summaryrefslogtreecommitdiffstats
path: root/Lib/email
diff options
context:
space:
mode:
authorR David Murray <rdmurray@bitdance.com>2012-07-23 01:47:53 (GMT)
committerR David Murray <rdmurray@bitdance.com>2012-07-23 01:47:53 (GMT)
commit6a31bc6d81f42ac39868ced08d83cad880a7cce6 (patch)
treee995d2867e2ec5da5166a1b7aa582f3fd9abfc2a /Lib/email
parente60e12b57a05e932c9d3ac330dcb7d5a908a1a6c (diff)
downloadcpython-6a31bc6d81f42ac39868ced08d83cad880a7cce6.zip
cpython-6a31bc6d81f42ac39868ced08d83cad880a7cce6.tar.gz
cpython-6a31bc6d81f42ac39868ced08d83cad880a7cce6.tar.bz2
#15232: correctly mangle From lines in MIME preamble and epilogue
Diffstat (limited to 'Lib/email')
-rw-r--r--Lib/email/generator.py12
-rw-r--r--Lib/email/test/test_email.py22
2 files changed, 32 insertions, 2 deletions
diff --git a/Lib/email/generator.py b/Lib/email/generator.py
index 04c0210..02487e3 100644
--- a/Lib/email/generator.py
+++ b/Lib/email/generator.py
@@ -233,7 +233,11 @@ class Generator:
msg.set_boundary(boundary)
# If there's a preamble, write it out, with a trailing CRLF
if msg.preamble is not None:
- self.write(msg.preamble + self._NL)
+ if self._mangle_from_:
+ preamble = fcre.sub('>From ', msg.preamble)
+ else:
+ preamble = msg.preamble
+ self.write(preamble + self._NL)
# dash-boundary transport-padding CRLF
self.write('--' + boundary + self._NL)
# body-part
@@ -251,7 +255,11 @@ class Generator:
self.write(self._NL + '--' + boundary + '--')
if msg.epilogue is not None:
self.write(self._NL)
- self.write(msg.epilogue)
+ if self._mangle_from_:
+ epilogue = fcre.sub('>From ', msg.epilogue)
+ else:
+ epilogue = msg.epilogue
+ self.write(epilogue)
def _handle_multipart_signed(self, msg):
# The contents of signed parts has to stay unmodified in order to keep
diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py
index 65b3ebd..95dc4af 100644
--- a/Lib/email/test/test_email.py
+++ b/Lib/email/test/test_email.py
@@ -1275,6 +1275,28 @@ From the desk of A.A.A.:
Blah blah blah
""")
+ def test_mangle_from_in_preamble_and_epilog(self):
+ s = StringIO()
+ g = Generator(s, mangle_from_=True)
+ msg = email.message_from_string(textwrap.dedent("""\
+ From: foo@bar.com
+ Mime-Version: 1.0
+ Content-Type: multipart/mixed; boundary=XXX
+
+ From somewhere unknown
+
+ --XXX
+ Content-Type: text/plain
+
+ foo
+
+ --XXX--
+
+ From somewhere unknowable
+ """))
+ g.flatten(msg)
+ self.assertEqual(len([1 for x in s.getvalue().split('\n')
+ if x.startswith('>From ')]), 2)
# Test the basic MIMEAudio class