From 10bc15d41d8a29e9c515f7b12145673cd7e39259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Garc=C3=ADa=20S=C3=A1ez?= Date: Tue, 14 Jul 2015 17:41:33 +0200 Subject: [PATCH] oc-folder: activate user context when needed Before creating sogo objects --- OpenChange/MAPIStoreContactsFolder.m | 7 +++++-- OpenChange/MAPIStoreDBFolder.m | 22 +++++++++++++-------- OpenChange/MAPIStoreFolder.m | 29 +++++++++++++++++----------- OpenChange/MAPIStoreMailFolder.m | 27 +++++++++++++------------- OpenChange/MAPIStoreTasksFolder.m | 6 ++++-- 5 files changed, 55 insertions(+), 36 deletions(-) diff --git a/OpenChange/MAPIStoreContactsFolder.m b/OpenChange/MAPIStoreContactsFolder.m index fc0c35840..823f467cd 100644 --- a/OpenChange/MAPIStoreContactsFolder.m +++ b/OpenChange/MAPIStoreContactsFolder.m @@ -28,6 +28,7 @@ #import #import "MAPIApplication.h" +#import "MAPIStoreUserContext.h" #import "MAPIStoreContactsContext.h" #import "MAPIStoreContactsMessage.h" #import "MAPIStoreContactsMessageTable.h" @@ -58,10 +59,12 @@ SOGoContactGCSEntry *newEntry; NSString *name; + [[self userContext] activate]; + name = [NSString stringWithFormat: @"%@.vcf", [SOGoObject globallyUniqueObjectId]]; newEntry = [SOGoContactGCSEntry objectWithName: name - inContainer: sogoObject]; + inContainer: sogoObject]; [newEntry setIsNew: YES]; newMessage = [MAPIStoreContactsMessage mapiStoreObjectWithSOGoObject: newEntry inContainer: self]; @@ -100,7 +103,7 @@ rights |= RightsReadItems; if (rights != 0) rights |= RoleNone; /* actually "folder visible" */ - + return rights; } diff --git a/OpenChange/MAPIStoreDBFolder.m b/OpenChange/MAPIStoreDBFolder.m index 4dd7fbfd9..d1734dc7c 100644 --- a/OpenChange/MAPIStoreDBFolder.m +++ b/OpenChange/MAPIStoreDBFolder.m @@ -161,7 +161,7 @@ static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact"; else [dbFolder changePathTo: [NSString stringWithFormat: @"/fallback/%@", pathComponent] intoNewContainer: nil]; - + mapping = [self mapping]; if (targetFolder) @@ -193,6 +193,8 @@ static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact"; SOGoMAPIDBMessage *fsObject; NSString *newKey; + [[self userContext] activate]; + newKey = [NSString stringWithFormat: @"%@.plist", [SOGoObject globallyUniqueObjectId]]; fsObject = [SOGoMAPIDBMessage objectWithName: newKey @@ -214,10 +216,13 @@ static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact"; ownerUser = [[self userContext] sogoUser]; if ([[context activeUser] isEqual: ownerUser] || [self subscriberCanReadMessages]) - keys = [(SOGoCacheGCSFolder *) sogoObject childKeysOfType: MAPIMessageCacheObject - includeDeleted: NO - matchingQualifier: qualifier - andSortOrderings: sortOrderings]; + { + [[self userContext] activate]; + keys = [(SOGoCacheGCSFolder *) sogoObject childKeysOfType: MAPIMessageCacheObject + includeDeleted: NO + matchingQualifier: qualifier + andSortOrderings: sortOrderings]; + } else keys = [NSArray array]; @@ -227,6 +232,7 @@ static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact"; - (NSArray *) folderKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings { + [[self userContext] activate]; return [dbFolder childKeysOfType: MAPIFolderCacheObject includeDeleted: NO matchingQualifier: qualifier @@ -262,7 +268,7 @@ static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact"; if ([date laterDate: fileDate] == fileDate) { //[self logWithFormat: @"current date: %@", date]; - + date = fileDate; } } @@ -326,7 +332,7 @@ static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact"; rights |= RightsFolderContact; if (rights != 0) rights |= RoleNone; /* actually "folder visible" */ - + return rights; } @@ -361,7 +367,7 @@ static NSString *MAPIStoreRightFolderContact = @"RightsFolderContact"; subscribed to read an open contained messages in order to enable them to find the "LocalFreebusy" message */ [sogoObject reloadIfNeeded]; - + displayName = [[sogoObject properties] objectForKey: MAPIPropertyKey (PidTagDisplayName)]; diff --git a/OpenChange/MAPIStoreFolder.m b/OpenChange/MAPIStoreFolder.m index 0e2652ff8..15ca68fc0 100644 --- a/OpenChange/MAPIStoreFolder.m +++ b/OpenChange/MAPIStoreFolder.m @@ -120,6 +120,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe folderName = [folderURL host]; userContext = [self userContext]; + [userContext activate]; [userContext ensureFolderTableExists]; ASSIGN (dbFolder, @@ -274,6 +275,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe if (messageKey) { + [[self userContext] activate]; msgObject = [sogoObject lookupName: messageKey inContext: nil acquire: NO]; @@ -303,6 +305,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe if (messageKey) { + [[self userContext] activate]; if ([[self faiMessageKeys] containsObject: messageKey]) { msgObject = [dbFolder lookupName: messageKey @@ -535,6 +538,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe context = [self context]; ownerUser = [[self userContext] sogoUser]; + [[self userContext] activate]; if ([[context activeUser] isEqual: ownerUser] || (!isAssociated && [self subscriberCanCreateMessages])) @@ -747,9 +751,9 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe } else rc = MAPISTORE_ERR_DENIED; - + //talloc_free (memCtx); - + return rc; } @@ -920,7 +924,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe NSArray *newIDs; uint64_t idNbr; bool softDeleted; - + baseURL = [self url]; mapping = [self mapping]; @@ -1094,6 +1098,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe - (NSArray *) faiMessageKeysMatchingQualifier: (EOQualifier *) qualifier andSortOrderings: (NSArray *) sortOrderings { + [[self userContext] activate]; return [dbFolder childKeysOfType: MAPIFAICacheObject includeDeleted: NO matchingQualifier: qualifier @@ -1202,7 +1207,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe /* Possible values are: - + 0x00000001 Modify 0x00000002 Read 0x00000004 Delete @@ -1233,7 +1238,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe access |= 0x10; if (userIsOwner) access |= 0x20; - + *data = MAPILongValue (memCtx, access); return MAPISTORE_SUCCESS; @@ -1262,7 +1267,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe rights |= RightsCreateSubfolders; if (userIsOwner) rights |= RightsFolderOwner | RightsFolderContact; - + *data = MAPILongValue (memCtx, rights); return MAPISTORE_SUCCESS; @@ -1298,7 +1303,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPIBoolValue (memCtx, [self supportsSubFolders] && [[self folderKeys] count] > 0); - + return MAPISTORE_SUCCESS; } @@ -1306,7 +1311,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, [[self folderKeys] count]); - + return MAPISTORE_SUCCESS; } @@ -1408,7 +1413,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe [dbObject setIsNew: YES]; newMessage = [MAPIStoreFAIMessageK mapiStoreObjectWithSOGoObject: dbObject inContainer: self]; - + return newMessage; } @@ -1417,6 +1422,8 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe MAPIStoreMessage *newMessage; WOContext *woContext; + [[self userContext] activate]; + if (isAssociated) newMessage = [self _createAssociatedMessage]; else @@ -1616,7 +1623,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe permissionUser = nil; permissionRoles = nil; - + if (currentPermission->PermissionDataFlags == ROW_ADD) isAdd = YES; else if (currentPermission->PermissionDataFlags == ROW_MODIFY) @@ -1767,7 +1774,7 @@ Class NSExceptionK, MAPIStoreFAIMessageK, MAPIStoreMessageTableK, MAPIStoreFAIMe { [self subclassResponsibility: _cmd]; - return nil; + return nil; } - (NSArray *) getDeletedKeysFromChangeNumber: (uint64_t) changeNum diff --git a/OpenChange/MAPIStoreMailFolder.m b/OpenChange/MAPIStoreMailFolder.m index 993b1c136..d4defea1e 100644 --- a/OpenChange/MAPIStoreMailFolder.m +++ b/OpenChange/MAPIStoreMailFolder.m @@ -250,7 +250,7 @@ static Class SOGoMailFolderK, MAPIStoreMailFolderK, MAPIStoreOutboxFolderK; inMemCtx: (TALLOC_CTX *) memCtx { *data = [@"IPF.Note" asUnicodeInMemCtx: memCtx]; - + return MAPISTORE_SUCCESS; } @@ -262,7 +262,7 @@ static Class SOGoMailFolderK, MAPIStoreMailFolderK, MAPIStoreOutboxFolderK; if (!nonDeletedQualifier) { deletedQualifier - = [[EOKeyValueQualifier alloc] + = [[EOKeyValueQualifier alloc] initWithKey: @"FLAGS" operatorSelector: EOQualifierOperatorContains value: [NSArray arrayWithObject: @"Deleted"]]; @@ -375,7 +375,7 @@ static Class SOGoMailFolderK, MAPIStoreMailFolderK, MAPIStoreOutboxFolderK; [self warnWithFormat: @"qualifier is only used for folders with name"]; if (sortOrderings) [self errorWithFormat: @"sort orderings are not used for folders"]; - + /* FIXME: Flush any cache before retrieving the hierarchy, this slows things down but it is safer */ if (!qualifier) @@ -469,7 +469,7 @@ static Class SOGoMailFolderK, MAPIStoreMailFolderK, MAPIStoreOutboxFolderK; } else supportsSubFolders = YES; - + return supportsSubFolders; } @@ -638,7 +638,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) fetchResults = [fetchResults sortedArrayUsingFunction: _compareFetchResultsByMODSEQ context: NULL]; - + for (count = 0; count < max; count++) { result = [fetchResults objectAtIndex: count]; @@ -948,7 +948,7 @@ _compareFetchResultsByMODSEQ (id entry1, id entry2, void *data) } } [self _setChangeKey: changeKey forMessageEntry: messageEntry]; - + [versionsMessage save]; } @@ -1175,7 +1175,7 @@ _parseIMAPRange (const unichar *uniString, NSArray **UIDsP) count++; } *UIDsP = UIDs; - + return count; } @@ -1453,7 +1453,7 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) [uids addObject: [self messageUIDFromMessageKey: childKey]]; } - result = [client copyUids: uids + result = [client copyUids: uids toFolder: newFolderIMAPName]; if ([[result objectForKey: @"result"] boolValue]) { @@ -1492,9 +1492,10 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) { SOGoCacheObject *childObject; - childObject = [SOGoCacheObject objectWithName: [SOGoCacheObject - globallyUniqueObjectId] - inContainer: sogoObject]; + [[[self context] userContext] activate]; + + childObject = [SOGoCacheObject objectWithName: [SOGoCacheObject globallyUniqueObjectId] + inContainer: sogoObject]; return [MAPIStoreMailVolatileMessage mapiStoreObjectWithSOGoObject: childObject inContainer: self]; @@ -1570,7 +1571,7 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) rights |= RoleNone; /* actually "folder visible" */ // [self logWithFormat: @"rights for roles (%@) = %.8x", roles, rights]; - + return rights; } @@ -1621,7 +1622,7 @@ _parseCOPYUID (NSString *line, NSArray **destUIDsP) } } } - + client = [[(SOGoMailFolder *) sogoObject imap4Connection] client]; [client select: [sogoObject absoluteImap4Name]]; response = [client fetchUids: [keyAssoc allKeys] diff --git a/OpenChange/MAPIStoreTasksFolder.m b/OpenChange/MAPIStoreTasksFolder.m index 7b8990fc8..d777b8e8b 100644 --- a/OpenChange/MAPIStoreTasksFolder.m +++ b/OpenChange/MAPIStoreTasksFolder.m @@ -31,6 +31,7 @@ #import #import "MAPIApplication.h" +#import "MAPIStoreUserContext.h" #import "MAPIStoreTasksContext.h" #import "MAPIStoreTasksMessage.h" #import "MAPIStoreTasksMessageTable.h" @@ -61,6 +62,7 @@ SOGoTaskObject *newEntry; NSString *name; + [[[self context] userContext] activate]; name = [NSString stringWithFormat: @"%@.ics", [SOGoObject globallyUniqueObjectId]]; newEntry = [SOGoTaskObject objectWithName: name @@ -69,7 +71,7 @@ newMessage = [MAPIStoreTasksMessage mapiStoreObjectWithSOGoObject: newEntry inContainer: self]; - + return newMessage; } @@ -116,7 +118,7 @@ rights |= RightsReadItems; if (rights != 0) rights |= RoleNone; /* actually "folder visible" */ - + return rights; }