[CalendarServer-changes] [7782] CalendarServer/trunk/twistedcaldav

source_changes at macosforge.org source_changes at macosforge.org
Wed Jul 13 09:43:29 PDT 2011


Revision: 7782
          http://trac.macosforge.org/projects/calendarserver/changeset/7782
Author:   sagen at apple.com
Date:     2011-07-13 09:43:28 -0700 (Wed, 13 Jul 2011)
Log Message:
-----------
Handle missing attachments in IMIP replies by getting email address for organizer from directory

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/mail.py
    CalendarServer/trunk/twistedcaldav/test/test_mail.py

Modified: CalendarServer/trunk/twistedcaldav/mail.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/mail.py	2011-07-12 21:58:46 UTC (rev 7781)
+++ CalendarServer/trunk/twistedcaldav/mail.py	2011-07-13 16:43:28 UTC (rev 7782)
@@ -71,7 +71,7 @@
 from twistedcaldav.util import AuthorizedHTTPGetter
 from twistedcaldav.stdconfig import DEFAULT_CONFIG, DEFAULT_CONFIG_FILE
 
-from calendarserver.tap.util import getRootResource
+from calendarserver.tap.util import getRootResource, directoryFromConfig
 
 
 __all__ = [
@@ -624,6 +624,7 @@
             dataRoot = config.DataRoot
         self.db = MailGatewayTokensDatabase(dataRoot)
         self.days = config.Scheduling['iMIP']['InvitationDaysToLive']
+        self.directory = directoryFromConfig(config)
 
     def purge(self):
         """
@@ -714,7 +715,7 @@
         self.log_warn("Mail gateway processing DSN %s" % (msgId,))
         return fn(organizer, attendee, calendar, msgId)
 
-    def processReply(self, msg, fn):
+    def processReply(self, msg, injectFunction, testMode=False):
         # extract the token from the To header
         name, addr = email.utils.parseaddr(msg['To'])
         if addr:
@@ -744,15 +745,25 @@
                 break
         else:
             # No icalendar attachment
-            self.log_error("Mail gateway didn't find an icalendar attachment in message %s" % (msg['Message-ID'],))
+            self.log_warn("Mail gateway didn't find an icalendar attachment in message %s" % (msg['Message-ID'],))
 
-            if not organizer.startswith("mailto:"):
+            toAddr = None
+            fromAddr = attendee[7:]
+
+            if organizer.startswith("mailto:"):
+                toAddr = organizer[7:]
+            elif organizer.startswith("urn:uuid:"):
+                guid = organizer[9:]
+                record = self.directory.recordWithGUID(guid)
+                if record and record.emailAddresses:
+                    toAddr = list(record.emailAddresses)[0]
+
+            if toAddr is None:
                 self.log_error("Don't have an email address for the organizer; ignoring reply.")
                 return
 
-            # Forward this email to organizer
-            toAddr = organizer[7:]
-            fromAddr = attendee[7:]
+            if testMode:
+                return (toAddr, fromAddr)
 
             settings = config.Scheduling["iMIP"]["Sending"]
             if settings["UseSSL"]:
@@ -775,6 +786,7 @@
                 requireTransportSecurity=settings["UseSSL"],
             )
 
+            self.log_warn("Mail gateway forwarding reply back to organizer")
             _reactor.connectTCP(settings["Server"], settings["Port"], factory)
             return deferred
 
@@ -810,7 +822,7 @@
             # the appropriate ATTENDEE.  This will require a new localizable
             # email template for the message.
 
-        return fn(organizer, attendee, calendar, msg['Message-ID'])
+        return injectFunction(organizer, attendee, calendar, msg['Message-ID'])
 
 
     def inbound(self, message, fn=injectMessage):

Modified: CalendarServer/trunk/twistedcaldav/test/test_mail.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_mail.py	2011-07-12 21:58:46 UTC (rev 7781)
+++ CalendarServer/trunk/twistedcaldav/test/test_mail.py	2011-07-13 16:43:28 UTC (rev 7782)
@@ -24,6 +24,7 @@
 import email
 from twistedcaldav.mail import MailHandler
 from twistedcaldav.mail import MailGatewayTokensDatabase
+from twistedcaldav.directory.directory import DirectoryRecord
 import os
 import datetime
 
@@ -195,10 +196,10 @@
         self.assertEquals(result, None)
 
         # Make sure a known token *is* processed
-        self.handler.db.createToken("mailto:user01 at example.com", "mailto:xyzzy at example.com", icaluid="1E71F9C8-AEDA-48EB-98D0-76E898F6BB5C", token="d7cdf68d-8b73-4df1-ad3b-f08002fb285f")
+        self.handler.db.createToken("urn:uuid:9DC04A70-E6DD-11DF-9492-0800200C9A66", "mailto:xyzzy at example.com", icaluid="1E71F9C8-AEDA-48EB-98D0-76E898F6BB5C", token="d7cdf68d-8b73-4df1-ad3b-f08002fb285f")
         organizer, attendee, calendar, msgId = self.handler.processReply(msg,
             echo)
-        self.assertEquals(organizer, 'mailto:user01 at example.com')
+        self.assertEquals(organizer, 'urn:uuid:9DC04A70-E6DD-11DF-9492-0800200C9A66')
         self.assertEquals(attendee, 'mailto:xyzzy at example.com')
         self.assertEquals(msgId, '<1983F777-BE86-4B98-881E-06D938E60920 at example.com>')
 
@@ -207,20 +208,20 @@
             file(os.path.join(self.dataDir, 'reply_missing_organizer')).read()
         )
         # stick the token in the database first
-        self.handler.db.createToken("mailto:user01 at example.com", "mailto:xyzzy at example.com", icaluid="1E71F9C8-AEDA-48EB-98D0-76E898F6BB5C", token="d7cdf68d-8b73-4df1-ad3b-f08002fb285f")
+        self.handler.db.createToken("urn:uuid:9DC04A70-E6DD-11DF-9492-0800200C9A66", "mailto:xyzzy at example.com", icaluid="1E71F9C8-AEDA-48EB-98D0-76E898F6BB5C", token="d7cdf68d-8b73-4df1-ad3b-f08002fb285f")
 
         organizer, attendee, calendar, msgId = self.handler.processReply(msg,
             echo)
         organizerProp = calendar.mainComponent().getOrganizerProperty()
         self.assertTrue(organizerProp is not None)
-        self.assertEquals(organizer, "mailto:user01 at example.com")
+        self.assertEquals(organizer, "urn:uuid:9DC04A70-E6DD-11DF-9492-0800200C9A66")
 
     def test_processReplyMissingAttendee(self):
         msg = email.message_from_string(
             file(os.path.join(self.dataDir, 'reply_missing_attendee')).read()
         )
         # stick the token in the database first
-        self.handler.db.createToken("mailto:user01 at example.com", "mailto:xyzzy at example.com", icaluid="1E71F9C8-AEDA-48EB-98D0-76E898F6BB5C", token="d7cdf68d-8b73-4df1-ad3b-f08002fb285f")
+        self.handler.db.createToken("urn:uuid:9DC04A70-E6DD-11DF-9492-0800200C9A66", "mailto:xyzzy at example.com", icaluid="1E71F9C8-AEDA-48EB-98D0-76E898F6BB5C", token="d7cdf68d-8b73-4df1-ad3b-f08002fb285f")
 
         organizer, attendee, calendar, msgId = self.handler.processReply(msg,
             echo)
@@ -231,7 +232,27 @@
         attendeeProp = calendar.mainComponent().getAttendeeProperty([attendee])
         self.assertEquals(attendeeProp.parameterValue("SCHEDULE-STATUS"), iTIPRequestStatus.SERVICE_UNAVAILABLE)
 
+    def test_processReplyMissingAttachment(self):
 
+        # Fake a directory record
+        record = DirectoryRecord(self.handler.directory, "users",
+            "9DC04A70-E6DD-11DF-9492-0800200C9A66", shortNames=("user01",),
+            emailAddresses=("user01 at example.com",))
+        record.enabled = True
+        self.handler.directory._tmpRecords["guids"]["9DC04A70-E6DD-11DF-9492-0800200C9A66"] = record
+
+        msg = email.message_from_string(
+            file(os.path.join(self.dataDir, 'reply_missing_attachment')).read()
+        )
+        # stick the token in the database first
+        self.handler.db.createToken("urn:uuid:9DC04A70-E6DD-11DF-9492-0800200C9A66", "mailto:xyzzy at example.com", icaluid="1E71F9C8-AEDA-48EB-98D0-76E898F6BB5C", token="d7cdf68d-8b73-4df1-ad3b-f08002fb285f")
+
+        self.assertEquals(
+            self.handler.processReply(msg, echo, testMode=True),
+            ("user01 at example.com", "xyzzy at example.com")
+        )
+
+
     @inlineCallbacks
     def test_outbound(self):
         """
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110713/c992246d/attachment.html>


More information about the calendarserver-changes mailing list