1.1 --- a/imiptools/__init__.py Wed Dec 10 18:42:08 2014 +0100
1.2 +++ b/imiptools/__init__.py Wed Dec 10 18:45:47 2014 +0100
1.3 @@ -1,7 +1,7 @@
1.4 #!/usr/bin/env python
1.5
1.6 from email import message_from_file
1.7 -from imiptools.content import handle_itip_part
1.8 +from imiptools.content import get_addresses, handle_itip_part
1.9 from imiptools.mail import Messenger
1.10 import sys
1.11
1.12 @@ -41,8 +41,8 @@
1.13 """
1.14
1.15 msg = message_from_file(f)
1.16 - senders = msg.get_all("Reply-To") or msg.get_all("From")
1.17 - original_recipients = original_recipients or get_all_values(msg, "To")
1.18 + senders = get_addresses(msg.get_all("Reply-To") or msg.get_all("From"))
1.19 + original_recipients = original_recipients or get_addresses(get_all_values(msg, "To"))
1.20
1.21 # Handle messages with iTIP parts.
1.22
2.1 --- a/imiptools/content.py Wed Dec 10 18:42:08 2014 +0100
2.2 +++ b/imiptools/content.py Wed Dec 10 18:45:47 2014 +0100
2.3 @@ -11,6 +11,7 @@
2.4 from pytz import timezone, UnknownTimeZoneError
2.5 from vCalendar import parse, ParseError, to_dict
2.6 from vRecurrence import get_parameters, get_rule
2.7 +import email.utils
2.8 import imip_store
2.9 import re
2.10
2.11 @@ -117,12 +118,26 @@
2.12 else:
2.13 return dt.strftime("%Y%m%d")
2.14
2.15 +def get_addresses(values):
2.16 + return [address for name, address in email.utils.getaddresses(values)]
2.17 +
2.18 def get_address(value):
2.19 + value = value.lower()
2.20 return value.startswith("mailto:") and value[7:] or value
2.21
2.22 def get_uri(value):
2.23 + value = value.lower()
2.24 return value.startswith("mailto:") and value or "mailto:%s" % value
2.25
2.26 +def uri_dict(d):
2.27 + return dict([(get_uri(key), value) for key, value in d.items()])
2.28 +
2.29 +def uri_item(item):
2.30 + return get_uri(item[0]), item[1]
2.31 +
2.32 +def uri_items(items):
2.33 + return [(get_uri(value), attr) for value, attr in items]
2.34 +
2.35 def get_datetime(value, attr=None):
2.36
2.37 """
2.38 @@ -339,8 +354,8 @@
2.39 """
2.40
2.41 self.details = details
2.42 - self.senders = senders and set(senders)
2.43 - self.recipients = recipients and set(recipients)
2.44 + self.senders = senders and set(map(get_address, senders))
2.45 + self.recipients = recipients and set(map(get_address, recipients))
2.46 self.messenger = messenger
2.47
2.48 self.uid = get_value(details, "UID")
2.49 @@ -405,10 +420,12 @@
2.50 """
2.51 Return the organiser and attendees for the current object, filtered by
2.52 the recipients of interest. Return None if no identities are eligible.
2.53 +
2.54 + Organiser and attendee identities are provided as lower case values.
2.55 """
2.56
2.57 - attendee_map = self.get_value_map("ATTENDEE")
2.58 - organiser = self.get_item("ORGANIZER")
2.59 + attendee_map = uri_dict(self.get_value_map("ATTENDEE"))
2.60 + organiser = uri_item(self.get_item("ORGANIZER"))
2.61
2.62 # Only provide details for recipients who are also attendees.
2.63
3.1 --- a/imiptools/handlers/person.py Wed Dec 10 18:42:08 2014 +0100
3.2 +++ b/imiptools/handlers/person.py Wed Dec 10 18:45:47 2014 +0100
3.3 @@ -6,7 +6,7 @@
3.4
3.5 from email.mime.text import MIMEText
3.6 from imiptools.config import MANAGER_PATH, MANAGER_URL
3.7 -from imiptools.content import Handler, get_uri, to_part
3.8 +from imiptools.content import Handler, get_address, get_uri, to_part, uri_dict, uri_items
3.9 from imiptools.handlers.common import CommonFreebusy
3.10 from socket import gethostname
3.11 from vCalendar import to_node
3.12 @@ -58,7 +58,7 @@
3.13 obj = self.get_object(organiser, objtype)
3.14
3.15 if obj and self.have_new_object(organiser, objtype, obj):
3.16 - attendee_map = self.get_value_map("ATTENDEE")
3.17 + attendee_map = uri_dict(self.get_value_map("ATTENDEE"))
3.18
3.19 for attendee, attendee_attr in attendees.items():
3.20
3.21 @@ -92,7 +92,7 @@
3.22 except ValueError:
3.23 pass
3.24
3.25 - for sender, sender_attr in self.get_items(from_organiser and "ORGANIZER" or "ATTENDEE"):
3.26 + for sender, sender_attr in uri_items(self.get_items(from_organiser and "ORGANIZER" or "ATTENDEE")):
3.27 for recipient in self.recipients:
3.28 self.store.set_freebusy_for_other(get_uri(recipient), freebusy, sender)
3.29
3.30 @@ -100,7 +100,7 @@
3.31
3.32 "Wrap any valid message and pass it on to the recipient."
3.33
3.34 - attendee = self.get_value("ATTENDEE")
3.35 + attendee = get_address(self.get_value("ATTENDEE"))
3.36 if attendee:
3.37 return "REPLY", MIMEText("A reply has been received from %s." % attendee)
3.38
4.1 --- a/imiptools/handlers/person_outgoing.py Wed Dec 10 18:42:08 2014 +0100
4.2 +++ b/imiptools/handlers/person_outgoing.py Wed Dec 10 18:45:47 2014 +0100
4.3 @@ -5,7 +5,7 @@
4.4 messages to obtain scheduling done externally.
4.5 """
4.6
4.7 -from imiptools.content import Handler
4.8 +from imiptools.content import Handler, uri_item
4.9 from vCalendar import to_node
4.10
4.11 class PersonHandler(Handler):
4.12 @@ -13,7 +13,7 @@
4.13 "Handling mechanisms specific to people."
4.14
4.15 def _record(self, objtype, from_organiser=True, update_freebusy=False):
4.16 - identity, attr = self.get_item(from_organiser and "ORGANIZER" or "ATTENDEE")
4.17 + identity, attr = uri_item(self.get_item(from_organiser and "ORGANIZER" or "ATTENDEE"))
4.18
4.19 # Check for event using UID.
4.20