diff --git a/OpenChange/MAPIStoreTasksFolder.m b/OpenChange/MAPIStoreTasksFolder.m index f4f6ac160..4b198d2d1 100644 --- a/OpenChange/MAPIStoreTasksFolder.m +++ b/OpenChange/MAPIStoreTasksFolder.m @@ -75,6 +75,10 @@ return newMessage; } +// -------------------------------------------- +// Permissions and sharing +// -------------------------------------------- + - (NSArray *) rolesForExchangeRights: (uint32_t) rights { NSMutableArray *roles; @@ -82,21 +86,34 @@ roles = [NSMutableArray arrayWithCapacity: 6]; if (rights & RightsCreateItems) [roles addObject: SOGoRole_ObjectCreator]; + if (rights & RightsDeleteAll) [roles addObject: SOGoRole_ObjectEraser]; + if (rights & RightsDeleteOwn) + [roles addObject: MAPIStoreRightDeleteOwn]; + if (rights & RightsEditAll) { [roles addObject: SOGoCalendarRole_PublicModifier]; [roles addObject: SOGoCalendarRole_PrivateModifier]; [roles addObject: SOGoCalendarRole_ConfidentialModifier]; } - else if (rights & RightsReadItems) + if (rights & RightsEditOwn) + [roles addObject: MAPIStoreRightEditOwn]; + + if (rights & RightsReadItems) { [roles addObject: SOGoCalendarRole_PublicViewer]; [roles addObject: SOGoCalendarRole_PrivateViewer]; [roles addObject: SOGoCalendarRole_ConfidentialViewer]; } + if (rights & RightsFolderOwner) + [roles addObject: MAPIStoreRightFolderOwner]; + + if (rights & RightsFolderContact) + [roles addObject: MAPIStoreRightFolderContact]; + return roles; } @@ -116,20 +133,65 @@ && [roles containsObject: SOGoCalendarRole_PrivateViewer] && [roles containsObject: SOGoCalendarRole_ConfidentialViewer]) rights |= RightsReadItems; + + if ([roles containsObject: MAPIStoreRightEditOwn]) + rights |= RightsEditOwn; + if ([roles containsObject: MAPIStoreRightDeleteOwn]) + rights |= RightsDeleteOwn; + if (rights != 0) rights |= RoleNone; /* actually "folder visible" */ + if ([roles containsObject: MAPIStoreRightFolderOwner]) + rights |= RightsFolderOwner | RoleNone; + + if ([roles containsObject: MAPIStoreRightFolderContact]) + rights |= RightsFolderContact; + return rights; } +- (BOOL) subscriberCanModifyMessages +{ + static NSArray *modifierRoles = nil; + + if (!modifierRoles) + modifierRoles = [[NSArray alloc] initWithObjects: + SOGoCalendarRole_PublicModifier, + SOGoCalendarRole_PrivateModifier, + SOGoCalendarRole_ConfidentialModifier, + nil]; + + return ([[self activeUserRoles] firstObjectCommonWithArray: modifierRoles] + != nil); +} + +- (BOOL) subscriberCanReadMessages +{ + static NSArray *viewerRoles = nil; + + if (!viewerRoles) + viewerRoles = [[NSArray alloc] initWithObjects: + SOGoCalendarRole_PublicViewer, + SOGoCalendarRole_PrivateViewer, + SOGoCalendarRole_ConfidentialViewer, + nil]; + + return ([[self activeUserRoles] firstObjectCommonWithArray: viewerRoles] + != nil); +} + - (EOQualifier *) aclQualifier { return [EOQualifier qualifierWithQualifierFormat: [(SOGoAppointmentFolder *) sogoObject aclSQLListingFilter]]; } +// -------------------------------------------- +// Property getters +// -------------------------------------------- - (enum mapistore_error) getPidTagDefaultPostMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx + inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPM.Task" asUnicodeInMemCtx: memCtx]; diff --git a/OpenChange/MAPIStoreTasksMessage.m b/OpenChange/MAPIStoreTasksMessage.m index 728fdb909..382c61fa0 100644 --- a/OpenChange/MAPIStoreTasksMessage.m +++ b/OpenChange/MAPIStoreTasksMessage.m @@ -154,6 +154,9 @@ return MAPISTORE_SUCCESS; } +//------------------------------------ +// Specific task related properties +//------------------------------------ - (enum mapistore_error) getPidLidTaskComplete: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { @@ -323,6 +326,7 @@ { NSString *owner; + /* FIXME: This is wrong when setting task's request */ owner = [sogoObject ownerInContext: nil]; *data = [owner asUnicodeInMemCtx: memCtx]; @@ -336,6 +340,25 @@ return [self getLongZero: data inMemCtx: memCtx]; } +// ---------------------------------- +// Sharing +// ---------------------------------- +- (NSString *) creator +{ + iCalToDo *task; + + task = [sogoObject component: NO secure: YES]; + return [[task uniqueChildWithTag: @"x-sogo-component-created-by"] + flattenedValuesForKey: @""]; +} + +- (NSString *) owner +{ + /* This is not true but to allow a user edit its own tasks is required. + FIXME: When PidLidTaskOwner getter is properly implemented for Task Requests */ + return [self creator]; +} + - (BOOL) subscriberCanReadMessage { return ([[self activeUserRoles] @@ -354,6 +377,15 @@ rc = ([roles containsObject: SOGoCalendarRole_ComponentModifier] || [roles containsObject: SOGoCalendarRole_ComponentResponder]); + /* Check if the message is owned and it has permission to edit it */ + if (!rc && [roles containsObject: MAPIStoreRightEditOwn]) + { + NSString *currentUser; + + currentUser = [[container context] activeUser]; + rc = [currentUser isEqual: [self ownerUser]]; + } + return rc; } @@ -524,10 +556,16 @@ [vToDo setAccessClass: @"PUBLIC"]; } + /* Creation */ now = [NSCalendarDate date]; if ([sogoObject isNew]) { [vToDo setCreated: now]; + /* Creator is used for sharing purposes */ + value = [properties objectForKey: MAPIPropertyKey (PidTagLastModifierName)]; + if (value) + [[vToDo uniqueChildWithTag: @"x-sogo-component-created-by"] setSingleValue: value + forKey: @""]; } [vToDo setTimeStampAsDate: now];