]> code.delx.au - offlineimap/blobdiff - offlineimap/imapserver.py
Add support for ssl client certificates
[offlineimap] / offlineimap / imapserver.py
index 2f0119ee38117c434837b9f3cc8afb928ec9add6..7d99e19de2c7e9d6b13aa36f88db25ea425ab62a 100644 (file)
@@ -23,9 +23,6 @@ from threading import *
 import thread, hmac, os
 import base64
 
-from StringIO import StringIO
-from platform import system
-
 try:
     # do we have a recent pykerberos?
     have_gss = False
@@ -63,42 +60,10 @@ class UsefulIMAP4(UsefulIMAPMixIn, imaplib.IMAP4):
     def open(self, host = '', port = imaplib.IMAP4_PORT):
         imaplibutil.new_open(self, host, port)
 
-    # This is a hack around Darwin's implementation of realloc() (which
-    # Python uses inside the socket code). On Darwin, we split the
-    # message into 100k chunks, which should be small enough - smaller
-    # might start seriously hurting performance ...
-
-    def read(self, size):
-        if system() == 'Darwin':
-            read = 0
-            io = StringIO()
-            while read < size:
-                data = self.file.read(min(size-read,100000))
-                read += len(data)
-                io.write(data)
-            return io.getvalue()
-        else:
-            return self.file.read(size)
-
 class UsefulIMAP4_SSL(UsefulIMAPMixIn, imaplibutil.WrappedIMAP4_SSL):
     def open(self, host = '', port = imaplib.IMAP4_SSL_PORT):
         imaplibutil.new_open_ssl(self, host, port)
 
-    # This is the same hack as above, to be used in the case of an SSL
-    # connexion.
-
-    def read(self, size):
-        if system() == 'Darwin':
-            read = 0
-            io = StringIO()
-            while read < size:
-                data = self.sslobj.read(min(size-read,100000))
-                read += len(data)
-                io.write(data)
-            return io.getvalue()
-        else:
-            return self.sslobj.read(size)
-
 class UsefulIMAP4_Tunnel(UsefulIMAPMixIn, imaplibutil.IMAP4_Tunnel): pass
 
 class IMAPServer:
@@ -107,7 +72,7 @@ class IMAPServer:
     def __init__(self, config, reposname,
                  username = None, password = None, hostname = None,
                  port = None, ssl = 1, maxconnections = 1, tunnel = None,
-                 reference = '""'):
+                 reference = '""', sslclientcert = None, sslclientkey = None):
         self.reposname = reposname
         self.config = config
         self.username = username
@@ -118,6 +83,8 @@ class IMAPServer:
         self.tunnel = tunnel
         self.port = port
         self.usessl = ssl
+        self.sslclientcert = sslclientcert
+        self.sslclientkey = sslclientkey
         self.delim = None
         self.root = None
         if port == None:
@@ -253,7 +220,8 @@ class IMAPServer:
                 success = 1
             elif self.usessl:
                 UIBase.getglobalui().connecting(self.hostname, self.port)
-                imapobj = UsefulIMAP4_SSL(self.hostname, self.port)
+                imapobj = UsefulIMAP4_SSL(self.hostname, self.port,
+                                          self.sslclientkey, self.sslclientcert)
             else:
                 UIBase.getglobalui().connecting(self.hostname, self.port)
                 imapobj = UsefulIMAP4(self.hostname, self.port)
@@ -395,6 +363,8 @@ class ConfigedIMAPServer(IMAPServer):
             user = self.repos.getuser()
             port = self.repos.getport()
             ssl = self.repos.getssl()
+            sslclientcert = self.repos.getsslclientcert()
+            sslclientkey = self.repos.getsslclientkey()
         reference = self.repos.getreference()
         server = None
         password = None
@@ -414,4 +384,6 @@ class ConfigedIMAPServer(IMAPServer):
             IMAPServer.__init__(self, self.config, self.repos.getname(),
                                 user, password, host, port, ssl,
                                 self.repos.getmaxconnections(),
-                                reference = reference)
+                                reference = reference,
+                                sslclientcert = sslclientcert,
+                                sslclientkey = sslclientkey)