[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