# HG changeset patch # User "Lorenzo M. Catucci" # Date 1228226479 -3600 # Branch trunk # Node ID c97a558f9e70bfcaa2456fbc443c86fe12a26e9a # Parent 2983b7526464c6ea8b45888aee5839d55bf9c4ec [mq]: imaplib_02_starttls.diff diff --git a/Lib/imaplib.py b/Lib/imaplib.py --- a/Lib/imaplib.py +++ b/Lib/imaplib.py @@ -23,6 +23,12 @@ __version__ = "2.58" import binascii, os, random, re, socket, sys, time + +try: + import ssl + HAVE_SSL = True +except ImportError: + HAVE_SSL = False __all__ = ["IMAP4", "IMAP4_stream", "Internaldate2tuple", "Int2AP", "ParseFlags", "Time2Internaldate"] @@ -71,6 +77,7 @@ 'SETANNOTATION':('AUTH', 'SELECTED'), 'SETQUOTA': ('AUTH', 'SELECTED'), 'SORT': ('SELECTED',), + 'STARTTLS': ('NONAUTH',), 'STATUS': ('AUTH', 'SELECTED'), 'STORE': ('SELECTED',), 'SUBSCRIBE': ('AUTH', 'SELECTED'), @@ -700,6 +707,27 @@ return self._untagged_response(typ, dat, name) + def starttls(self, keyfile = None, certfile = None): + name = 'STARTTLS' + if not HAVE_SSL: + raise self.error('SSL support missing') + if hasattr(self, '_tls_established') and self._tls_established: + raise self.abort('TLS session already established') + if name not in self.capabilities: + raise self.abort('TLS not supported by server') + typ, dat = self._simple_command(name) + if typ == 'OK': + self.sock=ssl.wrap_socket(self.sock, keyfile, certfile) + self.file = self.sock.makefile('rb') + typ, dat = self.capability() + if dat == [None]: + raise self.error('no CAPABILITY response from server') + self.capabilities = tuple(dat[-1].upper().split()) + else: + raise self.error("Couldn't establish TLS session") + return self._untagged_response(typ, dat, name) + + def status(self, mailbox, names): """Request named status conditions for mailbox. @@ -1118,11 +1146,8 @@ -try: - import ssl -except ImportError: - pass -else: +if HAVE_SSL: + class IMAP4_SSL(IMAP4): """IMAP4 client class over SSL connection