diff --git a/Lib/imaplib.py b/Lib/imaplib.py index 970b6a537f7..4e8a4bb6fa4 100644 --- a/Lib/imaplib.py +++ b/Lib/imaplib.py @@ -1353,7 +1353,7 @@ class _Authenticator: def process(self, data): ret = self.mech(self.decode(data)) if ret is None: - return '*' # Abort conversation + return b'*' # Abort conversation return self.encode(ret) def encode(self, inp): diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py index 80e27f39730..824865680fa 100644 --- a/Lib/test/test_imaplib.py +++ b/Lib/test/test_imaplib.py @@ -419,6 +419,26 @@ class ThreadedNetworkedTests(unittest.TestCase): ret, data = client.login_cram_md5("tim", b"tanstaaftanstaaf") self.assertEqual(ret, "OK") + + @reap_threads + def test_aborted_authentication(self): + + class MyServer(SimpleIMAPHandler): + + def cmd_AUTHENTICATE(self, tag, args): + self._send_textline('+') + self.response = yield + + if self.response == b'*\r\n': + self._send_tagged(tag, 'NO', '[AUTHENTICATIONFAILED] aborted') + else: + self._send_tagged(tag, 'OK', 'MYAUTH successful') + + with self.reaped_pair(MyServer) as (server, client): + with self.assertRaises(imaplib.IMAP4.error): + code, data = client.authenticate('MYAUTH', lambda x: None) + + def test_linetoolong(self): class TooLongHandler(SimpleIMAPHandler): def handle(self): diff --git a/Misc/ACKS b/Misc/ACKS index eb47ffda533..fae6e081cbc 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -603,6 +603,7 @@ Gerrit Holl Shane Holloway Rune Holm Thomas Holmes +Craig Holmquist Philip Homburg Naofumi Honda Jeffrey Honig diff --git a/Misc/NEWS b/Misc/NEWS index b9950c3a271..03a3c0fefd5 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,9 @@ Core and Builtins Library ------- +- Issue #23779: imaplib raises TypeError if authenticator tries to abort. + Patch from Craig Holmquist. + - Issue #23319: Fix ctypes.BigEndianStructure, swap correctly bytes. Patch written by Matthieu Gautier.