From 2c246f3e7a37e97ef12eb858ed2732cf38591d42 Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Tue, 14 Dec 2010 18:08:36 +0000 Subject: [PATCH] See ChangeLog Monotone-Parent: 535292a4d5c9f53624dcaabc419821b5755e9ccc Monotone-Revision: c35e5e0bbfa47c91a6b8c9b68bf31ca78ee421fc Monotone-Author: ludovic@Sophos.ca Monotone-Date: 2010-12-14T18:08:36 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 7 +++ Documentation/SOGo Installation Guide.odt | Bin 149264 -> 148792 bytes Main/SOGo.h | 8 +-- SoObjects/SOGo/LDAPSource.h | 9 +++- SoObjects/SOGo/LDAPSource.m | 57 +++++++++++++++++++--- SoObjects/SOGo/SOGoSource.h | 7 +++ SoObjects/SOGo/SOGoUser.h | 18 ++----- SoObjects/SOGo/SOGoUserManager.m | 22 +++++++++ SoObjects/SOGo/SQLSource.h | 2 +- 9 files changed, 103 insertions(+), 27 deletions(-) diff --git a/ChangeLog b/ChangeLog index e69854a10..3409738b4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2010-12-14 Ludovic Marcotte + + * Implemented the "bindAsCurrentUser" feature (when + set to the LDAP SOGoUserSources, to YES) which forces + SOGo to use the DN of the currently "requesting" user + to perform all LDAP-related operations + 2010-12-13 Wolfgang Sourdeau * OpenChange/EOQualifier+MAPIFS.[hm]: new category module for diff --git a/Documentation/SOGo Installation Guide.odt b/Documentation/SOGo Installation Guide.odt index f6219c3c90fbaa86e0d1ced43b6f3e347eb5a09b..251f8b5d5cdccf142d4110ff178fe135816c4d67 100644 GIT binary patch delta 39345 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 diff --git a/Main/SOGo.h b/Main/SOGo.h index 574f036d3..c6ed757d8 100644 --- a/Main/SOGo.h +++ b/Main/SOGo.h @@ -1,14 +1,15 @@ /* + Copyright (C) 2005-2010 Inverse inc. Copyright (C) 2004-2005 SKYRIX Software AG - This file is part of OpenGroupware.org. + This file is part of SOGo. - OGo is free software; you can redistribute it and/or modify it under + SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. - OGo is distributed in the hope that it will be useful, but WITHOUT ANY + SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. @@ -38,7 +39,6 @@ - (NSDictionary *) currentLocaleConsideringLanguages:(NSArray *)_langs; - (NSDictionary *) localeForLanguageNamed:(NSString *)_name; - - (NSString *) davURLAsString; @end diff --git a/SoObjects/SOGo/LDAPSource.h b/SoObjects/SOGo/LDAPSource.h index 4c3a418a1..907249200 100644 --- a/SoObjects/SOGo/LDAPSource.h +++ b/SoObjects/SOGo/LDAPSource.h @@ -3,6 +3,7 @@ * Copyright (C) 2007-2010 Inverse inc. * * Author: Wolfgang Sourdeau + * Ludovic Marcotte * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -54,6 +55,7 @@ NSArray *mailFields; NSString *IMAPHostField; NSArray *bindFields; + BOOL _bindAsCurrentUser; NSString *domain; NSString *contactInfoAttribute; @@ -61,15 +63,18 @@ NSDictionary *modulesConstraints; NSMutableArray *searchAttributes; - + BOOL passwordPolicy; + + NSMutableDictionary *_dnCache; } - (void) setBindDN: (NSString *) newBindDN password: (NSString *) newBindPassword hostname: (NSString *) newBindHostname port: (NSString *) newBindPort - encryption: (NSString *) newEncryption; + encryption: (NSString *) newEncryption + bindAsCurrentUser: (NSString *) bindAsCurrentUser; - (void) setBaseDN: (NSString *) newBaseDN IDField: (NSString *) newIDField diff --git a/SoObjects/SOGo/LDAPSource.m b/SoObjects/SOGo/LDAPSource.m index 8844be790..b73082a27 100644 --- a/SoObjects/SOGo/LDAPSource.m +++ b/SoObjects/SOGo/LDAPSource.m @@ -1,8 +1,9 @@ /* LDAPSource.m - this file is part of SOGo * - * Copyright (C) 2007-2009 Inverse inc. + * Copyright (C) 2007-2010 Inverse inc. * * Author: Wolfgang Sourdeau + * Ludovic Marcotte * * This file is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -40,6 +41,8 @@ #import "LDAPSource.h" +#import "../../Main/SOGo.h" + #define SafeLDAPCriteria(x) [[[x stringByReplacingString: @"\\" withString: @"\\\\"] \ stringByReplacingString: @"'" withString: @"\\'"] \ stringByReplacingString: @"%" withString: @"%%"] @@ -162,6 +165,8 @@ static NSArray *commonSearchFields; searchAttributes = nil; passwordPolicy = NO; + + _dnCache = [[NSMutableDictionary alloc] init]; } return self; @@ -169,6 +174,7 @@ static NSArray *commonSearchFields; - (void) dealloc { + NSLog(@"LDAPSource: -dealloc"); [bindDN release]; [hostname release]; [encryption release]; @@ -186,6 +192,7 @@ static NSArray *commonSearchFields; [_scope release]; [searchAttributes release]; [domain release]; + [_dnCache release]; [super dealloc]; } @@ -203,7 +210,9 @@ static NSArray *commonSearchFields; password: [udSource objectForKey: @"bindPassword"] hostname: [udSource objectForKey: @"hostname"] port: [udSource objectForKey: @"port"] - encryption: [udSource objectForKey: @"encryption"]]; + encryption: [udSource objectForKey: @"encryption"] + bindAsCurrentUser: [udSource objectForKey: @"bindAsCurrentUser"]]; + [self setBaseDN: [udSource objectForKey: @"baseDN"] IDField: [udSource objectForKey: @"IDFieldName"] CNField: [udSource objectForKey: @"CNFieldName"] @@ -252,11 +261,27 @@ static NSArray *commonSearchFields; return self; } +- (void) setBindDN: (NSString *) theDN +{ + ASSIGN(bindDN, theDN); +} + +- (void) setBindPassword: (NSString *) thePassword +{ + ASSIGN (password, thePassword); +} + +- (BOOL) bindAsCurrentUser +{ + return _bindAsCurrentUser; +} + - (void) setBindDN: (NSString *) newBindDN password: (NSString *) newBindPassword hostname: (NSString *) newBindHostname port: (NSString *) newBindPort encryption: (NSString *) newEncryption + bindAsCurrentUser: (NSString *) bindAsCurrentUser { ASSIGN (bindDN, newBindDN); ASSIGN (encryption, [newEncryption uppercaseString]); @@ -266,6 +291,7 @@ static NSArray *commonSearchFields; if (newBindPort) port = [newBindPort intValue]; ASSIGN (password, newBindPassword); + _bindAsCurrentUser = [bindAsCurrentUser boolValue]; } - (void) setBaseDN: (NSString *) newBaseDN @@ -337,6 +363,8 @@ static NSArray *commonSearchFields; NS_DURING { + //NSLog(@"Creating NGLdapConnection instance for bindDN '%@'", bindDN); + ldapConnection = [[NGLdapConnection alloc] initWithHostName: hostname port: port]; [ldapConnection autorelease]; @@ -442,11 +470,21 @@ static NSArray *commonSearchFields; { if (queryTimeout > 0) [bindConnection setQueryTimeLimit: queryTimeout]; - if (bindFields) - userDN = [self _fetchUserDNForLogin: _login]; - else - userDN = [NSString stringWithFormat: @"%@=%@,%@", - IDField, _login, baseDN]; + + userDN = [_dnCache objectForKey: _login]; + + if (!userDN) + { + if (bindFields) + userDN = [self _fetchUserDNForLogin: _login]; + else + userDN = [NSString stringWithFormat: @"%@=%@,%@", + IDField, _login, baseDN]; + } + + // We cache the _login <-> userDN entry to speed up things + [_dnCache setObject: userDN forKey: _login]; + if (userDN) { NS_DURING @@ -975,6 +1013,11 @@ static NSArray *commonSearchFields; return login; } +- (NSString *) lookupDNByLogin: (NSString *) theLogin +{ + return [_dnCache objectForKey: theLogin]; +} + - (NGLdapEntry *) lookupGroupEntryByUID: (NSString *) theUID { return [self lookupGroupEntryByAttribute: UIDField diff --git a/SoObjects/SOGo/SOGoSource.h b/SoObjects/SOGo/SOGoSource.h index 18acc5093..f6cdf9bf9 100644 --- a/SoObjects/SOGo/SOGoSource.h +++ b/SoObjects/SOGo/SOGoSource.h @@ -41,6 +41,7 @@ - (NSString *) domain; - (BOOL) checkLogin: (NSString *) _login + password: (NSString *) _pwd perr: (SOGoPasswordPolicyError *) _perr expire: (int *) _expire @@ -62,7 +63,13 @@ @protocol SOGoDNSource +- (void) setBindDN: (NSString *) theDN; +- (void) setBindPassword: (NSString *) thePassword; +- (BOOL) bindAsCurrentUser; + - (NSString *) lookupLoginByDN: (NSString *) theDN; +- (NSString *) lookupDNByLogin: (NSString *) theLogin; + - (NSString *) baseDN; @end diff --git a/SoObjects/SOGo/SOGoUser.h b/SoObjects/SOGo/SOGoUser.h index 6552f49e6..00acf9962 100644 --- a/SoObjects/SOGo/SOGoUser.h +++ b/SoObjects/SOGo/SOGoUser.h @@ -1,15 +1,15 @@ /* - Copyright (C) 2006-2009 Inverse inc. + Copyright (C) 2006-2010 Inverse inc. Copyright (C) 2005 SKYRIX Software AG - This file is part of OpenGroupware.org. + This file is part of SOGo. - OGo is free software; you can redistribute it and/or modify it under + SOGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. - OGo is distributed in the hope that it will be useful, but WITHOUT ANY + SOGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. @@ -29,7 +29,7 @@ SOGoUser This adds some additional SOGo properties to the SoUser object. The - properties are (currently) looked up using the LDAPUserManager. + properties are (currently) looked up using the SOGoUserManager. You have access to this object from the WOContext: context.activeUser @@ -52,12 +52,6 @@ @class SOGoUserProfile; @class SOGoUserSettings; -// @interface SoUser (SOGoExtension) - -// - (NSString *) language; - -// @end - @interface SOGoUser : SoUser { SOGoUserDefaults *_defaults; @@ -72,8 +66,6 @@ NSString *cn; } -// + (NSString *) language; - + (SOGoUser *) userWithLogin: (NSString *) newLogin; + (SOGoUser *) userWithLogin: (NSString *) login diff --git a/SoObjects/SOGo/SOGoUserManager.m b/SoObjects/SOGo/SOGoUserManager.m index 9ab8aa2d3..0bc2ddb7f 100644 --- a/SoObjects/SOGo/SOGoUserManager.m +++ b/SoObjects/SOGo/SOGoUserManager.m @@ -416,6 +416,9 @@ NSMutableDictionary *currentUser; BOOL checkOK; + // We check for cached passwords. If the entry is cached, we + // check this immediately. If not, we'll go directly at the + // authentication source and try to validate there, then cache it. jsonUser = [[SOGoCache sharedCache] userAttributesForLogin: _login]; currentUser = [jsonUser objectFromJSONString]; dictPassword = [currentUser objectForKey: @"password"]; @@ -446,6 +449,25 @@ else checkOK = NO; + // We MUST, for all LDAP sources, update the bindDN and bindPassword + // to the user's value if bindAsCurrentUser is set to true in the + // LDAP source configuration + if (checkOK) + { + NSObject *currentSource; + NSEnumerator *sources; + + sources = [[_sources allValues] objectEnumerator]; + while ((currentSource = [sources nextObject])) + if ([currentSource conformsToProtocol: @protocol(SOGoDNSource)] && + [currentSource bindAsCurrentUser] && + [currentSource lookupDNByLogin: _login]) + { + [currentSource setBindDN: [currentSource lookupDNByLogin: _login]]; + [currentSource setBindPassword: _pwd]; + } + } + return checkOK; } diff --git a/SoObjects/SOGo/SQLSource.h b/SoObjects/SOGo/SQLSource.h index 40f0425f7..8d08a1fdc 100644 --- a/SoObjects/SOGo/SQLSource.h +++ b/SoObjects/SOGo/SQLSource.h @@ -1,6 +1,6 @@ /* SQLSource.h - this file is part of SOGo * - * Copyright (C) 2009 Inverse inc. + * Copyright (C) 2009-2010 Inverse inc. * * Author: Ludovic Marcotte *