diff options
author | R David Murray <rdmurray@bitdance.com> | 2012-07-23 01:47:53 (GMT) |
---|---|---|
committer | R David Murray <rdmurray@bitdance.com> | 2012-07-23 01:47:53 (GMT) |
commit | 6a31bc6d81f42ac39868ced08d83cad880a7cce6 (patch) | |
tree | e995d2867e2ec5da5166a1b7aa582f3fd9abfc2a /Lib/email | |
parent | e60e12b57a05e932c9d3ac330dcb7d5a908a1a6c (diff) | |
download | cpython-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.py | 12 | ||||
-rw-r--r-- | Lib/email/test/test_email.py | 22 |
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 |