Ticket #83: AuthenticatorLDAP.php

File AuthenticatorLDAP.php, 6.3 KB (added by jguevara@…, 13 years ago)
Line 
1<?php
2
3
4/********************************************************************\
5 * This program is free software; you can redistribute it and/or    *
6 * modify it under the terms of the GNU General Public License as   *
7 * published by the Free Software Foundation; either version 2 of   *
8 * the License, or (at your option) any later version.              *
9 *                                                                  *
10 * This program is distributed in the hope that it will be useful,  *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
13 * GNU General Public License for more details.                     *
14 *                                                                  *
15 * You should have received a copy of the GNU General Public License*
16 * along with this program; if not, contact:                        *
17 *                                                                  *
18 * Free Software Foundation           Voice:  +1-617-542-5942       *
19 * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *
20 * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *
21 *                                                                  *
22 \********************************************************************/
23
24 /**@file AuthenticatorLDAP.php
25 * @author Copyright (C) 2006 Ricardo Jose Guevara Ochoa <rjguevara@gmail.com>,
26 */
27
28require_once BASEPATH.'classes/Authenticator.php';
29require_once BASEPATH.'classes/User.php';
30
31/** Internal wifidog user database authentication source using LDAP*/
32class AuthenticatorLDAP extends Authenticator
33{
34
35        private $mldap_hostname;
36        private $mldap_filter;
37        private $mldap_o;
38        private $mldap_pass;
39        private $mldap_rdn;
40
41
42
43        /**
44        * AuthenticatorLDAP constructor
45        * Example:  new AuthenticatorLDAP(IDRC_ACCOUNT_ORIGIN, '192.168.0.11',
46        * 'company.com', 'mail');
47        * @param $account_orgin : The network ID
48        * @param $host : hostname of the LDAP  server
49        * @param $o : the base dn of the server
50        * @param $filter : it's the field that will be used in the ldap search, ej: uid, mail, name
51        * server
52        */
53       
54        function __construct($account_orgin, $host, $rdn, $pass, $o, $filter)
55        {
56                parent :: __construct($account_orgin);
57                $this->mldap_hostname = $host;
58                $this->mldap_filter = $filter;
59                $this->mldap_o = $o;
60                $this->mldap_rdn = trim($rdn);
61                $this->mldap_pass = trim($pass);
62        }
63
64        //ldap
65        //poner para que sirve
66        //mandar los mensajes de error
67        function checkldapuser($username, $password, $ldap_server, $o, $f, & $errmsg = null )
68        {
69                $rtval = true;
70                if($connect=@ldap_connect($ldap_server))
71                { // if connected to ldap server
72                        ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
73
74                        // bind to ldap connection
75                        if( strlen(trim($mldap_rdn)) == 0  )
76                        {
77                                if(($bind=@ldap_bind($connect)) == false)
78                                {
79                                        $errmsg = _("Error while connecting to the server.");
80                                        return false;
81                                }
82                        }
83                        else
84                        {
85                                if(($bind=@ldap_bind($connect, $this->mldap_rdn, $this->mldap_pass )) == false)
86                                {
87                                        $errmsg = _("Error while connecting to the server.");
88                                        return false;
89                                }
90                        }
91
92                        // search for user
93                        if (($res_id = ldap_search( $connect, "o=$o", "$f=$username")) == false) 
94                        {
95                                $errmsg = _("1. Error occur while obtaingin your information.");
96                                return false;
97                        }
98
99                        if (ldap_count_entries($connect, $res_id) != 1)
100                        {
101                                $errmsg = _("2. Error occur while obtaining your username or password from the server.");
102                                return false;
103                        }
104
105                        if (( $entry_id = ldap_first_entry($connect, $res_id))== false)
106                        {       
107                                $errmsg = _("3. Error occur while obtaining your username or password from the server.");
108                                return false;
109                        }
110
111                        if (( $user_dn = ldap_get_dn($connect, $entry_id)) == false)
112                        {       
113                                $errmsg = _("4. Error occur while obtaining your username or password from the server.");
114                                return false;
115                        }
116                               
117                        //Authenticate the User
118                        if (($link_id = ldap_bind($connect, $user_dn, $password)) == false)
119                        {       
120                                $errmsg = _("Error in username or password.");
121                                return false;
122                        }
123
124                        return true;
125                }
126                else
127                {
128                        $errmsg = _("Error connecting to LDAP Server.");
129                       
130                }
131                ldap_close($connect);
132        }
133
134       
135        /** Attempts to login a user against the authentication source.  If successfull, returns a User object
136         * @param username:  A valid identifying token for the source.  Not necessarily unique.  For local user, bots username and email are valid.
137         * @param password:  Clear text password.
138         * @retval The actual User object if sogin was successfull, false otherwise.
139         */
140        function login($username, $password, & $errmsg = null)
141        {
142        //      $errmsg = _( "Error en Autenticacion. "  . $password );
143        //      return false;   
144                global $db;
145                $security = new Security();
146                $retval = false;
147                $username = $db->EscapeString($username);
148                $password = $db->EscapeString($password);
149               
150                if ( $this->checkldapuser( $username, $password, $this->mldap_hostname, $this->mldap_o, $this->mldap_filter, $errmsg ) )
151                {
152                        //LDAP Authentication Successful
153                       
154                        $sql = "SELECT user_id, pass FROM users WHERE (username='$username') AND account_origin='".$this->getNetwork()->getId()."'";
155               
156                        $db->ExecSqlUniqueRes($sql, $user_info, false); 
157
158                        if ($user_info != null)
159                        {
160                                $user = new User($user_info['user_id']);
161                                if ($user->isUserValid($errmsg))
162                                {
163                                        $retval = $user;
164                                        User::setCurrentUser($user);
165                                        $errmsg = _("Login successfull");
166                                }
167                                else
168                                {
169                                        $retval = false;
170                                }
171                        }
172                        else
173                        {
174                                $user = User :: createUser(get_guid(), $username, $this->getNetwork(), "", "");
175                                $retval = & $user;
176                                $user->setAccountStatus(ACCOUNT_STATUS_ALLOWED);
177                                User::setCurrentUser($user);
178                                $errmsg = _("Login successfull");
179                        }
180                }
181                else
182                {
183                        //Error already been set       
184                        return false;
185                }
186               
187                return $retval;
188        }
189
190        /** Start accounting traffic for the user */
191        function acctStart($info, & $errmsg = null)
192        {
193                parent :: acctStart($info);
194                return true;
195        }
196
197        /** Update traffic counters */
198        function acctUpdate($info, $incoming, $outgoing, & $errmsg = null)
199        {
200                // Just call the generic counters update
201                parent :: acctUpdate($info, $incoming, $outgoing);
202                return true;
203        }
204
205        /** Final update and stop accounting */
206        function acctStop($info, & $errmsg = null)
207        {
208                parent :: acctStop($info);
209                return true;
210        }
211       
212        /**
213         */
214        function isRegistrationPermitted()
215        {
216                return false;
217        }
218
219
220
221} // End class
222?>