Skip to content

Commit

Permalink
maxage: use the remote folder first to compute min_uid
Browse files Browse the repository at this point in the history
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: #384
Signed-off-by: Nicolas Sebrecht <nicolas.s-dev@laposte.net>
  • Loading branch information
nicolas33 committed May 20, 2017
1 parent d1e770f commit f37b97c
Showing 1 changed file with 14 additions and 16 deletions.
30 changes: 14 additions & 16 deletions offlineimap/accounts.py
Original file line number Diff line number Diff line change
Expand Up @@ -489,23 +489,21 @@ def check_uid_validity():
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
Expand Down

0 comments on commit f37b97c

Please sign in to comment.