Proper error handling for SEARCH and FETCH failures from the server

SEARCH and FETCH were never checking that the IMAP server actually
returned OK. Throw OfflineImapErrors at severity FOLDER in case one of
them fails.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
Signed-off-by: Nicolas Sebrecht <nicolas.s-dev@laposte.net>
This commit is contained in:
Sebastian Spaeth 2011-08-18 09:08:56 +02:00 committed by Nicolas Sebrecht
parent f755c8b423
commit 3302940382

View File

@ -144,15 +144,28 @@ class IMAPFolder(BaseFolder):
search_cond += ")" search_cond += ")"
res_type, res_data = imapobj.search(None, search_cond) res_type, res_data = imapobj.search(None, search_cond)
# Result UIDs seperated by space, coalesce into ranges if res_type != 'OK':
messagesToFetch = imaputil.uid_sequence(res_data.split()) raise OfflineImapError("SEARCH in folder [%s]%s failed. "
if not messagesToFetch: "Search string was '%s'. Server responded '[%s] %s'" % (
self.getrepository(), self,
search_cond, res_type, res_data),
OfflineImapError.ERROR.FOLDER)
# Result UIDs are seperated by space, coalesce into ranges
msgsToFetch = imaputil.uid_sequence(res_data.split())
if not msgsToFetch:
return # No messages to sync return # No messages to sync
# Get the flags and UIDs for these. single-quotes prevent # Get the flags and UIDs for these. single-quotes prevent
# imaplib2 from quoting the sequence. # imaplib2 from quoting the sequence.
res_type, response = imapobj.fetch("'%s'" % msgsToFetch, res_type, response = imapobj.fetch("'%s'" % msgsToFetch,
'(FLAGS UID)') '(FLAGS UID)')
if res_type != 'OK':
raise OfflineImapError("FETCHING UIDs in folder [%s]%s failed. "
"Server responded '[%s] %s'" % (
self.getrepository(), self,
res_type, response),
OfflineImapError.ERROR.FOLDER)
finally: finally:
self.imapserver.releaseconnection(imapobj) self.imapserver.releaseconnection(imapobj)