openrat-cms

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

InternalAuth.class.php (2700B)


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