diff --git a/ChangeLog b/ChangeLog index b82303340..9ba6123eb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2011-12-01 Wolfgang Sourdeau + * OpenChange/MAPIStoreGCSFolder.m (-aclQualifier): new accessor + providing an additional qualifier when listing elements of a + table, based on the current user rights. + (-messageKeysMatchingQualifier:andSortOrderings:): make use of the + new -aclQualifier method when the active user is not the owner of + the sogo object. Slightly simplified code by storing all + qualifiers in an array passed as parameter to the EOAndQualifier + constructor. + * OpenChange/MAPIStoreMessage.m (-subscriberCanReadMessage) (-subscriberCanModifyMessage): new getters for ACL operations at the message level. diff --git a/OpenChange/MAPIStoreCalendarFolder.m b/OpenChange/MAPIStoreCalendarFolder.m index 15c95f96a..8ed3f19ed 100644 --- a/OpenChange/MAPIStoreCalendarFolder.m +++ b/OpenChange/MAPIStoreCalendarFolder.m @@ -190,4 +190,10 @@ != nil); } +- (EOQualifier *) aclQualifier +{ + return [EOQualifier qualifierWithQualifierFormat: + [(SOGoAppointmentFolder *) sogoObject aclSQLListingFilter]]; +} + @end diff --git a/OpenChange/MAPIStoreGCSFolder.h b/OpenChange/MAPIStoreGCSFolder.h index f5a43dd2c..91ec334fd 100644 --- a/OpenChange/MAPIStoreGCSFolder.h +++ b/OpenChange/MAPIStoreGCSFolder.h @@ -51,6 +51,7 @@ - (NSArray *) activeUserRoles; /* subclasses */ +- (EOQualifier *) aclQualifier; - (EOQualifier *) componentQualifier; @end diff --git a/OpenChange/MAPIStoreGCSFolder.m b/OpenChange/MAPIStoreGCSFolder.m index cef875a8d..0a88a9a96 100644 --- a/OpenChange/MAPIStoreGCSFolder.m +++ b/OpenChange/MAPIStoreGCSFolder.m @@ -87,7 +87,8 @@ { static NSArray *fields = nil; NSArray *records; - EOQualifier *componentQualifier, *fetchQualifier; + NSMutableArray *qualifierArray; + EOQualifier *fetchQualifier, *aclQualifier; GCSFolder *ocsFolder; EOFetchSpecification *fs; NSArray *keys; @@ -96,24 +97,27 @@ fields = [[NSArray alloc] initWithObjects: @"c_name", @"c_version", nil]; - componentQualifier = [self componentQualifier]; - if (qualifier) + qualifierArray = [NSMutableArray new]; + if (![[context activeUser] isEqual: [context ownerUser]]) { - fetchQualifier = [[EOAndQualifier alloc] - initWithQualifiers: - componentQualifier, - qualifier, - nil]; - [fetchQualifier autorelease]; + aclQualifier = [self aclQualifier]; + if (aclQualifier) + [qualifierArray addObject: aclQualifier]; } - else - fetchQualifier = componentQualifier; + [qualifierArray addObject: [self componentQualifier]]; + if (qualifier) + [qualifierArray addObject: qualifier]; + + fetchQualifier = [[EOAndQualifier alloc] + initWithQualifierArray: qualifierArray]; ocsFolder = [sogoObject ocsFolder]; fs = [EOFetchSpecification fetchSpecificationWithEntityName: [ocsFolder folderName] qualifier: fetchQualifier sortOrderings: sortOrderings]; + [fetchQualifier release]; + [qualifierArray release]; records = [ocsFolder fetchFields: fields fetchSpecification: fs]; keys = [records objectsForKey: @"c_name" notFoundMarker: nil]; diff --git a/OpenChange/MAPIStoreTasksFolder.m b/OpenChange/MAPIStoreTasksFolder.m index 83eaea02a..228fb8eb5 100644 --- a/OpenChange/MAPIStoreTasksFolder.m +++ b/OpenChange/MAPIStoreTasksFolder.m @@ -157,4 +157,10 @@ return rights; } +- (EOQualifier *) aclQualifier +{ + return [EOQualifier qualifierWithQualifierFormat: + [(SOGoAppointmentFolder *) sogoObject aclSQLListingFilter]]; +} + @end