mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	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.
  ........
................
			
			
This commit is contained in:
		
							parent
							
								
									11f657843f
								
							
						
					
					
						commit
						fa606926d6
					
				
					 4 changed files with 86 additions and 0 deletions
				
			
		| 
						 | 
					@ -215,6 +215,17 @@ class Generator:
 | 
				
			||||||
            print(file=self._fp)
 | 
					            print(file=self._fp)
 | 
				
			||||||
            self._fp.write(msg.epilogue)
 | 
					            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):
 | 
					    def _handle_message_delivery_status(self, msg):
 | 
				
			||||||
        # We can't just write the headers directly to self's file object
 | 
					        # We can't just write the headers directly to self's file object
 | 
				
			||||||
        # because this will leave an extra newline between the last header
 | 
					        # because this will leave an extra newline between the last header
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										33
									
								
								Lib/email/test/data/msg_45.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								Lib/email/test/data/msg_45.txt
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,33 @@
 | 
				
			||||||
 | 
					From: <foo@bar.baz>
 | 
				
			||||||
 | 
					To: <baz@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--
 | 
				
			||||||
| 
						 | 
					@ -3386,6 +3386,44 @@ Content-Type: application/x-foo;
 | 
				
			||||||
        eq(s, 'My Document For You')
 | 
					        eq(s, 'My Document For You')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# 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():
 | 
					def _testclasses():
 | 
				
			||||||
    mod = sys.modules[__name__]
 | 
					    mod = sys.modules[__name__]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,6 +67,10 @@ Core and Builtins
 | 
				
			||||||
Library
 | 
					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
 | 
					- Issue #7701: Fix crash in binascii.b2a_uu() in debug mode when given a
 | 
				
			||||||
  1-byte argument.  Patch by Victor Stinner.
 | 
					  1-byte argument.  Patch by Victor Stinner.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue