diff --git a/ChangeLog b/ChangeLog index bd06c88bc..5de2a99e5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2008-11-23 Wolfgang Sourdeau + * SoObjects/SOGo/SOGoUserFolder.m ([SOGoUserFolder + -davCollectionQuery:queryContext]): simplified method by returning + only the folders with the specified type that are shared by the + owner of the current user folder. The folder owner is now + identified correctly with his personal folder principal. + ([SOGoUserFolder -davUserQuery:queryContext]): when an LDAP info + attribute is available for the user, we return it too. + * SoObjects/SOGo/LDAPUserManager.m ([LDAPUserManager +initialize]): we need to retain the LDAPContactInfoAttribute static var, to avoid a zombie. diff --git a/SoObjects/SOGo/SOGoUserFolder.m b/SoObjects/SOGo/SOGoUserFolder.m index cfad1fb47..d75a0b44c 100644 --- a/SoObjects/SOGo/SOGoUserFolder.m +++ b/SoObjects/SOGo/SOGoUserFolder.m @@ -23,6 +23,7 @@ #import #import #import +#import #import #import @@ -55,8 +56,23 @@ #import "SOGoUserFolder.h" +static NSString *LDAPContactInfoAttribute = nil; + @implementation SOGoUserFolder ++ (void) initialize +{ + NSUserDefaults *ud; + + if (!LDAPContactInfoAttribute) + { + ud = [NSUserDefaults standardUserDefaults]; + LDAPContactInfoAttribute + = [ud stringForKey: @"SOGoLDAPContactInfoAttribute"]; + [LDAPContactInfoAttribute retain]; + } +} + /* hierarchy */ - (NSArray *) toManyRelationshipKeys @@ -221,68 +237,29 @@ return rType; } -- (NSString *) _baseDAVURLWithSuffix: (NSString *) suffix -{ - NSURL *prefixURL; - - prefixURL = [NSURL URLWithString: [NSString stringWithFormat: @"../%@", suffix] - relativeToURL: [self davURL]]; - - return [[prefixURL standardizedURL] absoluteString]; -} - -- (void) _appendFolders: (NSDictionary *) users +- (void) _appendFolders: (NSArray *) folders toResponse: (WOResponse *) r { - NSDictionary *currentContact, *currentFolder; - NSEnumerator *keys, *folders; + NSDictionary *currentFolder; NSString *baseHREF, *data; + NSEnumerator *foldersEnum; - baseHREF = [self _baseDAVURLWithSuffix: @"./"]; - - keys = [[users allKeys] objectEnumerator]; - while ((currentContact = [keys nextObject])) + baseHREF = [[self davURL] absoluteString]; + if ([baseHREF hasSuffix: @"/"]) + baseHREF = [baseHREF substringToIndex: [baseHREF length] - 1]; + foldersEnum = [folders objectEnumerator]; + while ((currentFolder = [foldersEnum nextObject])) { - folders = [[users objectForKey: currentContact] objectEnumerator]; - while ((currentFolder = [folders nextObject])) - { - [r appendContentString: @""]; - data = [NSString stringWithFormat: @"%@%@%@/", baseHREF, - [currentContact objectForKey: @"c_uid"], - [currentFolder objectForKey: @"name"]]; - [r appendContentString: data]; - [r appendContentString: @""]; - [r appendContentString: @"HTTP/1.1 200 OK"]; - [r appendContentString: @""]; - data = [NSString stringWithFormat: @"%@%@", baseHREF, - [currentContact objectForKey: @"c_uid"]]; - [r appendContentString: data]; - [r appendContentString: @""]; - data = [currentContact keysWithFormat: @"%{cn} <%{c_email}>"]; - [r appendContentString: [data stringByEscapingXMLString]]; - [r appendContentString: @""]; - data = [currentFolder objectForKey: @"displayName"]; - [r appendContentString: [data stringByEscapingXMLString]]; - [r appendContentString: @""]; - } - } -} - -- (void) _appendCollectionsMatchingFilter: (NSDictionary *) filter - toResponse: (WOResponse *) r -{ - NSURL *prefix, *queryOwner; - NSDictionary *folders; - NSString *uid; - - prefix = [NSURL URLWithString: [self _baseDAVURLWithSuffix: @"users/"]]; - queryOwner = [NSURL URLWithString: [filter objectForKey: @"owner"]]; - if ([[queryOwner relativePath] hasPrefix: [prefix relativePath]]) - { - uid = [[queryOwner relativePath] lastPathComponent]; - folders = [self foldersOfType: [filter objectForKey: @"resource-type"] - matchingUID: uid]; - [self _appendFolders: folders toResponse: r]; + [r appendContentString: @""]; + data = [NSString stringWithFormat: @"%@%@/", baseHREF, + [currentFolder objectForKey: @"name"]]; + [r appendContentString: data]; + [r appendContentString: @""]; + [r appendContentString: @"HTTP/1.1 200 OK"]; + [r appendContentString: @""]; + data = [currentFolder objectForKey: @"displayName"]; + [r appendContentString: [data stringByEscapingXMLString]]; + [r appendContentString: @""]; } } @@ -291,6 +268,7 @@ WOResponse *r; NSDictionary *filter; id document; + NSArray *folders; r = [context response]; [r setStatus: 207]; @@ -304,7 +282,9 @@ document = [[context request] contentAsDOMDocument]; filter = [self _parseCollectionFilters: document]; - [self _appendCollectionsMatchingFilter: filter toResponse: r]; + folders = [self foldersOfType: [filter objectForKey: @"resource-type"] + forUID: [self ownerInContext: nil]]; + [self _appendFolders: folders toResponse: r]; [r appendContentString:@""]; @@ -319,6 +299,7 @@ NSDictionary *currentUser; NSString *field; +#warning the attributes returned here should match the one requested in the query fetch = [NSMutableString string]; um = [LDAPUserManager sharedUserManager]; @@ -335,6 +316,13 @@ field = [currentUser objectForKey: @"c_email"]; [fetch appendFormat: @"%@", [field stringByEscapingXMLString]]; + if (LDAPContactInfoAttribute) + { + field = [currentUser objectForKey: LDAPContactInfoAttribute]; + if ([field length]) + [fetch appendFormat: @"%@", + [field stringByEscapingXMLString]]; + } [fetch appendString: @""]; }