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.
........
diff --git a/Lib/email/header.py b/Lib/email/header.py
index 6e03922..9e91dc2 100644
--- a/Lib/email/header.py
+++ b/Lib/email/header.py
@@ -92,6 +92,9 @@
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 067937a..e1754e9 100644
--- a/Lib/email/test/test_email.py
+++ b/Lib/email/test/test_email.py
@@ -1611,6 +1611,15 @@
('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 @@
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 976d892..481c40f 100644
--- a/Lib/email/test/test_email_renamed.py
+++ b/Lib/email/test/test_email_renamed.py
@@ -2958,7 +2958,7 @@
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 197a502..089939e 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -831,6 +831,7 @@
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 d8b079b..545ef74 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -24,6 +24,9 @@
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.