From 156463c0841a17a1657ebabb2061fa84c330f12c Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Thu, 10 Dec 2015 11:11:22 -0500 Subject: [PATCH] (fix #157) we now honor which calendars we can write to --- UI/Scheduler/UIxCalendarSelector.m | 181 ++++++++++-------- .../UIxAppointmentEditorTemplate.wox | 2 +- .../js/Scheduler/Calendar.service.js | 8 +- .../js/Scheduler/ComponentController.js | 2 +- 4 files changed, 106 insertions(+), 87 deletions(-) diff --git a/UI/Scheduler/UIxCalendarSelector.m b/UI/Scheduler/UIxCalendarSelector.m index 86a709684..efbe93071 100644 --- a/UI/Scheduler/UIxCalendarSelector.m +++ b/UI/Scheduler/UIxCalendarSelector.m @@ -25,6 +25,7 @@ #import #import +#import #import #import @@ -92,102 +93,114 @@ _intValueFromHex (NSString *hexString) - (NSArray *) calendars { - NSArray *folders; - NSMutableDictionary *calendar, *notifications, *urls; - NSUInteger count, max; - NSString *userLogin, *folderName, *fDisplayName; + NSMutableDictionary *calendar, *notifications, *urls, *acls; + NSString *userLogin, *folderName, *fDisplayName, *owner; NSNumber *isActive, *fActiveTasks; - SOGoAppointmentFolders *co; SOGoAppointmentFolder *folder; - BOOL reloadOnLogin, synchronize; + SOGoAppointmentFolders *co; + NSArray *folders, *allACLs; + + BOOL objectCreator, objectEraser, reloadOnLogin, synchronize; + NSUInteger count, max; if (!calendars) - { - co = [self clientObject]; - userLogin = [[context activeUser] login]; - folders = [co subFolders]; - max = [folders count]; - calendars = [[NSMutableArray alloc] initWithCapacity: max]; - for (count = 0; count < max; count++) { - folder = [folders objectAtIndex: count]; - calendar = [NSMutableDictionary dictionary]; - folderName = [folder nameInContainer]; - fDisplayName = [folder displayName]; - if (fDisplayName == nil) - fDisplayName = @""; - if ([fDisplayName isEqualToString: [co defaultFolderName]]) - fDisplayName = [self labelForKey: fDisplayName]; - fActiveTasks = [folder activeTasks]; - - [calendar setObject: folderName forKey: @"id"]; - [calendar setObject: fDisplayName forKey: @"name"]; - [calendar setObject: [folder calendarColor] forKey: @"color"]; - isActive = [NSNumber numberWithBool: [folder isActive]]; - [calendar setObject: isActive forKey: @"active"]; - [calendar setObject: [folder ownerInContext: context] forKey: @"owner"]; - [calendar setObject: [NSNumber numberWithBool: [folder isWebCalendar]] forKey: @"isWebCalendar"]; - if (fActiveTasks > 0) - [calendar setObject: fActiveTasks forKey:@"activeTasks" ]; - [calendar setObject: [NSNumber numberWithBool: [folder includeInFreeBusy]] forKey: @"includeInFreeBusy"]; - [calendar setObject: [NSNumber numberWithBool: [folder showCalendarAlarms]] forKey: @"showCalendarAlarms"]; - [calendar setObject: [NSNumber numberWithBool: [folder showCalendarTasks]] forKey: @"showCalendarTasks"]; - - if ([folder isKindOfClass: [SOGoWebAppointmentFolder class]]) - synchronize = NO; - else - synchronize = [folder synchronize]; - - if ([[folder nameInContainer] isEqualToString: @"personal"]) - synchronize = YES; - - [calendar setObject: [NSNumber numberWithBool: synchronize] forKey: @"synchronize"]; - - if ([folder isWebCalendar]) + co = [self clientObject]; + userLogin = [[context activeUser] login]; + folders = [co subFolders]; + max = [folders count]; + calendars = [[NSMutableArray alloc] initWithCapacity: max]; + for (count = 0; count < max; count++) { - urls = [NSMutableDictionary dictionaryWithObject: [folder folderPropertyValueInCategory: @"WebCalendars"] - forKey: @"webCalendarURL"]; - if ([folder respondsToSelector: @selector (reloadOnLogin)]) - reloadOnLogin = [(SOGoWebAppointmentFolder *) folder reloadOnLogin]; + folder = [folders objectAtIndex: count]; + owner = [folder ownerInContext: context]; + calendar = [NSMutableDictionary dictionary]; + folderName = [folder nameInContainer]; + fDisplayName = [folder displayName]; + if (fDisplayName == nil) + fDisplayName = @""; + if ([fDisplayName isEqualToString: [co defaultFolderName]]) + fDisplayName = [self labelForKey: fDisplayName]; + fActiveTasks = [folder activeTasks]; + + [calendar setObject: folderName forKey: @"id"]; + [calendar setObject: fDisplayName forKey: @"name"]; + [calendar setObject: [folder calendarColor] forKey: @"color"]; + isActive = [NSNumber numberWithBool: [folder isActive]]; + [calendar setObject: isActive forKey: @"active"]; + [calendar setObject: owner forKey: @"owner"]; + [calendar setObject: [NSNumber numberWithBool: [folder isWebCalendar]] forKey: @"isWebCalendar"]; + if (fActiveTasks > 0) + [calendar setObject: fActiveTasks forKey:@"activeTasks" ]; + [calendar setObject: [NSNumber numberWithBool: [folder includeInFreeBusy]] forKey: @"includeInFreeBusy"]; + [calendar setObject: [NSNumber numberWithBool: [folder showCalendarAlarms]] forKey: @"showCalendarAlarms"]; + [calendar setObject: [NSNumber numberWithBool: [folder showCalendarTasks]] forKey: @"showCalendarTasks"]; + + // We extract ACLs for this address book + allACLs = ([owner isEqualToString: userLogin] ? nil : [folder aclsForUser: userLogin]); + objectCreator = ([owner isEqualToString: userLogin] || [allACLs containsObject: SOGoRole_ObjectCreator]); + objectEraser = ([owner isEqualToString: userLogin] || [allACLs containsObject: SOGoRole_ObjectEraser]); + acls = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool: objectCreator], @"objectCreator", + [NSNumber numberWithBool: objectEraser], @"objectEraser", nil]; + + + if ([folder isKindOfClass: [SOGoWebAppointmentFolder class]]) + objectCreator = objectEraser = synchronize = NO; else - reloadOnLogin = NO; - [calendar setObject: [NSNumber numberWithBool: reloadOnLogin] forKey: @"reloadOnLogin"]; - } - else - { - urls = [NSMutableDictionary dictionaryWithObjectsAndKeys: - [folder calDavURL], @"calDavURL", - [folder webDavICSURL], @"webDavICSURL", - [folder webDavXMLURL], @"webDavXMLURL", - nil]; - if ([self isPublicAccessEnabled]) + synchronize = [folder synchronize]; + + [calendar setObject: acls forKey: @"acls"]; + + if ([[folder nameInContainer] isEqualToString: @"personal"]) + synchronize = YES; + + [calendar setObject: [NSNumber numberWithBool: synchronize] forKey: @"synchronize"]; + + if ([folder isWebCalendar]) { - [urls setObject: [folder publicCalDavURL] forKey: @"publicCalDavURL"]; - [urls setObject: [folder publicWebDavICSURL] forKey: @"publicWebDavICSURL"]; - [urls setObject: [folder publicWebDavXMLURL] forKey: @"publicWebDavXMLURL"]; + urls = [NSMutableDictionary dictionaryWithObject: [folder folderPropertyValueInCategory: @"WebCalendars"] + forKey: @"webCalendarURL"]; + if ([folder respondsToSelector: @selector (reloadOnLogin)]) + reloadOnLogin = [(SOGoWebAppointmentFolder *) folder reloadOnLogin]; + else + reloadOnLogin = NO; + [calendar setObject: [NSNumber numberWithBool: reloadOnLogin] forKey: @"reloadOnLogin"]; } - } - [calendar setObject: urls forKey: @"urls"]; + else + { + urls = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [folder calDavURL], @"calDavURL", + [folder webDavICSURL], @"webDavICSURL", + [folder webDavXMLURL], @"webDavXMLURL", + nil]; + if ([self isPublicAccessEnabled]) + { + [urls setObject: [folder publicCalDavURL] forKey: @"publicCalDavURL"]; + [urls setObject: [folder publicWebDavICSURL] forKey: @"publicWebDavICSURL"]; + [urls setObject: [folder publicWebDavXMLURL] forKey: @"publicWebDavXMLURL"]; + } + } + [calendar setObject: urls forKey: @"urls"]; - if ([userLogin isEqualToString: [folder ownerInContext: context]]) - { - notifications = [NSMutableDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithBool: [folder notifyOnPersonalModifications]], - @"notifyOnPersonalModifications", - [NSNumber numberWithBool: [folder notifyOnExternalModifications]], - @"notifyOnExternalModifications", - [NSNumber numberWithBool: [folder notifyUserOnPersonalModifications]], - @"notifyUserOnPersonalModifications", - nil]; - if ([folder notifiedUserOnPersonalModifications]) - [calendar setObject: [folder notifiedUserOnPersonalModifications] forKey: @"notifiedUserOnPersonalModifications"]; - [calendar setObject: notifications forKey: @"notifications"]; - } + if ([userLogin isEqualToString: [folder ownerInContext: context]]) + { + notifications = [NSMutableDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool: [folder notifyOnPersonalModifications]], + @"notifyOnPersonalModifications", + [NSNumber numberWithBool: [folder notifyOnExternalModifications]], + @"notifyOnExternalModifications", + [NSNumber numberWithBool: [folder notifyUserOnPersonalModifications]], + @"notifyUserOnPersonalModifications", + nil]; + if ([folder notifiedUserOnPersonalModifications]) + [calendar setObject: [folder notifiedUserOnPersonalModifications] forKey: @"notifiedUserOnPersonalModifications"]; + [calendar setObject: notifications forKey: @"notifications"]; + } - [calendars addObject: calendar]; - } + [calendars addObject: calendar]; + } } - + return calendars; } diff --git a/UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox b/UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox index e7b232bbe..bc9e1d38f 100644 --- a/UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +++ b/UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox @@ -33,7 +33,7 @@ - {{calendar.name}} diff --git a/UI/WebServerResources/js/Scheduler/Calendar.service.js b/UI/WebServerResources/js/Scheduler/Calendar.service.js index 9d8244713..16aa617f7 100644 --- a/UI/WebServerResources/js/Scheduler/Calendar.service.js +++ b/UI/WebServerResources/js/Scheduler/Calendar.service.js @@ -86,9 +86,10 @@ * @memberof Calendar * @desc Set or get the list of calendars. Will instanciate a new Calendar object for each item. * @param {object[]} [data] - the metadata of the calendars + * @param {bool} [writable] - if true, returns only the list of writable calendars * @returns the list of calendars */ - Calendar.$findAll = function(data) { + Calendar.$findAll = function(data, writable) { var _this = this; if (data) { this.$calendars = []; @@ -105,6 +106,11 @@ _this.$calendars.push(calendar); }); } + + if (writable) { + return _.union(this.$calendars, _.filter(this.$subscriptions, function(calendar) { return calendar.acls.objectCreator; })); + } + return _.union(this.$calendars, this.$subscriptions, this.$webcalendars); }; diff --git a/UI/WebServerResources/js/Scheduler/ComponentController.js b/UI/WebServerResources/js/Scheduler/ComponentController.js index 6213c5eaa..32f03eada 100644 --- a/UI/WebServerResources/js/Scheduler/ComponentController.js +++ b/UI/WebServerResources/js/Scheduler/ComponentController.js @@ -149,7 +149,7 @@ function ComponentEditorController($rootScope, $scope, $log, $timeout, $mdDialog, User, Calendar, Component, AddressBook, Card, Alarm, stateComponent) { var vm = this, component, oldStartDate, oldEndDate, oldDueDate; - vm.calendars = Calendar.$calendars; + vm.service = Calendar; vm.component = stateComponent; vm.categories = {}; vm.showRecurrenceEditor = vm.component.$hasCustomRepeat;