mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-05-26 05:45:24 +00:00
propagate from branch 'ca.inverse.sogo.1_3_10' (head e1d9c79bd6c5862141ce684d5c07afe5be283b15)
to branch 'ca.inverse.sogo' (head 6b6c2b39b25856934b5a687c610bcd0b60732c42) Monotone-Parent: 6b6c2b39b25856934b5a687c610bcd0b60732c42 Monotone-Parent: e1d9c79bd6c5862141ce684d5c07afe5be283b15 Monotone-Revision: c848a704ccb578f33ab987c1380dd78a884e9eab Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-11-30T14:55:30 Monotone-Branch: ca.inverse.sogo
This commit is contained in:
@@ -1,3 +1,56 @@
|
||||
2011-11-30 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
|
||||
* SoObjects/SOGo/SOGoFolder.m
|
||||
(_expandPropertyResponse:forObject:): set the element in the 404
|
||||
bag only if the value is nil to avoid iCal complaining about lack
|
||||
of support for sharing.
|
||||
|
||||
* SoObjects/Appointments/SOGoCalendarProxy.m (+webdavAclManager):
|
||||
overriden method.
|
||||
(-davGroupMemberSet, -setDavGroupMemberSet:): instantiate the
|
||||
"Calendar" object from the result of -[self lookupUserFolder]
|
||||
instead of "container", since we might attach proxy objects to
|
||||
other containers.
|
||||
|
||||
* Main/SOGo+DAV.m (-davPrincipalURL): new DAV getter.
|
||||
(-davPrincipalSearchPropertySet): added "calendar-user-type", even
|
||||
though it's a lie.
|
||||
(-davComplianceClassesInContext:): declare
|
||||
"calendar-query-extended", "extended-mkcol",
|
||||
"calendarserver-principal-property-search" as additional classes,
|
||||
even though it's a lie.
|
||||
|
||||
* SoObjects/Appointments/SOGoUserFolder+Appointments.m
|
||||
(-davCalendarUserAddressSet): make sure each email address is
|
||||
reported only once, we also return the user principal in the list
|
||||
(for iCal).
|
||||
|
||||
* SoObjects/SOGo/SOGoObject.m (-davComplianceClassesInContext:):
|
||||
declare "calendar-query-extended", "extended-mkcol",
|
||||
"calendarserver-principal-property-search" as additional calendar
|
||||
classes, even though it's a lie.
|
||||
(-davCurrentUserPrincipal): new method.
|
||||
|
||||
* SoObjects/Appointments/SOGoAppointmentFolder.m (-davResourceId):
|
||||
new DAV getter.
|
||||
|
||||
* SoObjects/SOGo/SOGoUserFolder.m (-davResourceId): new DAV getter.
|
||||
|
||||
* SoObjects/SOGo/SOGoFolder.m (-davPrincipalURL): moved from
|
||||
SOGoUserFolder.
|
||||
|
||||
* SoObjects/SOGo/WORequest+SOGo.m (-isICal, -isICal4): updated for
|
||||
iCal 5.
|
||||
|
||||
* SoObjects/Appointments/SOGoAppointmentInboxFolder.m
|
||||
(-davScheduleDefaultCalendarURL): fixed method to return a
|
||||
properly formatted XML chunk.
|
||||
(-displayName): returns nameInContainer.
|
||||
|
||||
* SoObjects/Appointments/SOGoAppointmentFolder.m
|
||||
(-davCalendarTimeZone): fixed by embedding the VTIMEZONE element
|
||||
in a VCALENDAR.
|
||||
|
||||
2011-11-29 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||
|
||||
* OpenChange/MAPIStoreTypes.m (NSObjectFromSPropValue): set the
|
||||
|
||||
+31
-3
@@ -48,6 +48,26 @@
|
||||
|
||||
@implementation SOGo (SOGoWebDAVExtensions)
|
||||
|
||||
- (NSArray *) davPrincipalURL
|
||||
{
|
||||
NSArray *principalURL;
|
||||
NSString *classes;
|
||||
WOContext *context;
|
||||
|
||||
context = [self context];
|
||||
if ([[context request] isICal4])
|
||||
{
|
||||
classes = [[self davComplianceClassesInContext: context]
|
||||
componentsJoinedByString: @", "];
|
||||
[[context response] setHeader: classes forKey: @"DAV"];
|
||||
}
|
||||
|
||||
principalURL = [NSArray arrayWithObjects: @"href", @"DAV:", @"D",
|
||||
[self davURLAsString], nil];
|
||||
|
||||
return [NSArray arrayWithObject: principalURL];
|
||||
}
|
||||
|
||||
- (WOResponse *) davPrincipalSearchPropertySet: (WOContext *) localContext
|
||||
{
|
||||
static NSDictionary *davResponse = nil;
|
||||
@@ -62,6 +82,7 @@
|
||||
properties = [NSArray arrayWithObjects:
|
||||
@"calendar-user-type",
|
||||
@"calendar-user-address-set",
|
||||
@"calendar-user-type",
|
||||
@"displayname",
|
||||
@"first-name",
|
||||
@"last-name",
|
||||
@@ -72,6 +93,7 @@
|
||||
namespaces = [NSArray arrayWithObjects:
|
||||
XMLNS_CALDAV,
|
||||
XMLNS_CALDAV,
|
||||
XMLNS_CALDAV,
|
||||
XMLNS_WEBDAV,
|
||||
XMLNS_CalendarServerOrg,
|
||||
XMLNS_CalendarServerOrg,
|
||||
@@ -549,9 +571,15 @@
|
||||
{
|
||||
newClasses
|
||||
= [[super davComplianceClassesInContext: localContext] mutableCopy];
|
||||
selfClasses = [NSArray arrayWithObjects: @"access-control", @"addressbook",
|
||||
@"calendar-access", @"calendar-auto-schedule",
|
||||
@"calendar-schedule", @"calendar-proxy", nil];
|
||||
selfClasses = [NSArray arrayWithObjects: @"access-control",
|
||||
@"addressbook", @"calendar-access",
|
||||
@"calendar-schedule", @"calendar-auto-schedule",
|
||||
@"calendar-proxy",
|
||||
|
||||
@"calendar-query-extended",
|
||||
@"extended-mkcol",
|
||||
@"calendarserver-principal-property-search",
|
||||
nil];
|
||||
[newClasses addObjectsFromArray: selfClasses];
|
||||
}
|
||||
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
#import <SOGo/NSDictionary+Utilities.h>
|
||||
#import <SOGo/NSObject+DAV.h>
|
||||
#import <SOGo/NSString+Utilities.h>
|
||||
#import <SOGo/SOGoBuild.h>
|
||||
#import <SOGo/SOGoCache.h>
|
||||
#import <SOGo/SOGoDomainDefaults.h>
|
||||
#import <SOGo/SOGoPermissions.h>
|
||||
@@ -1542,11 +1543,22 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir
|
||||
{
|
||||
SOGoUser *ownerUser;
|
||||
NSString *ownerTimeZone;
|
||||
iCalCalendar *tzCal;
|
||||
iCalTimeZone *tz;
|
||||
NSString *prodID;
|
||||
|
||||
ownerUser = [SOGoUser userWithLogin: [self ownerInContext: context]];
|
||||
ownerTimeZone = [[ownerUser userDefaults] timeZoneName];
|
||||
|
||||
return [[iCalTimeZone timeZoneForName: ownerTimeZone] versitString];
|
||||
tz = [iCalTimeZone timeZoneForName: ownerTimeZone];
|
||||
|
||||
tzCal = [iCalCalendar groupWithTag: @"vcalendar"];
|
||||
[tzCal setVersion: @"2.0"];
|
||||
prodID = [NSString stringWithFormat:
|
||||
@"-//Inverse inc./SOGo %@//EN", SOGoVersion];
|
||||
[tzCal setProdID: prodID];
|
||||
[tzCal addChild: tz];
|
||||
|
||||
return [tzCal versitString];
|
||||
}
|
||||
|
||||
- (NSException *) setDavCalendarTimeZone: (NSString *) newTimeZone
|
||||
@@ -2037,6 +2049,12 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir
|
||||
return @"";
|
||||
}
|
||||
|
||||
- (NSString *) davResourceId
|
||||
{
|
||||
return [NSString stringWithFormat: @"urn:uuid:%@:calendars:%@",
|
||||
[self ownerInContext: context], [self nameInContainer]];
|
||||
}
|
||||
|
||||
- (NSArray *) davScheduleCalendarTransparency
|
||||
{
|
||||
const NSString *opacity;
|
||||
|
||||
@@ -76,17 +76,17 @@
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSArray *) davScheduleDefaultCalendarURL
|
||||
- (SOGoWebDAVValue *) davScheduleDefaultCalendarURL
|
||||
{
|
||||
NSArray *response;
|
||||
NSString *personalURL;
|
||||
NSDictionary *href;
|
||||
|
||||
personalURL = [NSString stringWithFormat: @"%@personal/",
|
||||
[container davURLAsString]];
|
||||
response = [NSArray arrayWithObjects: @"href", XMLNS_WEBDAV, @"D",
|
||||
personalURL, nil];
|
||||
href = davElementWithContent (@"href", XMLNS_WEBDAV, personalURL);
|
||||
|
||||
return response;
|
||||
return [davElementWithContent (@"schedule-default-calendar-URL", XMLNS_CALDAV, href)
|
||||
asWebDAVValue];
|
||||
}
|
||||
|
||||
- (NSArray *) aclsForUser: (NSString *) userID
|
||||
@@ -109,4 +109,9 @@
|
||||
return acls;
|
||||
}
|
||||
|
||||
- (NSString *) displayName
|
||||
{
|
||||
return nameInContainer;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -30,12 +30,74 @@
|
||||
#import <SOGo/SOGoUser.h>
|
||||
#import <SOGo/SOGoUserSettings.h>
|
||||
|
||||
#import <SOGo/NSObject+DAV.h>
|
||||
#import <SOGo/SOGoPermissions.h>
|
||||
#import <SOGo/SOGoWebDAVAclManager.h>
|
||||
|
||||
#import "SOGoAppointmentFolders.h"
|
||||
|
||||
#import "SOGoCalendarProxy.h"
|
||||
|
||||
@implementation SOGoCalendarProxy
|
||||
|
||||
+ (SOGoWebDAVAclManager *) webdavAclManager
|
||||
{
|
||||
static SOGoWebDAVAclManager *aclManager = nil;
|
||||
NSString *nsI;
|
||||
|
||||
if (!aclManager)
|
||||
{
|
||||
nsI = @"urn:inverse:params:xml:ns:inverse-dav";
|
||||
|
||||
aclManager = [SOGoWebDAVAclManager new];
|
||||
[aclManager registerDAVPermission: davElement (@"read", XMLNS_WEBDAV)
|
||||
abstract: YES
|
||||
withEquivalent: SoPerm_WebDAVAccess
|
||||
asChildOf: davElement (@"all", XMLNS_WEBDAV)];
|
||||
[aclManager
|
||||
registerDAVPermission: davElement (@"read-current-user-privilege-set", XMLNS_WEBDAV)
|
||||
abstract: YES
|
||||
withEquivalent: SoPerm_WebDAVAccess
|
||||
asChildOf: davElement (@"read", XMLNS_WEBDAV)];
|
||||
[aclManager registerDAVPermission: davElement (@"write", XMLNS_WEBDAV)
|
||||
abstract: YES
|
||||
withEquivalent: nil
|
||||
asChildOf: davElement (@"all", XMLNS_WEBDAV)];
|
||||
[aclManager registerDAVPermission: davElement (@"bind", XMLNS_WEBDAV)
|
||||
abstract: NO
|
||||
withEquivalent: SoPerm_AddDocumentsImagesAndFiles
|
||||
asChildOf: davElement (@"write", XMLNS_WEBDAV)];
|
||||
[aclManager registerDAVPermission: davElement (@"unbind", XMLNS_WEBDAV)
|
||||
abstract: NO
|
||||
withEquivalent: SoPerm_DeleteObjects
|
||||
asChildOf: davElement (@"write", XMLNS_WEBDAV)];
|
||||
[aclManager
|
||||
registerDAVPermission: davElement (@"write-properties", XMLNS_WEBDAV)
|
||||
abstract: NO
|
||||
withEquivalent: SoPerm_ChangePermissions /* hackish */
|
||||
asChildOf: davElement (@"write", XMLNS_WEBDAV)];
|
||||
[aclManager
|
||||
registerDAVPermission: davElement (@"write-content", XMLNS_WEBDAV)
|
||||
abstract: NO
|
||||
withEquivalent: SoPerm_AddDocumentsImagesAndFiles
|
||||
asChildOf: davElement (@"write", XMLNS_WEBDAV)];
|
||||
[aclManager registerDAVPermission: davElement (@"admin", nsI)
|
||||
abstract: YES
|
||||
withEquivalent: nil
|
||||
asChildOf: davElement (@"all", XMLNS_WEBDAV)];
|
||||
[aclManager registerDAVPermission: davElement (@"read-acl", XMLNS_WEBDAV)
|
||||
abstract: YES
|
||||
withEquivalent: SOGoPerm_ReadAcls
|
||||
asChildOf: davElement (@"admin", nsI)];
|
||||
[aclManager registerDAVPermission: davElement (@"write-acl", XMLNS_WEBDAV)
|
||||
abstract: YES
|
||||
withEquivalent: SoPerm_ChangePermissions
|
||||
asChildOf: davElement (@"admin", nsI)];
|
||||
}
|
||||
|
||||
return aclManager;
|
||||
}
|
||||
|
||||
- (id) init
|
||||
{
|
||||
if ((self = [super init]))
|
||||
@@ -78,7 +140,9 @@
|
||||
appName = [[context request] applicationName];
|
||||
|
||||
proxySubscribers
|
||||
= [[container lookupName: @"Calendar" inContext: context acquire: NO]
|
||||
= [[[self lookupUserFolder] lookupName: @"Calendar"
|
||||
inContext: context
|
||||
acquire: NO]
|
||||
proxySubscribersWithWriteAccess: hasWriteAccess];
|
||||
max = [proxySubscribers count];
|
||||
members = [NSMutableArray arrayWithCapacity: max];
|
||||
@@ -138,18 +202,13 @@
|
||||
|
||||
- (NSException *) setDavGroupMemberSet: (NSString *) memberSet
|
||||
{
|
||||
SOGoUser *ownerUser;
|
||||
SOGoUserSettings *us;
|
||||
NSMutableArray *addedSubscribers, *removedSubscribers;
|
||||
NSArray *oldProxySubscribers, *newProxySubscribers;
|
||||
NSString *login;
|
||||
SOGoAppointmentFolders *folders;
|
||||
|
||||
login = [self ownerInContext: context];
|
||||
ownerUser = [SOGoUser userWithLogin: login roles: nil];
|
||||
us = [ownerUser userSettings];
|
||||
folders = [container lookupName: @"Calendar"
|
||||
inContext: context acquire: NO];
|
||||
folders = [[self lookupUserFolder] lookupName: @"Calendar"
|
||||
inContext: context
|
||||
acquire: NO];
|
||||
oldProxySubscribers
|
||||
= [folders proxySubscribersWithWriteAccess: hasWriteAccess];
|
||||
if (!oldProxySubscribers)
|
||||
|
||||
@@ -59,21 +59,32 @@
|
||||
NSArray *tag;
|
||||
NSMutableArray *addresses;
|
||||
NSEnumerator *emails;
|
||||
NSMutableDictionary *doneEmails;
|
||||
NSString *currentEmail;
|
||||
SOGoUser *ownerUser;
|
||||
|
||||
addresses = [NSMutableArray array];
|
||||
|
||||
doneEmails = [NSMutableDictionary dictionary];
|
||||
ownerUser = [SOGoUser userWithLogin: owner];
|
||||
emails = [[ownerUser allEmails] objectEnumerator];
|
||||
while ((currentEmail = [emails nextObject]))
|
||||
{
|
||||
tag = [NSArray arrayWithObjects: @"href", XMLNS_WEBDAV, @"D",
|
||||
[NSString stringWithFormat: @"mailto:%@", currentEmail],
|
||||
nil];
|
||||
[addresses addObject: tag];
|
||||
if (![doneEmails objectForKey: currentEmail])
|
||||
{
|
||||
tag = [NSArray arrayWithObjects: @"href", XMLNS_WEBDAV, @"D",
|
||||
[NSString stringWithFormat: @"mailto:%@", currentEmail],
|
||||
nil];
|
||||
[addresses addObject: tag];
|
||||
[doneEmails setObject: [NSNull null] forKey: currentEmail];
|
||||
}
|
||||
}
|
||||
|
||||
tag = [NSArray arrayWithObjects: @"href", XMLNS_WEBDAV, @"D",
|
||||
[NSString stringWithFormat: @"/SOGo/dav/%@/", nameInContainer],
|
||||
nil];
|
||||
[addresses addObjectUniquely: tag];
|
||||
|
||||
return addresses;
|
||||
}
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
#import "NSString+Utilities.h"
|
||||
#import "SOGoPermissions.h"
|
||||
#import "SOGoWebDAVAclManager.h"
|
||||
#import "WORequest+SOGo.h"
|
||||
#import "WOResponse+SOGo.h"
|
||||
|
||||
#import "SOGoFolder.h"
|
||||
@@ -232,14 +233,16 @@
|
||||
{
|
||||
comparison = [self _compareByNameInContainer: otherFolder];
|
||||
if (comparison == NSOrderedSame)
|
||||
if ([self displayName] == nil)
|
||||
comparison = NSOrderedAscending;
|
||||
else if ([otherFolder displayName] == nil)
|
||||
comparison = NSOrderedDescending;
|
||||
else
|
||||
comparison
|
||||
= [[self displayName]
|
||||
localizedCaseInsensitiveCompare: [otherFolder displayName]];
|
||||
{
|
||||
if ([self displayName] == nil)
|
||||
comparison = NSOrderedAscending;
|
||||
else if ([otherFolder displayName] == nil)
|
||||
comparison = NSOrderedDescending;
|
||||
else
|
||||
comparison
|
||||
= [[self displayName]
|
||||
localizedCaseInsensitiveCompare: [otherFolder displayName]];
|
||||
}
|
||||
}
|
||||
|
||||
return comparison;
|
||||
@@ -442,7 +445,7 @@
|
||||
if (!tagNS)
|
||||
tagNS = XMLNS_WEBDAV;
|
||||
tagName = [childProperty attribute: @"name"];
|
||||
if ([childValue count])
|
||||
if (childValue)
|
||||
[properties200 addObject: davElementWithContent (tagName,
|
||||
tagNS,
|
||||
childValue)];
|
||||
@@ -562,4 +565,22 @@
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSArray *) davPrincipalURL
|
||||
{
|
||||
NSArray *principalURL;
|
||||
NSString *classes;
|
||||
|
||||
if ([[context request] isICal4])
|
||||
{
|
||||
classes = [[self davComplianceClassesInContext: context]
|
||||
componentsJoinedByString: @", "];
|
||||
[[context response] setHeader: classes forKey: @"DAV"];
|
||||
}
|
||||
|
||||
principalURL = [NSArray arrayWithObjects: @"href", @"DAV:", @"D",
|
||||
[self davURLAsString], nil];
|
||||
|
||||
return [NSArray arrayWithObject: principalURL];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -1211,14 +1211,48 @@
|
||||
/* CalDAV */
|
||||
if (needCalDAVClasses)
|
||||
{
|
||||
caldavClasses = [NSArray arrayWithObjects: @"calendar-access", @"calendar-schedule",
|
||||
@"calendar-auto-schedule", @"calendar-proxy", nil];
|
||||
caldavClasses = [NSArray arrayWithObjects: @"calendar-access",
|
||||
@"calendar-schedule",
|
||||
@"calendar-auto-schedule",
|
||||
@"calendar-proxy",
|
||||
// @"calendarserver-private-events",
|
||||
// @"calendarserver-private-comments",
|
||||
// @"calendarserver-sharing",
|
||||
// @"calendarserver-sharing-no-scheduling",
|
||||
@"calendar-query-extended",
|
||||
@"extended-mkcol",
|
||||
@"calendarserver-principal-property-search",
|
||||
nil];
|
||||
[classes addObjectsFromArray: caldavClasses];
|
||||
}
|
||||
|
||||
return classes;
|
||||
}
|
||||
|
||||
- (SOGoWebDAVValue *) davCurrentUserPrincipal
|
||||
{
|
||||
NSDictionary *userHREF;
|
||||
NSString *login;
|
||||
SOGoUser *activeUser;
|
||||
SOGoWebDAVValue *davCurrentUserPrincipal;
|
||||
|
||||
activeUser = [[self context] activeUser];
|
||||
login = [activeUser login];
|
||||
if ([login isEqualToString: @"anonymous"])
|
||||
davCurrentUserPrincipal = nil;
|
||||
else
|
||||
{
|
||||
userHREF = davElementWithContent (@"href", XMLNS_WEBDAV, [self davURLAsString]);
|
||||
davCurrentUserPrincipal
|
||||
= [davElementWithContent (@"current-user-principal",
|
||||
XMLNS_WEBDAV,
|
||||
userHREF)
|
||||
asWebDAVValue];
|
||||
}
|
||||
|
||||
return davCurrentUserPrincipal;
|
||||
}
|
||||
|
||||
/* dav acls */
|
||||
- (NSString *) davRecordForUser: (NSString *) user
|
||||
parameters: (NSArray *) params
|
||||
|
||||
@@ -55,8 +55,6 @@
|
||||
- (id) mailAccountsFolder: (NSString *) _key
|
||||
inContext: (WOContext *) _ctx;
|
||||
|
||||
- (NSArray *) davPrincipalURL;
|
||||
|
||||
- (BOOL) collectionDavKey: (NSString *) key
|
||||
matches: (NSString *) value;
|
||||
|
||||
|
||||
@@ -635,14 +635,9 @@
|
||||
getCNForUID: nameInContainer];
|
||||
}
|
||||
|
||||
- (NSArray *) davPrincipalURL
|
||||
- (NSString *) davResourceId
|
||||
{
|
||||
NSArray *principalURL;
|
||||
|
||||
principalURL = [NSArray arrayWithObjects: @"href", @"DAV:", @"D",
|
||||
[self davURLAsString], nil];
|
||||
|
||||
return [NSArray arrayWithObject: principalURL];
|
||||
return [NSString stringWithFormat: @"urn:uuid:%@", nameInContainer];
|
||||
}
|
||||
|
||||
- (NSException *) setDavSignature: (NSString *) newSignature
|
||||
@@ -665,5 +660,4 @@
|
||||
return YES;
|
||||
}
|
||||
|
||||
|
||||
@end /* SOGoUserFolder */
|
||||
|
||||
@@ -131,7 +131,8 @@
|
||||
|
||||
- (BOOL) isICal
|
||||
{
|
||||
return [self isAppleDAVWithSubstring: @"Mac OS X/10."];
|
||||
return ([self isAppleDAVWithSubstring: @"Mac OS X/10."]
|
||||
|| [self isAppleDAVWithSubstring: @"CoreDAV/"]);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -140,8 +141,9 @@
|
||||
//
|
||||
- (BOOL) isICal4
|
||||
{
|
||||
return ([self isAppleDAVWithSubstring: @"iCal/4."] ||
|
||||
[self isAppleDAVWithSubstring: @"iCal/5."]);
|
||||
return ([self isAppleDAVWithSubstring: @"iCal/4."]
|
||||
|| [self isAppleDAVWithSubstring: @"iCal/5."]
|
||||
|| [self isAppleDAVWithSubstring: @"CoreDAV/"]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user