Update from Git Manager GUI
This commit is contained in:
@@ -3,7 +3,7 @@ if ( ! defined( 'ABSPATH' ) ) exit;
|
||||
|
||||
class WBF_Auth {
|
||||
|
||||
const SESSION_KEY = 'wbf_forum_user';
|
||||
const SESSION_KEY = 'wbf_forum_user';
|
||||
|
||||
public static function init() {
|
||||
// PHP 8.3: session_start() nach gesendeten Headers erzeugt E_WARNING,
|
||||
@@ -11,8 +11,6 @@ class WBF_Auth {
|
||||
// Lösung: headers_sent() prüfen + session_start() mit Cookie-Optionen aufrufen.
|
||||
if ( ! session_id() ) {
|
||||
if ( headers_sent() ) {
|
||||
// Headers bereits gesendet — Session kann nicht sicher gestartet werden.
|
||||
// Passiert z.B. wenn WP_DEBUG=true und PHP Notices vor dem Hook ausgegeben hat.
|
||||
return;
|
||||
}
|
||||
$session_opts = [
|
||||
@@ -20,7 +18,6 @@ class WBF_Auth {
|
||||
'cookie_samesite' => 'Lax',
|
||||
'use_strict_mode' => true,
|
||||
];
|
||||
// cookie_secure nur setzen wenn HTTPS aktiv — verhindert Session-Verlust bei HTTP
|
||||
if ( is_ssl() || ( ! empty( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] !== 'off' ) ) {
|
||||
$session_opts['cookie_secure'] = true;
|
||||
}
|
||||
@@ -50,7 +47,7 @@ class WBF_Auth {
|
||||
return WBF_DB::get_user( (int) $_SESSION[ self::SESSION_KEY ] );
|
||||
}
|
||||
|
||||
public static function login( $username_or_email, $password ) {
|
||||
public static function login( $username_or_email, $password, $remember = false ) {
|
||||
self::init();
|
||||
$user = WBF_DB::get_user_by( 'username', $username_or_email );
|
||||
if ( ! $user ) {
|
||||
@@ -60,6 +57,19 @@ class WBF_Auth {
|
||||
if ( ! password_verify( $password, $user->password ) ) {
|
||||
return array( 'success' => false, 'message' => 'Falsches Passwort.' );
|
||||
}
|
||||
|
||||
// ── 2FA-Check ─────────────────────────────────────────────────────────
|
||||
// Wenn 2FA aktiv: Login pausieren und TOTP-Code anfordern.
|
||||
// remember-Flag in Session merken, damit es nach 2FA-Verifikation gesetzt wird.
|
||||
if ( class_exists('WBF_TOTP') && WBF_TOTP::is_enabled_for( $user->id ) ) {
|
||||
$_SESSION[ WBF_TOTP::SESSION_PENDING ] = $user->id;
|
||||
if ( $remember ) {
|
||||
$_SESSION['wbf_2fa_remember'] = true;
|
||||
}
|
||||
return array( 'success' => false, '2fa_required' => true );
|
||||
}
|
||||
// ── Ende 2FA-Check ────────────────────────────────────────────────────
|
||||
|
||||
if ( WBF_Roles::level($user->role) < 0 ) {
|
||||
// Zeitlich begrenzte Sperre prüfen — automatisch aufheben wenn abgelaufen
|
||||
if ( ! empty($user->ban_until) && strtotime($user->ban_until) <= time() ) {
|
||||
@@ -70,22 +80,20 @@ class WBF_Auth {
|
||||
'ban_until' => null,
|
||||
'pre_ban_role' => '',
|
||||
]);
|
||||
// Frisch laden und einloggen
|
||||
$user = WBF_DB::get_user( $user->id );
|
||||
if ( session_id() ) session_regenerate_id( true ); // Session Fixation verhindern
|
||||
if ( session_id() ) session_regenerate_id( true );
|
||||
$_SESSION[ self::SESSION_KEY ] = $user->id;
|
||||
WBF_DB::touch_last_active( $user->id );
|
||||
return array( 'success' => true, 'user' => $user );
|
||||
}
|
||||
$reason = !empty($user->ban_reason) ? $user->ban_reason : 'Dein Konto wurde gesperrt.';
|
||||
// Zeitstempel anhängen wenn temporäre Sperre
|
||||
if ( ! empty($user->ban_until) ) {
|
||||
$until_fmt = date_i18n( 'd.m.Y \u\m H:i \U\h\r', strtotime($user->ban_until) );
|
||||
$reason .= ' (Gesperrt bis: ' . $until_fmt . ')';
|
||||
}
|
||||
return array( 'success' => false, 'banned' => true, 'message' => $reason );
|
||||
}
|
||||
if ( session_id() ) session_regenerate_id( true ); // Session Fixation verhindern
|
||||
if ( session_id() ) session_regenerate_id( true );
|
||||
$_SESSION[ self::SESSION_KEY ] = $user->id;
|
||||
WBF_DB::touch_last_active( $user->id );
|
||||
return array( 'success' => true, 'user' => $user );
|
||||
@@ -115,7 +123,7 @@ class WBF_Auth {
|
||||
'avatar_url' => $avatar,
|
||||
));
|
||||
|
||||
if ( session_id() ) session_regenerate_id( true ); // Session Fixation verhindern
|
||||
if ( session_id() ) session_regenerate_id( true );
|
||||
$_SESSION[ self::SESSION_KEY ] = $id;
|
||||
return array('success'=>true,'user'=>WBF_DB::get_user($id));
|
||||
}
|
||||
@@ -124,10 +132,14 @@ class WBF_Auth {
|
||||
self::init();
|
||||
$user_id = $_SESSION[ self::SESSION_KEY ] ?? 0;
|
||||
unset( $_SESSION[ self::SESSION_KEY ] );
|
||||
// 2FA-Pending-State ebenfalls löschen
|
||||
if ( class_exists('WBF_TOTP') ) {
|
||||
unset( $_SESSION[ WBF_TOTP::SESSION_PENDING ] );
|
||||
unset( $_SESSION['wbf_2fa_remember'] );
|
||||
}
|
||||
if ( $user_id ) {
|
||||
WBF_DB::delete_remember_token( (int)$user_id );
|
||||
}
|
||||
// Remove cookie
|
||||
if ( isset($_COOKIE['wbf_remember']) ) {
|
||||
setcookie( 'wbf_remember', '', time() - 3600, COOKIEPATH, COOKIE_DOMAIN, is_ssl(), true );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user