From: R. David Murray Date: Tue, 3 Aug 2010 22:14:10 +0000 (+0000) Subject: #3196: if needed pad a short base64 encoded word before trying to decode. X-Git-Tag: v3.2a2~484 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c4e69cc1d84a8e025c6b1894b4749cda8bb1d156;p=thirdparty%2FPython%2Fcpython.git #3196: if needed pad a short base64 encoded word before trying to decode. The RFCs encourage following Postel's law: be liberal in what you accept. So if someone forgot to pad the base64 encoded word payload to an even four bytes, we add the padding before handing it to base64mime.decode. Previously, missing padding resulted in a HeaderParseError. Patch by Jason Williams. --- diff --git a/Lib/email/header.py b/Lib/email/header.py index c924d3a7227c..89c139105221 100644 --- a/Lib/email/header.py +++ b/Lib/email/header.py @@ -94,6 +94,9 @@ def decode_header(header): word = email.quoprimime.header_decode(encoded_string) decoded_words.append((word, charset)) elif encoding == 'b': + paderr = len(encoded_string) % 4 # Postel's law: add missing padding + if paderr: + encoded_string += '==='[:4 - paderr] try: word = email.base64mime.decode(encoded_string) except binascii.Error: diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py index 09f51dfaca6f..c3114695d1b3 100644 --- a/Lib/email/test/test_email.py +++ b/Lib/email/test/test_email.py @@ -1649,6 +1649,15 @@ Re: =?mac-iceland?q?r=8Aksm=9Arg=8Cs?= baz foo bar =?mac-iceland?q?r=8Aksm?= (b'rg', None), (b'\xe5', 'iso-8859-1'), (b'sbord', None)]) + def test_rfc2047_B_bad_padding(self): + s = '=?iso-8859-1?B?%s?=' + data = [ # only test complete bytes + ('dm==', b'v'), ('dm=', b'v'), ('dm', b'v'), + ('dmk=', b'vi'), ('dmk', b'vi') + ] + for q, a in data: + dh = decode_header(s % q) + self.assertEqual(dh, [(a, 'iso-8859-1')]) # Test the MIMEMessage class @@ -3176,7 +3185,7 @@ A very long line that must get split to something other than at the def test_broken_base64_header(self): raises = self.assertRaises - s = 'Subject: =?EUC-KR?B?CSixpLDtKSC/7Liuvsax4iC6uLmwMcijIKHaILzSwd/H0SC8+LCjwLsgv7W/+Mj3IQ?=' + s = 'Subject: =?EUC-KR?B?CSixpLDtKSC/7Liuvsax4iC6uLmwMcijIKHaILzSwd/H0SC8+LCjwLsgv7W/+Mj3I ?=' raises(errors.HeaderParseError, decode_header, s) diff --git a/Misc/ACKS b/Misc/ACKS index 0347f6755dc6..75c3ae7b30ec 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -854,6 +854,7 @@ Felix Wiemann Gerry Wiener Frank Wierzbicki Bryce "Zooko" Wilcox-O'Hearn +Jason Williams John Williams Sue Williams Gerald S. Williams diff --git a/Misc/NEWS b/Misc/NEWS index a523b8fddf29..dcf2b624b03c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -37,6 +37,9 @@ Extensions Library ------- +- Issue #3196: email header decoding is now forgiving if an RFC2047 + encoded word encoded in base64 is lacking padding. + - Issue #9444: Argparse now uses the first element of prefix_chars as the option character for the added 'h/help' option if prefix_chars does not contain a '-', instead of raising an error.