]> code.delx.au - offlineimap/blobdiff - offlineimap/repository/IMAP.py
Add support for ssl client certificates
[offlineimap] / offlineimap / repository / IMAP.py
index f0e23e7a6b47574e9047b4528a9707e8a3d06335..e5be9eefaf4d24c4bdad3d3be5da96a3e95bd534 100644 (file)
@@ -20,7 +20,7 @@ from Base import BaseRepository
 from offlineimap import folder, imaputil, imapserver
 from offlineimap.folder.UIDMaps import MappedIMAPFolder
 from offlineimap.threadutil import ExitNotifyThread
-import re, types, os, netrc
+import re, types, os, netrc, errno
 from threading import *
 
 class IMAPRepository(BaseRepository):
@@ -85,33 +85,39 @@ class IMAPRepository(BaseRepository):
         return self.imapserver.delim
 
     def gethost(self):
-       host = None
+        host = None
         localeval = self.localeval
 
         if self.config.has_option(self.getsection(), 'remotehosteval'):
-           host = self.getconf('remotehosteval')
-       if host != None:
-           return localeval.eval(host)
+            host = self.getconf('remotehosteval')
+        if host != None:
+            return localeval.eval(host)
 
-       host = self.getconf('remotehost')
-       if host != None:
-           return host
+        host = self.getconf('remotehost')
+        if host != None:
+            return host
 
     def getuser(self):
-       user = None
+        user = None
         localeval = self.localeval
 
         if self.config.has_option(self.getsection(), 'remoteusereval'):
-           user = self.getconf('remoteusereval')
-       if user != None:
-           return localeval.eval(user)
+            user = self.getconf('remoteusereval')
+        if user != None:
+            return localeval.eval(user)
 
-       user = self.getconf('remoteuser')
-       if user != None:
-           return user
-        netrcentry = netrc.netrc().authentificator(self.gethost())
-        if netrcentry:
-            return netrcentry[0]
+        user = self.getconf('remoteuser')
+        if user != None:
+            return user
+
+        try:
+            netrcentry = netrc.netrc().authentificator(self.gethost())
+        except IOError, inst:
+            if inst.errno != errno.ENOENT:
+                raise
+        else:
+            if netrcentry:
+                return netrcentry[0]
 
     def getport(self):
         return self.getconfint('remoteport', None)
@@ -119,6 +125,12 @@ class IMAPRepository(BaseRepository):
     def getssl(self):
         return self.getconfboolean('ssl', 0)
 
+    def getsslclientcert(self):
+        return self.getconf('sslclientcert', None)
+
+    def getsslclientkey(self):
+        return self.getconf('sslclientkey', None)
+
     def getpreauthtunnel(self):
         return self.getconf('preauthtunnel', None)
 
@@ -132,13 +144,13 @@ class IMAPRepository(BaseRepository):
         return self.getconfboolean('expunge', 1)
 
     def getpassword(self):
-       passwd = None
+        passwd = None
         localeval = self.localeval
 
         if self.config.has_option(self.getsection(), 'remotepasseval'):
-           passwd = self.getconf('remotepasseval')
-       if passwd != None:
-           return localeval.eval(passwd)
+            passwd = self.getconf('remotepasseval')
+        if passwd != None:
+            return localeval.eval(passwd)
 
         password = self.getconf('remotepass', None)
         if password != None:
@@ -148,12 +160,18 @@ class IMAPRepository(BaseRepository):
             fd = open(os.path.expanduser(passfile))
             password = fd.readline().strip()
             fd.close()
-           return password
-        netrcentry = netrc.netrc().authenticators(self.gethost())
-        if netrcentry:
-           user = self.getconf('remoteuser')
-            if user == None or user == netrcentry[0]:
-                return netrcentry[2]
+            return password
+
+        try:
+            netrcentry = netrc.netrc().authenticators(self.gethost())
+        except IOError, inst:
+            if inst.errno != errno.ENOENT:
+                raise
+        else:
+            if netrcentry:
+                user = self.getconf('remoteuser')
+                if user == None or user == netrcentry[0]:
+                    return netrcentry[2]
         return None
 
     def getfolder(self, foldername):
@@ -164,6 +182,13 @@ class IMAPRepository(BaseRepository):
     def getfoldertype(self):
         return folder.IMAP.IMAPFolder
 
+    def connect(self):
+        imapobj = self.imapserver.acquireconnection()
+        self.imapserver.releaseconnection(imapobj)
+
+    def forgetfolders(self):
+        self.folders = None
+
     def getfolders(self):
         if self.folders != None:
             return self.folders