diff --git a/ChangeLog b/ChangeLog index de528af86..b82303340 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2011-12-01 Wolfgang Sourdeau + + * OpenChange/MAPIStoreMessage.m (-subscriberCanReadMessage) + (-subscriberCanModifyMessage): new getters for ACL operations at + the message level. + + * OpenChange/MAPIStoreFolder.m (-subscriberCanCreateMessages) + (-subscriberCanModifyMessages, -subscriberCanReadMessages) + (-subscriberCanDeleteMessages, -subscriberCanCreateSubFolders): + new getters for ACL operations at the folder level. + 2011-11-30 Wolfgang Sourdeau * SoObjects/SOGo/SOGoFolder.m diff --git a/OpenChange/MAPIStoreCalendarFolder.m b/OpenChange/MAPIStoreCalendarFolder.m index 34c5dea6b..15c95f96a 100644 --- a/OpenChange/MAPIStoreCalendarFolder.m +++ b/OpenChange/MAPIStoreCalendarFolder.m @@ -157,4 +157,37 @@ return rights; } +- (BOOL) subscriberCanReadMessages +{ + static NSArray *viewerRoles = nil; + + if (!viewerRoles) + viewerRoles = [[NSArray alloc] initWithObjects: + SOGoCalendarRole_PublicViewer, + SOGoCalendarRole_PublicDAndTViewer, + SOGoCalendarRole_PrivateViewer, + SOGoCalendarRole_PrivateDAndTViewer, + SOGoCalendarRole_ConfidentialViewer, + SOGoCalendarRole_ConfidentialDAndTViewer, + nil]; + + return ([[self activeUserRoles] firstObjectCommonWithArray: viewerRoles] + != nil); +} + +- (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); +} + @end diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 73729cc66..66bdbc5fa 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -42,6 +42,7 @@ #import #import #import +#import #import #import #import @@ -620,6 +621,27 @@ } } +- (BOOL) subscriberCanReadMessage +{ + return ([[self activeUserRoles] + containsObject: SOGoCalendarRole_ComponentViewer] + || [self subscriberCanModifyMessage]); +} + +- (BOOL) subscriberCanModifyMessage +{ + BOOL rc; + NSArray *roles = [self activeUserRoles]; + + if (isNew) + rc = [roles containsObject: SOGoRole_ObjectCreator]; + else + rc = ([roles containsObject: SOGoCalendarRole_ComponentModifier] + || [roles containsObject: SOGoCalendarRole_ComponentResponder]); + + return rc; +} + - (void) save { iCalCalendar *vCalendar; diff --git a/OpenChange/MAPIStoreContactsFolder.m b/OpenChange/MAPIStoreContactsFolder.m index 0b7354d9e..ba3d36c6d 100644 --- a/OpenChange/MAPIStoreContactsFolder.m +++ b/OpenChange/MAPIStoreContactsFolder.m @@ -142,4 +142,14 @@ return rights; } +- (BOOL) subscriberCanModifyMessages +{ + return [[self activeUserRoles] containsObject: SOGoRole_ObjectEditor]; +} + +- (BOOL) subscriberCanReadMessages +{ + return [[self activeUserRoles] containsObject: SOGoRole_ObjectViewer]; +} + @end diff --git a/OpenChange/MAPIStoreContactsMessage.m b/OpenChange/MAPIStoreContactsMessage.m index 5ef07ff99..3ef9e4c66 100644 --- a/OpenChange/MAPIStoreContactsMessage.m +++ b/OpenChange/MAPIStoreContactsMessage.m @@ -33,6 +33,7 @@ #import #import #import +#import #import "MAPIStoreContactsAttachment.h" #import "MAPIStoreContactsFolder.h" @@ -847,6 +848,22 @@ } } +- (BOOL) subscriberCanReadMessage +{ + return [[self activeUserRoles] containsObject: SOGoRole_ObjectViewer]; +} + +- (BOOL) subscriberCanModifyMessage +{ + NSArray *roles; + + roles = [self activeUserRoles]; + + return ((isNew + && [roles containsObject: SOGoRole_ObjectCreator]) + || (!isNew && [roles containsObject: SOGoRole_ObjectEditor])); +} + // // // diff --git a/OpenChange/MAPIStoreFolder.h b/OpenChange/MAPIStoreFolder.h index 085795de2..fa19b4a84 100644 --- a/OpenChange/MAPIStoreFolder.h +++ b/OpenChange/MAPIStoreFolder.h @@ -161,6 +161,12 @@ - (NSArray *) rolesForExchangeRights: (uint32_t) rights; - (uint32_t) exchangeRightsForRoles: (NSArray *) roles; +- (BOOL) subscriberCanCreateMessages; +- (BOOL) subscriberCanModifyMessages; +- (BOOL) subscriberCanReadMessages; +- (BOOL) subscriberCanDeleteMessages; +- (BOOL) subscriberCanCreateSubFolders; + /* subclass helpers */ - (void) postNotificationsForMoveCopyMessagesWithMIDs: (uint64_t *) srcMids andMessageURLs: (NSArray *) oldMessageURLs diff --git a/OpenChange/MAPIStoreFolder.m b/OpenChange/MAPIStoreFolder.m index 43c56dd46..c861f1407 100644 --- a/OpenChange/MAPIStoreFolder.m +++ b/OpenChange/MAPIStoreFolder.m @@ -1519,4 +1519,29 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe return nil; } +- (BOOL) subscriberCanCreateMessages +{ + return NO; +} + +- (BOOL) subscriberCanModifyMessages +{ + return NO; +} + +- (BOOL) subscriberCanReadMessages +{ + return NO; +} + +- (BOOL) subscriberCanDeleteMessages +{ + return NO; +} + +- (BOOL) subscriberCanCreateSubFolders +{ + return NO; +} + @end diff --git a/OpenChange/MAPIStoreGCSFolder.h b/OpenChange/MAPIStoreGCSFolder.h index 84ff6fcce..f5a43dd2c 100644 --- a/OpenChange/MAPIStoreGCSFolder.h +++ b/OpenChange/MAPIStoreGCSFolder.h @@ -25,6 +25,7 @@ #import "MAPIStoreFolder.h" +@class NSArray; @class NSCalendarDate; @class NSData; @class NSMutableDictionary; @@ -34,6 +35,7 @@ @interface MAPIStoreGCSFolder : MAPIStoreFolder { SOGoMAPIFSMessage *versionsMessage; + NSArray *activeUserRoles; } /* synchronisation */ @@ -46,6 +48,8 @@ - (void) setChangeKey: (NSData *) changeKey forMessageWithKey: (NSString *) messageKey; +- (NSArray *) activeUserRoles; + /* subclasses */ - (EOQualifier *) componentQualifier; diff --git a/OpenChange/MAPIStoreGCSFolder.m b/OpenChange/MAPIStoreGCSFolder.m index 6fe81e303..cef875a8d 100644 --- a/OpenChange/MAPIStoreGCSFolder.m +++ b/OpenChange/MAPIStoreGCSFolder.m @@ -29,6 +29,8 @@ #import #import #import +#import +#import #import "MAPIStoreContext.h" #import "MAPIStoreTypes.h" @@ -53,6 +55,7 @@ ASSIGN (versionsMessage, [SOGoMAPIFSMessage objectWithName: @"versions.plist" inContainer: propsFolder]); + activeUserRoles = nil; } return self; @@ -66,6 +69,7 @@ ASSIGN (versionsMessage, [SOGoMAPIFSMessage objectWithName: @"versions.plist" inContainer: propsFolder]); + activeUserRoles = nil; } return self; @@ -74,6 +78,7 @@ - (void) dealloc { [versionsMessage release]; + [activeUserRoles release]; [super dealloc]; } @@ -516,8 +521,38 @@ return deletedKeys; } +- (NSArray *) activeUserRoles +{ + SOGoUser *activeUser; + + if (!activeUserRoles) + { + activeUser = [[self context] activeUser]; + activeUserRoles = [activeUser rolesForObject: sogoObject + inContext: [context woContext]]; + [activeUserRoles retain]; + } + + return activeUserRoles; +} + +- (BOOL) subscriberCanCreateMessages +{ + return [[self activeUserRoles] containsObject: SOGoRole_ObjectCreator]; +} + +- (BOOL) subscriberCanDeleteMessages +{ + return [[self activeUserRoles] containsObject: SOGoRole_ObjectEraser]; +} + /* subclasses */ +- (EOQualifier *) aclQualifier +{ + return nil; +} + - (EOQualifier *) componentQualifier { [self subclassResponsibility: _cmd]; diff --git a/OpenChange/MAPIStoreMessage.h b/OpenChange/MAPIStoreMessage.h index 83dfa57a2..8e7ff86c4 100644 --- a/OpenChange/MAPIStoreMessage.h +++ b/OpenChange/MAPIStoreMessage.h @@ -42,6 +42,7 @@ NSArray *attachmentKeys; NSMutableDictionary *attachmentParts; NSMutableArray *activeTables; + NSArray *activeUserRoles; } - (void) getMessageData: (struct mapistore_message **) dataPtr @@ -70,6 +71,8 @@ inMemCtx: (TALLOC_CTX *) memCtx; - (NSArray *) activeContainerMessageTables; +- (NSArray *) activeUserRoles; + /* subclasses */ - (void) save; @@ -77,6 +80,9 @@ - (MAPIStoreAttachment *) createAttachment; - (MAPIStoreAttachmentTable *) attachmentTable; +- (BOOL) subscriberCanReadMessage; +- (BOOL) subscriberCanModifyMessage; + @end #endif /* MAPISTOREMESSAGE_H */ diff --git a/OpenChange/MAPIStoreMessage.m b/OpenChange/MAPIStoreMessage.m index f2c78814e..bde58fe58 100644 --- a/OpenChange/MAPIStoreMessage.m +++ b/OpenChange/MAPIStoreMessage.m @@ -28,6 +28,7 @@ #import #import #import +#import #import #import "MAPIStoreActiveTables.h" @@ -137,6 +138,7 @@ rtf2html (NSData *compressedRTF) { attachmentParts = [NSMutableDictionary new]; activeTables = [NSMutableArray new]; + activeUserRoles = nil; } return self; @@ -144,6 +146,7 @@ rtf2html (NSData *compressedRTF) - (void) dealloc { + [activeUserRoles release]; [attachmentKeys release]; [attachmentParts release]; [activeTables release]; @@ -799,4 +802,31 @@ rtf2html (NSData *compressedRTF) [activeTables removeObject: activeTable]; } +- (NSArray *) activeUserRoles +{ + MAPIStoreContext *context; + + if (!activeUserRoles) + { + context = [self context]; + + activeUserRoles = [[context activeUser] + rolesForObject: sogoObject + inContext: [context woContext]]; + [activeUserRoles retain]; + } + + return activeUserRoles; +} + +- (BOOL) subscriberCanReadMessage +{ + return NO; +} + +- (BOOL) subscriberCanModifyMessage +{ + return NO; +} + @end diff --git a/OpenChange/MAPIStoreTasksMessage.m b/OpenChange/MAPIStoreTasksMessage.m index 3dcc4b41d..b675c8b71 100644 --- a/OpenChange/MAPIStoreTasksMessage.m +++ b/OpenChange/MAPIStoreTasksMessage.m @@ -31,6 +31,7 @@ #import #import #import +#import #import #import #import @@ -296,6 +297,27 @@ return [self getLongZero: data inMemCtx: memCtx]; } +- (BOOL) subscriberCanReadMessage +{ + return ([[self activeUserRoles] + containsObject: SOGoCalendarRole_ComponentViewer] + || [self subscriberCanModifyMessage]); +} + +- (BOOL) subscriberCanModifyMessage +{ + BOOL rc; + NSArray *roles = [self activeUserRoles]; + + if (isNew) + rc = [roles containsObject: SOGoRole_ObjectCreator]; + else + rc = ([roles containsObject: SOGoCalendarRole_ComponentModifier] + || [roles containsObject: SOGoCalendarRole_ComponentResponder]); + + return rc; +} + - (void) save { iCalCalendar *vCalendar;