Skip to content

Commit

Permalink
Improve email address validation for Automatic Links
Browse files Browse the repository at this point in the history
  • Loading branch information
nzlosh committed Aug 11, 2021
1 parent 850b8a5 commit 9aa4586
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 4 deletions.
5 changes: 3 additions & 2 deletions docs/change_log/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ Python-Markdown Change Log
Under development: version 3.3.5 (a bug-fix release).

* Make the `slugify_unicode` function not remove diacritical marks (#1118).
* Fix `[toc]` detection when used with `nl2br` extension (#1160)
* Re-use compiled regex for block level checks (#1169)
* Fix `[toc]` detection when used with `nl2br` extension (#1160).
* Re-use compiled regex for block level checks (#1169).
* Don't process shebangs in fenced code blocks when using CodeHilite (#1156).
* Improve email address validation for Automatic Links (#1165).

Feb 24, 2021: version 3.3.4 (a bug-fix release).

Expand Down
4 changes: 2 additions & 2 deletions markdown/inlinepatterns.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,10 +160,10 @@ def build_inlinepatterns(md, **kwargs):
AUTOLINK_RE = r'<((?:[Ff]|[Hh][Tt])[Tt][Pp][Ss]?://[^<>]*)>'

# <me@example.com>
AUTOMAIL_RE = r'<([^<> !]*@[^@<> ]*)>'
AUTOMAIL_RE = r'<([^<> !]+@[^@<> ]+)>'

# <...>
HTML_RE = r'(<([a-zA-Z/][^<>]*|!--(?:(?!<!--|-->).)*--)>)'
HTML_RE = r'(<(\/?[a-zA-Z][^<>@ ]*( [^<>]*)?|!--(?:(?!<!--|-->).)*--)>)'

# "&#38;" (decimal) or "&#x26;" (hex) or "&amp;" (named)
ENTITY_RE = r'(&(?:\#[0-9]+|\#x[0-9a-fA-F]+|[a-zA-Z0-9]+);)'
Expand Down
63 changes: 63 additions & 0 deletions tests/test_syntax/inline/test_autolinks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
"""
Python Markdown
A Python implementation of John Gruber's Markdown.
Documentation: https://python-markdown.github.io/
GitHub: https://github.com/Python-Markdown/markdown/
PyPI: https://pypi.org/project/Markdown/
Started by Manfred Stienstra (http://www.dwerg.net/).
Maintained for a few years by Yuri Takhteyev (http://www.freewisdom.org).
Currently maintained by Waylan Limberg (https://github.com/waylan),
Dmitry Shachnev (https://github.com/mitya57) and Isaac Muse (https://github.com/facelessuser).
Copyright 2007-2021 The Python Markdown Project (v. 1.7 and later)
Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b)
Copyright 2004 Manfred Stienstra (the original version)
License: BSD (see LICENSE.md for details).
"""

from markdown.test_tools import TestCase


class TestAutomaticLinks(TestCase):

def test_email_address(self):
self.assertMarkdownRenders(
'asdfasdfadsfasd <yuri@freewisdom.org> or you can say ',
'<p>asdfasdfadsfasd <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#121;&#117;&#114;'
'&#105;&#64;&#102;&#114;&#101;&#101;&#119;&#105;&#115;&#100;&#111;&#109;&#46;&#111;&#114;'
'&#103;">&#121;&#117;&#114;&#105;&#64;&#102;&#114;&#101;&#101;&#119;&#105;&#115;&#100;'
'&#111;&#109;&#46;&#111;&#114;&#103;</a> or you can say </p>'
)

def test_mailto_email_address(self):
self.assertMarkdownRenders(
'instead <mailto:yuri@freewisdom.org>',
'<p>instead <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#121;&#117;&#114;&#105;&#64;'
'&#102;&#114;&#101;&#101;&#119;&#105;&#115;&#100;&#111;&#109;&#46;&#111;&#114;&#103;">'
'&#121;&#117;&#114;&#105;&#64;&#102;&#114;&#101;&#101;&#119;&#105;&#115;&#100;&#111;&#109;'
'&#46;&#111;&#114;&#103;</a></p>'
)

def test_email_address_with_ampersand(self):
self.assertMarkdownRenders(
'<bob&sue@example.com>',
'<p><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#98;&#111;&#98;&#38;&#115;&#117;&#101;'
'&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;">&#98;&#111;&#98;&amp;'
'&#115;&#117;&#101;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;</a></p>'
)

def test_invalid_email_address_local_part(self):
self.assertMarkdownRenders(
'Missing local-part <@domain>',
'<p>Missing local-part &lt;@domain&gt;</p>'
)

def test_invalid_email_address_domain(self):
self.assertMarkdownRenders(
'Missing domain <local-part@>',
'<p>Missing domain &lt;local-part@&gt;</p>'
)

0 comments on commit 9aa4586

Please sign in to comment.