]> code.delx.au - offlineimap/blobdiff - offlineimap/repository/IMAP.py
Add support for ssl client certificates
[offlineimap] / offlineimap / repository / IMAP.py
index 33987e29cd4a5aecefd80acc78ec5adbb0ce6cc4..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,30 +85,39 @@ class IMAPRepository(BaseRepository):
         return self.imapserver.delim
 
     def gethost(self):
         return self.imapserver.delim
 
     def gethost(self):
-       host = None
+        host = None
         localeval = self.localeval
 
         if self.config.has_option(self.getsection(), 'remotehosteval'):
         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):
 
     def getuser(self):
-       user = None
+        user = None
         localeval = self.localeval
 
         if self.config.has_option(self.getsection(), 'remoteusereval'):
         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
+        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)
@@ -116,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)
 
@@ -129,13 +144,13 @@ class IMAPRepository(BaseRepository):
         return self.getconfboolean('expunge', 1)
 
     def getpassword(self):
         return self.getconfboolean('expunge', 1)
 
     def getpassword(self):
-       passwd = None
+        passwd = None
         localeval = self.localeval
 
         if self.config.has_option(self.getsection(), 'remotepasseval'):
         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:
 
         password = self.getconf('remotepass', None)
         if password != None:
@@ -145,7 +160,18 @@ class IMAPRepository(BaseRepository):
             fd = open(os.path.expanduser(passfile))
             password = fd.readline().strip()
             fd.close()
             fd = open(os.path.expanduser(passfile))
             password = fd.readline().strip()
             fd.close()
-           return password
+            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):
@@ -156,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