mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-05-28 14:45:28 +00:00
(fix #157) we now honor which calendars we can write to
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
#import <NGObjWeb/WOResponse.h>
|
||||
|
||||
#import <SOGo/NSDictionary+Utilities.h>
|
||||
#import <SOGo/SOGoPermissions.h>
|
||||
#import <SOGo/SOGoSystemDefaults.h>
|
||||
|
||||
#import <SoObjects/SOGo/NSArray+Utilities.h>
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<md-input-container>
|
||||
<label><var:string label:value="Calendar"/></label>
|
||||
<md-select ng-model="editor.component.destinationCalendar">
|
||||
<md-option ng-repeat="calendar in ::editor.calendars"
|
||||
<md-option ng-repeat="calendar in editor.service.$findAll(null, true)"
|
||||
ng-value="calendar.id">{{calendar.name}}</md-option>
|
||||
</md-select>
|
||||
</md-input-container>
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user