[CalendarServer-changes] [2784] CalendarServer/branches/users/sagen/mailgateway-implicit-2745

source_changes at macosforge.org source_changes at macosforge.org
Thu Aug 7 11:24:43 PDT 2008


Revision: 2784
          http://trac.macosforge.org/projects/calendarserver/changeset/2784
Author:   sagen at apple.com
Date:     2008-08-07 11:24:42 -0700 (Thu, 07 Aug 2008)
Log Message:
-----------
IMAP now works; I also now check to see if any new messages have come in before I hang up.

Included is a patch for the twisted imap4 client as found at:
http://twistedmatrix.com/trac/ticket/1105

Modified Paths:
--------------
    CalendarServer/branches/users/sagen/mailgateway-implicit-2745/twistedcaldav/mail.py

Added Paths:
-----------
    CalendarServer/branches/users/sagen/mailgateway-implicit-2745/lib-patches/Twisted/twisted.mail.imap4.patch

Added: CalendarServer/branches/users/sagen/mailgateway-implicit-2745/lib-patches/Twisted/twisted.mail.imap4.patch
===================================================================
--- CalendarServer/branches/users/sagen/mailgateway-implicit-2745/lib-patches/Twisted/twisted.mail.imap4.patch	                        (rev 0)
+++ CalendarServer/branches/users/sagen/mailgateway-implicit-2745/lib-patches/Twisted/twisted.mail.imap4.patch	2008-08-07 18:24:42 UTC (rev 2784)
@@ -0,0 +1,50 @@
+Index: twisted/mail/imap4.py
+===================================================================
+--- twisted/mail/imap4.py	(revision 19773)
++++ twisted/mail/imap4.py	(working copy)
+@@ -363,16 +363,11 @@
+         for L in self.lines:
+             names = parseNestedParens(L)
+             N = len(names)
++            # This section is patched as described in http://twistedmatrix.com/trac/ticket/1105
+             if (N >= 1 and names[0] in self._1_RESPONSES or
++                N >= 2 and names[1] in self._2_RESPONSES or
+                 N >= 2 and names[0] == 'OK' and isinstance(names[1], types.ListType) and names[1][0] in self._OK_RESPONSES):
+                 send.append(L)
+-            elif N >= 3 and names[1] in self._2_RESPONSES:
+-                if isinstance(names[2], list) and len(names[2]) >= 1 and names[2][0] == 'FLAGS' and 'FLAGS' not in self.args:
+-                    unuse.append(L)
+-                else:
+-                    send.append(L)
+-            elif N >= 2 and names[1] in self._2_RESPONSES:
+-                send.append(L)
+             else:
+                 unuse.append(L)
+         d, self.defer = self.defer, None
+@@ -3336,6 +3331,8 @@
+                             if len(data) < 2:
+                                 raise IllegalServerResponse("Not enough arguments", data)
+                             flags.setdefault(id, {})[data[0]] = data[1]
++                            if data[0] == 'FLAGS':
++                                self.flagsChanged({id: data[1]})
+                             del data[:2]
+                 else:
+                     print '(2)Ignoring ', parts
+@@ -3431,7 +3428,16 @@
+                     except ValueError:
+                         raise IllegalServerResponse, line
+                     else:
+-                        info[id] = parseNestedParens(parts[2])
++                        data = parseNestedParens(parts[2])[0]
++                        # This section is patched as described in http://twistedmatrix.com/trac/ticket/1105
++                        # XXX this will fail if 'FLAGS' is a retrieved part
++                        for i in range(len(data) -1):
++                            if data[i] == 'FLAGS':
++                                self.flagsChanged({id: data[i+1]})
++                                del data[i:i+2]
++                                break
++                        if data:
++                            info.setdefault(id, []).append(data)
+         return info
+ 
+     def _fetch(self, messages, useUID=0, **terms):

Modified: CalendarServer/branches/users/sagen/mailgateway-implicit-2745/twistedcaldav/mail.py
===================================================================
--- CalendarServer/branches/users/sagen/mailgateway-implicit-2745/twistedcaldav/mail.py	2008-08-07 15:26:18 UTC (rev 2783)
+++ CalendarServer/branches/users/sagen/mailgateway-implicit-2745/twistedcaldav/mail.py	2008-08-07 18:24:42 UTC (rev 2784)
@@ -474,7 +474,6 @@
     def __init__(self):
         self.db = MailGatewayTokensDatabase(config.DataRoot)
 
-    @inlineCallbacks
     def inbound(self, message):
         parsedMessage = email.message_from_string(message)
         self.log_info("Mail gateway received message %s from %s to %s" %
@@ -502,7 +501,7 @@
                 calBody = part.get_payload(decode=True)
                 break
         else:
-            # No icalendear attachment
+            # No icalendar attachment
             self.log_error("Mail gateway didn't find an icalendar attachment in message %s" % (parsedMessage['Message-ID'],))
             return
 
@@ -520,7 +519,7 @@
         organizer = str(organizer)
         attendee = str(attendee)
         calendar.getOrganizerProperty().setValue(organizer)
-        yield injectMessage(organizer, attendee, calendar,
+        return injectMessage(organizer, attendee, calendar,
             parsedMessage['Message-ID'])
 
 
@@ -842,12 +841,11 @@
         self.log_info("POP factory connection failed")
         self.retry(connector)
 
-    @inlineCallbacks
     def handleMessage(self, message):
         self.log_debug("POP factory handle message")
         self.log_debug(message)
 
-        yield self.mailer.inbound(message)
+        return self.mailer.inbound(message)
 
 
 
@@ -883,32 +881,38 @@
 
     def serverGreeting(self, capabilities):
         self.log_debug("IMAP servergreeting")
-        return self.login(self.factory.settings["Username"],
-            self.factory.settings["Password"]).addCallback(self.cbLoggedIn)
+        login = self.login(self.factory.settings["Username"],
+            self.factory.settings["Password"])
+        login.addCallback(self.cbLoggedIn)
+        login.addErrback(self.ebLoginFailed)
 
     def ebLogError(self, error):
         self.log_error("IMAP Error: %s" % (error,))
 
-    def cbLoginFailed(self, reason):
+    def ebLoginFailed(self, reason):
         self.log_error("IMAP login failed for %s" %
             (self.factory.settings["Username"],))
-        return self.transport.loseConnection()
+        self.transport.loseConnection()
 
     def cbLoggedIn(self, result):
         self.log_debug("IMAP logged in [%s]" % (self.state,))
-        return self.select("Inbox").addCallback(self.cbInboxSelected)
+        self.select("Inbox").addCallback(self.cbInboxSelected)
 
     def cbInboxSelected(self, result):
         self.log_debug("IMAP Inbox selected [%s]" % (self.state,))
         allMessages = imap4.MessageSet(1, None)
-        return self.fetchUID(allMessages, True).addCallback(self.cbGotUIDs)
+        self.fetchUID(allMessages, True).addCallback(self.cbGotUIDs)
 
     def cbGotUIDs(self, results):
         self.log_debug("IMAP got uids [%s]" % (self.state,))
         self.messageUIDs = [result['UID'] for result in results.values()]
         self.messageCount = len(self.messageUIDs)
         self.log_debug("IMAP Inbox has %d messages" % (self.messageCount,))
-        return self.fetchNextMessage()
+        if self.messageCount:
+            self.fetchNextMessage()
+        else:
+            # No messages; close it out
+            self.close().addCallback(self.cbClosed)
 
     def fetchNextMessage(self):
         self.log_debug("IMAP in fetchnextmessage [%s]" % (self.state,))
@@ -918,23 +922,33 @@
             self.log_debug("Downloading message %d of %d (%s)" %
                 (self.messageCount - len(self.messageUIDs), self.messageCount,
                 nextUID))
-            return self.fetchMessage(messageListToFetch, True).addCallback(
+            self.fetchMessage(messageListToFetch, True).addCallback(
                 self.cbGotMessage, messageListToFetch).addErrback(self.ebLogError)
         else:
-            self.log_debug("All messages downloaded")
-            return self.close().addCallback(self.cbClosed)
+            self.log_debug("Seeing if anything new has arrived")
+            # Go back and see if any more messages have come in
+            self.expunge().addCallback(self.cbInboxSelected)
 
     def cbGotMessage(self, results, messageList):
         self.log_debug("IMAP in cbGotMessage [%s]" % (self.state,))
         try:
             messageData = results.values()[0]['RFC822']
         except IndexError:
-            # not sure what happened, but results is empty
-            self.log_error("Skipping empty results")
-            return self.fetchNextMessage()
+            # results will be empty unless the "twistedmail-imap-flags-anywhere"
+            # patch from http://twistedmatrix.com/trac/ticket/1105 is applied
+            self.log_error("Skipping empty results -- apply twisted patch!")
+            self.fetchNextMessage()
+            return
 
-        self.factory.handleMessage(messageData)
-        return self.addFlags(messageList, ("\\Deleted",),
+        d = self.factory.handleMessage(messageData)
+        if d:
+            d.addCallback(self.cbFlagDeleted, messageList)
+        else:
+            # No deferred returned, so no need for addCallback( )
+            self.cbFlagDeleted(None, messageList)
+
+    def cbFlagDeleted(self, results, messageList):
+        self.addFlags(messageList, ("\\Deleted",),
             uid=True).addCallback(self.cbMessageDeleted, messageList)
 
     def cbMessageDeleted(self, results, messageList):
@@ -945,9 +959,13 @@
     def cbClosed(self, results):
         self.log_debug("IMAP in cbClosed [%s]" % (self.state,))
         self.log_debug("Mailbox closed")
-        return self.logout().addCallback(
+        self.logout().addCallback(
             lambda _: self.transport.loseConnection())
 
+    def rawDataReceived(self, data):
+        self.log_debug("RAW RECEIVED: %s" % (data,))
+        imap4.IMAP4Client.rawDataReceived(self, data)
+
     def lineReceived(self, line):
         self.log_debug("RECEIVED: %s" % (line,))
         imap4.IMAP4Client.lineReceived(self, line)
@@ -974,7 +992,7 @@
         self.log_debug("IMAP factory handle message")
         self.log_debug(message)
 
-        yield self.mailer.inbound(message)
+        return self.mailer.inbound(message)
 
 
     def retry(self, connector=None):
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080807/5fb2c8d8/attachment-0001.html 


More information about the calendarserver-changes mailing list