#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.
This commit is contained in:
R. David Murray 2010-08-03 22:14:10 +00:00
parent df7f2fd350
commit c4e69cc1d8
4 changed files with 17 additions and 1 deletions

View File

@ -94,6 +94,9 @@ def decode_header(header):
word = email.quoprimime.header_decode(encoded_string) word = email.quoprimime.header_decode(encoded_string)
decoded_words.append((word, charset)) decoded_words.append((word, charset))
elif encoding == 'b': elif encoding == 'b':
paderr = len(encoded_string) % 4 # Postel's law: add missing padding
if paderr:
encoded_string += '==='[:4 - paderr]
try: try:
word = email.base64mime.decode(encoded_string) word = email.base64mime.decode(encoded_string)
except binascii.Error: except binascii.Error:

View File

@ -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'rg', None), (b'\xe5', 'iso-8859-1'),
(b'sbord', None)]) (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 # 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): def test_broken_base64_header(self):
raises = self.assertRaises 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) raises(errors.HeaderParseError, decode_header, s)

View File

@ -854,6 +854,7 @@ Felix Wiemann
Gerry Wiener Gerry Wiener
Frank Wierzbicki Frank Wierzbicki
Bryce "Zooko" Wilcox-O'Hearn Bryce "Zooko" Wilcox-O'Hearn
Jason Williams
John Williams John Williams
Sue Williams Sue Williams
Gerald S. Williams Gerald S. Williams

View File

@ -37,6 +37,9 @@ Extensions
Library 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 - Issue #9444: Argparse now uses the first element of prefix_chars as
the option character for the added 'h/help' option if prefix_chars the option character for the added 'h/help' option if prefix_chars
does not contain a '-', instead of raising an error. does not contain a '-', instead of raising an error.