Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion Lib/imaplib.py
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,11 @@ def _connect(self):
elif 'OK' in self.untagged_responses:
self.state = 'NONAUTH'
else:
raise self.error(self.welcome)
# A continuation ('+') greeting is returned as None; report its
# raw line, still held by the last match (gh-108280).
greeting = (self.welcome or self.mo.string).decode(
self._encoding, 'replace')
raise self.error('invalid greeting: ' + greeting)

self._get_capabilities()
if __debug__:
Expand Down
33 changes: 33 additions & 0 deletions Lib/test/test_imaplib.py
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,39 @@ def handle(self):
self.assertRaises(imaplib.IMAP4.abort, self.imap_class,
*server.server_address)

def test_invalid_greeting(self):
# An invalid greeting, e.g. from a POP3 server on the IMAP port,
# must not fail with "error: None" but report the server's line
# (gh-108280).
class Pop3Handler(socketserver.StreamRequestHandler):
def handle(self):
self.wfile.write(b'+OK POP3 server ready\r\n')
_, server = self._setup(Pop3Handler, connect=False)
with self.assertRaisesRegex(imaplib.IMAP4.error,
r'invalid greeting: \+OK POP3 server ready'):
self.imap_class(*server.server_address)

def test_invalid_greeting_untagged(self):
# An untagged greeting that is neither OK nor PREAUTH (e.g. BYE)
# is reported as is (gh-108280).
class ByeHandler(socketserver.StreamRequestHandler):
def handle(self):
self.wfile.write(b'* BYE Server unavailable\r\n')
_, server = self._setup(ByeHandler, connect=False)
with self.assertRaisesRegex(imaplib.IMAP4.error,
r'invalid greeting: \* BYE Server unavailable'):
self.imap_class(*server.server_address)

def test_invalid_greeting_bare_continuation(self):
# A bare continuation greeting is still reported (gh-108280).
class BareHandler(socketserver.StreamRequestHandler):
def handle(self):
self.wfile.write(b'+\r\n')
_, server = self._setup(BareHandler, connect=False)
with self.assertRaisesRegex(imaplib.IMAP4.error,
r'invalid greeting: \+'):
self.imap_class(*server.server_address)

def test_line_termination(self):
class BadNewlineHandler(SimpleIMAPHandler):
def cmd_CAPABILITY(self, tag, args):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Connecting :mod:`imaplib` to a server that does not send a valid IMAP4
greeting (for example a POP3 server answering on the IMAP port) now raises
an error reporting the server's response instead of
``imaplib.IMAP4.error: None``.
Loading