#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:14:13 -04:00
parent f2b34b8b96
commit 638d40b433
4 changed files with 21 additions and 1 deletions

View File

@ -391,6 +391,8 @@ class BytesGenerator(Generator):
if msg._payload is None:
return
if _has_surrogates(msg._payload):
if self._mangle_from_:
msg._payload = fcre.sub(">From ", msg._payload)
self.write(msg._payload)
else:
super(BytesGenerator,self)._handle_text(msg)

View File

@ -20,7 +20,7 @@ import email
from email.charset import Charset
from email.header import Header, decode_header, make_header
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.mime.application import MIMEApplication
from email.mime.audio import MIMEAudio
@ -1298,6 +1298,20 @@ Blah blah blah
self.assertEqual(len([1 for x in s.getvalue().split('\n')
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
class TestMIMEAudio(unittest.TestCase):

View File

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

View File

@ -109,6 +109,9 @@ Core and Builtins
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 #15199: Fix JavaScript's default MIME type to application/javascript.