Ticket #125: AuthenticatorLDAP.php

File AuthenticatorLDAP.php, 11.4 KB (added by jguevara@…, 15 years ago)

here are the fixes

Line 
1<?php
2
3/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
4
5// +-------------------------------------------------------------------+
6// | WiFiDog Authentication Server                                     |
7// | =============================                                     |
8// |                                                                   |
9// | The WiFiDog Authentication Server is part of the WiFiDog captive  |
10// | portal suite.                                                     |
11// +-------------------------------------------------------------------+
12// | PHP version 5 required.                                           |
13// +-------------------------------------------------------------------+
14// | Homepage:     http://www.wifidog.org/                             |
15// | Source Forge: http://sourceforge.net/projects/wifidog/            |
16// +-------------------------------------------------------------------+
17// | This program is free software; you can redistribute it and/or     |
18// | modify it under the terms of the GNU General Public License as    |
19// | published by the Free Software Foundation; either version 2 of    |
20// | the License, or (at your option) any later version.               |
21// |                                                                   |
22// | This program is distributed in the hope that it will be useful,   |
23// | but WITHOUT ANY WARRANTY; without even the implied warranty of    |
24// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the     |
25// | GNU General Public License for more details.                      |
26// |                                                                   |
27// | You should have received a copy of the GNU General Public License |
28// | along with this program; if not, contact:                         |
29// |                                                                   |
30// | Free Software Foundation           Voice:  +1-617-542-5942        |
31// | 59 Temple Place - Suite 330        Fax:    +1-617-542-2652        |
32// | Boston, MA  02111-1307,  USA       gnu@gnu.org                    |
33// |                                                                   |
34// +-------------------------------------------------------------------+
35
36/**
37 * @package    WiFiDogAuthServer
38 * @subpackage Authenticators
39 * @author     Ricardo Jose Guevara Ochoa <rjguevara@gmail.com>
40 * @author     Max Horvath <max.horvath@maxspot.de>
41 * @copyright  2006 Ricardo Jose Guevara Ochoa
42 * @copyright  2006 Max Horvath, maxspot GmbH
43 * @version    Subversion $Id: AuthenticatorLocalUser.php 915 2006-01-23 05:26:20Z max-horvath $
44 * @link       http://www.wifidog.org/
45 */
46
47/**
48 * Load include files
49 */
50require_once('classes/Authenticator.php');
51require_once('classes/Dependencies.php');
52require_once('classes/Security.php');
53require_once('classes/User.php');
54
55/**
56 * Internal wifidog user database authentication source using LDAP
57 *
58 * @package    WiFiDogAuthServer
59 * @subpackage Authenticators
60 * @author     Ricardo Jose Guevara Ochoa <rjguevara@gmail.com>
61 * @author     Max Horvath <max.horvath@maxspot.de>
62 * @copyright  2006 Ricardo Jose Guevara Ochoa
63 * @copyright  2006 Max Horvath, maxspot GmbH
64 */
65class AuthenticatorLDAP extends Authenticator
66{
67    /**
68     * Hostname of the LDAP  server
69     *
70     * @var string
71     *
72     * @access private
73     */
74    private $mldap_hostname;
75
76    /**
77     * The Relative Distinguished Name of the LDAP server
78     *
79     * @var string
80     *
81     * @access private
82     */
83    private $mldap_rdn;
84
85    /**
86     * The password of the LDAP server
87     *
88     * @var string
89     *
90     * @access private
91     */
92    private $mldap_pass;
93
94    /**
95     * The base dn of the server
96     *
97     * @var string
98     *
99     * @access private
100     */
101    private $mldap_o;
102
103    /**
104     * It's the field that will be used in the LDAP search, i.e.: uid, mail,
105     * name server
106     *
107     * @var string
108     *
109     * @access private
110     */
111    private $mldap_filter;
112
113    /**
114     * AuthenticatorLDAP constructor
115     *
116     * Example: new AuthenticatorLDAP(IDRC_ACCOUNT_ORIGIN, '192.168.0.11',
117     * 'company.com', 'password', 'mail');
118     *
119     * @param string $account_orgin The network ID
120     * @param string $host          Hostname of the LDAP  server
121     * @param string $rdn           The Relative Distinguished Name of the LDAP
122     *                              server
123     * @param string $rdn           The Relative Distinguished Name of the LDAP
124     *                              server
125     * @param string $pass          The password of the LDAP server
126     * @param string $o             The base dn of the LDAP server
127     * @param string $filter        It's the field that will be used in the
128     *                              LDAP search, i.e.: uid, mail, name server
129     *
130     * @return void
131     *
132     * @access public
133     */
134        public function __construct($account_orgin, $host, $rdn, $pass, $o, $filter)
135    {
136        // Call parent constructor
137        parent::__construct($account_orgin);
138
139                $this->mldap_hostname = $host;
140                $this->mldap_filter = $filter;
141                $this->mldap_o = $o;
142                $this->mldap_rdn = trim($rdn);
143                $this->mldap_pass = trim($pass);
144    }
145
146    /**
147     * Callback function used to LDAP accounts
148     *
149     * @param string $username    Username of user
150     * @param string $password    Clear text password of user
151     * @param string $ldap_server Hostname of LDAP server
152     * @param strong $o           The base dn of the LDAP server
153     * @param string $f           It's the field that will be used in the
154     *                            LDAP search, i.e.: uid, mail, name server
155     * @param string $errmsg      Reference of error message
156     *
157     * @return bool True if the parameter refers to a Local User account origin
158     *
159     * @access private
160     */
161        private function checkLdapUser($username, $password, $ldap_server, $o, $f, &$errmsg = null )
162        {
163            // Init values
164                $rtval = true;
165
166                if (Dependencies::check("LDAP", $errmsg)) {
167                if ($connect = @ldap_connect($ldap_server)) {
168                    // if connected to ldap server
169                        ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
170
171                        // bind to ldap connection
172                if (strlen(trim($this->mldap_rdn)) == 0) {
173                                if (($bind = @ldap_bind($connect)) == false) {
174                                        $errmsg = _("Error while connecting to the LDAP server.");
175                                        return false;
176                                }
177                        } else {
178                                if (($bind = @ldap_bind($connect, $this->mldap_rdn, $this->mldap_pass )) == false) {
179                                        $errmsg = _("Error while connecting to the LDAP server.");
180                                        return false;
181                                }
182                        }
183
184                        // search for user
185                        if (($res_id = ldap_search($connect, "o=$o", "$f=$username")) == false)  {
186                                $errmsg = _("Error while obtaining your LDAP information.");
187
188                                return false;
189                        }
190
191                        if (ldap_count_entries($connect, $res_id) != 1) {
192                                $errmsg = _("Error while obtaining your username or password from the LDAP server.");
193
194                                return false;
195                        }
196
197                        if (($entry_id = ldap_first_entry($connect, $res_id)) == false) {
198                                $errmsg = _("Error while obtaining your username or password from the LDAP server.");
199
200                                return false;
201                        }
202
203                        if (($user_dn = ldap_get_dn($connect, $entry_id)) == false) {
204                                $errmsg = _("Error while obtaining your username or password from the LDAP server.");
205
206                                return false;
207                        }
208
209                        //Authenticate the User
210                        if (($link_id = ldap_bind($connect, $user_dn, $password)) == false) {
211                                $errmsg = _("Error in username or password.");
212
213                                return false;
214                        }
215
216                        return true;
217                } else {
218                        $errmsg = _("Error connecting to the LDAP Server.");
219                }
220
221                ldap_close($connect);
222                } else {
223                    $rtval = false;
224                }
225        }
226
227    /**
228     * Attempts to login a user against the authentication source
229     *
230     * If successfull, returns a User object
231     *
232     * @param string $username A valid identifying token for the source. Not
233     *                         necessarily unique.
234     * @param string $password Clear text password.
235     * @param string $errmsg   Reference of error message
236     *
237     * @return object The actual User object if login was successfull, false
238     *                otherwise.
239     *
240     * @access public
241     */
242        public function login($username, $password, &$errmsg = null)
243        {
244            // Define globals
245                global $db;
246
247                // Init values
248                $security = new Security();
249                $retval = false;
250                $username = $db->EscapeString($username);
251                $password = $db->EscapeString($password);
252
253                if (Dependencies::check("LDAP", $errmsg)) {
254                if ($this->checkLdapUser($username, $password, $this->mldap_hostname, $this->mldap_o, $this->mldap_filter, $errmsg)) {
255                        //LDAP Authentication Successful
256                        $sql = "SELECT user_id, pass FROM users WHERE (username='$username') AND account_origin='".$this->getNetwork()->getId()."'";
257
258                        $db->ExecSqlUniqueRes($sql, $user_info, false);
259
260                        if ($user_info != null) {
261                                $user = new User($user_info['user_id']);
262
263                                if ($user->isUserValid($errmsg)) {
264                                        $retval = $user;
265                                        User::setCurrentUser($user);
266                                        $errmsg = _("Login successfull");
267                                } else {
268                                        $retval = false;
269                                //Error already been set
270                                }
271                        } else {
272                                $user = User::createUser(get_guid(), $username, $this->getNetwork(), "", "");
273                                $retval = &$user;
274                                $user->setAccountStatus(ACCOUNT_STATUS_ALLOWED);
275                                User::setCurrentUser($user);
276                                $errmsg = _("Login successfull");
277                        }
278                } else {
279                        return false;
280                        //Error already been set
281                }
282                }
283
284                return $retval;
285        }
286
287    /**
288     * Start accounting traffic for the user
289     *
290     * @param string $conn_id The connection id for the connection to work on
291     * @param string $errmsg  Reference of error message
292     *
293     * @return bool Returns always true
294     *
295     * @access public
296     */
297    public function acctStart($conn_id, &$errmsg = null)
298    {
299        // Call parent method
300        parent::acctStart($conn_id);
301
302        return true;
303    }
304
305    /**
306     * Update traffic counters
307     *
308     * @param string $conn_id  The connection id for the connection to work on
309     * @param int    $incoming Incoming traffic in bytes
310     * @param int    $outgoing Outgoing traffic in bytes
311     * @param string $errmsg   Reference of error message
312     *
313     * @return bool Returns always true
314     *
315     * @access public
316     */
317    public function acctUpdate($conn_id, $incoming, $outgoing, &$errmsg = null)
318    {
319        // Call parent method
320        parent::acctUpdate($conn_id, $incoming, $outgoing);
321
322        return true;
323    }
324
325    /**
326     * Final update and stop accounting
327     *
328     * @param string $conn_id The connection id (the token id) for the
329     *                        connection to work on
330     * @param string $errmsg  Reference of error message
331     *
332     * @return bool Returns always true
333     *
334     * @access public
335     */
336    public function acctStop($conn_id, &$errmsg = null)
337    {
338        // Call parent method
339        parent::acctStop($conn_id);
340
341        return true;
342    }
343
344}
345
346/*
347 * Local variables:
348 * tab-width: 4
349 * c-basic-offset: 4
350 * c-hanging-comment-ender-p: nil
351 * End:
352 */
353