diff options
-rw-r--r-- | Lib/email/base64mime.py | 20 | ||||
-rw-r--r-- | Lib/email/header.py | 9 | ||||
-rw-r--r-- | Lib/email/message.py | 6 | ||||
-rw-r--r-- | Lib/email/quoprimime.py | 2 | ||||
-rw-r--r-- | Lib/email/test/test_email.py | 4 | ||||
-rwxr-xr-x | Lib/smtplib.py | 10 |
6 files changed, 23 insertions, 28 deletions
diff --git a/Lib/email/base64mime.py b/Lib/email/base64mime.py index 0035b79..369bf10 100644 --- a/Lib/email/base64mime.py +++ b/Lib/email/base64mime.py @@ -101,25 +101,19 @@ def body_encode(s, maxlinelen=76, eol=NL): -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. """ - 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(s) # For convenience and backwards compatibility w/ standard base64 module diff --git a/Lib/email/header.py b/Lib/email/header.py index e03e42d..786a71f 100644 --- a/Lib/email/header.py +++ b/Lib/email/header.py @@ -341,10 +341,11 @@ class _ValueFormatter: self._current_line = _Accumulator(headerlen) def __str__(self): - # Remove the trailing TRANSITIONAL_SPACE - last_line = self._current_line.pop() - if last_line is not TRANSITIONAL_SPACE: - self._current_line.push(last_line) + # Remove any trailing TRANSITIONAL_SPACE + if len(self._current_line) > 0: + last_line = self._current_line.pop() + if last_line is not TRANSITIONAL_SPACE: + self._current_line.push(last_line) self.newline() return NL.join(self._lines) diff --git a/Lib/email/message.py b/Lib/email/message.py index 50d6604..e368737 100644 --- a/Lib/email/message.py +++ b/Lib/email/message.py @@ -201,7 +201,8 @@ class Message: # Incorrect padding pass elif cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'): - in_file = BytesIO(bytes(payload + '\n')) + payload += '\n' + in_file = BytesIO(payload.encode('raw-unicode-escape')) out_file = BytesIO() try: uu.decode(in_file, out_file, quiet=True) @@ -752,7 +753,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 diff --git a/Lib/email/quoprimime.py b/Lib/email/quoprimime.py index 1301e0b..e59479c 100644 --- a/Lib/email/quoprimime.py +++ b/Lib/email/quoprimime.py @@ -58,7 +58,7 @@ _QUOPRI_HEADER_MAP = dict((c, '=%02X' % c) for c in range(256)) _QUOPRI_BODY_MAP = _QUOPRI_HEADER_MAP.copy() # Safe header bytes which need no encoding. -for c in b'-!*+/' + bytes(ascii_letters, 'ascii') + bytes(digits, 'ascii'): +for c in b'-!*+/' + ascii_letters.encode('ascii') + digits.encode('ascii'): _QUOPRI_HEADER_MAP[c] = chr(c) # Headers have one other special encoding; spaces become underscores. _QUOPRI_HEADER_MAP[ord(' ')] = '_' diff --git a/Lib/email/test/test_email.py b/Lib/email/test/test_email.py index 78d702d..f7cac97 100644 --- a/Lib/email/test/test_email.py +++ b/Lib/email/test/test_email.py @@ -2538,10 +2538,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 diff --git a/Lib/smtplib.py b/Lib/smtplib.py index 301f4fe..1aa83a4 100755 --- a/Lib/smtplib.py +++ b/Lib/smtplib.py @@ -46,7 +46,7 @@ import re import email.utils import base64 import hmac -from email.base64mime import encode as encode_base64 +from email.base64mime import body_encode as encode_base64 from sys import stderr __all__ = ["SMTPException","SMTPServerDisconnected","SMTPResponseException", @@ -529,10 +529,10 @@ class SMTP: def encode_cram_md5(challenge, user, password): challenge = base64.decodestring(challenge) response = user + " " + hmac.HMAC(password, challenge).hexdigest() - return encode_base64(response, eol="") + return encode_base64(response) def encode_plain(user, password): - return encode_base64("\0%s\0%s" % (user, password), eol="") + return encode_base64("\0%s\0%s" % (user, password)) AUTH_PLAIN = "PLAIN" @@ -574,10 +574,10 @@ class SMTP: AUTH_PLAIN + " " + encode_plain(user, password)) elif authmethod == AUTH_LOGIN: (code, resp) = self.docmd("AUTH", - "%s %s" % (AUTH_LOGIN, encode_base64(user, eol=""))) + "%s %s" % (AUTH_LOGIN, encode_base64(user))) if code != 334: raise SMTPAuthenticationError(code, resp) - (code, resp) = self.docmd(encode_base64(password, eol="")) + (code, resp) = self.docmd(encode_base64(password)) elif authmethod is None: raise SMTPException("No suitable authentication method found.") if code not in (235, 503): |