#1050268: make parseaddr 'quote' the contents of quoted strings in addresses.
Also made the doc string for email._parseaddr's 'quote' function more accurate; I'd love to make the function match the old docstring instead, but other code uses it according the existing semantics.
This commit is contained in:
parent
8f7bcb3f85
commit
5397e862e2
|
@ -160,7 +160,12 @@ def mktime_tz(data):
|
|||
|
||||
|
||||
def quote(str):
|
||||
"""Add quotes around a string."""
|
||||
"""Prepare string to be used in a quoted string.
|
||||
|
||||
Turns backslash and double quote characters into quoted pairs. These
|
||||
are the only characters that need to be quoted inside a quoted string.
|
||||
Does not add the surrounding double quotes.
|
||||
"""
|
||||
return str.replace('\\', '\\\\').replace('"', '\\"')
|
||||
|
||||
|
||||
|
@ -318,7 +323,7 @@ class AddrlistClass:
|
|||
aslist.append('.')
|
||||
self.pos += 1
|
||||
elif self.field[self.pos] == '"':
|
||||
aslist.append('"%s"' % self.getquote())
|
||||
aslist.append('"%s"' % quote(self.getquote()))
|
||||
elif self.field[self.pos] in self.atomends:
|
||||
break
|
||||
else:
|
||||
|
|
|
@ -2287,6 +2287,24 @@ class TestMiscellaneous(TestEmailBase):
|
|||
# formataddr() quotes the name if there's a dot in it
|
||||
self.assertEqual(utils.formataddr((a, b)), y)
|
||||
|
||||
def test_parseaddr_preserves_quoted_pairs_in_addresses(self):
|
||||
# issue 10005. Note that in the third test the second pair of
|
||||
# backslashes is not actually a quoted pair because it is not inside a
|
||||
# comment or quoted string: the address being parsed has a quoted
|
||||
# string containing a quoted backslash, followed by 'example' and two
|
||||
# backslashes, followed by another quoted string containing a space and
|
||||
# the word 'example'. parseaddr copies those two backslashes
|
||||
# literally. Per rfc5322 this is not technically correct since a \ may
|
||||
# not appear in an address outside of a quoted string. It is probably
|
||||
# a sensible Postel interpretation, though.
|
||||
eq = self.assertEqual
|
||||
eq(utils.parseaddr('""example" example"@example.com'),
|
||||
('', '""example" example"@example.com'))
|
||||
eq(utils.parseaddr('"\\"example\\" example"@example.com'),
|
||||
('', '"\\"example\\" example"@example.com'))
|
||||
eq(utils.parseaddr('"\\\\"example\\\\" example"@example.com'),
|
||||
('', '"\\\\"example\\\\" example"@example.com'))
|
||||
|
||||
def test_multiline_from_comment(self):
|
||||
x = """\
|
||||
Foo
|
||||
|
|
|
@ -87,6 +87,9 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #1050268: parseaddr now correctly quotes double quote and backslash
|
||||
characters that appear inside quoted strings in email addresses.
|
||||
|
||||
- Issue #10004: quoprimime no longer generates a traceback when confronted
|
||||
with invalid characters after '=' in a Q-encoded word.
|
||||
|
||||
|
|
Loading…
Reference in New Issue