#14983: always add a line end after a MIME boundary marker.

This is more RFC compliant (see issue) and fixes a problem with
signature verifiers rejecting the part when signed.  There is some
amount of backward compatibility concern here since it changes
the output, but the RFC issue coupled with fixing the problem
with signature verifiers seems worth the small risk of breaking
code that depends on the current incorrect output.
This commit is contained in:
R David Murray 2014-02-08 17:54:56 -05:00
parent 409ea5dac1
commit e9c31470e1
4 changed files with 16 additions and 7 deletions

View File

@ -299,9 +299,8 @@ class Generator:
# body-part # body-part
self._fp.write(body_part) self._fp.write(body_part)
# close-delimiter transport-padding # close-delimiter transport-padding
self.write(self._NL + '--' + boundary + '--') self.write(self._NL + '--' + boundary + '--' + self._NL)
if msg.epilogue is not None: if msg.epilogue is not None:
self.write(self._NL)
if self._mangle_from_: if self._mangle_from_:
epilogue = fcre.sub('>From ', msg.epilogue) epilogue = fcre.sub('>From ', msg.epilogue)
else: else:

View File

@ -119,6 +119,7 @@ hello
--__--__---- --__--__----
--192.168.1.2.889.32614.987812255.500.21814 --192.168.1.2.889.32614.987812255.500.21814
Content-type: text/plain; charset=us-ascii Content-type: text/plain; charset=us-ascii
Content-description: Digest Footer Content-description: Digest Footer

View File

@ -1711,7 +1711,8 @@ From: bperson@dom.ain
--BOUNDARY --BOUNDARY
--BOUNDARY--''') --BOUNDARY--
''')
def test_no_parts_in_a_multipart_with_empty_epilogue(self): def test_no_parts_in_a_multipart_with_empty_epilogue(self):
outer = MIMEBase('multipart', 'mixed') outer = MIMEBase('multipart', 'mixed')
@ -1756,7 +1757,8 @@ MIME-Version: 1.0
Content-Transfer-Encoding: 7bit Content-Transfer-Encoding: 7bit
hello world hello world
--BOUNDARY--''') --BOUNDARY--
''')
def test_seq_parts_in_a_multipart_with_empty_preamble(self): def test_seq_parts_in_a_multipart_with_empty_preamble(self):
eq = self.ndiffAssertEqual eq = self.ndiffAssertEqual
@ -1782,7 +1784,8 @@ MIME-Version: 1.0
Content-Transfer-Encoding: 7bit Content-Transfer-Encoding: 7bit
hello world hello world
--BOUNDARY--''') --BOUNDARY--
''')
def test_seq_parts_in_a_multipart_with_none_preamble(self): def test_seq_parts_in_a_multipart_with_none_preamble(self):
@ -1808,7 +1811,8 @@ MIME-Version: 1.0
Content-Transfer-Encoding: 7bit Content-Transfer-Encoding: 7bit
hello world hello world
--BOUNDARY--''') --BOUNDARY--
''')
def test_seq_parts_in_a_multipart_with_none_epilogue(self): def test_seq_parts_in_a_multipart_with_none_epilogue(self):
@ -1834,7 +1838,8 @@ MIME-Version: 1.0
Content-Transfer-Encoding: 7bit Content-Transfer-Encoding: 7bit
hello world hello world
--BOUNDARY--''') --BOUNDARY--
''')
def test_seq_parts_in_a_multipart_with_empty_epilogue(self): def test_seq_parts_in_a_multipart_with_empty_epilogue(self):

View File

@ -48,6 +48,10 @@ Core and Builtins
Library Library
------- -------
- Issue #14983: email.generator now always adds a line end after each MIME
boundary marker, instead of doing so only when there is an epilogue. This
fixes an RFC compliance bug and solves an issue with signed MIME parts.
- Issue #20540: Fix a performance regression (vs. Python 3.2) when layering - Issue #20540: Fix a performance regression (vs. Python 3.2) when layering
a multiprocessing Connection over a TCP socket. For small payloads, Nagle's a multiprocessing Connection over a TCP socket. For small payloads, Nagle's
algorithm would introduce idle delays before the entire transmission of a algorithm would introduce idle delays before the entire transmission of a