From f37b97c61b814d1b9fa4864ef5dd0040ebe30283 Mon Sep 17 00:00:00 2001 From: Nicolas Sebrecht Date: Tue, 8 Nov 2016 06:56:57 +0100 Subject: [PATCH] maxage: use the remote folder first to compute min_uid On each folder scan, we must compute the min_uid. Locally, this is done by relying on the prefix timestamp in the filenames. If for whatever reason they do not reflect the Date header of the email, changing maxage leads to undefined behaviour. To prevent from this, we rather rely on the remote folder. We assume that the remotes are more reliable to provide correct sets of UIDs based on dates than we are. Github-ref: https://github.com/OfflineIMAP/offlineimap/issues/384 Signed-off-by: Nicolas Sebrecht --- offlineimap/accounts.py | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/offlineimap/accounts.py b/offlineimap/accounts.py index c06ae3d..f50aa78 100644 --- a/offlineimap/accounts.py +++ b/offlineimap/accounts.py @@ -489,23 +489,21 @@ def syncfolder(account, remotefolder, quick): def cachemessagelists_upto_date(date): """Returns messages with uid > min(uids of messages newer than date).""" - # Warning: this makes sense only if the cached list is empty. - localfolder.cachemessagelist(min_date=date) - check_uid_validity() - # Local messagelist had date restriction applied already. Restrict - # sync to messages with UIDs >= min_uid from this list. - # - # Local messagelist might contain new messages (with uid's < 0). - positive_uids = [uid for uid in localfolder.getmessageuidlist() if uid > 0] - if len(positive_uids) > 0: - remotefolder.cachemessagelist(min_uid=min(positive_uids)) + remotefolder.cachemessagelist( + min_date=time.gmtime(time.mktime(date) + 24*60*60)) + uids = remotefolder.getmessageuidlist() + localfolder.dropmessagelistcache() + if len(uids) > 0: + localfolder.cachemessagelist(min_uid=min(uids)) else: - # No messages with UID > 0 in range in localfolder. - # date restriction was applied with respect to local dates but - # remote folder timezone might be different from local, so be - # safe and make sure the range isn't bigger than in local. - remotefolder.cachemessagelist( - min_date=time.gmtime(time.mktime(date) + 24*60*60)) + # Remote folder UIDs list is empty for the given range. We still + # might have valid local UIDs for this range (e.g.: new local + # emails). + localfolder.cachemessagelist(min_date=date) + uids = localfolder.getmessageuidlist() + if len(uids) > 0: + # Update the remote cache list for this new min(uids). + remotefolder.cachemessagelist(min_uid=min(uids)) def cachemessagelists_startdate(new, partial, date): """Retrieve messagelists when startdate has been set for