summaryrefslogtreecommitdiffstats
path: root/Lib/imaplib.py
diff options
context:
space:
mode:
authorR David Murray <rdmurray@bitdance.com>2013-02-19 17:17:31 (GMT)
committerR David Murray <rdmurray@bitdance.com>2013-02-19 17:17:31 (GMT)
commit774a39f26ef2fa8ed96f3c52d3edac5e93926b4b (patch)
treea7fb7a639755bc6843c6189d9b928e0039433bcd /Lib/imaplib.py
parent6b30759022d836099a0844983816edaa5e64f52f (diff)
downloadcpython-774a39f26ef2fa8ed96f3c52d3edac5e93926b4b.zip
cpython-774a39f26ef2fa8ed96f3c52d3edac5e93926b4b.tar.gz
cpython-774a39f26ef2fa8ed96f3c52d3edac5e93926b4b.tar.bz2
#13700: Make imap.authenticate with authobject work.
This fixes a bytes/string confusion in the API which prevented custom authobjects from working at all. Original patch by Erno Tukia.
Diffstat (limited to 'Lib/imaplib.py')
-rw-r--r--Lib/imaplib.py20
1 files changed, 12 insertions, 8 deletions
diff --git a/Lib/imaplib.py b/Lib/imaplib.py
index c0334d8..00a17fb 100644
--- a/Lib/imaplib.py
+++ b/Lib/imaplib.py
@@ -360,10 +360,10 @@ class IMAP4:
data = authobject(response)
- It will be called to process server continuation responses.
- It should return data that will be encoded and sent to server.
- It should return None if the client abort response '*' should
- be sent instead.
+ It will be called to process server continuation responses; the
+ response argument it is passed will be a bytes. It should return bytes
+ data that will be base64 encoded and sent to the server. It should
+ return None if the client abort response '*' should be sent instead.
"""
mech = mechanism.upper()
# XXX: shouldn't this code be removed, not commented out?
@@ -546,7 +546,9 @@ class IMAP4:
def _CRAM_MD5_AUTH(self, challenge):
""" Authobject to use with CRAM-MD5 authentication. """
import hmac
- return self.user + " " + hmac.HMAC(self.password, challenge).hexdigest()
+ pwd = (self.password.encode('ASCII') if isinstance(self.password, str)
+ else self.password)
+ return self.user + " " + hmac.HMAC(pwd, challenge).hexdigest()
def logout(self):
@@ -1288,14 +1290,16 @@ class _Authenticator:
# so when it gets to the end of the 8-bit input
# there's no partial 6-bit output.
#
- oup = ''
+ oup = b''
+ if isinstance(inp, str):
+ inp = inp.encode('ASCII')
while inp:
if len(inp) > 48:
t = inp[:48]
inp = inp[48:]
else:
t = inp
- inp = ''
+ inp = b''
e = binascii.b2a_base64(t)
if e:
oup = oup + e[:-1]
@@ -1303,7 +1307,7 @@ class _Authenticator:
def decode(self, inp):
if not inp:
- return ''
+ return b''
return binascii.a2b_base64(inp)