# HG changeset patch # User Paul Boddie # Date 1418233547 -3600 # Node ID 39509f7669d4b88c29258645e144ee16483b769b # Parent d52e08731368b4343e1bde5a8b597d5d2ec70b82 Introduced address and URI normalisation for organisers and attendees. (This helps with the processing of Claws Mail vCalendar plugin messages.) diff -r d52e08731368 -r 39509f7669d4 imiptools/__init__.py --- a/imiptools/__init__.py Wed Dec 10 18:42:08 2014 +0100 +++ b/imiptools/__init__.py Wed Dec 10 18:45:47 2014 +0100 @@ -1,7 +1,7 @@ #!/usr/bin/env python from email import message_from_file -from imiptools.content import handle_itip_part +from imiptools.content import get_addresses, handle_itip_part from imiptools.mail import Messenger import sys @@ -41,8 +41,8 @@ """ msg = message_from_file(f) - senders = msg.get_all("Reply-To") or msg.get_all("From") - original_recipients = original_recipients or get_all_values(msg, "To") + senders = get_addresses(msg.get_all("Reply-To") or msg.get_all("From")) + original_recipients = original_recipients or get_addresses(get_all_values(msg, "To")) # Handle messages with iTIP parts. diff -r d52e08731368 -r 39509f7669d4 imiptools/content.py --- a/imiptools/content.py Wed Dec 10 18:42:08 2014 +0100 +++ b/imiptools/content.py Wed Dec 10 18:45:47 2014 +0100 @@ -11,6 +11,7 @@ from pytz import timezone, UnknownTimeZoneError from vCalendar import parse, ParseError, to_dict from vRecurrence import get_parameters, get_rule +import email.utils import imip_store import re @@ -117,12 +118,26 @@ else: return dt.strftime("%Y%m%d") +def get_addresses(values): + return [address for name, address in email.utils.getaddresses(values)] + def get_address(value): + value = value.lower() return value.startswith("mailto:") and value[7:] or value def get_uri(value): + value = value.lower() return value.startswith("mailto:") and value or "mailto:%s" % value +def uri_dict(d): + return dict([(get_uri(key), value) for key, value in d.items()]) + +def uri_item(item): + return get_uri(item[0]), item[1] + +def uri_items(items): + return [(get_uri(value), attr) for value, attr in items] + def get_datetime(value, attr=None): """ @@ -339,8 +354,8 @@ """ self.details = details - self.senders = senders and set(senders) - self.recipients = recipients and set(recipients) + self.senders = senders and set(map(get_address, senders)) + self.recipients = recipients and set(map(get_address, recipients)) self.messenger = messenger self.uid = get_value(details, "UID") @@ -405,10 +420,12 @@ """ Return the organiser and attendees for the current object, filtered by the recipients of interest. Return None if no identities are eligible. + + Organiser and attendee identities are provided as lower case values. """ - attendee_map = self.get_value_map("ATTENDEE") - organiser = self.get_item("ORGANIZER") + attendee_map = uri_dict(self.get_value_map("ATTENDEE")) + organiser = uri_item(self.get_item("ORGANIZER")) # Only provide details for recipients who are also attendees. diff -r d52e08731368 -r 39509f7669d4 imiptools/handlers/person.py --- a/imiptools/handlers/person.py Wed Dec 10 18:42:08 2014 +0100 +++ b/imiptools/handlers/person.py Wed Dec 10 18:45:47 2014 +0100 @@ -6,7 +6,7 @@ from email.mime.text import MIMEText from imiptools.config import MANAGER_PATH, MANAGER_URL -from imiptools.content import Handler, get_uri, to_part +from imiptools.content import Handler, get_address, get_uri, to_part, uri_dict, uri_items from imiptools.handlers.common import CommonFreebusy from socket import gethostname from vCalendar import to_node @@ -58,7 +58,7 @@ obj = self.get_object(organiser, objtype) if obj and self.have_new_object(organiser, objtype, obj): - attendee_map = self.get_value_map("ATTENDEE") + attendee_map = uri_dict(self.get_value_map("ATTENDEE")) for attendee, attendee_attr in attendees.items(): @@ -92,7 +92,7 @@ except ValueError: pass - for sender, sender_attr in self.get_items(from_organiser and "ORGANIZER" or "ATTENDEE"): + for sender, sender_attr in uri_items(self.get_items(from_organiser and "ORGANIZER" or "ATTENDEE")): for recipient in self.recipients: self.store.set_freebusy_for_other(get_uri(recipient), freebusy, sender) @@ -100,7 +100,7 @@ "Wrap any valid message and pass it on to the recipient." - attendee = self.get_value("ATTENDEE") + attendee = get_address(self.get_value("ATTENDEE")) if attendee: return "REPLY", MIMEText("A reply has been received from %s." % attendee) diff -r d52e08731368 -r 39509f7669d4 imiptools/handlers/person_outgoing.py --- a/imiptools/handlers/person_outgoing.py Wed Dec 10 18:42:08 2014 +0100 +++ b/imiptools/handlers/person_outgoing.py Wed Dec 10 18:45:47 2014 +0100 @@ -5,7 +5,7 @@ messages to obtain scheduling done externally. """ -from imiptools.content import Handler +from imiptools.content import Handler, uri_item from vCalendar import to_node class PersonHandler(Handler): @@ -13,7 +13,7 @@ "Handling mechanisms specific to people." def _record(self, objtype, from_organiser=True, update_freebusy=False): - identity, attr = self.get_item(from_organiser and "ORGANIZER" or "ATTENDEE") + identity, attr = uri_item(self.get_item(from_organiser and "ORGANIZER" or "ATTENDEE")) # Check for event using UID.