diff options
author | R David Murray <rdmurray@bitdance.com> | 2013-02-19 17:20:32 (GMT) |
---|---|---|
committer | R David Murray <rdmurray@bitdance.com> | 2013-02-19 17:20:32 (GMT) |
commit | 8aa164b395d785598b0708644a6802b71d78660c (patch) | |
tree | 17a63104403afdebca2f0a5a327c1ca996b4f194 /Lib/imaplib.py | |
parent | 5e06d1d0b9964513068a993074340b07e17fa04e (diff) | |
parent | 6cd6f015567d35be5831f0095b39a512842d31f2 (diff) | |
download | cpython-8aa164b395d785598b0708644a6802b71d78660c.zip cpython-8aa164b395d785598b0708644a6802b71d78660c.tar.gz cpython-8aa164b395d785598b0708644a6802b71d78660c.tar.bz2 |
Merge: #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.py | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/Lib/imaplib.py b/Lib/imaplib.py index fba3bca..cc23e89 100644 --- a/Lib/imaplib.py +++ b/Lib/imaplib.py @@ -352,10 +352,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? @@ -538,7 +538,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): @@ -1295,14 +1297,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] @@ -1310,7 +1314,7 @@ class _Authenticator: def decode(self, inp): if not inp: - return '' + return b'' return binascii.a2b_base64(inp) Months = ' Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' ') |