diff --git a/ChangeLog b/ChangeLog index e5bbb49c3..c5cfb501f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2009-05-06 Francis Lachapelle + + * SoObjects/SOGo/SOGoGCSFolder.m ([SOGoGCSFolder + -removeAclsForUsers:atObjectPath:]): verify if user is a group and + prefix the UID with "@" if so. + + * SoObjects/Appointments/SOGoCalendarComponent.m + ([SOGoCalendarComponent -expandGroupsInEvent:]): new method from + the code that was in [SOGoAppointmentObject -_handleAddedUsers:] + and [SOGoAppointmentObject -_PUTAction:] that expands the groups + among the attendees of the passed event. + 2009-05-05 Francis Lachapelle * SoObjects/SOGo/SOGoUser.m ([SOGoUser diff --git a/SoObjects/Appointments/SOGoAppointmentFolder.m b/SoObjects/Appointments/SOGoAppointmentFolder.m index 28bc112a1..14dc8c9ad 100644 --- a/SoObjects/Appointments/SOGoAppointmentFolder.m +++ b/SoObjects/Appointments/SOGoAppointmentFolder.m @@ -2399,6 +2399,9 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir return result; } +// +// This method returns the personal calendar of a specific user. +// - (SOGoAppointmentFolder *) lookupCalendarFolderForUID: (NSString *) uid { SOGoFolder *currentContainer; diff --git a/SoObjects/Appointments/SOGoAppointmentObject.m b/SoObjects/Appointments/SOGoAppointmentObject.m index 9622eda69..6de6bfb73 100644 --- a/SoObjects/Appointments/SOGoAppointmentObject.m +++ b/SoObjects/Appointments/SOGoAppointmentObject.m @@ -203,6 +203,7 @@ if (!object) { + // Create the event in the user's personal calendar. folder = [container lookupCalendarFolderForUID: uid]; object = [SOGoAppointmentObject objectWithName: nameInContainer inContainer: folder]; @@ -396,87 +397,22 @@ toAttendees: updateAttendees]; } -// -// Returns "YES" if a group was decomposed during attendees addition. -// -- (BOOL) _handleAddedUsers: (NSArray *) attendees +- (void) _handleAddedUsers: (NSArray *) attendees fromEvent: (iCalEvent *) newEvent { - NSMutableArray *array, *attendeesFromGroups; NSEnumerator *enumerator; iCalPerson *currentAttendee; NSString *currentUID; - BOOL b; - int i; - - array = [NSMutableArray arrayWithArray: [newEvent attendees]]; - attendeesFromGroups = [NSMutableArray array]; - RETAIN(attendees); - b = NO; enumerator = [attendees objectEnumerator]; while ((currentAttendee = [enumerator nextObject])) { - SOGoGroup *group; - - group = [SOGoGroup groupWithEmail: [currentAttendee rfc822Email]]; - - if (group) - { - iCalPerson *person; - NSArray *members; - SOGoUser *user; - - // We did decompose a group... - [array removeObject: currentAttendee]; - b = YES; - - members = [group members]; - for (i = 0; i < [members count]; i++) - { - user = [members objectAtIndex: i]; - - // If the organizer is part of the group, we skip it from - // the addition to the attendees' list - if ([user hasEmail: [[newEvent organizer] rfc822Email]]) - continue; - - person = [self iCalPersonWithUID: [user login]]; - [person setTag: @"ATTENDEE"]; - [person setParticipationStatus: iCalPersonPartStatNeedsAction]; - [person setRsvp: @"TRUE"]; - [person setRole: @"REQ-PARTICIPANT"]; - - [attendeesFromGroups addObject: [user login]]; - - if (![array containsObject: person]) - [array addObject: person]; - } - } - else - { - currentUID = [currentAttendee uid]; - if (currentUID) - [self _addOrUpdateEvent: newEvent - forUID: currentUID - owner: owner]; - } - } - - if (b) - { - NSLog(@"New attendees: %@", array); - [newEvent setAttendees: array]; - - for (i = 0; i < [attendeesFromGroups count]; i++) + currentUID = [currentAttendee uid]; + if (currentUID) [self _addOrUpdateEvent: newEvent - forUID: [attendeesFromGroups objectAtIndex: i] + forUID: currentUID owner: owner]; } - - RELEASE(attendees); - - return b; } // @@ -541,14 +477,7 @@ originalAttendees = [NSArray arrayWithArray: [newEvent attendees]]; // Send an invitation to new attendees - if ([self _handleAddedUsers: attendees fromEvent: newEvent]) - { - // We need to compute our new set for the invitation template - // if we decomposed groups. - attendees = [NSMutableArray arrayWithArray: [newEvent attendees]]; - [(NSMutableArray *)attendees removeObjectsInArray: originalAttendees]; - } - + [self _handleAddedUsers: attendees fromEvent: newEvent]; [self sendEMailUsingTemplateNamed: @"Invitation" forObject: [newEvent itipEntryWithMethod: @"request"] previousObject: oldEvent @@ -567,6 +496,8 @@ [[newEvent parent] setMethod: @""]; ownerUser = [SOGoUser userWithLogin: owner roles: nil]; + [self expandGroupsInEvent: newEvent]; + // We first save the event. It is important to this initially // as the event's UID might get modified in SOGoCalendarComponent: -saveComponent: [super saveComponent: newEvent]; @@ -579,13 +510,7 @@ attendees = [newEvent attendeesWithoutUser: ownerUser]; if ([attendees count]) { - if ([self _handleAddedUsers: attendees fromEvent: newEvent]) - { - // We refetch the list of attendees and save again the - // event as a group was decomposed - attendees = [newEvent attendeesWithoutUser: ownerUser]; - [super saveComponent: newEvent]; - } + [self _handleAddedUsers: attendees fromEvent: newEvent]; [self sendEMailUsingTemplateNamed: @"Invitation" forObject: [newEvent itipEntryWithMethod: @"request"] previousObject: nil @@ -1317,12 +1242,8 @@ // - (id) PUTAction: (WOContext *) _ctx { - iCalPerson *currentAttendee; - NSEnumerator *enumerator; iCalCalendar *calendar; - NSMutableArray *array; NSArray *allEvents; - SOGoGroup *group; iCalEvent *event; WORequest *rq; @@ -1350,46 +1271,8 @@ for (i = 0; i < [allEvents count]; i++) { event = [allEvents objectAtIndex: i]; - array = [NSMutableArray arrayWithArray: [event attendees]]; - - enumerator = [[event attendees] objectEnumerator]; - while ((currentAttendee = [enumerator nextObject])) - { - group = [SOGoGroup groupWithEmail: [currentAttendee rfc822Email]]; - - if (group) - { - iCalPerson *person; - NSArray *members; - SOGoUser *user; - - // We did decompose a group... - [array removeObject: currentAttendee]; - b = YES; - - members = [group members]; - for (i = 0; i < [members count]; i++) - { - user = [members objectAtIndex: i]; - - // If the organizer is part of the group, we skip it from - // the addition to the attendees' list - if ([user hasEmail: [[event organizer] rfc822Email]]) - continue; - - person = [self iCalPersonWithUID: [user login]]; - [person setTag: @"ATTENDEE"]; - [person setParticipationStatus: iCalPersonPartStatNeedsAction]; - [person setRsvp: @"TRUE"]; - [person setRole: @"REQ-PARTICIPANT"]; - - if (![array containsObject: person]) - [array addObject: person]; - } - } - } - - [event setAttendees: array]; + if ([self expandGroupsInEvent: event]) + b = YES; } //NSLog(@"Content from calendar:secure: %@", [calendar versitString]); diff --git a/SoObjects/Appointments/SOGoCalendarComponent.h b/SoObjects/Appointments/SOGoCalendarComponent.h index 3acf79ca8..2ef56c68d 100644 --- a/SoObjects/Appointments/SOGoCalendarComponent.h +++ b/SoObjects/Appointments/SOGoCalendarComponent.h @@ -31,6 +31,7 @@ @class NSString; @class iCalCalendar; +@class iCalEvent; @class iCalPerson; @class iCalRepeatableEntityObject; @@ -52,6 +53,8 @@ secure: (BOOL) secure; - (id) component: (BOOL) create secure: (BOOL) secure; +- (BOOL) expandGroupsInEvent: (iCalEvent *) theEvent; + // - (NSException *) primarySaveContentString: (NSString *) _iCalString; // - (NSException *) primaryDelete; diff --git a/SoObjects/Appointments/SOGoCalendarComponent.m b/SoObjects/Appointments/SOGoCalendarComponent.m index 742611ccb..a4a73d3ad 100644 --- a/SoObjects/Appointments/SOGoCalendarComponent.m +++ b/SoObjects/Appointments/SOGoCalendarComponent.m @@ -45,6 +45,7 @@ #import #import #import +#import #import #import #import @@ -196,8 +197,7 @@ static BOOL sendEMailNotifications = NO; return iCalString; } -static inline BOOL -_occurenceHasID (iCalRepeatableEntityObject *occurence, NSString *recID) +static inline BOOL _occurenceHasID (iCalRepeatableEntityObject *occurence, NSString *recID) { unsigned int seconds, recSeconds; @@ -407,6 +407,64 @@ _occurenceHasID (iCalRepeatableEntityObject *occurence, NSString *recID) firstChildWithTag: [self componentTag]]; } +// +// Returs "YES" if a a group was decomposed among attendees. +// +- (BOOL) expandGroupsInEvent: (iCalEvent *) theEvent +{ + NSMutableArray *allAttendees; + NSEnumerator *enumerator; + NSString *organizerEmail; + iCalPerson *currentAttendee; + SOGoGroup *group; + BOOL doesIncludeGroup; + unsigned int i; + + organizerEmail = [[theEvent organizer] rfc822Email]; + doesIncludeGroup = NO; + allAttendees = [NSMutableArray arrayWithArray: [theEvent attendees]]; + enumerator = [[theEvent attendees] objectEnumerator]; + while ((currentAttendee = [enumerator nextObject])) + { + group = [SOGoGroup groupWithEmail: [currentAttendee rfc822Email]]; + if (group) + { + iCalPerson *person; + NSArray *members; + SOGoUser *user; + + // We did decompose a group... + [allAttendees removeObject: currentAttendee]; + + members = [group members]; + for (i = 0; i < [members count]; i++) + { + user = [members objectAtIndex: i]; + doesIncludeGroup = YES; + + // If the organizer is part of the group, we skip it from + // the addition to the attendees' list + if ([user hasEmail: organizerEmail]) + continue; + + person = [self iCalPersonWithUID: [user login]]; + [person setTag: @"ATTENDEE"]; + [person setParticipationStatus: [currentAttendee participationStatus]]; + [person setRsvp: [currentAttendee rsvp]]; + [person setRole: [currentAttendee role]]; + + if (![allAttendees containsObject: person]) + [allAttendees addObject: person]; + } + } + } + + if (doesIncludeGroup) + [theEvent setAttendees: allAttendees]; + + return doesIncludeGroup; +} + - (void) _updateRecurrenceIDsWithEvent: (iCalRepeatableEntityObject*) newEvent { iCalRepeatableEntityObject *oldMaster, *currentComponent; diff --git a/SoObjects/SOGo/SOGoGCSFolder.m b/SoObjects/SOGo/SOGoGCSFolder.m index b7c6c6e28..1eea96e48 100644 --- a/SoObjects/SOGo/SOGoGCSFolder.m +++ b/SoObjects/SOGo/SOGoGCSFolder.m @@ -397,7 +397,6 @@ static NSArray *childRecordFields = nil; - (BOOL) create { NSException *result; - result = [[self folderManager] createFolderOfType: [self folderType] withName: displayName atPath: ocsPath]; @@ -886,16 +885,32 @@ static NSArray *childRecordFields = nil; forObjectAtPath: (NSArray *) objectPathArray { EOQualifier *qualifier; - NSString *uids, *qs, *objectPath; + NSString *uid, *uids, *qs, *objectPath; + NSMutableArray *usersAndGroups; NSMutableDictionary *aclsForObject; + SOGoGroup *group; + unsigned int i; if ([users count] > 0) { + usersAndGroups = [NSMutableArray arrayWithArray: users]; + for (i = 0; i < [usersAndGroups count]; i++) + { + uid = [usersAndGroups objectAtIndex: i]; + if (![uid hasPrefix: @"@"]) + { + // Prefix the UID with the character "@" when dealing with a group + group = [SOGoGroup groupWithIdentifier: uid]; + if (group) + [usersAndGroups replaceObjectAtIndex: i + withObject: [NSString stringWithFormat: @"@%@", uid]]; + } + } objectPath = [objectPathArray componentsJoinedByString: @"/"]; aclsForObject = [aclCache objectForKey: objectPath]; if (aclsForObject) - [aclsForObject removeObjectsForKeys: users]; - uids = [users componentsJoinedByString: @"') OR (c_uid = '"]; + [aclsForObject removeObjectsForKeys: usersAndGroups]; + uids = [usersAndGroups componentsJoinedByString: @"') OR (c_uid = '"]; qs = [NSString stringWithFormat: @"(c_object = '/%@') AND ((c_uid = '%@'))", objectPath, uids];