[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