[PATCH] Unbreak getting password from UI

Sebastian Sebastian at SSpaeth.de
Mon Dec 13 17:36:24 GMT 2010


Commit 9239a2d3268e155d13c9 broke getting the password from the UI. This
unbreaks the change and adds some extended documentation and cleanups in
the functino en-passent.

Signed-Off-By: Sebastian Spaeth <Sebastian at SSpaeth.de>
---
This one replaces the patch [PATCH 2/2] Don't fail mysteriously if we cannot get a password

 offlineimap/imapserver.py      |    4 ++--
 offlineimap/repository/IMAP.py |   28 +++++++++++++++++++++-------
 2 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/offlineimap/imapserver.py b/offlineimap/imapserver.py
index 74f1a27..d9dd6ba 100644
--- a/offlineimap/imapserver.py
+++ b/offlineimap/imapserver.py
@@ -176,7 +176,7 @@ class IMAPServer:
         challenge = response.strip()
         ui.debug('imap', 'md5handler: got challenge %s' % challenge)
 
-        passwd = self.repos.getpassword()
+        passwd = self.getpassword()
         retval = self.username + ' ' + hmac.new(passwd, challenge).hexdigest()
         ui.debug('imap', 'md5handler: returning %s' % retval)
         return retval
@@ -184,7 +184,7 @@ class IMAPServer:
     def plainauth(self, imapobj):
         UIBase.getglobalui().debug('imap',
                                    'Attempting plain authentication')
-        imapobj.login(self.username, self.repos.getpassword())
+        imapobj.login(self.username, self.getpassword())
 
     def gssauth(self, response):
         data = base64.b64encode(response)
diff --git a/offlineimap/repository/IMAP.py b/offlineimap/repository/IMAP.py
index 789a64c..52a8e61 100644
--- a/offlineimap/repository/IMAP.py
+++ b/offlineimap/repository/IMAP.py
@@ -152,24 +152,35 @@ class IMAPRepository(BaseRepository):
         return self.getconfboolean('expunge', 1)
 
     def getpassword(self):
-        passwd = None
-        localeval = self.localeval
+        """Return the IMAP password for this repository.
 
-        if self.config.has_option(self.getsection(), 'remotepasseval'):
-            passwd = self.getconf('remotepasseval')
-        if passwd != None:
-            return localeval.eval(passwd)
+        It tries to get passwords in the following order:
+
+        1. evaluate Repository 'remotepasseval'
+        2. read password from Repository 'remotepass'
+        3. read password from file specified in Repository 'remotepassfile'
+        4. read password from ~/.netrc
+        5. read password from /etc/netrc
 
+        On success we return the password.
+        If all strategies fail we return None.
+        """
+        # 1. evaluate Repository 'remotepasseval'
+        passwd = self.getconf('remotepasseval', None)
+        if passwd != None:
+            return self.localeval.eval(passwd)
+        # 2. read password from Repository 'remotepass'
         password = self.getconf('remotepass', None)
         if password != None:
             return password
+        # 3. read password from file specified in Repository 'remotepassfile'
         passfile = self.getconf('remotepassfile', None)
         if passfile != None:
             fd = open(os.path.expanduser(passfile))
             password = fd.readline().strip()
             fd.close()
             return password
-
+        # 4. read password from ~/.netrc
         try:
             netrcentry = netrc.netrc().authenticators(self.gethost())
         except IOError, inst:
@@ -180,6 +191,7 @@ class IMAPRepository(BaseRepository):
                 user = self.getconf('remoteuser')
                 if user == None or user == netrcentry[0]:
                     return netrcentry[2]
+        # 5. read password from /etc/netrc
         try:
             netrcentry = netrc.netrc('/etc/netrc').authenticators(self.gethost())
         except IOError, inst:
@@ -190,8 +202,10 @@ class IMAPRepository(BaseRepository):
                 user = self.getconf('remoteuser')
                 if user == None or user == netrcentry[0]:
                     return netrcentry[2]
+        # no strategy yielded a password!
         return None
 
+
     def getfolder(self, foldername):
         return self.getfoldertype()(self.imapserver, foldername,
                                     self.nametrans(foldername),
-- 
1.7.1





More information about the OfflineIMAP-project mailing list