summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSaJH <wogur981208@gmail.com>2025-08-27 23:25:43 +0900
committerSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2025-08-28 08:54:56 +0200
commita9fe98d5bd4212d069afe8316101984aadecfbb2 (patch)
tree9ec270af941dd2c2ec6824d3efeedd7c06a267f8
parent05bac8c4202aba77dcb109aeedd35ff563331e1a (diff)
Fixed #35533 -- Prevented urlize creating broken links given a markdown link input.
Signed-off-by: SaJH <wogur981208@gmail.com>
-rw-r--r--django/utils/html.py6
-rw-r--r--tests/template_tests/filter_tests/test_urlize.py5
-rw-r--r--tests/utils_tests/test_html.py1
3 files changed, 7 insertions, 5 deletions
diff --git a/django/utils/html.py b/django/utils/html.py
index d3b904a822..734d7fbfb3 100644
--- a/django/utils/html.py
+++ b/django/utils/html.py
@@ -10,7 +10,7 @@ from urllib.parse import parse_qsl, quote, unquote, urlencode, urlsplit, urlunsp
from django.conf import settings
from django.core.exceptions import SuspiciousOperation, ValidationError
-from django.core.validators import EmailValidator
+from django.core.validators import DomainNameValidator, EmailValidator
from django.utils.deprecation import RemovedInDjango70Warning
from django.utils.functional import Promise, cached_property, keep_lazy, keep_lazy_text
from django.utils.http import MAX_URL_LENGTH, RFC3986_GENDELIMS, RFC3986_SUBDELIMS
@@ -296,7 +296,9 @@ class Urlizer:
simple_url_re = _lazy_re_compile(r"^https?://\[?\w", re.IGNORECASE)
simple_url_2_re = _lazy_re_compile(
- r"^www\.|^(?!http)\w[^@]+\.(com|edu|gov|int|mil|net|org)($|/.*)$", re.IGNORECASE
+ rf"^www\.|^(?!http)(?:{DomainNameValidator.hostname_re})"
+ r"\.(com|edu|gov|int|mil|net|org)($|/.*)$",
+ re.IGNORECASE,
)
word_split_re = _lazy_re_compile(r"""([\s<>"']+)""")
diff --git a/tests/template_tests/filter_tests/test_urlize.py b/tests/template_tests/filter_tests/test_urlize.py
index ca9f8fb7e1..692c3fc830 100644
--- a/tests/template_tests/filter_tests/test_urlize.py
+++ b/tests/template_tests/filter_tests/test_urlize.py
@@ -359,9 +359,8 @@ class FunctionTests(SimpleTestCase):
"www.example.com</a>]",
)
self.assertEqual(
- urlize("see test[at[example.com"),
- 'see <a href="https://test[at[example.com" rel="nofollow">'
- "test[at[example.com</a>",
+ urlize("see test[at[example.com"), # Invalid hostname.
+ "see test[at[example.com",
)
self.assertEqual(
urlize("[http://168.192.0.1](http://168.192.0.1)"),
diff --git a/tests/utils_tests/test_html.py b/tests/utils_tests/test_html.py
index f1a29977a7..7167383aef 100644
--- a/tests/utils_tests/test_html.py
+++ b/tests/utils_tests/test_html.py
@@ -489,6 +489,7 @@ class TestUtilsHtml(SimpleTestCase):
"foo@localhost.",
"test@example?;+!.com",
"email me@example.com,then I'll respond",
+ "[a link](https://www.djangoproject.com/)",
# trim_punctuation catastrophic tests
"(" * 100_000 + ":" + ")" * 100_000,
"(" * 100_000 + "&:" + ")" * 100_000,