From dbcc8d9b24496ca55dd349cd2eb5273cf6723343 Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Mon, 1 May 2006 03:03:02 +0000 Subject: Port forward from 2.4 branch: Patch #1464708 from William McVey: fixed handling of nested comments in mail addresses. E.g. "Foo ((Foo Bar)) " Fixes for both rfc822.py and email package. This patch needs to be back ported to Python 2.3 for email 2.5. --- Lib/email/_parseaddr.py | 1 + Lib/email/test/test_email.py | 6 ++++++ Lib/email/test/test_email_renamed.py | 6 ++++++ Lib/rfc822.py | 1 + Lib/test/test_rfc822.py | 10 ++++++++++ 5 files changed, 24 insertions(+) diff --git a/Lib/email/_parseaddr.py b/Lib/email/_parseaddr.py index 5821ddf..a08c43e 100644 --- a/Lib/email/_parseaddr.py +++ b/Lib/email/_parseaddr.py @@ -367,6 +367,7 @@ class AddrlistClass: break elif allowcomments and self.field[self.pos] == '(': slist.append(self.getcomment()) + continue # have already advanced pos from getcomment elif self.field[self.pos] == '\\': quote = True else: diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py index d977693..a197a36 100644 --- a/Lib/email/test/test_email.py +++ b/Lib/email/test/test_email.py @@ -2215,6 +2215,12 @@ class TestMiscellaneous(TestEmailBase): ['foo: ;', '"Jason R. Mastaler" ']), [('', ''), ('Jason R. Mastaler', 'jason@dom.ain')]) + def test_getaddresses_embedded_comment(self): + """Test proper handling of a nested comment""" + eq = self.assertEqual + addrs = Utils.getaddresses(['User ((nested comment)) ']) + eq(addrs[0][1], 'foo@bar.com') + def test_utils_quote_unquote(self): eq = self.assertEqual msg = Message() diff --git a/Lib/email/test/test_email_renamed.py b/Lib/email/test/test_email_renamed.py index 4ac2ee9..95d06cb 100644 --- a/Lib/email/test/test_email_renamed.py +++ b/Lib/email/test/test_email_renamed.py @@ -2221,6 +2221,12 @@ class TestMiscellaneous(TestEmailBase): ['foo: ;', '"Jason R. Mastaler" ']), [('', ''), ('Jason R. Mastaler', 'jason@dom.ain')]) + def test_getaddresses_embedded_comment(self): + """Test proper handling of a nested comment""" + eq = self.assertEqual + addrs = utils.getaddresses(['User ((nested comment)) ']) + eq(addrs[0][1], 'foo@bar.com') + def test_utils_quote_unquote(self): eq = self.assertEqual msg = Message() diff --git a/Lib/rfc822.py b/Lib/rfc822.py index 871a049..d6d5e47 100644 --- a/Lib/rfc822.py +++ b/Lib/rfc822.py @@ -700,6 +700,7 @@ class AddrlistClass: break elif allowcomments and self.field[self.pos] == '(': slist.append(self.getcomment()) + continue # have already advanced pos from getcomment elif self.field[self.pos] == '\\': quote = 1 else: diff --git a/Lib/test/test_rfc822.py b/Lib/test/test_rfc822.py index 0d9f28a..6d22825 100644 --- a/Lib/test/test_rfc822.py +++ b/Lib/test/test_rfc822.py @@ -45,6 +45,10 @@ class MessageTestCase(unittest.TestCase): print 'extra parsed address:', repr(n), repr(a) continue i = i + 1 + self.assertEqual(mn, n, + "Un-expected name: %s != %s" % (`mn`, `n`)) + self.assertEqual(ma, a, + "Un-expected address: %s != %s" % (`ma`, `a`)) if mn == n and ma == a: pass else: @@ -129,6 +133,12 @@ class MessageTestCase(unittest.TestCase): 'To: person@dom.ain (User J. Person)\n\n', [('User J. Person', 'person@dom.ain')]) + def test_doublecomment(self): + # The RFC allows comments within comments in an email addr + self.check( + 'To: person@dom.ain ((User J. Person)), John Doe \n\n', + [('User J. Person', 'person@dom.ain'), ('John Doe', 'foo@bar.com')]) + def test_twisted(self): # This one is just twisted. I don't know what the proper # result should be, but it shouldn't be to infloop, which is -- cgit v0.12