Merge #15249: Mangle From lines correctly when body contains invalid bytes.

Fix by Colin Su.  Test by me, based on a test written by Petri Lehtinen.
This commit is contained in:
R David Murray 2012-08-24 11:23:50 -04:00
commit ad2a7d528a
4 changed files with 21 additions and 1 deletions

View File

@ -400,6 +400,8 @@ class BytesGenerator(Generator):
if msg._payload is None: if msg._payload is None:
return return
if _has_surrogates(msg._payload) and not self.policy.cte_type=='7bit': if _has_surrogates(msg._payload) and not self.policy.cte_type=='7bit':
if self._mangle_from_:
msg._payload = fcre.sub(">From ", msg._payload)
self.write(msg._payload) self.write(msg._payload)
else: else:
super(BytesGenerator,self)._handle_text(msg) super(BytesGenerator,self)._handle_text(msg)

View File

@ -21,7 +21,7 @@ import email.policy
from email.charset import Charset from email.charset import Charset
from email.header import Header, decode_header, make_header from email.header import Header, decode_header, make_header
from email.parser import Parser, HeaderParser from email.parser import Parser, HeaderParser
from email.generator import Generator, DecodedGenerator from email.generator import Generator, DecodedGenerator, BytesGenerator
from email.message import Message from email.message import Message
from email.mime.application import MIMEApplication from email.mime.application import MIMEApplication
from email.mime.audio import MIMEAudio from email.mime.audio import MIMEAudio
@ -1306,6 +1306,20 @@ Blah blah blah
self.assertEqual(len([1 for x in s.getvalue().split('\n') self.assertEqual(len([1 for x in s.getvalue().split('\n')
if x.startswith('>From ')]), 2) if x.startswith('>From ')]), 2)
def test_mangled_from_with_bad_bytes(self):
source = textwrap.dedent("""\
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
From: aaa@bbb.org
""").encode('utf-8')
msg = email.message_from_bytes(source + b'From R\xc3\xb6lli\n')
b = BytesIO()
g = BytesGenerator(b, mangle_from_=True)
g.flatten(msg)
self.assertEqual(b.getvalue(), source + b'>From R\xc3\xb6lli\n')
# Test the basic MIMEAudio class # Test the basic MIMEAudio class
class TestMIMEAudio(unittest.TestCase): class TestMIMEAudio(unittest.TestCase):

View File

@ -1020,6 +1020,7 @@ Ken Stox
Dan Stromberg Dan Stromberg
Daniel Stutzbach Daniel Stutzbach
Andreas Stührk Andreas Stührk
Colin Su
Pal Subbiah Pal Subbiah
Nathan Sullivan Nathan Sullivan
Mark Summerfield Mark Summerfield

View File

@ -29,6 +29,9 @@ Core and Builtins
Library Library
------- -------
- Issue #15249: BytesGenerator now correctly mangles From lines (when
requested) even if the body contains undecodable bytes.
- Issue #15777: Fix a refleak in _posixsubprocess. - Issue #15777: Fix a refleak in _posixsubprocess.
- Issue ##665194: Update email.utils.localtime to use datetime.astimezone and - Issue ##665194: Update email.utils.localtime to use datetime.astimezone and