render_incoming_message: Require a realm object.

This commit is contained in:
Tim Abbott
2017-01-21 20:55:30 -08:00
parent 76509a251b
commit 01e0acb282
4 changed files with 30 additions and 11 deletions

View File

@@ -763,9 +763,9 @@ def do_send_message(message, rendered_content=None, no_log=False, stream=None,
'realm': realm, 'realm': realm,
'local_id': local_id}])[0] 'local_id': local_id}])[0]
def render_incoming_message(message, content, message_users): def render_incoming_message(message, content, message_users, realm):
# type: (Message, Text, Set[UserProfile]) -> Text # type: (Message, Text, Set[UserProfile], Realm) -> Text
realm_alert_words = alert_words_in_realm(message.get_realm()) realm_alert_words = alert_words_in_realm(realm)
try: try:
rendered_content = render_markdown( rendered_content = render_markdown(
message=message, message=message,
@@ -849,7 +849,8 @@ def do_send_messages(messages):
rendered_content = render_incoming_message( rendered_content = render_incoming_message(
message['message'], message['message'],
message['message'].content, message['message'].content,
message_users=message['active_recipients']) message['active_recipients'],
message['realm'])
message['message'].rendered_content = rendered_content message['message'].rendered_content = rendered_content
message['message'].rendered_content_version = bugdown_version message['message'].rendered_content_version = bugdown_version
links_for_embed |= message['message'].links_for_preview links_for_embed |= message['message'].links_for_preview
@@ -940,6 +941,7 @@ def do_send_messages(messages):
event_data = { event_data = {
'message_id': message['message'].id, 'message_id': message['message'].id,
'message_content': message['message'].content, 'message_content': message['message'].content,
'message_realm_id': message['realm'].id,
'urls': links_for_embed} 'urls': links_for_embed}
queue_json_publish('embed_links', event_data, lambda x: None) queue_json_publish('embed_links', event_data, lambda x: None)

View File

@@ -178,14 +178,20 @@ class PreviewTestCase(ZulipTestCase):
response = MockPythonResponse(html, 200) response = MockPythonResponse(html, 200)
mocked_response = mock.Mock( mocked_response = mock.Mock(
side_effect=lambda k: {url: response}.get(k, MockPythonResponse('', 404))) side_effect=lambda k: {url: response}.get(k, MockPythonResponse('', 404)))
msg = Message.objects.select_related("sender").get(id=msg_id)
self.assertNotIn(
'<a href="{0}" target="_blank" title="The Rock">The Rock</a>'.format(url),
msg.rendered_content)
event = { event = {
'message_id': msg_id, 'message_id': msg_id,
'urls': [url], 'urls': [url],
'message_realm_id': msg.sender.realm_id,
'message_content': url} 'message_content': url}
with self.settings(INLINE_URL_EMBED_PREVIEW=True, TEST_SUITE=False, CACHES=TEST_CACHES): with self.settings(INLINE_URL_EMBED_PREVIEW=True, TEST_SUITE=False, CACHES=TEST_CACHES):
with mock.patch('requests.get', mocked_response): with mock.patch('requests.get', mocked_response):
FetchLinksEmbedData().consume(event) FetchLinksEmbedData().consume(event)
msg = Message.objects.get(id=msg_id) msg = Message.objects.select_related("sender").get(id=msg_id)
self.assertIn( self.assertIn(
'<a href="{0}" target="_blank" title="The Rock">The Rock</a>'.format(url), '<a href="{0}" target="_blank" title="The Rock">The Rock</a>'.format(url),
msg.rendered_content) msg.rendered_content)
@@ -196,9 +202,11 @@ class PreviewTestCase(ZulipTestCase):
msg_id = self.send_message( msg_id = self.send_message(
"hamlet@zulip.com", "cordelia@zulip.com", "hamlet@zulip.com", "cordelia@zulip.com",
Recipient.PERSONAL, subject="url", content=url) Recipient.PERSONAL, subject="url", content=url)
msg = Message.objects.select_related("sender").get(id=msg_id)
event = { event = {
'message_id': msg_id, 'message_id': msg_id,
'urls': [url], 'urls': [url],
'message_realm_id': msg.sender.realm_id,
'message_content': url} 'message_content': url}
with self.settings(INLINE_URL_EMBED_PREVIEW=True, TEST_SUITE=False, CACHES=TEST_CACHES): with self.settings(INLINE_URL_EMBED_PREVIEW=True, TEST_SUITE=False, CACHES=TEST_CACHES):
with mock.patch('requests.get', mock.Mock(side_effect=ConnectionError())): with mock.patch('requests.get', mock.Mock(side_effect=ConnectionError())):

View File

@@ -931,10 +931,14 @@ def update_message_backend(request, user_profile,
ums = UserMessage.objects.filter(message=message.id, ums = UserMessage.objects.filter(message=message.id,
flags=~UserMessage.flags.historical) flags=~UserMessage.flags.historical)
message_users = {get_user_profile_by_id(um.user_profile_id) for um in ums} message_users = {get_user_profile_by_id(um.user_profile_id) for um in ums}
# If rendering fails, the called code will raise a JsonableError. # We render the message using the current user's realm; since
# the cross-realm bots never edit messages, this should be
# always correct.
# Note: If rendering fails, the called code will raise a JsonableError.
rendered_content = render_incoming_message(message, rendered_content = render_incoming_message(message,
content=content, content,
message_users=message_users) message_users,
user_profile.realm)
links_for_embed |= message.links_for_preview links_for_embed |= message.links_for_preview
do_update_message(user_profile, message, subject, propagate_mode, content, rendered_content) do_update_message(user_profile, message, subject, propagate_mode, content, rendered_content)

View File

@@ -6,7 +6,7 @@ from django.core.handlers.wsgi import WSGIRequest
from django.core.handlers.base import BaseHandler from django.core.handlers.base import BaseHandler
from zerver.models import get_user_profile_by_email, \ from zerver.models import get_user_profile_by_email, \
get_user_profile_by_id, get_prereg_user_by_email, get_client, \ get_user_profile_by_id, get_prereg_user_by_email, get_client, \
UserMessage, Message UserMessage, Message, Realm
from zerver.lib.context_managers import lockfile from zerver.lib.context_managers import lockfile
from zerver.lib.queue import SimpleQueueClient, queue_json_publish from zerver.lib.queue import SimpleQueueClient, queue_json_publish
from zerver.lib.timestamp import timestamp_to_datetime from zerver.lib.timestamp import timestamp_to_datetime
@@ -405,10 +405,15 @@ class FetchLinksEmbedData(QueueProcessingWorker):
ums = UserMessage.objects.filter( ums = UserMessage.objects.filter(
message=message.id).select_related("user_profile") message=message.id).select_related("user_profile")
message_users = {um.user_profile for um in ums} message_users = {um.user_profile for um in ums}
# Fetch the realm whose settings we're using for rendering
realm = Realm.objects.get(id=event['message_realm_id'])
# If rendering fails, the called code will raise a JsonableError. # If rendering fails, the called code will raise a JsonableError.
rendered_content = render_incoming_message( rendered_content = render_incoming_message(
message, message,
content=message.content, message.content,
message_users=message_users) message_users,
realm)
do_update_embedded_data( do_update_embedded_data(
message.sender, message, message.content, rendered_content) message.sender, message, message.content, rendered_content)