]> code.delx.au - offlineimap/blobdiff - offlineimap/repository/IMAP.py
Add support for ssl client certificates
[offlineimap] / offlineimap / repository / IMAP.py
index 8548b6d9cdf800dc0cfe21b780ddb4ffaad7be69..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
 from offlineimap import folder, imaputil, imapserver
 from offlineimap.folder.UIDMaps import MappedIMAPFolder
 from offlineimap.threadutil import ExitNotifyThread
-import re, types, os
+import re, types, os, netrc, errno
 from threading import *
 
 class IMAPRepository(BaseRepository):
 from threading import *
 
 class IMAPRepository(BaseRepository):
@@ -85,10 +85,39 @@ class IMAPRepository(BaseRepository):
         return self.imapserver.delim
 
     def gethost(self):
         return self.imapserver.delim
 
     def gethost(self):
-        return self.getconf('remotehost')
+        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('remotehost')
+        if host != None:
+            return host
 
     def getuser(self):
 
     def getuser(self):
-        return self.getconf('remoteuser')
+        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('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)
 
     def getport(self):
         return self.getconfint('remoteport', None)
@@ -96,6 +125,12 @@ class IMAPRepository(BaseRepository):
     def getssl(self):
         return self.getconfboolean('ssl', 0)
 
     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)
 
     def getpreauthtunnel(self):
         return self.getconf('preauthtunnel', None)
 
@@ -109,6 +144,14 @@ class IMAPRepository(BaseRepository):
         return self.getconfboolean('expunge', 1)
 
     def getpassword(self):
         return self.getconfboolean('expunge', 1)
 
     def getpassword(self):
+        passwd = None
+        localeval = self.localeval
+
+        if self.config.has_option(self.getsection(), 'remotepasseval'):
+            passwd = self.getconf('remotepasseval')
+        if passwd != None:
+            return localeval.eval(passwd)
+
         password = self.getconf('remotepass', None)
         if password != None:
             return password
         password = self.getconf('remotepass', None)
         if password != None:
             return password
@@ -118,6 +161,17 @@ class IMAPRepository(BaseRepository):
             password = fd.readline().strip()
             fd.close()
             return password
             password = fd.readline().strip()
             fd.close()
             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):
         return None
 
     def getfolder(self, foldername):
@@ -128,6 +182,13 @@ class IMAPRepository(BaseRepository):
     def getfoldertype(self):
         return folder.IMAP.IMAPFolder
 
     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
     def getfolders(self):
         if self.folders != None:
             return self.folders