MIOLO20
Carregando...
Procurando...
Nenhuma entrada encontrada
mauthldap.class
Ir para a documentação deste ficheiro.
1<?php
2class MAuthLdap extends MAuth
3{
4 var $login; // objeto Login
5 var $iduser; // iduser do usuario corrente
6 var $module; // authentication module;
7 var $conn; //the ldap connection
8
9 function connect()
10 {
12 $module = $MIOLO->getCurrentModule();
13
14 $host = $MIOLO->getConf('login.ldap.host');
15 $port = $MIOLO->getConf('login.ldap.port');
16 $user = $MIOLO->getConf('login.ldap.user');
17 $pass = $MIOLO->getConf('login.ldap.password');
18
19 if ( strlen($port) > 0 )
20 {
21 $this->conn = ldap_connect($host, $port);
22 $this->connUser = ldap_connect($host, $port);
23 }
24 else
25 {
26 $this->conn = ldap_connect($host);
27 $this->connUser = ldap_connect($host);
28 }
29
30 ldap_set_option($this->conn, LDAP_OPT_REFERRALS, 0);
31 ldap_set_option($this->connUser, LDAP_OPT_REFERRALS, 0);
32 ldap_set_option($this->conn, LDAP_OPT_PROTOCOL_VERSION, 3);
33 ldap_set_option($this->connUser, LDAP_OPT_PROTOCOL_VERSION, 3);
34 $r = ldap_bind($this->conn, $user, $pass);
35
36 if( ! $r )
37 {
38 $prompt = _M('O sistema não conseguiu realizar conexão com o serviço de autenticação (LDAP/AD). Este problema pode ser ocasionado por instabilidade na rede ou no serviço de autenticação. <b>Tente novamente mais tarde ou entre em contato com o suporte de infraestrutura.<b>', $module);
39
40 print($prompt);
41 exit;
42 }
43 return true;
44 }
45
46 function __destruct()
47 {
48 ldap_close($this->conn);
49 }
50
51 function __construct()
52 {
53 parent::__construct();
54 $this->connect();
55 }
56
57
58 function Authenticate($user, $pass, $log=true)
59 {
60 $userDb = $user;
62 $base = $MIOLO->getConf('login.ldap.base');
63 $custom = $MIOLO->getConf('login.ldap.custom');
64 $schema = $MIOLO->getConf('login.ldap.schema');
65 $attr = $MIOLO->getConf('login.ldap.userName');
66 $l = $MIOLO->getConf('login.ldap.login');
67 $idPerson = $MIOLO->getConf('login.ldap.idperson');
68 $vars = array(
69 '%domain%' =>$_SERVER['HOST_NAME'],
70 '%login%' =>$user,
71 '%password%'=>md5($pass),
72 'AND(' =>'&(',
73 'OR(' =>'|(',
74 );
75 switch($schema)
76 {
77 case 'miolo':
78 $search = '(&(login='.$user.')(password='.md5($pass).'))';
79 $login = false;
80 break;
81 case 'system':
82 $search = 'uid='.$user;
83 $login = true;
84 break;
85 case 'ad':
86 $search = 'sAMAccountName='.$user;
87 $login = true;
88 break;
89 default:
90 if($custom)
91 {
92 $search = strtr($custom, $vars);
93 }
94 else
95 {
96 $search = strtr('(&(|(uid=%login%)(login=%login%))(objectClass=mioloUser))', $vars);
97 }
98 $login = null;
99 }
100 $sr= ldap_search( $this->conn, $base, $search, array('dn', $attr, 'password', 'mioloGroup', $l, $idPerson, 'userPassword' ));
101
102 $info = ldap_get_entries($this->conn, $sr);
103
104 for($i=0; $i < $info['count']; $i++)
105 {
106 $bind = $exists = false;
107 if( $info[$i]['dn'] )
108 {
109 if( ! $login )
110 {
111 // LDAP
112 if ( strlen($info[$i]['password'][0]) )
113 {
114 $passwordColumn = 'password';
115 }
116 // Active Directory
117 elseif ( strlen($info[$i]['userpassword'][0]) )
118 {
119 $passwordColumn = 'userpassword';
120 }
121
122 $exists = $info[$i][$passwordColumn][0] == md5($pass);
123
124 if ( !$exists )
125 {
126 // Se ainda não encontrou, verifica se no ldap ad não está em md5
127 if ( strlen($info[$i]['userpassword'][0]) )
128 {
129 $passwordColumn = 'userpassword';
130 $senhaDigitada = self::pwdEncrypt($pass);
131
132 $exists = $info[$i][$passwordColumn][0] == $senhaDigitada["userPassword"];
133 }
134 }
135 }
136 if( !$exists && (($login) || is_null($login)) && strlen($pass)>0 )
137 {
138 $bind = ldap_bind($this->connUser, $info[$i]['dn'], $pass);
139 }
140 if( $bind || $exists )
141 {
147 $dbuser = $this->manager->GetBusinessMAD('user');
148 $dbuser->getByLogin($user, 'ILIKE');
149
150 if ( strlen($dbuser->login) > 0 )
151 {
152 $user = $dbuser->login;
153 $idUser = $dbuser->idUser;
154 }
155
156 $r = true;
157 break;
158 }
159 }
160 }
161
162 $groups = array();
163 if($info[$i]['miologroup']['count'] > 0)
164 {
165 unset($info[$i]['miologroup']['count']);
166 $groups = $info[$i]['miologroup'];
167 }
168
169 // Grupos e rights/direitos do usuário tem que buscar da base, o LDAP
170 // não possui essa informação - ticket #38491
171 $userBus = $MIOLO->GetBusiness('admin', 'user');
172 $userBus->login = $user;
173
174 $groupsUser = $userBus->listGroupsByLogin($user);
175 $rightsUser = $userBus->getRights();
176
177 if($log && $r)
178 {
179 if( strlen($idUser) == 0 )
180 {
181 $idUser = 0;
182 }
183
184 $login = new MLogin($user,
185 $pass,
186 $info[$i][$attr][0],
187 $idUser);
188
189 $login->setIdPerson( $info[$i][$idPerson][0] );
190 $login->setGroups($groupsUser);
191 $login->SetRights($rightsUser);
192 $this->SetLogin($login);
193 }
194
195 if ( $r == false )
196 {
197 include 'mauthdb.class';
198
199 $mauthDb = new MAuthDb();
200 return $mauthDb->Authenticate($userDb, $pass);
201 }
202
203 return $r;
204 }
205
212 public static function pwdEncrypt($pw)
213 {
214 $newpw = '';
215 $pw = "\"" . $pw . "\"";
216 $len = strlen($pw);
217
218 for ( $i = 0; $i < $len; $i++ )
219 {
220 $newpw .= "{$pw{$i}}\000";
221 }
222
223 return base64_encode($newpw);
224 }
225
233 public static function getUserDn($ldapConn, $userName)
234 {
236 $basedn = $MIOLO->getConf("login.ldap.base");
237 $searchResults = ldap_search($ldapConn, $basedn, $userName);
238
239 if ( !is_resource($searchResults) )
240 {
241 $MIOLO->error(_M("Error in search results."));
242 }
243
244 $entry = ldap_first_entry($ldapConn, $searchResults);
245
246 return ldap_get_dn($ldapConn, $entry);
247 }
248}
249?>
static getUserDn($ldapConn, $userName)
static pwdEncrypt($pw)
Authenticate($user, $pass, $log=true)
Definição mauthldap.class:58
Definição mauth.class:3
SetLogin($login)
Definição mauth.class:14
static getInstance()
Definição miolo.class:134