From: wolfgang Date: Fri, 16 May 2008 20:41:43 +0000 (+0000) Subject: git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1409 d1b88da0-ebda-0310... X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cec2945662ff7406951b21f062252c541fbf6836;p=scalable-opengroupware.org git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1409 d1b88da0-ebda-0310-925b-ed51d893ca5b --- diff --git a/ChangeLog b/ChangeLog index 9f2635bd..526682f5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,21 @@ 2008-05-16 Wolfgang Sourdeau + * SoObjects/SOGo/SOGoGCSFolder.m ([SOGoGCSFolder + -subscribe:reallyDoinTheNameOf:delegatedUserfromMailInvitation:isMailInvitationinContext:localContext]): + published method. + ([-folderReference]): no longer distingish between the user owned + and the subscribed folders. + + * SoObjects/SOGo/SOGoFolder.m ([SOGoFolder -compare:otherFolder]): + no longer use the "_" in the folder's nameInContainer. + + * UI/Common/UIxFolderActions.m ([UIxFolderActions -subscribeAction]) + ([UIxFolderActions -unsubscribeAction]): use the client object's + method for un-/subscribing. + + * SoObjects/SOGo/SOGoObject.m ([SOGoObject + -pathArrayToSOGoObject]): removed useless method. + * SoObjects/Appointments/SOGoAppointmentFolder.m ([SOGoAppointmentFolder -davCalendarQuery:queryContext]): added partial support for the "text-match" caldav directive. diff --git a/SoObjects/SOGo/SOGoContentObject.m b/SoObjects/SOGo/SOGoContentObject.m index af4e3b53..f9714efe 100644 --- a/SoObjects/SOGo/SOGoContentObject.m +++ b/SoObjects/SOGo/SOGoContentObject.m @@ -381,7 +381,12 @@ - (NSArray *) aclUsers { - return [container aclUsersForObjectAtPath: [self pathArrayToSOGoObject]]; + NSMutableArray *pathArray; + + pathArray = [NSMutableArray arrayWithArray: [container pathArrayToFolder]]; + [pathArray addObject: nameInContainer]; + + return pathArray; } - (NSArray *) aclsForUser: (NSString *) uid diff --git a/SoObjects/SOGo/SOGoFolder.h b/SoObjects/SOGo/SOGoFolder.h index 03f1c934..a4b37720 100644 --- a/SoObjects/SOGo/SOGoFolder.h +++ b/SoObjects/SOGo/SOGoFolder.h @@ -28,11 +28,17 @@ @interface SOGoFolder : SOGoObject { NSMutableString *displayName; + BOOL isSubscription; } - (void) setDisplayName: (NSString *) newDisplayName; - (NSString *) displayName; +- (void) setIsSubscription: (BOOL) newIsSubscription; +- (BOOL) isSubscription; + +- (NSString *) realNameInContainer; + - (NSString *) folderType; - (NSArray *) fetchContentObjectNames; diff --git a/SoObjects/SOGo/SOGoFolder.m b/SoObjects/SOGo/SOGoFolder.m index f931cc49..3dbbcd55 100644 --- a/SoObjects/SOGo/SOGoFolder.m +++ b/SoObjects/SOGo/SOGoFolder.m @@ -65,7 +65,10 @@ - (id) init { if ((self = [super init])) - displayName = nil; + { + displayName = nil; + isSubscription = NO; + } return self; } @@ -86,6 +89,32 @@ return ((displayName) ? displayName : nameInContainer); } +- (void) setIsSubscription: (BOOL) newIsSubscription +{ + isSubscription = newIsSubscription; +} + +- (BOOL) isSubscription +{ + return isSubscription; +} + +- (NSString *) realNameInContainer +{ + NSString *realNameInContainer, *ownerName; + + if (isSubscription) + { + ownerName = [self ownerInContext: context]; + realNameInContainer + = [nameInContainer substringFromIndex: [ownerName length] + 1]; + } + else + realNameInContainer = nameInContainer; + + return realNameInContainer; +} + - (NSString *) folderType { [self subclassResponsibility: _cmd]; @@ -132,26 +161,13 @@ /* sorting */ - (NSComparisonResult) _compareByOrigin: (SOGoFolder *) otherFolder { - NSArray *thisElements, *otherElements; - unsigned thisCount, otherCount; NSComparisonResult comparison; - thisElements = [nameInContainer componentsSeparatedByString: @"_"]; - otherElements = [[otherFolder nameInContainer] - componentsSeparatedByString: @"_"]; - thisCount = [thisElements count]; - otherCount = [otherElements count]; - if (thisCount == otherCount) - { - if (thisCount == 1) - comparison = NSOrderedSame; - else - comparison = [[thisElements objectAtIndex: 0] - compare: [otherElements objectAtIndex: 0]]; - } + if (isSubscription == [otherFolder isSubscription]) + comparison = NSOrderedSame; else { - if (thisCount > otherCount) + if (isSubscription) comparison = NSOrderedDescending; else comparison = NSOrderedAscending; @@ -162,23 +178,24 @@ - (NSComparisonResult) _compareByNameInContainer: (SOGoFolder *) otherFolder { - NSString *otherName; + NSString *selfName, *otherName; NSComparisonResult comparison; - otherName = [otherFolder nameInContainer]; - if ([nameInContainer hasSuffix: @"personal"]) + selfName = [self realNameInContainer]; + otherName = [otherFolder realNameInContainer]; + if ([selfName isEqualToString: @"personal"]) { - if ([otherName hasSuffix: @"personal"]) - comparison = [nameInContainer compare: otherName]; + if ([otherName isEqualToString: @"personal"]) + comparison = NSOrderedSame; else comparison = NSOrderedAscending; } else { - if ([otherName hasSuffix: @"personal"]) + if ([otherName isEqualToString: @"personal"]) comparison = NSOrderedDescending; else - comparison = NSOrderedSame; + comparison = [selfName compare: otherName]; } return comparison; diff --git a/SoObjects/SOGo/SOGoGCSFolder.h b/SoObjects/SOGo/SOGoGCSFolder.h index 54214dff..c64f879c 100644 --- a/SoObjects/SOGo/SOGoGCSFolder.h +++ b/SoObjects/SOGo/SOGoGCSFolder.h @@ -30,6 +30,8 @@ @class NSString; @class GCSFolder; +@class WOContext; +@class WOResponse; /* SOGoGCSFolder @@ -60,6 +62,7 @@ - (GCSFolder *) ocsFolder; - (NSString *) folderReference; +- (NSArray *) pathArrayToFolder; /* lower level fetches */ - (BOOL) nameExistsInFolder: (NSString *) objectName; @@ -77,6 +80,11 @@ - (NSException *) delete; - (void) renameTo: (NSString *) newName; +- (WOResponse *) subscribe: (BOOL) reallyDo + inTheNameOf: (NSString *) delegatedUser + fromMailInvitation: (BOOL) isMailInvitation + inContext: (WOContext *) localContext; + /* acls as a container */ - (NSArray *) aclUsersForObjectAtPath: (NSArray *) objectPathArray; - (NSArray *) aclsForUser: (NSString *) uid diff --git a/SoObjects/SOGo/SOGoGCSFolder.m b/SoObjects/SOGo/SOGoGCSFolder.m index 6c4e9905..893f12ef 100644 --- a/SoObjects/SOGo/SOGoGCSFolder.m +++ b/SoObjects/SOGo/SOGoGCSFolder.m @@ -138,10 +138,13 @@ static BOOL sendFolderAdvisories = NO; { id newFolder; NSArray *elements, *pathElements; - NSString *path, *objectPath, *login, *ocsName, *folderName; + NSString *path, *objectPath, *login, *currentUser, *ocsName, *folderName; + WOContext *context; elements = [reference componentsSeparatedByString: @":"]; login = [elements objectAtIndex: 0]; + context = [[WOApplication application] context]; + currentUser = [[context activeUser] login]; objectPath = [elements objectAtIndex: 1]; pathElements = [objectPath componentsSeparatedByString: @"/"]; if ([pathElements count] > 1) @@ -155,6 +158,7 @@ static BOOL sendFolderAdvisories = NO; newFolder = [self objectWithName: folderName inContainer: aContainer]; [newFolder setOCSPath: path]; [newFolder setOwner: login]; + [newFolder setIsSubscription: ![login isEqualToString: currentUser]]; if (![newFolder displayName]) newFolder = nil; @@ -284,27 +288,21 @@ static BOOL sendFolderAdvisories = NO; - (NSString *) folderReference { - NSString *login, *reference, *realName; - NSArray *nameComponents; + return [NSString stringWithFormat: @"%@:%@/%@", + owner, + [container nameInContainer], + [self realNameInContainer]]; +} - login = [[context activeUser] login]; - if ([owner isEqualToString: login]) - reference = nameInContainer; - else - { - nameComponents = [nameInContainer componentsSeparatedByString: @"_"]; - if ([nameComponents count] > 1) - realName = [nameComponents objectAtIndex: 1]; - else - realName = nameInContainer; +- (NSArray *) pathArrayToFolder +{ + NSArray *basePathElements; + unsigned int max; - reference = [NSString stringWithFormat: @"%@:%@/%@", - owner, - [container nameInContainer], - realName]; - } + basePathElements = [[self ocsPath] componentsSeparatedByString: @"/"]; + max = [basePathElements count]; - return reference; + return [basePathElements subarrayWithRange: NSMakeRange (2, max - 2)]; } - (NSString *) davDisplayName @@ -497,7 +495,6 @@ static BOOL sendFolderAdvisories = NO; } } -#warning this method is dirty code - (NSDictionary *) fetchContentStringsAndNamesOfAllObjects { NSDictionary *files; @@ -508,27 +505,23 @@ static BOOL sendFolderAdvisories = NO; [self errorWithFormat:@"(%s): fetch failed!", __PRETTY_FUNCTION__]; return nil; } - if ([files isKindOfClass:[NSException class]]) - return files; + return files; } #warning this code should be cleaned up -#warning this code is a dup of UIxFolderActions,\ - we should remove the methods there - (void) _subscribeUser: (SOGoUser *) subscribingUser reallyDo: (BOOL) reallyDo + fromMailInvitation: (BOOL) isMailInvitation inResponse: (WOResponse *) response { NSMutableArray *folderSubscription; - NSString *subscriptionPointer, *baseFolder, *folder; + NSString *subscriptionPointer, *mailInvitationURL; NSUserDefaults *ud; - NSArray *realFolderPath; NSMutableDictionary *moduleSettings; ud = [subscribingUser userSettings]; - baseFolder = [container nameInContainer]; - moduleSettings = [ud objectForKey: baseFolder]; + moduleSettings = [ud objectForKey: [container nameInContainer]]; if ([owner isEqualToString: [subscribingUser login]]) { @@ -548,12 +541,6 @@ static BOOL sendFolderAdvisories = NO; forKey: @"SubscribedFolders"]; } - realFolderPath = [nameInContainer componentsSeparatedByString: @"_"]; - if ([realFolderPath count] > 1) - folder = [realFolderPath objectAtIndex: 1]; - else - folder = [realFolderPath objectAtIndex: 0]; - subscriptionPointer = [self folderReference]; if (reallyDo) [folderSubscription addObjectUniquely: subscriptionPointer]; @@ -562,13 +549,23 @@ static BOOL sendFolderAdvisories = NO; [ud synchronize]; - [response setStatus: 204]; + if (isMailInvitation) + { + mailInvitationURL = [[self soURLToBaseContainerForCurrentUser] + absoluteString]; + [response setStatus: 302]; + [response setHeader: mailInvitationURL + forKey: @"location"]; + } + else + [response setStatus: 204]; } } -- (WOResponse *) _subscribe: (BOOL) reallyDo - inTheNameOf: (NSString *) delegatedUser - inContext: (WOContext *) localContext +- (WOResponse *) subscribe: (BOOL) reallyDo + inTheNameOf: (NSString *) delegatedUser + fromMailInvitation: (BOOL) isMailInvitation + inContext: (WOContext *) localContext { WOResponse *response; SOGoUser *currentUser, *subscriptionUser; @@ -591,6 +588,7 @@ static BOOL sendFolderAdvisories = NO; if (validRequest) [self _subscribeUser: subscriptionUser reallyDo: reallyDo + fromMailInvitation: isMailInvitation inResponse: response]; else { @@ -616,15 +614,17 @@ static BOOL sendFolderAdvisories = NO; - (id ) davSubscribe: (WOContext *) queryContext { - return [self _subscribe: YES + return [self subscribe: YES inTheNameOf: [self _parseDAVDelegatedUser: queryContext] + fromMailInvitation: NO inContext: queryContext]; } - (id ) davUnsubscribe: (WOContext *) queryContext { - return [self _subscribe: NO + return [self subscribe: NO inTheNameOf: [self _parseDAVDelegatedUser: queryContext] + fromMailInvitation: NO inContext: queryContext]; } @@ -784,7 +784,7 @@ static BOOL sendFolderAdvisories = NO; /* acls */ - (NSArray *) aclUsers { - return [self aclUsersForObjectAtPath: [self pathArrayToSOGoObject]]; + return [self aclUsersForObjectAtPath: [self pathArrayToFolder]]; } - (NSArray *) aclsForUser: (NSString *) uid @@ -793,8 +793,7 @@ static BOOL sendFolderAdvisories = NO; NSArray *ownAcls, *containerAcls; acls = [NSMutableArray array]; - ownAcls = [self aclsForUser: uid - forObjectAtPath: [self pathArrayToSOGoObject]]; + ownAcls = [self aclsForUser: uid forObjectAtPath: [self pathArrayToFolder]]; [acls addObjectsFromArray: ownAcls]; if ([container respondsToSelector: @selector (aclsForUser:)]) { @@ -815,13 +814,13 @@ static BOOL sendFolderAdvisories = NO; { return [self setRoles: roles forUser: uid - forObjectAtPath: [self pathArrayToSOGoObject]]; + forObjectAtPath: [self pathArrayToFolder]]; } - (void) removeAclsForUsers: (NSArray *) users { return [self removeAclsForUsers: users - forObjectAtPath: [self pathArrayToSOGoObject]]; + forObjectAtPath: [self pathArrayToFolder]]; } - (NSString *) defaultUserID diff --git a/SoObjects/SOGo/SOGoObject.h b/SoObjects/SOGo/SOGoObject.h index eb1736f2..d800d74c 100644 --- a/SoObjects/SOGo/SOGoObject.h +++ b/SoObjects/SOGo/SOGoObject.h @@ -82,8 +82,6 @@ - (NSString *) nameInContainer; - (id) container; -- (NSArray *) pathArrayToSOGoObject; - - (NSURL *) davURL; - (NSURL *) soURL; - (NSURL *) soURLToBaseContainerForUser: (NSString *) uid; diff --git a/SoObjects/SOGo/SOGoObject.m b/SoObjects/SOGo/SOGoObject.m index b3398a67..fccb4e35 100644 --- a/SoObjects/SOGo/SOGoObject.m +++ b/SoObjects/SOGo/SOGoObject.m @@ -246,33 +246,6 @@ static NSDictionary *reportMap = nil; return container; } -- (NSArray *) pathArrayToSOGoObject -{ - NSMutableArray *realPathArray; - NSString *objectName; - NSArray *objectDescription; - - realPathArray - = [NSMutableArray arrayWithArray: [self pathArrayToSoObject]]; - if ([realPathArray count] > 2) - { - objectName = [realPathArray objectAtIndex: 2]; - if ([objectName isKindOfClass: [NSString class]]) - { - objectDescription = [objectName componentsSeparatedByString: @"_"]; - if ([objectDescription count] > 1) - { - [realPathArray replaceObjectAtIndex: 0 - withObject: [objectDescription objectAtIndex: 0]]; - [realPathArray replaceObjectAtIndex: 2 - withObject: [objectDescription objectAtIndex: 1]]; - } - } - } - - return realPathArray; -} - /* ownership */ - (void) setOwner: (NSString *) newOwner diff --git a/UI/Common/UIxFolderActions.m b/UI/Common/UIxFolderActions.m index 9fde4a2f..fae4f02b 100644 --- a/UI/Common/UIxFolderActions.m +++ b/UI/Common/UIxFolderActions.m @@ -45,9 +45,6 @@ @implementation UIxFolderActions -#warning some of this code could probably be moved in one of the \ - clientObject classes... - - (void) _setupContext { NSString *mailInvitationParam; @@ -75,65 +72,24 @@ isMailInvitation = [mailInvitationParam boolValue]; } -- (WOResponse *) _realSubscribe: (BOOL) reallyDo -{ - WOResponse *response; - NSMutableArray *folderSubscription; - NSString *mailInvitationURL, *subscriptionPointer; - - if ([owner isEqualToString: login]) - { - response = [self responseWithStatus: 403]; - [response appendContentString: - @"You cannot (un)subscribe to a folder that you own!"]; - } - else - { - folderSubscription - = [moduleSettings objectForKey: @"SubscribedFolders"]; - if (!(folderSubscription - && [folderSubscription isKindOfClass: [NSMutableArray class]])) - { - folderSubscription = [NSMutableArray array]; - [moduleSettings setObject: folderSubscription - forKey: @"SubscribedFolders"]; - } - subscriptionPointer = [[self clientObject] folderReference]; - if (reallyDo) - [folderSubscription addObjectUniquely: subscriptionPointer]; - else - [folderSubscription removeObject: subscriptionPointer]; - - [ud synchronize]; - - if (isMailInvitation) - { - mailInvitationURL - = [[clientObject soURLToBaseContainerForCurrentUser] - absoluteString]; - response = [self responseWithStatus: 302]; - [response setHeader: mailInvitationURL - forKey: @"location"]; - } - else - response = [self responseWith204]; - } - - return response; -} - - (WOResponse *) subscribeAction { [self _setupContext]; - return [self _realSubscribe: YES]; + return [clientObject subscribe: YES + inTheNameOf: nil + fromMailInvitation: isMailInvitation + inContext: context]; } - (WOResponse *) unsubscribeAction { [self _setupContext]; - return [self _realSubscribe: NO]; + return [clientObject subscribe: NO + inTheNameOf: nil + fromMailInvitation: isMailInvitation + inContext: context]; } - (WOResponse *) canAccessContentAction diff --git a/UI/WebServerResources/ContactsUI.js b/UI/WebServerResources/ContactsUI.js index a9155fad..4e341051 100644 --- a/UI/WebServerResources/ContactsUI.js +++ b/UI/WebServerResources/ContactsUI.js @@ -623,12 +623,13 @@ function onFolderUnsubscribeCB(folderId) { function onAddressBookRemove(event) { var selector = $("contactFolders"); var nodes = selector.getSelectedNodes(); - if (nodes.length > 0) { + if (nodes.length > 0) { nodes[0].deselect(); - var folderId = nodes[0].getAttribute("id"); - var folderIdElements = folderId.split("_"); - if (folderIdElements.length > 1) - unsubscribeFromFolder(folderId, onFolderUnsubscribeCB, folderId); + var owner = nodes[0].getAttribute("owner"); + if (owner != UserLogin) { + var folderId = nodes[0].getAttribute("id"); + unsubscribeFromFolder(folderId, owner, onFolderUnsubscribeCB, folderId); + } else { var abId = folderIdElements[0].substr(1); deletePersonalAddressBook(abId); diff --git a/UI/WebServerResources/SchedulerUI.js b/UI/WebServerResources/SchedulerUI.js index be36e8c5..a9eef319 100644 --- a/UI/WebServerResources/SchedulerUI.js +++ b/UI/WebServerResources/SchedulerUI.js @@ -1754,10 +1754,11 @@ function onCalendarRemove(event) { var nodes = $("calendarList").getSelectedNodes(); for (var i = 0; i < nodes.length; i++) { nodes[i].deselect(); - var folderId = nodes[i].getAttribute("id"); - var folderIdElements = folderId.split("_"); - if (folderIdElements.length > 1) { - unsubscribeFromFolder(folderId, onFolderUnsubscribeCB, folderId); + var owner = nodes[i].getAttribute("owner"); + if (owner != UserLogin) { + var folderId = nodes[i].getAttribute("id"); + unsubscribeFromFolder(folderId, owner, + onFolderUnsubscribeCB, folderId); } else deletePersonalCalendar(folderIdElements[0]); diff --git a/UI/WebServerResources/generic.js b/UI/WebServerResources/generic.js index 7c2e36b5..a47bbc7c 100644 --- a/UI/WebServerResources/generic.js +++ b/UI/WebServerResources/generic.js @@ -1061,18 +1061,16 @@ function folderUnsubscriptionCallback(http) { } } -function unsubscribeFromFolder(folder, refreshCallback, refreshCallbackData) { +function unsubscribeFromFolder(folder, owner, refreshCallback, + refreshCallbackData) { if (document.body.hasClassName("popup")) { window.opener.unsubscribeFromFolder(folder, refreshCallback, refreshCallbackData); } else { - var folderData = folder.split("_"); - var username = folderData[0]; - var folderPath = folderData[1]; - if (username.startsWith('/')) - username = username.substring(1); - if (username != UserLogin) { + if (owner.startsWith('/')) + owner = owner.substring(1); + if (owner != UserLogin) { var url = (ApplicationBaseURL + folder + "/unsubscribe"); removeFolderRequestCount++; var rfCbData = { method: refreshCallback, data: refreshCallbackData };