diff options
author | R. David Murray <rdmurray@bitdance.com> | 2010-01-16 16:32:39 (GMT) |
---|---|---|
committer | R. David Murray <rdmurray@bitdance.com> | 2010-01-16 16:32:39 (GMT) |
commit | 3cc6191ecdafecdad2d724053ec95fd5ccbe8dab (patch) | |
tree | 55dbf713b5efd0d3f89bdd8efcaf7a6852d4e943 /Lib | |
parent | b9ba2bb6855db373baef83993abbcd2965ff10ce (diff) | |
download | cpython-3cc6191ecdafecdad2d724053ec95fd5ccbe8dab.zip cpython-3cc6191ecdafecdad2d724053ec95fd5ccbe8dab.tar.gz cpython-3cc6191ecdafecdad2d724053ec95fd5ccbe8dab.tar.bz2 |
Merged revisions 77517,77525 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r77517 | r.david.murray | 2010-01-16 00:15:17 -0500 (Sat, 16 Jan 2010) | 6 lines
Issue #1670765: Prevent email.generator.Generator from re-wrapping
headers in multipart/signed MIME parts, which fixes one of the sources of
invalid modifications to such parts by Generator. Patch and tests by
Martin von Gagern.
........
r77525 | r.david.murray | 2010-01-16 11:08:32 -0500 (Sat, 16 Jan 2010) | 2 lines
Fix issue number in comment.
........
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/email/generator.py | 11 | ||||
-rw-r--r-- | Lib/email/test/test_email.py | 36 |
2 files changed, 47 insertions, 0 deletions
diff --git a/Lib/email/generator.py b/Lib/email/generator.py index ed832a3..ba3ccd8 100644 --- a/Lib/email/generator.py +++ b/Lib/email/generator.py @@ -235,6 +235,17 @@ class Generator: print >> self._fp self._fp.write(msg.epilogue) + def _handle_multipart_signed(self, msg): + # The contents of signed parts has to stay unmodified in order to keep + # the signature intact per RFC1847 2.1, so we disable header wrapping. + # RDM: This isn't enough to completely preserve the part, but it helps. + old_maxheaderlen = self._maxheaderlen + try: + self._maxheaderlen = 0 + self._handle_multipart(msg) + finally: + self._maxheaderlen = old_maxheaderlen + def _handle_message_delivery_status(self, msg): # We can't just write the headers directly to self's file object # because this will leave an extra newline between the last header diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py index 3a68f02..631c278 100644 --- a/Lib/email/test/test_email.py +++ b/Lib/email/test/test_email.py @@ -3267,6 +3267,42 @@ Content-Type: application/x-foo; +# Tests to ensure that signed parts of an email are completely preserved, as +# required by RFC1847 section 2.1. Note that these are incomplete, because the +# email package does not currently always preserve the body. See issue 1670765. +class TestSigned(TestEmailBase): + + def _msg_and_obj(self, filename): + fp = openfile(findfile(filename)) + try: + original = fp.read() + msg = email.message_from_string(original) + finally: + fp.close() + return original, msg + + def _signed_parts_eq(self, original, result): + # Extract the first mime part of each message + import re + repart = re.compile(r'^--([^\n]+)\n(.*?)\n--\1$', re.S | re.M) + inpart = repart.search(original).group(2) + outpart = repart.search(result).group(2) + self.assertEqual(outpart, inpart) + + def test_long_headers_as_string(self): + original, msg = self._msg_and_obj('msg_45.txt') + result = msg.as_string() + self._signed_parts_eq(original, result) + + def test_long_headers_flatten(self): + original, msg = self._msg_and_obj('msg_45.txt') + fp = StringIO() + Generator(fp).flatten(msg) + result = fp.getvalue() + self._signed_parts_eq(original, result) + + + def _testclasses(): mod = sys.modules[__name__] return [getattr(mod, name) for name in dir(mod) if name.startswith('Test')] |