diff --git a/OpenChange/MAPIStoreFSFolder.m b/OpenChange/MAPIStoreFSFolder.m index 21b345fb5..615e3b21c 100644 --- a/OpenChange/MAPIStoreFSFolder.m +++ b/OpenChange/MAPIStoreFSFolder.m @@ -27,7 +27,9 @@ #import #import #import +#import #import "EOQualifier+MAPI.h" +#import "MAPIStoreContext.h" #import "MAPIStoreFSFolderTable.h" #import "MAPIStoreFSMessage.h" #import "MAPIStoreFSMessageTable.h" @@ -237,4 +239,43 @@ static Class EOKeyValueQualifierK; return rights; } +- (BOOL) _testRoleForActiveUser: (NSString *) role +{ + SOGoUser *activeUser; + NSArray *roles; + + activeUser = [[self context] activeUser]; + + roles = [[self aclFolder] aclsForUser: [activeUser login]]; + + return [roles containsObject: role]; +} + +- (BOOL) subscriberCanCreateMessages +{ + return [self _testRoleForActiveUser: @"RightsCreateItems"]; +} + +- (BOOL) subscriberCanModifyMessages +{ + return ([self _testRoleForActiveUser: @"RightsEditAll"] + || [self _testRoleForActiveUser: @"RightsEditOwn"]); +} + +- (BOOL) subscriberCanReadMessages +{ + return [self _testRoleForActiveUser: @"RightsReadItems"]; +} + +- (BOOL) subscriberCanDeleteMessages +{ + return ([self _testRoleForActiveUser: @"RightsDeleteAll"] + || [self _testRoleForActiveUser: @"RightsDeleteOwn"]); +} + +- (BOOL) subscriberCanCreateSubFolders +{ + return [self _testRoleForActiveUser: @"RightsCreateSubfolders"]; +} + @end diff --git a/OpenChange/MAPIStoreFSMessage.m b/OpenChange/MAPIStoreFSMessage.m index f02262cee..161359e8b 100644 --- a/OpenChange/MAPIStoreFSMessage.m +++ b/OpenChange/MAPIStoreFSMessage.m @@ -28,6 +28,7 @@ #import "MAPIStorePropertySelectors.h" #import "SOGoMAPIFSMessage.h" +#import "MAPIStoreFSFolder.h" #import "MAPIStoreFSMessage.h" #import "MAPIStoreTypes.h" #import "NSData+MAPIStore.h" @@ -83,16 +84,29 @@ [properties removeAllObjects]; } -- (BOOL) subscriberCanReadMessage +- (BOOL) _messageIsFreeBusy { - /* This is a HACK until we figure out how to determine a message position in - the mailbox hierarchy.... (missing: folderid and role) */ NSString *msgClass; + /* This is a HACK until we figure out how to determine a message position in + the mailbox hierarchy.... (missing: folderid and role) */ msgClass = [[sogoObject properties] objectForKey: MAPIPropertyKey (PR_MESSAGE_CLASS_UNICODE)]; - return [msgClass isEqualToString: @"IPM.Microsoft.ScheduleData.FreeBusy"]; + return [msgClass isEqualToString: @"IPM.Microsoft.ScheduleData.FreeBusy"]; +} + +/* TODO: differentiate between the "Own" and "All" cases */ +- (BOOL) subscriberCanReadMessage +{ + return ([(MAPIStoreFolder *) container subscriberCanReadMessages] + || [self _messageIsFreeBusy]); +} + +- (BOOL) subscriberCanModifyMessage +{ + return ([(MAPIStoreFolder *) container subscriberCanModifyMessages] + || [self _messageIsFreeBusy]); } - (NSDate *) creationTime