Package: getmail4 Followup-For: Bug #462020 Revised patch, which fixes the flag parsing to cover a corner case I missed in the previous version.
- Josh Triplett -- System Information: Debian Release: lenny/sid APT prefers unstable APT policy: (500, 'unstable'), (1, 'experimental') Architecture: i386 (i686) Kernel: Linux 2.6.23-1-686 (SMP w/1 CPU core) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash
diff -Naur getmail4-4.7.7.orig/getmailcore/_retrieverbases.py getmail4-4.7.7/getmailcore/_retrieverbases.py --- getmail4-4.7.7.orig/getmailcore/_retrieverbases.py 2007-08-08 07:17:15.000000000 -0700 +++ getmail4-4.7.7/getmailcore/_retrieverbases.py 2008-01-25 12:56:35.000000000 -0800 @@ -646,19 +646,25 @@ try: parts = line[line.index('(') + 1:line.rindex(')')].split() while parts: - # Flags starts a parenthetical list of valueless flags - if parts[0].lower() == 'flags' and parts[1].startswith('('): - while parts and not parts[0].endswith(')'): - del parts[0] - if parts: - # Last one, ends with ")" - del parts[0] - continue - if len(parts) == 1: - # Leftover part -- not name, value pair. - raise ValueError name = parts.pop(0).lower() - r[name] = parts.pop(0) + # Flags starts a parenthetical list of valueless flags + if name == 'flags': + if not parts[0].startswith('('): + raise ValueError + if parts[0].endswith(')'): + flag = parts.pop(0)[1:-1] + if flag == '': + r[name] = [] + else: + r[name] = [flag] + continue + flaglist = [parts.pop(0)[1:].lower()] + while not parts[0].endswith(')'): + flaglist.append(parts.pop(0).lower()) + flaglist.append(parts.pop(0)[:-1].lower()) + r[name] = flaglist + else: + r[name] = parts.pop(0) except (ValueError, IndexError), o: raise getmailOperationError('IMAP error (failed to parse' ' UID response line "%s")' % line) @@ -696,11 +702,14 @@ # Get number of messages in mailbox msgcount = self._selectmailbox(mailbox) if msgcount: - # Get UIDs and sizes for all messages in mailbox + # Get UIDs, sizes, and flags for all messages in mailbox response = self._parse_imapcmdresponse('FETCH', - '1:%d' % msgcount, '(UID RFC822.SIZE)') + '1:%d' % msgcount, '(UID RFC822.SIZE FLAGS)') for line in response: r = self._parse_imapattrresponse(line) + if (self.conf['ignore_deleted'] + and '\\deleted' in r['flags']): + continue msgid = ('%s/%s/%s' % (self.uidvalidity, mailbox, r['uid'])) self._mboxuids[msgid] = (mailbox, r['uid']) diff -Naur getmail4-4.7.7.orig/getmailcore/retrievers.py getmail4-4.7.7/getmailcore/retrievers.py --- getmail4-4.7.7.orig/getmailcore/retrievers.py 2006-06-21 08:46:05.000000000 -0700 +++ getmail4-4.7.7/getmailcore/retrievers.py 2008-01-25 12:53:51.000000000 -0800 @@ -359,6 +359,7 @@ # imaplib.IMAP4.login_cram_md5() requires the (unimplemented) # .authenticate(), so we can't do this yet (?). ConfBool(name='use_cram_md5', required=False, default=False), + ConfBool(name='ignore_deleted', required=False, default=False), ) received_from = None received_with = 'IMAP4' @@ -398,6 +399,7 @@ # imaplib.IMAP4.login_cram_md5() requires the (unimplemented) # .authenticate(), so we can't do this yet (?). ConfBool(name='use_cram_md5', required=False, default=False), + ConfBool(name='ignore_deleted', required=False, default=False), ) received_from = None received_with = 'IMAP4-SSL' @@ -435,6 +437,7 @@ # .authenticate(), so we can't do this yet (?). ConfBool(name='use_cram_md5', required=False, default=False), ConfString(name='envelope_recipient'), + ConfBool(name='ignore_deleted', required=False, default=False), ) received_from = None received_with = 'IMAP4' @@ -475,6 +478,7 @@ # .authenticate(), so we can't do this yet (?). ConfBool(name='use_cram_md5', required=False, default=False), ConfString(name='envelope_recipient'), + ConfBool(name='ignore_deleted', required=False, default=False), ) received_from = None received_with = 'IMAP4-SSL'