From 2bbb20074103ec23512a0cee75d9b3596d8d2b81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Tue, 7 May 2024 16:40:27 +0200 Subject: [PATCH 1/2] gh-118716: Do not fail on non ASCII local part when parsing addr_spec RFC 6530 allows UTF-8 strings in the local part. --- Lib/email/headerregistry.py | 5 +++-- Lib/test/test_email/test_headerregistry.py | 23 +++++++++++----------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Lib/email/headerregistry.py b/Lib/email/headerregistry.py index 543141dc427ebe..587f08df0350ae 100644 --- a/Lib/email/headerregistry.py +++ b/Lib/email/headerregistry.py @@ -45,8 +45,9 @@ def __init__(self, display_name='', username='', domain='', addr_spec=None): raise ValueError("Invalid addr_spec; only '{}' " "could be parsed from '{}'".format( a_s, addr_spec)) - if a_s.all_defects: - raise a_s.all_defects[0] + for defect in a_s.all_defects: + if not isinstance(defect, errors.NonASCIILocalPartDefect): + raise defect username = a_s.local_part domain = a_s.domain self._display_name = display_name diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py index bb7ca8dfd8c52c..340d87bc2ff7a5 100644 --- a/Lib/test/test_email/test_headerregistry.py +++ b/Lib/test/test_email/test_headerregistry.py @@ -1492,17 +1492,20 @@ def test_quoting(self): self.assertEqual(str(a), '"Sara J." <"bad name"@example.com>') def test_il8n(self): - a = Address('Éric', 'wok', 'exàmple.com') + a = Address('Éric', 'wők', 'exàmple.com') self.assertEqual(a.display_name, 'Éric') - self.assertEqual(a.username, 'wok') + self.assertEqual(a.username, 'wők') self.assertEqual(a.domain, 'exàmple.com') - self.assertEqual(a.addr_spec, 'wok@exàmple.com') - self.assertEqual(str(a), 'Éric ') + self.assertEqual(a.addr_spec, 'wők@exàmple.com') + self.assertEqual(str(a), 'Éric ') - # XXX: there is an API design issue that needs to be solved here. - #def test_non_ascii_username_raises(self): - # with self.assertRaises(ValueError): - # Address('foo', 'wők', 'example.com') + def test_non_ascii_username_in_addr_spec(self): + a = Address('foo', addr_spec='wők@example.com') + self.assertEqual(a.display_name, 'foo') + self.assertEqual(a.username, 'wők') + self.assertEqual(a.domain, 'example.com') + self.assertEqual(a.addr_spec, 'wők@example.com') + self.assertEqual(str(a), 'foo ') def test_crlf_in_constructor_args_raises(self): cases = ( @@ -1523,10 +1526,6 @@ def test_crlf_in_constructor_args_raises(self): with self.subTest(kwargs=kwargs), self.assertRaisesRegex(ValueError, "invalid arguments"): Address(**kwargs) - def test_non_ascii_username_in_addr_spec_raises(self): - with self.assertRaises(ValueError): - Address('foo', addr_spec='wők@example.com') - def test_address_addr_spec_and_username_raises(self): with self.assertRaises(TypeError): Address('foo', username='bing', addr_spec='bar@baz') From 0f62095817d9a140fb1c6bb713131e05cd31ec87 Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Fri, 10 May 2024 10:42:31 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20blu?= =?UTF-8?q?rb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../next/Library/2024-05-10-10-42-30.gh-issue-118716.OvpPa-.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Library/2024-05-10-10-42-30.gh-issue-118716.OvpPa-.rst diff --git a/Misc/NEWS.d/next/Library/2024-05-10-10-42-30.gh-issue-118716.OvpPa-.rst b/Misc/NEWS.d/next/Library/2024-05-10-10-42-30.gh-issue-118716.OvpPa-.rst new file mode 100644 index 00000000000000..14a6bd0bfae966 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-05-10-10-42-30.gh-issue-118716.OvpPa-.rst @@ -0,0 +1 @@ +Do not fail when parsing email address with non-ASCII local part.