83 lines
3.4 KiB
PHP
83 lines
3.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use Steuerkram\Auth;
|
|
use Steuerkram\Models\User;
|
|
|
|
class SessionRevocationTest extends TestCase
|
|
{
|
|
protected string $testName = 'Test 100: Sitzungsentzug bei Deaktivierung/Löschung/Passwortwechsel (Fix #215)';
|
|
|
|
public function run(): void
|
|
{
|
|
User::create('sessionrevoke-user', 'password123');
|
|
$user = User::findByUsername('sessionrevoke-user');
|
|
$id = (int)$user['id'];
|
|
|
|
$fingerprint = Auth::passwordFingerprint((string)$user['password_hash']);
|
|
$this->assertEquals(
|
|
$fingerprint,
|
|
Auth::passwordFingerprint((string)$user['password_hash']),
|
|
'passwordFingerprint() ist deterministisch für denselben Hash'
|
|
);
|
|
$this->assert(
|
|
$fingerprint !== Auth::passwordFingerprint('$2y$anderer-hash'),
|
|
'passwordFingerprint() unterscheidet unterschiedliche Hashes'
|
|
);
|
|
|
|
// Frisch angemeldete Session: aktiver Benutzer, passender Fingerprint -> gültig
|
|
$authData = User::findAuthData($id);
|
|
$this->assert(
|
|
!Auth::isSessionRevoked($authData, $fingerprint),
|
|
'Aktiver Benutzer mit passendem Passwort-Fingerprint gilt als gültige Session'
|
|
);
|
|
|
|
// Fehlender/falscher Fingerprint (z. B. Session von vor dem Fix, oder nach Passwortänderung)
|
|
$this->assert(
|
|
Auth::isSessionRevoked($authData, ''),
|
|
'Fehlender Passwort-Fingerprint in der Session entzieht den Zugriff'
|
|
);
|
|
$this->assert(
|
|
Auth::isSessionRevoked($authData, 'falscher-fingerprint'),
|
|
'Abweichender Passwort-Fingerprint entzieht den Zugriff'
|
|
);
|
|
|
|
// Admin ändert das Passwort -> alter Fingerprint wird ungültig
|
|
User::update($id, 'sessionrevoke-user', 'einneuespasswort123');
|
|
$afterPasswordChange = User::findAuthData($id);
|
|
$this->assert(
|
|
Auth::isSessionRevoked($afterPasswordChange, $fingerprint),
|
|
'Passwortänderung entzieht bereits bestehende Sessions (alter Fingerprint)'
|
|
);
|
|
$newFingerprint = Auth::passwordFingerprint((string)$afterPasswordChange['password_hash']);
|
|
$this->assert(
|
|
!Auth::isSessionRevoked($afterPasswordChange, $newFingerprint),
|
|
'Nach der Passwortänderung ist eine Session mit dem neuen Fingerprint wieder gültig'
|
|
);
|
|
|
|
// Admin deaktiviert den Benutzer -> Session wird ungültig, obwohl Fingerprint passt
|
|
User::setActive($id, false);
|
|
$afterDeactivation = User::findAuthData($id);
|
|
$this->assert(
|
|
Auth::isSessionRevoked($afterDeactivation, $newFingerprint),
|
|
'Deaktivierung entzieht den Zugriff, obwohl der Passwort-Fingerprint noch passt'
|
|
);
|
|
|
|
User::setActive($id, true);
|
|
$afterReactivation = User::findAuthData($id);
|
|
$this->assert(
|
|
!Auth::isSessionRevoked($afterReactivation, $newFingerprint),
|
|
'Reaktivierung macht die Session mit passendem Fingerprint wieder gültig'
|
|
);
|
|
|
|
// Admin löscht den Benutzer -> Session wird ungültig
|
|
User::delete($id);
|
|
$afterDelete = User::findAuthData($id);
|
|
$this->assert($afterDelete === false, 'Gelöschter Benutzer wird von findAuthData() nicht mehr gefunden');
|
|
$this->assert(
|
|
Auth::isSessionRevoked($afterDelete, $newFingerprint),
|
|
'Löschung entzieht den Zugriff'
|
|
);
|
|
}
|
|
}
|