summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorR David Murray <rdmurray@bitdance.com>2014-02-08 22:54:12 (GMT)
committerR David Murray <rdmurray@bitdance.com>2014-02-08 22:54:12 (GMT)
commit2cfae9b03f706e0d6889dfecc21f87419d926b00 (patch)
tree4fe839211986e569c5b4c1f1bd3db9ef4260b8ca
parent4ade2d25fc585876540ac9d591a44469fd853462 (diff)
downloadcpython-2cfae9b03f706e0d6889dfecc21f87419d926b00.zip
cpython-2cfae9b03f706e0d6889dfecc21f87419d926b00.tar.gz
cpython-2cfae9b03f706e0d6889dfecc21f87419d926b00.tar.bz2
#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.
-rw-r--r--Lib/email/generator.py3
-rw-r--r--Lib/email/test/data/msg_02.txt1
-rw-r--r--Lib/email/test/test_email.py15
-rw-r--r--Lib/email/test/test_email_renamed.py15
-rw-r--r--Misc/NEWS4
5 files changed, 26 insertions, 12 deletions
diff --git a/Lib/email/generator.py b/Lib/email/generator.py
index 5626ab9..e50f912 100644
--- a/Lib/email/generator.py
+++ b/Lib/email/generator.py
@@ -231,9 +231,8 @@ class Generator:
# body-part
self._fp.write(body_part)
# close-delimiter transport-padding
- self._fp.write('\n--' + boundary + '--')
+ self._fp.write('\n--' + boundary + '--' + NL)
if msg.epilogue is not None:
- print >> self._fp
if self._mangle_from_:
epilogue = fcre.sub('>From ', msg.epilogue)
else:
diff --git a/Lib/email/test/data/msg_02.txt b/Lib/email/test/data/msg_02.txt
index 43f2480..5d0a7e1 100644
--- a/Lib/email/test/data/msg_02.txt
+++ b/Lib/email/test/data/msg_02.txt
@@ -119,6 +119,7 @@ hello
--__--__----
+
--192.168.1.2.889.32614.987812255.500.21814
Content-type: text/plain; charset=us-ascii
Content-description: Digest Footer
diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py
index 35c422d..c4a90d8 100644
--- a/Lib/email/test/test_email.py
+++ b/Lib/email/test/test_email.py
@@ -1206,7 +1206,8 @@ From: bperson@dom.ain
--BOUNDARY
---BOUNDARY--''')
+--BOUNDARY--
+''')
def test_no_parts_in_a_multipart_with_empty_epilogue(self):
outer = MIMEBase('multipart', 'mixed')
@@ -1251,7 +1252,8 @@ MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
hello world
---BOUNDARY--''')
+--BOUNDARY--
+''')
def test_seq_parts_in_a_multipart_with_empty_preamble(self):
eq = self.ndiffAssertEqual
@@ -1277,7 +1279,8 @@ MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
hello world
---BOUNDARY--''')
+--BOUNDARY--
+''')
def test_seq_parts_in_a_multipart_with_none_preamble(self):
@@ -1303,7 +1306,8 @@ MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
hello world
---BOUNDARY--''')
+--BOUNDARY--
+''')
def test_seq_parts_in_a_multipart_with_none_epilogue(self):
@@ -1329,7 +1333,8 @@ MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
hello world
---BOUNDARY--''')
+--BOUNDARY--
+''')
def test_seq_parts_in_a_multipart_with_empty_epilogue(self):
diff --git a/Lib/email/test/test_email_renamed.py b/Lib/email/test/test_email_renamed.py
index f72fd08..5a41701 100644
--- a/Lib/email/test/test_email_renamed.py
+++ b/Lib/email/test/test_email_renamed.py
@@ -1146,7 +1146,8 @@ From: bperson@dom.ain
--BOUNDARY
---BOUNDARY--''')
+--BOUNDARY--
+''')
def test_no_parts_in_a_multipart_with_empty_epilogue(self):
outer = MIMEBase('multipart', 'mixed')
@@ -1191,7 +1192,8 @@ MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
hello world
---BOUNDARY--''')
+--BOUNDARY--
+''')
def test_seq_parts_in_a_multipart_with_empty_preamble(self):
eq = self.ndiffAssertEqual
@@ -1217,7 +1219,8 @@ MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
hello world
---BOUNDARY--''')
+--BOUNDARY--
+''')
def test_seq_parts_in_a_multipart_with_none_preamble(self):
@@ -1243,7 +1246,8 @@ MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
hello world
---BOUNDARY--''')
+--BOUNDARY--
+''')
def test_seq_parts_in_a_multipart_with_none_epilogue(self):
@@ -1269,7 +1273,8 @@ MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
hello world
---BOUNDARY--''')
+--BOUNDARY--
+''')
def test_seq_parts_in_a_multipart_with_empty_epilogue(self):
diff --git a/Misc/NEWS b/Misc/NEWS
index 5bf0af1..05413fe 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -42,6 +42,10 @@ Core and Builtins
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 #20013: Some imap servers disconnect if the current mailbox is
deleted, and imaplib did not handle that case gracefully. Now it
handles the 'bye' correctly.