| <?php␊ |
| /* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */␊ |
| /*␊ |
| # ***** BEGIN LICENSE BLOCK *****␊ |
| # This file is part of Plume Framework, a simple PHP Application Framework.␊ |
| # Copyright (C) 2001-2007 Loic d'Anterroches and contributors.␊ |
| #␊ |
| # Plume Framework 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.1 of the License, or␊ |
| # (at your option) any later version.␊ |
| #␊ |
| # Plume Framework 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.␊ |
| #␊ |
| # You should have received a copy of the GNU Lesser General Public License␊ |
| # along with this program; if not, write to the Free Software␊ |
| # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA␊ |
| #␊ |
| # ***** END LICENSE BLOCK ***** */␊ |
| ␊ |
| /**␊ |
| * Backend to authenticate against a LDAP server.␊ |
| *␊ |
| * Configuration is done with the 'auth_ldap_*' keys.␊ |
| */␊ |
| class Pluf_Auth_LdapBackend␊ |
| {␊ |
| /**␊ |
| * Given a user id, retrieve it.␊ |
| *␊ |
| * Here we get the against the model database.␊ |
| */␊ |
| public static function getUser($user_id)␊ |
| {␊ |
| $sql = new Pluf_SQL('login=%s', array($user_id));␊ |
| return Pluf::factory('Pluf_User')->getOne($sql->gen());␊ |
| }␊ |
| ␊ |
| /**␊ |
| * Given an array with the authentication data, auth the user and return it.␊ |
| */␊ |
| public static function authenticate($auth_data)␊ |
| {␊ |
| $password = $auth_data['password'];␊ |
| $login = $auth_data['login'];␊ |
| ␊ |
| // Small security check against the login␊ |
| if (preg_match('/[^A-Za-z0-9\-\_]/', $login)) {␊ |
| return false;␊ |
| }␊ |
| ␊ |
| // We check the user against the LDAP server, if it works we␊ |
| // are happy, if not return false.␊ |
| ␊ |
| ␊ |
| ␉$ldap_dn = Pluf::f('auth_ldap_dn', 'ou=users,dc=example,dc=com');␊ |
| $ldap_user = Pluf::f('auth_ldap_user', null);␊ |
| $ldap_password = Pluf::f('auth_ldap_password', null);␊ |
| $ldap_version = Pluf::f('auth_ldap_version', 3);␊ |
| $ldap_user_key = Pluf::f('auth_ldap_user_key', 'uid');␊ |
| // If auth_ldap_password_key, it will use crypt hash control␊ |
| // to test the login password, else it will bind.␊ |
| $ldap_password_key = Pluf::f('auth_ldap_password_key', null);␊ |
| $ldap_surname_key = Pluf::f('auth_ldap_surname_key', 'sn');␊ |
| $ldap_givenname_key = Pluf::f('auth_ldap_givenname_key', 'cn');␊ |
| $ldap_email_key = Pluf::f('auth_ldap_email_key', 'email');␊ |
| ␊ |
| ␊ |
| ␉␉$ldap = ldap_connect(Pluf::f('auth_ldap_host', 'localhost'));␊ |
| ␉␉ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, ␊ |
| Pluf::f('auth_ldap_version', 3));␊ |
| ␉␉if (!ldap_bind($ldap, $ldap_user, $ldap_password)) {␊ |
| Pluf_Log::warn(sprintf('Cannot bind to the ldap server, user:%s, password:***', $ldap_user));␊ |
| ldap_close($ldap);␊ |
| return false;␊ |
| }␊ |
| // Go for a search␊ |
| $search = ldap_search($ldap, $ldap_dn, ␊ |
| $ldap_user_id.'='.$login);␊ |
| $n = ldap_get_entries($ldap, $search);␊ |
| if ($n['count'] != 1) {␊ |
| ldap_close($ldap);␊ |
| return false;␊ |
| }␊ |
| $entry = ldap_first_entry($ldap, $search);␊ |
| // We get all the data first, the bind or hash control is done␊ |
| // later. If we control with bind now, we need to search again␊ |
| // to have an $entry resource to get the values.␊ |
| list($family_name,) = ldap_get_values($ldap, $entry, $ldap_surname_key);␊ |
| list($first_name,) = ldap_get_values($ldap, $entry, $ldap_givenname_key);␊ |
| list($email,) = ldap_get_values($ldap, $entry, $ldap_email_key);␊ |
| ␊ |
| if ($ldap_password_key) {␊ |
| // Password authentication.␊ |
| list($ldap_hash,) = ldap_get_values($ldap, $entry, $ldap_password_key);␊ |
| $ldap_hash = substr($ldap_hash, 7);␊ |
| $salt = substr($ldap_hash, 0, 12);␊ |
| $hash = crypt($password, $salt);␊ |
| if ($ldap_hash != $hash) {␊ |
| ldap_close($ldap);␊ |
| return false;␊ |
| }␊ |
| } else {␊ |
| // Bind authentication␊ |
| if (!ldap_bind($lda, $login, $password)) {␊ |
| ldap_close($ldap);␊ |
| return false;␊ |
| }␊ |
| } ␊ |
| // We get the user values as the ␊ |
| // Now we get the user and we create it if not available␊ |
| $user = self::getUser($login);␊ |
| if ($user) {␊ |
| ldap_close($ldap);␊ |
| return $user;␊ |
| }␊ |
| // Need to create it␊ |
| ldap_close($ldap);␊ |
| $user = new Pluf_User();␊ |
| $user->active = true;␊ |
| $user->login = $login;␊ |
| $user->password = $password;␊ |
| $user->last_name = $family_name;␊ |
| $user->first_name = $first_name;␊ |
| $user->email = $email;␊ |
| $user->create();␊ |
| return $user;␊ |
| }␊ |
| }␊ |
| ␊ |