Skip to content
This repository has been archived by the owner on Feb 13, 2020. It is now read-only.

Commit

Permalink
Use canonical calendar user address for group attendees and vCard X-A…
Browse files Browse the repository at this point in the history
…DDRESSBOOKSERVER-MEMBER

git-svn-id: https://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk@13250 e27351fd-9f3e-4f54-a53b-843176b1656c
  • Loading branch information
bgaya committed Apr 10, 2014
1 parent bde8198 commit f99a959
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 26 deletions.
22 changes: 10 additions & 12 deletions twistedcaldav/ical.py
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -3384,38 +3384,36 @@ def normalizeCalendarUserAddresses(self, lookupFunction, recordFunction,




@inlineCallbacks @inlineCallbacks
def expandGroupAttendee(self, groupGUID, memberGUIDs, recordFunction): def expandGroupAttendee(self, groupCUA, memberCUAs, recordFunction):


memberUUIDs = set(["urn:uuid:" + str(memberGUID) for memberGUID in memberGUIDs])
groupUUID = "urn:uuid:" + str(groupGUID)
changed = False changed = False
for component in self.subcomponents(): for component in self.subcomponents():
if component.name() in ignoredComponents: if component.name() in ignoredComponents:
continue continue


oldAttendeeProps = tuple(component.properties("ATTENDEE")) oldAttendeeProps = tuple(component.properties("ATTENDEE"))
oldAttendeeUUIDs = set([attendeeProp.value() for attendeeProp in oldAttendeeProps]) oldAttendeeCUAs = set([attendeeProp.value() for attendeeProp in oldAttendeeProps])


# add new member attendees # add new member attendees
for memberUUID in sorted(memberUUIDs - oldAttendeeUUIDs): for memberCUA in sorted(set(memberCUAs) - oldAttendeeCUAs):
directoryRecord = yield recordFunction(memberUUID) directoryRecord = yield recordFunction(memberCUA)
newAttendeeProp = directoryRecord.attendee(params={"MEMBER": groupUUID}) newAttendeeProp = directoryRecord.attendee(params={"MEMBER": groupCUA})
component.addProperty(newAttendeeProp) component.addProperty(newAttendeeProp)
changed = True changed = True


# remove attendee or update MEMBER attribute for non-primary attendees in this group, # remove attendee or update MEMBER attribute for non-primary attendees in this group,
for attendeeProp in oldAttendeeProps: for attendeeProp in oldAttendeeProps:
if attendeeProp.hasParameter("MEMBER"): if attendeeProp.hasParameter("MEMBER"):
parameterValues = tuple(attendeeProp.parameterValues("MEMBER")) parameterValues = tuple(attendeeProp.parameterValues("MEMBER"))
if groupUUID in parameterValues: if groupCUA in parameterValues:
if attendeeProp.value() not in memberUUIDs: if attendeeProp.value() not in memberCUAs:
attendeeProp.removeParameterValue("MEMBER", groupUUID) attendeeProp.removeParameterValue("MEMBER", groupCUA)
if not attendeeProp.parameterValues("MEMBER"): if not attendeeProp.parameterValues("MEMBER"):
component.removeProperty(attendeeProp) component.removeProperty(attendeeProp)
changed = True changed = True
else: else:
if attendeeProp.value() in memberUUIDs: if attendeeProp.value() in memberCUAs:
attendeeProp.setParameter("MEMBER", parameterValues + (groupUUID,)) attendeeProp.setParameter("MEMBER", parameterValues + (groupCUA,))
changed = True changed = True


returnValue(changed) returnValue(changed)
Expand Down
25 changes: 14 additions & 11 deletions txdav/caldav/datastore/sql.py
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -1937,30 +1937,29 @@ def expandGroupAttendees(self, component):
""" """
Expand group attendees Expand group attendees
""" """

if not config.Scheduling.Options.AllowGroupAsAttendee: if not config.Scheduling.Options.AllowGroupAsAttendee:
return return


attendeeProps = component.getAllAttendeeProperties() attendeeProps = component.getAllAttendeeProperties()
groupGUIDs = set([ groupCUAs = set([
uuid.UUID(attendeeProp.value()[len("urn:uuid:"):]) for attendeeProp in attendeeProps attendeeProp.value() for attendeeProp in attendeeProps
if attendeeProp.parameterValue("CUTYPE") == "GROUP" if attendeeProp.parameterValue("CUTYPE") == "GROUP"
]) ])
for groupCUA in groupCUAs:


for groupGUID in groupGUIDs: groupRecord = yield self.directoryService().recordWithCalendarUserAddress(groupCUA)

groupRecord = yield self.directoryService().recordWithGUID(groupGUID)
if groupRecord: if groupRecord:
members = yield groupRecord.expandedMembers() members = yield groupRecord.expandedMembers()
memberGUIDs = sorted([member.guid for member in members])


# calculate hash
memberUIDs = sorted([member.uid for member in members])
membershipHashContent = hashlib.md5() membershipHashContent = hashlib.md5()
for memberGUID in memberGUIDs: for memberUID in memberUIDs:
membershipHashContent.update(str(memberGUID)) membershipHashContent.update(memberUID)
membershipHash = membershipHashContent.hexdigest() membershipHash = membershipHashContent.hexdigest()


# associate group ID with self # associate group ID with self
groupID, _ignore_name, membershipHash, _ignore_modDate = yield self._txn.groupByUID(str(groupGUID)) groupID, _ignore_name, membershipHash, _ignore_modDate = yield self._txn.groupByUID(groupRecord.uid)
try: try:
groupAttendee = schema.GROUP_ATTENDEE groupAttendee = schema.GROUP_ATTENDEE
yield Insert({ yield Insert({
Expand All @@ -1972,7 +1971,11 @@ def expandGroupAttendees(self, component):
pass pass


# get members # get members
yield component.expandGroupAttendee(groupGUID, memberGUIDs, self.directoryService().recordWithCalendarUserAddress) yield component.expandGroupAttendee(
groupRecord.canonicalCalendarUserAddress(),
set([member.canonicalCalendarUserAddress() for member in members]),
self.directoryService().recordWithCalendarUserAddress
)




def validCalendarDataCheck(self, component, inserting): def validCalendarDataCheck(self, component, inserting):
Expand Down
4 changes: 2 additions & 2 deletions txdav/who/test/test_group_attendees.py
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -317,8 +317,8 @@ def test_twoGroupPUT(self):
ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001 ATTENDEE;CN=User 01;EMAIL=user01@example.com;RSVP=TRUE:urn:uuid:10000000-0000-0000-0000-000000000001
ATTENDEE;CN=Group 02;CUTYPE=GROUP;EMAIL=group02@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000002 ATTENDEE;CN=Group 02;CUTYPE=GROUP;EMAIL=group02@example.com;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000002
ATTENDEE;CN=Group 04;CUTYPE=GROUP;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000004 ATTENDEE;CN=Group 04;CUTYPE=GROUP;RSVP=TRUE;SCHEDULE-STATUS=3.7:urn:uuid:20000000-0000-0000-0000-000000000004
ATTENDEE;CN=User 06;EMAIL=user06@example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000002","urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000006 ATTENDEE;CN=User 06;EMAIL=user06@example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004","urn:uuid:20000000-0000-0000-0000-000000000002";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000006
ATTENDEE;CN=User 07;EMAIL=user07@example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000002","urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000007 ATTENDEE;CN=User 07;EMAIL=user07@example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004","urn:uuid:20000000-0000-0000-0000-000000000002";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000007
ATTENDEE;CN=User 08;EMAIL=user08@example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000008 ATTENDEE;CN=User 08;EMAIL=user08@example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000008
ATTENDEE;CN=User 09;EMAIL=user09@example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000009 ATTENDEE;CN=User 09;EMAIL=user09@example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000009
ATTENDEE;CN=User 10;EMAIL=user10@example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000010 ATTENDEE;CN=User 10;EMAIL=user10@example.com;MEMBER="urn:uuid:20000000-0000-0000-0000-000000000004";PARTSTAT=NEEDS-ACTION;RSVP=TRUE;SCHEDULE-STATUS=1.2:urn:uuid:10000000-0000-0000-0000-000000000010
Expand Down
2 changes: 1 addition & 1 deletion txdav/who/vcard.py
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ def addUniqueProperty(newProperty, ignoredParameters=None):
# FIXME: members() is a deferred, so all of vCardFromRecord is deferred. # FIXME: members() is a deferred, so all of vCardFromRecord is deferred.
for memberRecord in (yield record.members()): for memberRecord in (yield record.members()):
if memberRecord: if memberRecord:
vcard.addProperty(Property("X-ADDRESSBOOKSERVER-MEMBER", "urn:uuid:" + memberRecord.fields[FieldName.uid].encode("utf-8"))) vcard.addProperty(Property("X-ADDRESSBOOKSERVER-MEMBER", memberRecord.canonicalCalendarUserAddress().encode("utf-8")))


#=================================================================== #===================================================================
# vCard 4.0 http://tools.ietf.org/html/rfc6350 # vCard 4.0 http://tools.ietf.org/html/rfc6350
Expand Down

0 comments on commit f99a959

Please sign in to comment.