[Python-checkins] r77546 - in python/branches/release31-maint: Lib/email/generator.py Lib/email/test/data/msg_45.txt Lib/email/test/test_email.py Misc/NEWS

r.david.murray python-checkins at python.org
Sat Jan 16 19:41:00 CET 2010


Author: r.david.murray
Date: Sat Jan 16 19:41:00 2010
New Revision: 77546

Log:
Merged revisions 77542 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/branches/py3k

................
  r77542 | r.david.murray | 2010-01-16 13:30:03 -0500 (Sat, 16 Jan 2010) | 18 lines
  
  Merged revisions 77517,77525 via svnmerge from 
  svn+ssh://pythondev@svn.python.org/python/trunk
  
  Merge adds an additional test for as_string with a maxheaderlen specified.
  
  ........
    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.
  ........
................


Added:
   python/branches/release31-maint/Lib/email/test/data/msg_45.txt
Modified:
   python/branches/release31-maint/   (props changed)
   python/branches/release31-maint/Lib/email/generator.py
   python/branches/release31-maint/Lib/email/test/test_email.py
   python/branches/release31-maint/Misc/NEWS

Modified: python/branches/release31-maint/Lib/email/generator.py
==============================================================================
--- python/branches/release31-maint/Lib/email/generator.py	(original)
+++ python/branches/release31-maint/Lib/email/generator.py	Sat Jan 16 19:41:00 2010
@@ -215,6 +215,17 @@
             print(file=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

Added: python/branches/release31-maint/Lib/email/test/data/msg_45.txt
==============================================================================
--- (empty file)
+++ python/branches/release31-maint/Lib/email/test/data/msg_45.txt	Sat Jan 16 19:41:00 2010
@@ -0,0 +1,33 @@
+From: <foo at bar.baz>
+To: <baz at bar.foo>
+Subject: test
+X-Long-Line: Some really long line contains a lot of text and thus has to be rewrapped because it is some
+	really long
+        line
+MIME-Version: 1.0
+Content-Type: multipart/signed; boundary="borderline";
+	protocol="application/pgp-signature"; micalg=pgp-sha1
+
+This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
+--borderline
+Content-Type: text/plain
+X-Long-Line: Another really long line contains a lot of text and thus has to be rewrapped because it is another
+	really long
+        line
+
+This is the signed contents.
+
+--borderline
+Content-Type: application/pgp-signature; name="signature.asc"
+Content-Description: OpenPGP digital signature
+Content-Disposition: attachment; filename="signature.asc"
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v2.0.6 (GNU/Linux)
+
+iD8DBQFG03voRhp6o4m9dFsRApSZAKCCAN3IkJlVRg6NvAiMHlvvIuMGPQCeLZtj
+FGwfnRHFBFO/S4/DKysm0lI=
+=t7+s
+-----END PGP SIGNATURE-----
+
+--borderline--

Modified: python/branches/release31-maint/Lib/email/test/test_email.py
==============================================================================
--- python/branches/release31-maint/Lib/email/test/test_email.py	(original)
+++ python/branches/release31-maint/Lib/email/test/test_email.py	Sat Jan 16 19:41:00 2010
@@ -3387,6 +3387,44 @@
 
 
 
+# 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):
+        with openfile(findfile(filename)) as fp:
+            original = fp.read()
+            msg = email.message_from_string(original)
+        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_as_string_maxheaderlen(self):
+        original, msg = self._msg_and_obj('msg_45.txt')
+        result = msg.as_string(maxheaderlen=60)
+        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')]

Modified: python/branches/release31-maint/Misc/NEWS
==============================================================================
--- python/branches/release31-maint/Misc/NEWS	(original)
+++ python/branches/release31-maint/Misc/NEWS	Sat Jan 16 19:41:00 2010
@@ -67,6 +67,10 @@
 Library
 -------
 
+- 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.
+
 - Issue #7701: Fix crash in binascii.b2a_uu() in debug mode when given a
   1-byte argument.  Patch by Victor Stinner.
 


More information about the Python-checkins mailing list