From 75a292e5be429977656acaf846345be9dc0a6b8e Mon Sep 17 00:00:00 2001 From: "R. David Murray" Date: Wed, 4 Aug 2010 00:05:50 +0000 Subject: [PATCH] Merged revisions 83690 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r83690 | r.david.murray | 2010-08-03 18:14:10 -0400 (Tue, 03 Aug 2010) | 10 lines #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. ........ --- Lib/email/header.py | 3 +++ Lib/email/test/test_email.py | 11 ++++++++++- Lib/email/test/test_email_renamed.py | 2 +- Misc/ACKS | 1 + Misc/NEWS | 3 +++ 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Lib/email/header.py b/Lib/email/header.py index 6e03922aa03d..9e91dc20774e 100644 --- a/Lib/email/header.py +++ b/Lib/email/header.py @@ -92,6 +92,9 @@ def decode_header(header): if encoding == 'q': dec = email.quoprimime.header_decode(encoded) elif encoding == 'b': + paderr = len(encoded) % 4 # Postel's law: add missing padding + if paderr: + encoded += '==='[:4 - paderr] try: dec = email.base64mime.decode(encoded) except binascii.Error: diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py index 067937a97571..e1754e9f7534 100644 --- a/Lib/email/test/test_email.py +++ b/Lib/email/test/test_email.py @@ -1611,6 +1611,15 @@ class TestRFC2047(unittest.TestCase): ('rg', None), ('\xe5', 'iso-8859-1'), ('sbord', None)]) + def test_rfc2047_B_bad_padding(self): + s = '=?iso-8859-1?B?%s?=' + data = [ # only test complete bytes + ('dm==', 'v'), ('dm=', 'v'), ('dm', 'v'), + ('dmk=', 'vi'), ('dmk', 'vi') + ] + for q, a in data: + dh = decode_header(s % q) + self.assertEqual(dh, [(a, 'iso-8859-1')]) # Test the MIMEMessage class @@ -3064,7 +3073,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/Lib/email/test/test_email_renamed.py b/Lib/email/test/test_email_renamed.py index 976d892f4a71..481c40f1354f 100644 --- a/Lib/email/test/test_email_renamed.py +++ b/Lib/email/test/test_email_renamed.py @@ -2958,7 +2958,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 197a5022caa1..089939ee1e2a 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -831,6 +831,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 d8b079bdb503..545ef74f21c8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -24,6 +24,9 @@ Core and Builtins 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. -- 2.47.3