summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/email/base64mime.py20
-rw-r--r--Lib/email/header.py9
-rw-r--r--Lib/email/message.py6
-rw-r--r--Lib/email/quoprimime.py2
-rw-r--r--Lib/email/test/test_email.py4
-rwxr-xr-xLib/smtplib.py10
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):