mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	bugdown: Rewrite links to local server to be relative links.
Fixes #7247
This commit is contained in:
		@@ -982,15 +982,26 @@ def url_to_a(url, text = None):
 | 
				
			|||||||
    a = markdown.util.etree.Element('a')
 | 
					    a = markdown.util.etree.Element('a')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    href = sanitize_url(url)
 | 
					    href = sanitize_url(url)
 | 
				
			||||||
 | 
					    target_blank = True
 | 
				
			||||||
    if href is None:
 | 
					    if href is None:
 | 
				
			||||||
        # Rejected by sanitize_url; render it as plain text.
 | 
					        # Rejected by sanitize_url; render it as plain text.
 | 
				
			||||||
        return url
 | 
					        return url
 | 
				
			||||||
    if text is None:
 | 
					    if text is None:
 | 
				
			||||||
        text = markdown.util.AtomicString(url)
 | 
					        text = markdown.util.AtomicString(url)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    target_blank = 'mailto:' not in href[:7]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if db_data:
 | 
				
			||||||
 | 
					        # If the link points to a local destination we can just switch to that
 | 
				
			||||||
 | 
					        # instead of opening a new tab.
 | 
				
			||||||
 | 
					        local_link = re.match("^{}\/(#.+)$".format(re.escape(db_data['realm_uri'])), url)
 | 
				
			||||||
 | 
					        if local_link:
 | 
				
			||||||
 | 
					            href = local_link.group(1)
 | 
				
			||||||
 | 
					            target_blank = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    a.set('href', href)
 | 
					    a.set('href', href)
 | 
				
			||||||
    a.text = text
 | 
					    a.text = text
 | 
				
			||||||
    fixup_link(a, 'mailto:' not in href[:7])
 | 
					    fixup_link(a, target_blank)
 | 
				
			||||||
    return a
 | 
					    return a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class VerbosePattern(markdown.inlinepatterns.Pattern):
 | 
					class VerbosePattern(markdown.inlinepatterns.Pattern):
 | 
				
			||||||
@@ -1719,6 +1730,7 @@ def do_convert(content, message=None, message_realm=None, possible_words=None, s
 | 
				
			|||||||
            'email_info': email_info,
 | 
					            'email_info': email_info,
 | 
				
			||||||
            'mention_data': mention_data,
 | 
					            'mention_data': mention_data,
 | 
				
			||||||
            'realm_emoji': realm_emoji,
 | 
					            'realm_emoji': realm_emoji,
 | 
				
			||||||
 | 
					            'realm_uri': message_realm.uri,
 | 
				
			||||||
            'sent_by_bot': sent_by_bot,
 | 
					            'sent_by_bot': sent_by_bot,
 | 
				
			||||||
            'stream_names': stream_name_info,
 | 
					            'stream_names': stream_name_info,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1168,6 +1168,30 @@ class BugdownTest(ZulipTestCase):
 | 
				
			|||||||
                          '<p>I am writing this message to test something. I am writing this message to test something.</p>'
 | 
					                          '<p>I am writing this message to test something. I am writing this message to test something.</p>'
 | 
				
			||||||
        self.assertEqual(converted, expected_output)
 | 
					        self.assertEqual(converted, expected_output)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_normal_link(self):
 | 
				
			||||||
 | 
					        # type: () -> None
 | 
				
			||||||
 | 
					        realm = get_realm("zulip")
 | 
				
			||||||
 | 
					        sender_user_profile = self.example_user('othello')
 | 
				
			||||||
 | 
					        message = Message(sender=sender_user_profile, sending_client=get_client("test"))
 | 
				
			||||||
 | 
					        msg = "http://example.com/#settings/"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertEqual(
 | 
				
			||||||
 | 
					            bugdown.convert(msg, message_realm=realm, message=message),
 | 
				
			||||||
 | 
					            '<p><a href="http://example.com/#settings/" target="_blank" title="http://example.com/#settings/">http://example.com/#settings/</a></p>'
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_relative_link(self):
 | 
				
			||||||
 | 
					        # type: () -> None
 | 
				
			||||||
 | 
					        realm = get_realm("zulip")
 | 
				
			||||||
 | 
					        sender_user_profile = self.example_user('othello')
 | 
				
			||||||
 | 
					        message = Message(sender=sender_user_profile, sending_client=get_client("test"))
 | 
				
			||||||
 | 
					        msg = "http://zulip.testserver/#narrow/stream/hello"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertEqual(
 | 
				
			||||||
 | 
					            bugdown.convert(msg, message_realm=realm, message=message),
 | 
				
			||||||
 | 
					            '<p><a href="#narrow/stream/hello" title="#narrow/stream/hello">http://zulip.testserver/#narrow/stream/hello</a></p>'
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class BugdownApiTests(ZulipTestCase):
 | 
					class BugdownApiTests(ZulipTestCase):
 | 
				
			||||||
    def test_render_message_api(self):
 | 
					    def test_render_message_api(self):
 | 
				
			||||||
        # type: () -> None
 | 
					        # type: () -> None
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user