isLoggedIn()) { header('Location: index.php'); exit; } I18n::init(); $db = Database::getInstance(); $appTitle = $db->getSetting('app_title', 'UniFi Voucher System'); $logoUrl = $db->getSetting('logo_url', ''); $token = trim($_GET['token'] ?? ''); $error = ''; $success = ''; $valid = false; $tokenRow = null; if (empty($token)) { $error = __('reset_invalid'); } else { $tokenRow = $db->fetchOne( "SELECT prt.*, u.email, u.name FROM password_reset_tokens prt JOIN users u ON prt.user_id = u.id WHERE prt.token = ? AND prt.used = 0 AND prt.expires_at > NOW()", [$token] ); if (!$tokenRow) { $error = __('reset_invalid'); } else { $valid = true; } } if ($valid && $_SERVER['REQUEST_METHOD'] === 'POST') { $newPw = $_POST['new_password'] ?? ''; $confirm= $_POST['confirm_password'] ?? ''; if (strlen($newPw) < 8) { $error = __('settings_pw_minlength'); $valid = true; // keep form visible } elseif ($newPw !== $confirm) { $error = 'Passwörter stimmen nicht überein'; $valid = true; } else { $hash = password_hash($newPw, PASSWORD_DEFAULT); $db->execute("UPDATE users SET password_hash = ? WHERE id = ?", [$hash, $tokenRow['user_id']]); $db->execute("UPDATE password_reset_tokens SET used = 1 WHERE token = ?", [$token]); $db->execute( "INSERT INTO audit_log (user_id, action, entity_type, entity_id, details, ip_address) VALUES (?, 'password_reset', 'user', ?, 'Passwort erfolgreich geändert', ?)", [$tokenRow['user_id'], $tokenRow['user_id'], $_SERVER['REMOTE_ADDR'] ?? ''] ); $success = __('reset_done'); $valid = false; } } ?> <?= __('reset_new_pw') ?> – <?= htmlspecialchars($appTitle) ?>

Für