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 ?>