Browse Source

Make posted links open in new tab (#1403)

Rafał Pitoń 2 years ago
parent
commit
aad8ba8fc4

+ 3 - 1
misago/markup/parser.py

@@ -167,7 +167,9 @@ def clean_links(request, result, force_shva=False):
         else:
             result["outgoing_links"].append(clean_link_prefix(link["href"]))
             link["href"] = assert_link_prefix(link["href"])
-            link["rel"] = "nofollow noopener"
+            link["rel"] = "external nofollow noopener"
+
+        link["target"] = "_blank"
 
         if link.string:
             link.string = clean_link_prefix(link.string)

+ 7 - 7
misago/markup/tests/snapshots/snap_test_inline_bbcode.py

@@ -37,28 +37,28 @@ snapshots["test_underline_bbcode 1"] = "<p>Lorem <u>ipsum</u>!</p>"
 
 snapshots[
     "test_url_bbcode 1"
-] = '<p>Lorem <a href="https://placekitten.com/g/1200/500" rel="nofollow noopener">placekitten.com/g/1200/500</a> ipsum</p>'
+] = '<p>Lorem <a href="https://placekitten.com/g/1200/500" rel="external nofollow noopener" target="_blank">placekitten.com/g/1200/500</a> ipsum</p>'
 
 snapshots[
     "test_url_bbcode_is_escaped 1"
-] = '<p>Lorem <a href=\'http://&lt;script language="application/javascript"&gt;\' rel="nofollow noopener">&lt;script language="application/javascript"&gt;</a> ipsum</p>'
+] = '<p>Lorem <a href=\'http://&lt;script language="application/javascript"&gt;\' rel="external nofollow noopener" target="_blank">&lt;script language="application/javascript"&gt;</a> ipsum</p>'
 
 snapshots[
     "test_url_bbcode_link_text_is_escaped 1"
-] = '<p>Lorem <a href=\'http://&lt;script language="application/javascript"&gt;\' rel="nofollow noopener">&lt;script language="application/javascript"&gt;</a> ipsum</p>'
+] = '<p>Lorem <a href=\'http://&lt;script language="application/javascript"&gt;\' rel="external nofollow noopener" target="_blank">&lt;script language="application/javascript"&gt;</a> ipsum</p>'
 
 snapshots[
     "test_url_bbcode_with_link_text 1"
-] = '<p>Lorem <a href="https://placekitten.com/g/1200/500" rel="nofollow noopener">dolor</a> ipsum</p>'
+] = '<p>Lorem <a href="https://placekitten.com/g/1200/500" rel="external nofollow noopener" target="_blank">dolor</a> ipsum</p>'
 
 snapshots[
     "test_url_bbcode_with_long_link_text 1"
-] = '<p>Lorem <a href="https://placekitten.com/g/1200/500" rel="nofollow noopener">dolor met</a> ipsum</p>'
+] = '<p>Lorem <a href="https://placekitten.com/g/1200/500" rel="external nofollow noopener" target="_blank">dolor met</a> ipsum</p>'
 
 snapshots[
     "test_url_bbcode_with_quotes_and_link_text 1"
-] = '<p>Lorem <a href="https://placekitten.com/g/1200/500" rel="nofollow noopener">dolor</a> ipsum</p>'
+] = '<p>Lorem <a href="https://placekitten.com/g/1200/500" rel="external nofollow noopener" target="_blank">dolor</a> ipsum</p>'
 
 snapshots[
     "test_url_bbcode_with_quotes_and_long_link_text 1"
-] = '<p>Lorem <a href="https://placekitten.com/g/1200/500" rel="nofollow noopener">dolor met</a> ipsum</p>'
+] = '<p>Lorem <a href="https://placekitten.com/g/1200/500" rel="external nofollow noopener" target="_blank">dolor met</a> ipsum</p>'

+ 17 - 17
misago/markup/tests/snapshots/snap_test_link_handling.py

@@ -8,34 +8,34 @@ from snapshottest import Snapshot
 snapshots = Snapshot()
 
 snapshots[
-    "test_parser_converts_unmarked_links_to_hrefs 1"
-] = '<p>Lorem ipsum <a href="http://test.com" rel="nofollow noopener">test.com</a></p>'
+    "test_absolute_link_to_site_is_changed_to_relative_link 1"
+] = '<p>clean_links step cleans <a href="/" target="_blank">example.com</a></p>'
 
 snapshots[
-    "test_parser_skips_links_in_inline_code_markdown 1"
-] = "<p>Lorem ipsum <code>http://test.com</code></p>"
+    "test_absolute_link_to_site_without_schema_is_changed_to_relative_link 1"
+] = '<p>clean_links step cleans <a href="/" target="_blank">example.com</a></p>'
 
 snapshots[
-    "test_parser_skips_links_in_inline_code_bbcode 1"
-] = """<p>Lorem ipsum <br/>
-</p><pre><code>http://test.com</code></pre><p></p>"""
+    "test_absolute_link_with_path_to_site_is_changed_to_relative_link 1"
+] = '<p>clean_links step cleans <a href="/somewhere-something/" target="_blank">example.com/somewhere-something/</a></p>'
 
 snapshots[
-    "test_parser_skips_links_in_code_bbcode 1"
-] = "<pre><code>http://test.com</code></pre>"
+    "test_local_image_is_changed_to_relative_link 1"
+] = '<p>clean_links step cleans <img alt="example.com/media/img.png" src="/media/img.png"/></p>'
 
 snapshots[
-    "test_absolute_link_to_site_is_changed_to_relative_link 1"
-] = '<p>clean_links step cleans <a href="/">example.com</a></p>'
+    "test_parser_converts_unmarked_links_to_hrefs 1"
+] = '<p>Lorem ipsum <a href="http://test.com" rel="external nofollow noopener" target="_blank">test.com</a></p>'
 
 snapshots[
-    "test_absolute_link_to_site_without_schema_is_changed_to_relative_link 1"
-] = '<p>clean_links step cleans <a href="/">example.com</a></p>'
+    "test_parser_skips_links_in_code_bbcode 1"
+] = "<pre><code>http://test.com</code></pre>"
 
 snapshots[
-    "test_absolute_link_with_path_to_site_is_changed_to_relative_link 1"
-] = '<p>clean_links step cleans <a href="/somewhere-something/">example.com/somewhere-something/</a></p>'
+    "test_parser_skips_links_in_inline_code_bbcode 1"
+] = """<p>Lorem ipsum <br/>
+</p><pre><code>http://test.com</code></pre><p></p>"""
 
 snapshots[
-    "test_local_image_is_changed_to_relative_link 1"
-] = '<p>clean_links step cleans <img alt="example.com/media/img.png" src="/media/img.png"/></p>'
+    "test_parser_skips_links_in_inline_code_markdown 1"
+] = "<p>Lorem ipsum <code>http://test.com</code></p>"

+ 0 - 6
misago/markup/tests/test_inline_bbcode.py

@@ -61,12 +61,6 @@ def test_url_bbcode(request_mock, user, snapshot):
     snapshot.assert_match(result["parsed_text"])
 
 
-def test_url_bbcode_includes_nofollow_and_noopener(request_mock, user, snapshot):
-    text = "Lorem [url]https://placekitten.com/g/1200/500[/url] ipsum"
-    result = parse(text, request_mock, user, minify=False)
-    assert 'rel="nofollow noopener"' in result["parsed_text"]
-
-
 def test_url_bbcode_is_escaped(request_mock, user, snapshot):
     text = 'Lorem [url]<script language="application/javascript">[/url] ipsum'
     result = parse(text, request_mock, user, minify=False)

+ 6 - 0
misago/markup/tests/test_link_handling.py

@@ -87,6 +87,12 @@ def test_outgoing_link_is_added_to_outgoing_links_list(request_mock, user):
     assert result["outgoing_links"] == ["other.com"]
 
 
+def test_outgoing_llink_includes_external_nofollow_and_noopener(request_mock, user):
+    text = "Lorem [url]https://placekitten.com/g/1200/500[/url] ipsum"
+    result = parse(text, request_mock, user, minify=False)
+    assert 'rel="external nofollow noopener"' in result["parsed_text"]
+
+
 def test_outgoing_link_without_scheme_is_added_to_outgoing_links_list(
     request_mock, user
 ):