diff --git a/offlineimap/repository/Base.py b/offlineimap/repository/Base.py index 594f864..34f2f4a 100644 --- a/offlineimap/repository/Base.py +++ b/offlineimap/repository/Base.py @@ -21,7 +21,7 @@ import traceback from offlineimap import CustomConfig from offlineimap.ui import getglobalui -class BaseRepository(CustomConfig.ConfigHelperMixin): +class BaseRepository(object, CustomConfig.ConfigHelperMixin): def __init__(self, reposname, account): self.ui = getglobalui() self.account = account diff --git a/offlineimap/repository/Gmail.py b/offlineimap/repository/Gmail.py index 97637b8..fd95361 100644 --- a/offlineimap/repository/Gmail.py +++ b/offlineimap/repository/Gmail.py @@ -16,33 +16,37 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from offlineimap.repository.IMAP import IMAPRepository -from offlineimap import folder +from offlineimap import folder, OfflineImapError class GmailRepository(IMAPRepository): """Gmail IMAP repository. - Uses hard-coded host name and port, see: - http://mail.google.com/support/bin/answer.py?answer=78799&topic=12814 + Falls back to hard-coded gmail host name and port, if none were specified: + http://mail.google.com/support/bin/answer.py?answer=78799&topic=12814 """ - - #: Gmail IMAP server hostname + # Gmail IMAP server hostname HOSTNAME = "imap.gmail.com" - - #: Gmail IMAP server port + # Gmail IMAP server port PORT = 993 def __init__(self, reposname, account): """Initialize a GmailRepository object.""" - account.getconfig().set('Repository ' + reposname, - 'remotehost', GmailRepository.HOSTNAME) - account.getconfig().set('Repository ' + reposname, - 'remoteport', GmailRepository.PORT) + # Enforce SSL usage account.getconfig().set('Repository ' + reposname, 'ssl', 'yes') IMAPRepository.__init__(self, reposname, account) def gethost(self): - return GmailRepository.HOSTNAME + """Return the server name to connect to. + + Gmail implementation first checks for the usual IMAP settings + and falls back to imap.gmail.com if not specified.""" + try: + return super(GmailRepository, self).gethost() + except OfflineImapError: + # nothing was configured, cache and return hardcoded one + self._host = GmailRepository.HOSTNAME + return self._host def getport(self): return GmailRepository.PORT diff --git a/offlineimap/repository/IMAP.py b/offlineimap/repository/IMAP.py index 3517d88..82d9e32 100644 --- a/offlineimap/repository/IMAP.py +++ b/offlineimap/repository/IMAP.py @@ -17,7 +17,7 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from offlineimap.repository.Base import BaseRepository -from offlineimap import folder, imaputil, imapserver +from offlineimap import folder, imaputil, imapserver, OfflineImapError from offlineimap.folder.UIDMaps import MappedIMAPFolder from offlineimap.threadutil import ExitNotifyThread from threading import Event @@ -32,6 +32,7 @@ class IMAPRepository(BaseRepository): """Initialize an IMAPRepository object.""" BaseRepository.__init__(self, reposname, account) # self.ui is being set by the BaseRepository + self._host = None self.imapserver = imapserver.ConfigedIMAPServer(self) self.folders = None self.nametrans = lambda foldername: foldername @@ -94,17 +95,34 @@ class IMAPRepository(BaseRepository): return self.imapserver.delim def gethost(self): - host = None - localeval = self.localeval + """Return the configured hostname to connect to + :returns: hostname as string or throws Exception""" + if self._host: # use cached value if possible + return self._host + + # 1) check for remotehosteval setting if self.config.has_option(self.getsection(), 'remotehosteval'): host = self.getconf('remotehosteval') + try: + host = self.localeval.eval(host) + except Exception, e: + raise OfflineImapError("remotehosteval option for repository "\ + "'%s' failed:\n%s" % (self, e), + OfflineImapError.ERROR.REPO) + if host: + self._host = host + return self._host + # 2) check for plain remotehost setting + host = self.getconf('remotehost', None) if host != None: - return localeval.eval(host) + self._host = host + return self._host - host = self.getconf('remotehost') - if host != None: - return host + # no success + raise OfflineImapError("No remote host for repository "\ + "'%s' specified." % self, + OfflineImapError.ERROR.REPO) def getuser(self): user = None