diff --git a/SOPE/GDLContentStore/GCSFolderManager.h b/SOPE/GDLContentStore/GCSFolderManager.h index 3f4ca95c32..6758bf4e9c 100644 --- a/SOPE/GDLContentStore/GCSFolderManager.h +++ b/SOPE/GDLContentStore/GCSFolderManager.h @@ -65,6 +65,7 @@ - (BOOL)folderExistsAtPath:(NSString *)_path; - (NSArray *)listSubFoldersAtPath:(NSString *)_path recursive:(BOOL)_flag; +- (NSDictionary *) recordAtPath: (NSString *) _path; - (GCSFolder *)folderAtPath:(NSString *)_path; - (NSException *)createFolderOfType:(NSString *)_type withName:(NSString *)_name atPath:(NSString *)_path; diff --git a/SOPE/GDLContentStore/GCSFolderManager.m b/SOPE/GDLContentStore/GCSFolderManager.m index 91c59c2686..b7260e1c3b 100644 --- a/SOPE/GDLContentStore/GCSFolderManager.m +++ b/SOPE/GDLContentStore/GCSFolderManager.m @@ -634,7 +634,7 @@ - (NSArray *)listSubFoldersAtPath:(NSString *)_path recursive:(BOOL)_recursive{ return result; } -- (GCSFolder *) folderAtPath: (NSString *) _path +- (NSDictionary *) recordAtPath: (NSString *) _path { NSMutableString *sql; NSArray *fnames, *records; @@ -691,8 +691,13 @@ - (GCSFolder *) folderAtPath: (NSString *) _path [self debugWithFormat:@"found no record for path: '%@'", _path]; return nil; } - - return [self folderForRecord:record]; + + return record; +} + +- (GCSFolder *) folderAtPath: (NSString *) _path +{ + return [self folderForRecord: [self recordAtPath: _path]]; } - (NSString *) baseTableNameWithUID: (NSString *) _uid diff --git a/SoObjects/SOGo/SOGoGCSFolder.m b/SoObjects/SOGo/SOGoGCSFolder.m index a4036ec50c..4b51fe2160 100644 --- a/SoObjects/SOGo/SOGoGCSFolder.m +++ b/SoObjects/SOGo/SOGoGCSFolder.m @@ -439,7 +439,23 @@ - (GCSFolderManager *) folderManager - (GCSFolder *) ocsFolderForPath: (NSString *) _path { - return [[self folderManager] folderAtPath: _path]; + NSDictionary *record; + SOGoCache *cache; + + cache = [SOGoCache sharedCache]; + record = [[cache valueForKey: _path] objectFromJSONString]; + + if (!record) + { + record = [[self folderManager] recordAtPath: _path]; + + if (!record) + return nil; + + [cache setValue: [record jsonRepresentation] forKey: _path]; + } + + return [[self folderManager] folderForRecord: record]; } - (BOOL) folderIsMandatory @@ -590,6 +606,7 @@ - (NSException *) delete [self removeFolderSettings: moduleSettings withReference: [self folderReference]]; [us synchronize]; + [[SOGoCache sharedCache] removeValueForKey: ocsPath]; if ([[context request] handledByDefaultHandler]) [self sendFolderAdvisoryTemplate: @"Removal"]; diff --git a/SoObjects/SOGo/SOGoParentFolder.m b/SoObjects/SOGo/SOGoParentFolder.m index eb454dc970..89521b0582 100644 --- a/SoObjects/SOGo/SOGoParentFolder.m +++ b/SoObjects/SOGo/SOGoParentFolder.m @@ -297,14 +297,8 @@ - (BOOL) _appendSubscribedSource: (NSString *) sourceKey // This is important because user A could delete folder X, and user B has subscribed to it. // If the "default roles" are enabled for calendars/address books, -validatePersmission:.. will // work (grabbing the default role) and the deleted resource will be incorrectly returned. - // - // FIXME - 2015/01/29 - this fix (24c6c8c91d421594bd51f07904d4cd3911cd187c) was reverted. Normally, we should add - // [subscribedFolder ocsFolderForPath: [subscribedFolder ocsPath]] to check the existence of the folder but it causes - // massive SQL traffic. - // - // The proper fix would be to check upon login and only upon login if GCS folders that we're subscribed to are still existent. - // if (subscribedFolder + && [subscribedFolder ocsFolderForPath: [subscribedFolder ocsPath]] && ![sm validatePermission: SOGoPerm_AccessObject onObject: subscribedFolder inContext: context])