Commit 8b3d6596 authored by Barry Warsaw's avatar Barry Warsaw

Fix a more bytes/str confusion.

Use str.encode('raw-unicode-escape') consistently instead of bytes(string).

Remove the convert_eols argument from base64mime.decode().  This matches
previous API changes done to the quoprimime module.
parent ce36ad8a
......@@ -109,7 +109,7 @@ def header_encode(header, charset='iso-8859-1', keep_eols=False,
lines = []
for line in base64ed:
# Ignore the last character of each line if it is a newline
if line.endswith(NL):
if line[-1] == ord(NL):
line = line[:-1]
# Add the chrome
lines.append('=?%s?b?%s?=' % (charset, line))
......@@ -158,25 +158,19 @@ encodestring = encode
def decode(s, convert_eols=False):
def decode(string):
"""Decode a raw base64 string, returning a bytes object.
If convert_eols is set to a string value, all canonical email linefeeds,
e.g. "\\r\\n", in the decoded text will be converted to the value of
convert_eols. os.linesep is a good choice for convert_eols if you are
decoding a text attachment.
This function does not parse a full MIME header value encoded with
base64 (like =?iso-8895-1?b?bmloISBuaWgh?=) -- please use the high
level email.Header class for that functionality.
This function does not parse a full MIME header value encoded with base64
(like =?iso-8895-1?b?bmloISBuaWgh?=) -- use the high level
email.Header class for that functionality.
"""
if not s:
return s
dec = a2b_base64(s)
if convert_eols:
return dec.replace(CRLF, convert_eols)
return dec
if not string:
return bytes()
elif isinstance(string, str):
return a2b_base64(string.encode('raw-unicode-escape'))
else:
return a2b_base64(string)
# For convenience and backwards compatibility w/ standard base64 module
......
......@@ -201,7 +201,7 @@ class Message:
# Incorrect padding
pass
elif cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'):
in_file = BytesIO(bytes(payload + '\n'))
in_file = BytesIO((payload + '\n').encode('raw-unicode-escape'))
out_file = BytesIO()
try:
uu.decode(in_file, out_file, quiet=True)
......@@ -757,7 +757,8 @@ class Message:
# LookupError will be raised if the charset isn't known to
# Python. UnicodeError will be raised if the encoded text
# contains a character not in the charset.
charset = str(bytes(charset[2]), pcharset)
as_bytes = charset[2].encode('raw-unicode-escape')
charset = str(as_bytes, pcharset)
except (LookupError, UnicodeError):
charset = charset[2]
# charset characters must be in us-ascii range
......
......@@ -55,7 +55,10 @@ EMPTYSTRING = ''
# See also Charset.py
MISC_LEN = 7
HEADER_SAFE_BYTES = b'-!*+/ ' + bytes(ascii_letters) + bytes(digits)
HEADER_SAFE_BYTES = (b'-!*+/ ' +
ascii_letters.encode('raw-unicode-escape') +
digits.encode('raw-unicode-escape'))
BODY_SAFE_BYTES = (b' !"#$%&\'()*+,-./0123456789:;<>'
b'?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`'
b'abcdefghijklmnopqrstuvwxyz{|}~\t')
......
......@@ -2531,10 +2531,8 @@ class TestBase64(unittest.TestCase):
def test_decode(self):
eq = self.assertEqual
eq(base64mime.decode(''), '')
eq(base64mime.decode(''), b'')
eq(base64mime.decode('aGVsbG8='), b'hello')
eq(base64mime.decode('aGVsbG8=', 'X'), b'hello')
eq(base64mime.decode('aGVsbG8NCndvcmxk\n', 'X'), b'helloXworld')
def test_encode(self):
eq = self.assertEqual
......@@ -2844,7 +2842,7 @@ class TestHeader(TestEmailBase):
def test_empty_header_encode(self):
h = Header()
self.assertEqual(h.encode(), '')
def test_header_ctor_default_args(self):
eq = self.ndiffAssertEqual
h = Header()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment