From 60bef234d7fb017ae2756bd71c8367e30a3043f2 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Fri, 16 May 2008 20:33:55 +0000 Subject: [PATCH] Monotone-Parent: 87a5b99c1c6050fac3ae23cc68cad8099adec7da Monotone-Revision: ca4e48599cbe0a9577bf9aa27cd8ffc7e1a0e61c Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2008-05-16T20:33:55 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 9 +++ SoObjects/SOGo/SOGoContentObject.m | 7 ++- SoObjects/SOGo/SOGoFolder.h | 6 ++ SoObjects/SOGo/SOGoFolder.m | 65 ++++++++++++-------- SoObjects/SOGo/SOGoGCSFolder.h | 8 +++ SoObjects/SOGo/SOGoGCSFolder.m | 89 ++++++++++++++-------------- UI/WebServerResources/ContactsUI.js | 11 ++-- UI/WebServerResources/SchedulerUI.js | 9 +-- UI/WebServerResources/generic.js | 12 ++-- 9 files changed, 130 insertions(+), 86 deletions(-) diff --git a/ChangeLog b/ChangeLog index dd30d9a6c..526682f53 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 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. diff --git a/SoObjects/SOGo/SOGoContentObject.m b/SoObjects/SOGo/SOGoContentObject.m index af4e3b531..f9714efef 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 03f1c934f..a4b377207 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 f931cc496..3dbbcd551 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 54214dff2..c64f879ca 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 6c4e99050..893f12ef0 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/UI/WebServerResources/ContactsUI.js b/UI/WebServerResources/ContactsUI.js index a9155fad4..4e3410519 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 be36e8c5b..a9eef319f 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 7c2e36b5a..a47bbc7c7 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 };