diff --git a/ChangeLog b/ChangeLog index ee873e8bf..9a67f429b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2008-02-22 Wolfgang Sourdeau + * SoObjects/SOGo/SOGoUserFolder.m ([SOGoUserFolder + -davUserQuery:queryContext]): new method for the "user-query" + inverse DAV method. + + * SoObjects/SOGo/SOGoGCSFolder.m ([SOGoGCSFolder + -aclUsersForObjectAtPath:objectPathArray]): return unique uids. + * SoObjects/SOGo/SOGoFolder.m ([-davNamespaces]): removed method. * SoObjects/SOGo/SOGoDAVRendererTypes.h (SoWebDAVValue): added diff --git a/SoObjects/SOGo/SOGoUserFolder.m b/SoObjects/SOGo/SOGoUserFolder.m index 1df3b3045..a3a6dc7db 100644 --- a/SoObjects/SOGo/SOGoUserFolder.m +++ b/SoObjects/SOGo/SOGoUserFolder.m @@ -42,6 +42,7 @@ #import #import +#import "NSArray+Utilities.h" #import "NSDictionary+Utilities.h" #import "LDAPUserManager.h" #import "SOGoPermissions.h" @@ -108,18 +109,13 @@ return self; } -- (NSArray *) davNamespaces -{ - return [NSArray arrayWithObject: @"urn:inverse:params:xml:ns:inverse-dav"]; -} - - (NSDictionary *) _parseCollectionFilters: (id ) parentNode { NSEnumerator *children; NGDOMNode *node; NSMutableDictionary *filter; NSString *componentName; - + filter = [NSMutableDictionary dictionaryWithCapacity: 2]; children = [[parentNode getElementsByTagName: @"prop-match"] objectEnumerator]; @@ -289,7 +285,7 @@ } } -- (id) davCollectionQuery: (id) queryContext +- (id) davCollectionQuery: (WOContext *) queryContext { WOResponse *r; NSDictionary *filter; @@ -314,6 +310,99 @@ return r; } +- (NSString *) _davFetchUsersMatching: (NSString *) user +{ + LDAPUserManager *um; + NSEnumerator *users; + NSMutableString *fetch; + NSDictionary *currentUser; + NSString *field; + + fetch = [NSMutableString string]; + um = [LDAPUserManager sharedUserManager]; + users = [[um fetchContactsMatching: user] objectEnumerator]; + while ((currentUser = [users nextObject])) + { + [fetch appendString: @""]; + field = [currentUser objectForKey: @"c_uid"]; + [fetch appendFormat: @"%@", + [field stringByEscapingXMLString]]; + field = [currentUser objectForKey: @"cn"]; + [fetch appendFormat: @"%@", + [field stringByEscapingXMLString]]; + field = [currentUser objectForKey: @"c_email"]; + [fetch appendFormat: @"%@", + [field stringByEscapingXMLString]]; + [fetch appendString: @""]; + } + + return fetch; +} + +- (NSString *) _davUsersFromQuery: (id ) document +{ + id node, userAttr; + id attrs; + NSString *nodeName, *result, *response, *user; + + node = [[document documentElement] firstChild]; + nodeName = [node nodeName]; + if ([nodeName isEqualToString: @"users"]) + { + attrs = [node attributes]; + userAttr = [attrs namedItem: @"match-name"]; + user = [userAttr nodeValue]; + if ([user length]) + result = [self _davFetchUsersMatching: user]; + else + result = nil; + } + else + result = nil; + + if (result) + { + if ([result length]) + response = [NSString stringWithFormat: @"<%@>%@", + nodeName, result, nodeName]; + else + response = @""; + } + else + response = nil; + + return response; +} + +- (id) davUserQuery: (WOContext *) queryContext +{ + WOResponse *r; + id document; + NSString *content; + + r = [queryContext response]; + [r setContentEncoding: NSUTF8StringEncoding]; + [r setHeader: @"text/xml; charset=\"utf-8\"" forKey: @"content-type"]; + [r setHeader: @"no-cache" forKey: @"pragma"]; + [r setHeader: @"no-cache" forKey: @"cache-control"]; + + document = [[context request] contentAsDOMDocument]; + content = [self _davUsersFromQuery: document]; + if (content) + { + [r setStatus: 207]; + if ([content length]) + { + [r appendContentString: @"\r\n"]; + [r appendContentString: content]; + } + } + else + [r setStatus: 400]; + + return r; +} + // - (SOGoGroupsFolder *) lookupGroupsFolder // { // return [self lookupName: @"Groups" inContext: nil acquire: NO];