00001 <?php
00003
00004
00005
00006
00007
00008
00010
00020
00024 define('PWD_MD5', 1);
00025 define('PWD_CRYPT', 2);
00026 define('PWD_CLEARTEXT', 3);
00027 define('PWD_SHA1', 4);
00028 define('PWD_SHA2', 5);
00029
00030
00031
00032 FLEA::loadClass('FLEA_Db_TableDataGateway');
00033
00034
00044 class FLEA_Rbac_UsersManager extends FLEA_Db_TableDataGateway
00045 {
00051 var $primaryKey = 'user_id';
00052
00058 var $tableName = 'users';
00059
00065 var $usernameField = 'username';
00066
00072 var $emailField = 'email';
00073
00079 var $passwordField = 'password';
00080
00086 var $rolesField = 'roles';
00087
00093 var $encodeMethod = PWD_CRYPT;
00094
00100 var $autoValidating = true;
00101
00107 var $functionFields = array(
00108 'registerIpField' => null,
00109 'lastLoginField' => null,
00110 'lastLoginIpField' => null,
00111 'loginCountField' => null,
00112 'isLockedField' => null,
00113 );
00114
00118 function FLEA_Rbac_UsersManager()
00119 {
00120 parent::FLEA_Db_TableDataGateway();
00121 $mn = strtoupper($this->emailField);
00122 if (isset($this->meta[$mn])) {
00123 $this->meta[$mn]['complexType'] = 'EMAIL';
00124 }
00125 }
00126
00135 function findByUserId($id, $fields = '*')
00136 {
00137 return $this->findByField($this->primaryKey, $id, null, $fields);
00138 }
00139
00148 function findByUsername($username, $fields = '*')
00149 {
00150 return $this->findByField($this->usernameField, $username, null, $fields);
00151 }
00152
00161 function findByEmail($email, $fields = '*')
00162 {
00163 return $this->findByField($this->emailField, $email, null, $fields);
00164 }
00165
00173 function existsUserId($id)
00174 {
00175 return $this->findCount(array($this->primaryKey => $id)) > 0;
00176 }
00177
00185 function existsUsername($username)
00186 {
00187 return $this->findCount(array($this->usernameField => $username)) > 0;
00188 }
00189
00197 function existsEmail($email)
00198 {
00199 return $this->findCount(array($this->emailField => $email)) > 0;
00200 }
00201
00209 function create(& $row)
00210 {
00211 if (isset($this->functionFields['registerIpField'])
00212 && $this->functionFields['registerIpField'] != '')
00213 {
00214 $row[$this->functionFields['registerIpField']] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1';
00215 }
00216 return parent::create($row);
00217 }
00218
00230 function validateUser($username, $password, $returnUserdata = false)
00231 {
00232 if ($returnUserdata) {
00233 $user = $this->findByField($this->usernameField, $username);
00234 } else {
00235 $fields = array($this->primaryKey, $this->passwordField);
00236 if (isset($this->functionFields['loginCountField'])
00237 && $this->functionFields['loginCountField'] != '')
00238 {
00239 $fields[] = $this->functionFields['loginCountField'];
00240 }
00241 if (isset($this->functionFields['isLockedField'])
00242 && $this->functionFields['isLockedField'] != '')
00243 {
00244 $fields[] = $this->functionFields['isLockedField'];
00245 }
00246 $user = $this->findByField($this->usernameField, $username, null, $fields);
00247 }
00248 if (!$user) { return false; }
00249 if (isset($this->functionFields['isLockedField'])
00250 && $this->functionFields['isLockedField'] != '')
00251 {
00252 if ($user[$this->functionFields['isLockedField']]) {
00253 return false;
00254 }
00255 }
00256 if (!$this->checkPassword($password, $user[$this->passwordField])) {
00257 return false;
00258 }
00259
00260 $update = array();
00261
00262 if (isset($this->functionFields['lastLoginField'])
00263 && $this->functionFields['lastLoginField'] != '')
00264 {
00265 $update[$this->functionFields['lastLoginField']] = time();
00266 }
00267
00268 if (isset($this->functionFields['lastLoginIpField'])
00269 && $this->functionFields['lastLoginIpField'] != '')
00270 {
00271 $update[$this->functionFields['lastLoginIpField']] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1';
00272 }
00273
00274 if (isset($this->functionFields['loginCountField'])
00275 && $this->functionFields['loginCountField'] != '')
00276 {
00277 $update[$this->functionFields['loginCountField']] = $user[$this->functionFields['loginCountField']] + 1;
00278 }
00279
00280 if (!empty($update)) {
00281 $update[$this->primaryKey] = $user[$this->primaryKey];
00282 $this->update($update);
00283 }
00284
00285 if ($returnUserdata) { return $user; }
00286 return true;
00287 }
00288
00300 function changePassword($username, $oldPassword, $newPassword)
00301 {
00302 $user = $this->findByField(
00303 $this->usernameField, $username, null,
00304 array($this->primaryKey, $this->passwordField)
00305 );
00306 if (!$user) { return false; }
00307 if (!$this->checkPassword($oldPassword, $user[$this->passwordField])) {
00308 return false;
00309 }
00310
00311 $user[$this->passwordField] = $newPassword;
00312 return parent::update($user);
00313 }
00314
00323 function updatePassword($username, $newPassword)
00324 {
00325 $user = $this->findByField($this->usernameField, $username, null, $this->primaryKey);
00326 if (!$user) { return false; }
00327
00328 $user[$this->passwordField] = $newPassword;
00329 return parent::update($user);
00330 }
00331
00340 function updatePasswordById($userid, $newPassword)
00341 {
00342 $user = $this->findByField($this->primaryKey, $userid, null, $this->primaryKey);
00343 if (!$user) { return false; }
00344
00345 $user[$this->passwordField] = $newPassword;
00346 return parent::update($user);
00347 }
00348
00359 function checkPassword($cleartext, $cryptograph)
00360 {
00361 switch ($this->encodeMethod) {
00362 case PWD_MD5:
00363 return (md5($cleartext) == rtrim($cryptograph));
00364 case PWD_CRYPT:
00365 return (crypt($cleartext, $cryptograph) == rtrim($cryptograph));
00366 case PWD_CLEARTEXT:
00367 return ($cleartext == rtrim($cryptograph));
00368 case PWD_SHA1:
00369 return (sha1($cleartext) == rtrim($cryptograph));
00370 case PWD_SHA2:
00371 return (hash('sha512', $cleartext) == rtrim($cryptograph));
00372
00373 default:
00374 return false;
00375 }
00376 }
00377
00387 function encodePassword($cleartext)
00388 {
00389 switch ($this->encodeMethod) {
00390 case PWD_MD5:
00391 return md5($cleartext);
00392 case PWD_CRYPT:
00393 return crypt($cleartext);
00394 case PWD_CLEARTEXT:
00395 return $cleartext;
00396 case PWD_SHA1:
00397 return sha1($cleartext);
00398 case PWD_SHA2:
00399 return hash('sha512', $cleartext);
00400
00401 default:
00402 return false;
00403 }
00404 }
00405
00414 function fetchRoles(& $user, $rolenameField = 'rolename')
00415 {
00416 if (!isset($user[$this->rolesField]) ||
00417 !is_array($user[$this->rolesField])) {
00418 return array();
00419 }
00420 $roles = array();
00421 foreach ($user[$this->rolesField] as $role) {
00422 if (!is_array($role)) {
00423 return array($user[$this->rolesField][$rolenameField]);
00424 }
00425 $roles[] = $role[$rolenameField];
00426 }
00427 return $roles;
00428 }
00429
00437 function update(& $row)
00438 {
00439 unset($row[$this->passwordField]);
00440 return parent::update($row);
00441 }
00442
00446 function _beforeUpdateDb(& $row)
00447 {
00448 $this->_encodeRecordPassword($row);
00449 return true;
00450 }
00451
00455 function _beforeCreateDb(& $row)
00456 {
00457 $this->_encodeRecordPassword($row);
00458 return true;
00459 }
00460
00466 function _encodeRecordPassword(& $row)
00467 {
00468 if (isset($row[$this->passwordField])) {
00469 $row[$this->passwordField] =
00470 $this->encodePassword($row[$this->passwordField]);
00471 }
00472 }
00473 }