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'

Reply via email to