1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
13:
14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
49: class Auth_Auth
50: {
51: const NO_ERROR = 0;
52: const ERROR_LOG = 1;
53: const ERROR_PASS = 2;
54: const ERROR_TABLE = 3;
55: const ERROR_FIELD = 4;
56:
57: 58: 59: 60: 61:
62: private $oDB;
63:
64: 65: 66: 67: 68:
69: private $errorType;
70:
71: 72: 73: 74: 75:
76: private $errorMsg;
77:
78: 79: 80: 81: 82:
83: private $userTable;
84:
85: 86: 87: 88: 89:
90: private $userField;
91:
92: 93: 94: 95: 96:
97: private $pwdField;
98:
99:
100: private $autologTokenField;
101:
102:
103: private $hashRounds;
104:
105: 106: 107: 108: 109:
110: private $autoLogin;
111:
112: 113: 114: 115: 116:
117: private $cookieOption;
118:
119: 120: 121: 122: 123:
124: private $redirectError;
125:
126: 127: 128: 129: 130:
131: private $redirect;
132:
133: 134: 135: 136:
137: private $timeOutSession;
138:
139: 140: 141: 142: 143:
144: public $error;
145:
146: 147: 148: 149: 150:
151: private $session;
152:
153: 154: 155: 156: 157: 158: 159:
160: public function __construct(Session_Session $session,Zend_Db_Adapter_Abstract $db)
161: {
162: $this->oDB = $db;
163: $this->userTable = 'user';
164: $this->userField = 'login';
165: $this->pwdField = 'password';
166: $this->pwdHash = 'md5';
167: $this->autoLogin = false;
168: $timeTTL = time() + (365 * 24 * 3600);
169: $this->cookieOption = array(
170: 'name' => 'loginCookie',
171: 'ttl' => $timeTTL
172: );
173: $this->timeOutSession = 0;
174: $this->redirectError = 'index.php';
175: $this->redirect = (!empty($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] : '';
176: $this->error = false;
177: $this->errorType = self::NO_ERROR;
178: $this->errorMsg = '';
179: $this->session = $session;
180:
181: if (!isset($session->AC_lastAct))
182: {
183: $session->AC_connected = 0;
184: $session->AC_lastAct = 0;
185: }
186: }
187:
188: 189: 190: 191: 192: 193:
194: public function login($login, $pass)
195: {
196: if ($this->checkUser($login))
197: if ($this->checkPass($login, $pass))
198: {
199: $this->startSession();
200: $this->session->AC_connected = true;
201: $this->session->AC_lastAct = time();
202: if ($this->autoLogin)
203: {
204: $this->createCookie($login);
205: }
206: }
207: else
208: $this->displayError();
209: else
210: $this->displayError();
211: }
212:
213: public function logout()
214: {
215: $this->destroySession();
216: $this->destroyCookie();
217: }
218:
219: 220: 221: 222: 223:
224: public function isLogged()
225: {
226: $lastActivity = time() - $this->session->AC_lastAct;
227:
228: if ($this->session->AC_connected === true && $this->timeOutSession == 0)
229: {
230: $this->session->AC_lastAct = time();
231: if ($lastActivity > 300)
232: $this->session->refresh();
233: return true;
234: }
235:
236: elseif ($this->session->AC_connected === true && $lastActivity < $this->timeOutSession && $this->timeOutSession != 0)
237: {
238: $this->session->AC_lastAct = time();
239: if ($lastActivity > 300)
240: $this->session->refresh();
241: return true;
242: }
243:
244: elseif ($this->session->AC_connected === true && $lastActivity > $this->timeOutSession && $this->timeOutSession != 0)
245: {
246: $this->logout();
247: return false;
248: }
249:
250: elseif (isset($this->session->AC_connected) && !$this->session->AC_connected && $this->autoLogin)
251: {
252: if ($this->loginCookie())
253: return true;
254: else
255: return false;
256: }
257:
258: else
259: {
260: return false;
261: }
262: }
263:
264: 265: 266: 267: 268:
269: public function displayError()
270: {
271: switch ($this->errorType)
272: {
273: case self::ERROR_LOG:
274: $this->errorMsg = 'Identifiant incorrect';
275: break;
276: case self::ERROR_PASS:
277: $this->errorMsg = 'Mot de passe incorrect';
278: break;
279: }
280: return $this->errorMsg;
281: }
282:
283: 284: 285: 286: 287:
288: private function loginCookie()
289: {
290: if (isset($_COOKIE['' . $this->cookieOption['name'] . '']))
291: {
292: $datas = $_COOKIE['' . $this->cookieOption['name'] . ''];
293: $pos = strripos($datas, '|');
294: $login = substr($datas, 0, $pos);
295: $token = substr($datas, $pos + 1);
296:
297: if ($this->checkUser($login))
298: {
299: $prepare = $this->oDB->prepare('SELECT ' . $this->autologTokenField . ' FROM ' . $this->userTable . ' WHERE ' . $this->userField . ' = :logCookie');
300: $prepare->execute(array(':logCookie' => $login));
301: $data = $prepare->fetchColumn();
302:
303: if ($token == $data)
304: {
305: $this->startSession();
306: $this->session->AC_connected = true;
307: $this->session->AC_lastAct = time();
308:
309: $this->destroyCookie();
310: $this->createCookie($login);
311: return true;
312: }
313: else
314: {
315: $this->error = true;
316: $this->errorType = self::ERROR_PASS;
317: $this->destroyCookie();
318: $this->displayError();
319: }
320: }
321: else
322: {
323: $this->destroyCookie();
324: $this->displayError();
325: }
326:
327: }
328: return false;
329: }
330:
331: 332: 333: 334:
335: public function startSession($name='acauth')
336: {
337: if (empty($this->session))
338: $this->session = Session_Session::getInstance($name, $this->timeOutSession);
339: }
340:
341: 342: 343: 344: 345:
346: private function createCookie($login)
347: {
348: $token = $this->generateRandomToken();
349: $value = $login.'|'.$token;
350: setcookie($this->cookieOption['name'], $value, $this->cookieOption['ttl']);
351:
352:
353: $prep = $this->oDB->prepare('UPDATE '.$this->userTable.' SET '.$this->autologTokenField.' = :token WHERE '.$this->userField.' = :user');
354: $prep->execute(array(
355: ':token' => $token,
356: ':user' => $login
357: ));
358: }
359:
360: private function generateRandomToken()
361: {
362: $token = '';
363: $char = '+-*$=)_!?./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
364: for($i = 0; $i < 35; $i++)
365: $token .= $char[mt_rand(0,72)];
366:
367: return sha1($token);
368: }
369:
370: 371: 372: 373:
374: private function destroySession()
375: {
376: $this->session->destroy();
377: }
378:
379: 380: 381: 382:
383: private function destroyCookie()
384: {
385: setcookie($this->cookieOption['name'], NULL, time() - 1);
386: }
387:
388: 389: 390: 391: 392: 393:
394: private function checkUser($user)
395: {
396: $prepare = $this->oDB->prepare('SELECT ' . $this->userField . ' FROM ' . $this->userTable . ' WHERE ' . $this->userField . ' = :user');
397: $prepare->execute(array(':user' => $user));
398: if ($prepare->fetchColumn())
399: return true;
400: else
401: {
402: $this->error = true;
403: $this->errorType = self::ERROR_LOG;
404: return false;
405: }
406: }
407:
408: 409: 410: 411: 412: 413: 414: 415:
416: private function checkPass($login, $pass)
417: {
418: $prepare = $this->oDB->prepare('SELECT ' . $this->pwdField . ' FROM ' . $this->userTable . ' WHERE ' . $this->userField . ' = :login');
419: $prepare->execute(array(':login' => $login));
420: $hash = $prepare->fetchColumn();
421:
422: if (Auth_Bcrypt::check($pass, $hash))
423: return true;
424: else
425: {
426: $this->error = true;
427: $this->errorType = self::ERROR_PASS;
428: return false;
429: }
430: }
431:
432: 433: 434: 435: 436: 437: 438:
439: private function hashPass($pass)
440: {
441: 442: 443: 444:
445:
446: $bCrypt = new Auth_Bcrypt($this->hashRounds);
447: return $bCrypt->hash($pass);
448: }
449:
450: 451: 452: 453: 454: 455:
456: public function getErrorType()
457: {
458: return $this->errorType;
459: }
460:
461: 462: 463: 464:
465: public function setUserTable($userTable)
466: {
467: $this->userTable = $userTable;
468: }
469:
470: 471: 472: 473:
474: public function setUserField($userField)
475: {
476: $this->userField = $userField;
477: }
478:
479: 480: 481: 482:
483: public function setPwdField($pwdField)
484: {
485: $this->pwdField = $pwdField;
486: }
487:
488: 489: 490: 491:
492: public function setAutologTokenField($autologTokenField)
493: {
494: $this->autologTokenField = $autologTokenField;
495: }
496:
497: 498: 499: 500:
501: public function setHashRounds($hashRounds)
502: {
503: $this->hashRounds = $hashRounds;
504: }
505:
506: 507: 508: 509:
510: public function setAutoLogin($autoLogin)
511: {
512: $this->autoLogin = $autoLogin;
513: }
514:
515: 516: 517: 518: 519:
520: public function setCookieOption($cookieOption)
521: {
522: $this->cookieOption = $cookieOption;
523: }
524:
525: 526: 527: 528:
529: public function setTimeoutSession($timeout)
530: {
531: $this->timeOutSession = $timeout;
532: }
533:
534:
535:
536: }
537:
538: ?>