openrat-cms

OpenRat Content Management System
git clone http://git.code.weiherhei.de/openrat-cms.git
Log | Files | Refs | README

InternalAuth.class.php (2993B)


      1 <?php
      2 
      3 namespace cms\auth;
      4 
      5 use cms\base\Configuration;
      6 use cms\base\DB as Db;
      7 use cms\base\Startup;
      8 use cms\model\User;
      9 use LogicException;
     10 use security\Password;
     11 
     12 /**
     13  * Authentifizierungsmodul für die interne Benutzerdatenbank.
     14  *
     15  * @author Jan Dankert
     16  *
     17  */
     18 class InternalAuth implements Auth
     19 {
     20 	/**
     21 	 * Ueberpruefen des Kennwortes
     22 	 * ueber die Benutzertabelle in der Datenbank.
     23 	 */
     24 	function login($username, $password, $token)
     25 	{
     26 		// Lesen des Benutzers aus der DB-Tabelle
     27 		$sql = Db::sql(<<<SQL
     28 SELECT * FROM {{user}}
     29  WHERE name={name}
     30 SQL
     31 		);
     32 		$sql->setString('name', $username);
     33 
     34 		$row_user = $sql->getRow();
     35 
     36 		if (empty($row_user)) {
     37 
     38 			// Benutzer ist nicht vorhanden.
     39 			// Trotzdem das Kennwort hashen, um Timingattacken zu verhindern.
     40 			$unusedHash = Password::hash(User::pepperPassword($password), Password::bestAlgoAvailable());
     41 			return Auth::STATUS_FAILED ;
     42 		}
     43 
     44 		$lockedUntil = $row_user['password_locked_until'];
     45 		if ( $lockedUntil && $lockedUntil > Startup::getStartTime() ) {
     46 			return Auth::STATUS_FAILED + Auth::STATUS_ACCOUNT_LOCKED; // Password is locked
     47 		}
     48 
     49 		// Pruefen ob Kennwort mit Datenbank uebereinstimmt.
     50 		if (!Password::check(User::pepperPassword($password), $row_user['password_hash'], $row_user['password_algo'])) {
     51 			return Auth::STATUS_FAILED;
     52 		}
     53 
     54 		// Behandeln von Klartext-Kennwoertern (Igittigitt).
     55 		if ($row_user['password_algo'] == Password::ALGO_PLAIN) {
     56 			if (Configuration::subset(['security', 'password'] )->is('force_change_if_cleartext',true))
     57 				// Kennwort steht in der Datenbank im Klartext.
     58 				// Das Kennwort muss geaendert werden
     59 				return Auth::STATUS_PW_EXPIRED;
     60 
     61 			// Anderenfalls ist das Login zwar moeglich, aber das Kennwort wird automatisch neu gehasht, weil der beste Algo erzwungen wird.
     62 			// Das Klartextkennwort waere danach ueberschrieben.
     63 		}
     64 
     65 		if ($row_user['password_expires'] != null && $row_user['password_expires'] < time()) {
     66 			// Kennwort ist abgelaufen.
     67 
     68 			// Wenn das kennwort abgelaufen ist, kann es eine bestimmte Dauer noch benutzt und geändert werden.
     69 			// Nach Ablauf dieser Dauer wird das Login abgelehnt.
     70 			if ($row_user['password_expires'] + (Configuration::subset('security')->getSeconds('deny_after_expiration_duration',3*24*60*60)) < time())
     71 				return Auth::STATUS_FAILED + Auth::STATUS_PW_EXPIRED; // Abgelaufenes Kennwort wird nicht mehr akzeptiert.
     72 			else
     73 				return Auth::STATUS_SUCCESS + Auth::STATUS_PW_EXPIRED; // Kennwort ist abgelaufen, kann aber noch geändert werden.
     74 		}
     75 
     76 		if ($row_user['totp'] == 1) {
     77 			$user = new User($row_user['id']);
     78 			$user->load();
     79 			if (Password::getTOTPCode($user->otpSecret) == $token)
     80 				return Auth::STATUS_SUCCESS;
     81 			else
     82 				return Auth::STATUS_FAILED + Auth::STATUS_TOKEN_NEEDED;
     83 		}
     84 
     85 		if ($row_user['hotp'] == 1) {
     86 			throw new LogicException('HOTP not yet implemented.');
     87 		}
     88 
     89 		// Benutzer wurde erfolgreich authentifiziert.
     90 		return Auth::STATUS_SUCCESS;
     91 	}
     92 
     93 	public function username()
     94 	{
     95 		return null;
     96 	}
     97 }