diff --git a/offlineimap.conf b/offlineimap.conf index b57b182..7af2e7e 100644 --- a/offlineimap.conf +++ b/offlineimap.conf @@ -801,7 +801,7 @@ remoteuser = username # limitations, if GSSAPI is set, it will be tried first, no matter where it was # specified in the list. # -#auth_mechanisms = GSSAPI, CRAM-MD5, XOAUTH2, PLAIN, LOGIN +#auth_mechanisms = GSSAPI, XOAUTH2, CRAM-MD5, PLAIN, LOGIN # This option stands in the [Repository RemoteExample] section. @@ -812,7 +812,9 @@ remoteuser = username # with type = IMAP for compatible servers. # # Mandatory parameters are "oauth2_client_id", "oauth2_client_secret" and -# either "oauth2_refresh_token" or "oauth2_access_token". +# either "oauth2_refresh_token" or "oauth2_access_token". XOAUTH2 mechanism +# won't be tried if both oauth2_refresh_token and oauth2_access_token are not +# set. # # See below to learn how to get those. # diff --git a/offlineimap/repository/Gmail.py b/offlineimap/repository/Gmail.py index a45d274..c7a0984 100644 --- a/offlineimap/repository/Gmail.py +++ b/offlineimap/repository/Gmail.py @@ -47,7 +47,7 @@ class GmailRepository(IMAPRepository): try: return super(GmailRepository, self).gethost() except OfflineImapError: - # nothing was configured, cache and return hardcoded one + # Nothing was configured, cache and return hardcoded one. self._host = GmailRepository.HOSTNAME return self._host @@ -60,10 +60,10 @@ class GmailRepository(IMAPRepository): url = super(GmailRepository, self).getoauth2_request_url() if url is None: # Nothing was configured, cache and return hardcoded one. - self._oauth2_request_url = GmailRepository.OAUTH2_URL + self.setoauth2_request_url(GmailRepository.OAUTH2_URL) else: - self._oauth2_request_url = url - return self._oauth2_request_url + self.setoauth2_request_url(url) + return self.oauth2_request_url def getport(self): return GmailRepository.PORT @@ -82,8 +82,8 @@ class GmailRepository(IMAPRepository): return folder.Gmail.GmailFolder def gettrashfolder(self, foldername): - #: Where deleted mail should be moved - return self.getconf('trashfolder','[Gmail]/Trash') + # Where deleted mail should be moved + return self.getconf('trashfolder', '[Gmail]/Trash') def getspamfolder(self): #: Gmail also deletes messages upon EXPUNGE in the Spam folder diff --git a/offlineimap/repository/IMAP.py b/offlineimap/repository/IMAP.py index 17655d5..87d0dd4 100644 --- a/offlineimap/repository/IMAP.py +++ b/offlineimap/repository/IMAP.py @@ -36,11 +36,11 @@ class IMAPRepository(BaseRepository): BaseRepository.__init__(self, reposname, account) # self.ui is being set by the BaseRepository self._host = None - self._oauth2_request_url = None + # Must be set before calling imapserver.IMAPServer(self) + self.oauth2_request_url = None self.imapserver = imapserver.IMAPServer(self) self.folders = None self.copy_ignore_eval = None - self.oauth2_request_url = None # Keep alive. self.kaevent = None self.kathread = None @@ -295,12 +295,15 @@ class IMAPRepository(BaseRepository): value = self.getconf('cert_fingerprint', "") return [f.strip().lower() for f in value.split(',') if f] - def getoauth2_request_url(self): - if self._oauth2_request_url: # Use cached value if possible. - return self._oauth2_request_url + def setoauth2_request_url(self, url): + self.oauth2_request_url = url - self.oauth2_request_url = self.getconf('oauth2_request_url', None) - return self._oauth2_request_url + def getoauth2_request_url(self): + if self.oauth2_request_url is not None: # Use cached value if possible. + return self.oauth2_request_url + + self.setoauth2_request_url(self.getconf('oauth2_request_url', None)) + return self.oauth2_request_url def getoauth2_refresh_token(self): refresh_token = self.getconf('oauth2_refresh_token', None)