Package tlslite :: Package integration :: Module imap4_tls |
[hide private]
[frames] | no frames]

# Source Code for Module tlslite.integration.imap4_tls

     1  # Author: Trevor Perrin
     2  # See the LICENSE file for legal information regarding use of this file.
     3
     4  """TLS Lite + imaplib."""
     5
     6  import socket
     7  from imaplib import IMAP4
     8  from tlslite.tlsconnection import TLSConnection
     9  from tlslite.integration.clienthelper import ClientHelper
    10
    11  # IMAP TLS PORT
    12  IMAP4_TLS_PORT = 993
    13
    14 -class IMAP4_TLS(IMAP4, ClientHelper):
    15      """This class extends L{imaplib.IMAP4} with TLS support."""
    16
    17 -    def __init__(self, host = '', port = IMAP4_TLS_PORT,
    18                   username=None, password=None,
    19                   certChain=None, privateKey=None,
    20                   checker=None,
    21                   settings=None):
    22          """Create a new IMAP4_TLS.
    23
    24          For client authentication, use one of these argument
    25          combinations:
    26           - username, password (SRP)
    27           - certChain, privateKey (certificate)
    28
    29          For server authentication, you can either rely on the
    30          implicit mutual authentication performed by SRP
    31          or you can do certificate-based server
    32          authentication with one of these argument combinations:
    33           - x509Fingerprint
    34
    35          Certificate-based server authentication is compatible with
    36          SRP or certificate-based client authentication.
    37
    38          The caller should be prepared to handle TLS-specific
    39          exceptions.  See the client handshake functions in
    40          L{tlslite.TLSConnection.TLSConnection} for details on which
    41          exceptions might be raised.
    42
    43          @type host: str
    44          @param host: Server to connect to.
    45
    46          @type port: int
    47          @param port: Port to connect to.
    48
    49          @type username: str
    50          @param username: SRP username.  Requires the
    51          'password' argument.
    52
    53          @type password: str
    54          @param password: SRP password for mutual authentication.
    55          Requires the 'username' argument.
    56
    57          @type certChain: L{tlslite.x509certchain.X509CertChain}
    58          @param certChain: Certificate chain for client authentication.
    59          Requires the 'privateKey' argument.  Excludes the SRP arguments.
    60
    61          @type privateKey: L{tlslite.utils.rsakey.RSAKey}
    62          @param privateKey: Private key for client authentication.
    63          Requires the 'certChain' argument.  Excludes the SRP arguments.
    64
    65          @type checker: L{tlslite.checker.Checker}
    66          @param checker: Callable object called after handshaking to
    67          evaluate the connection and raise an Exception if necessary.
    68
    69          @type settings: L{tlslite.handshakesettings.HandshakeSettings}
    70          @param settings: Various settings which can be used to control
    71          the ciphersuites, certificate types, and SSL/TLS versions
    72          offered by the client.
    73          """
    74
    75          ClientHelper.__init__(self,
    76                   username, password,
    77                   certChain, privateKey,
    78                   checker,
    79                   settings)
    80
    81          IMAP4.__init__(self, host, port)
    82
    83
    84 -    def open(self, host = '', port = IMAP4_TLS_PORT):
    85          """Setup connection to remote server on "host:port".
    86
    87          This connection will be used by the routines:
    88          read, readline, send, shutdown.
    89          """
    90          self.host = host
    91          self.port = port
    92          self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    93          self.sock.connect((host, port))
    94          self.sock = TLSConnection(self.sock)
    95          ClientHelper._handshake(self, self.sock)
    96          self.file = self.sock.makefile('rb')
    97