. */ const SESSION_LIFETIME = 60 * 60 * 24 * 365; function session_cookie(int $lifetime): array { return [ 'lifetime' => $lifetime, 'path' => '/', 'secure' => true, 'httponly' => true, 'samesite' => 'Strict' ]; } function has_session(): bool { if (session_status() === PHP_SESSION_ACTIVE) { return true; } return isset($_COOKIE[session_name()]); } function start_session(): void { if (session_status() === PHP_SESSION_ACTIVE) { return; } ini_set('session.gc_maxlifetime', (string)SESSION_LIFETIME); session_set_cookie_params(session_cookie(0)); session_start(); if (!empty($_SESSION['remember'])) { remember_session(); } } function remember_session(): void { $parameters = session_cookie(SESSION_LIFETIME); $parameters['expires'] = time() + $parameters['lifetime']; unset($parameters['lifetime']); setcookie(session_name(), session_id(), $parameters); } function sign_in(int $user_id, string $username, bool $remember): void { start_session(); session_regenerate_id(true); $_SESSION['user_id'] = $user_id; $_SESSION['username'] = $username; $_SESSION['remember'] = $remember; if ($remember) { remember_session(); } } function set_user_id(int $user_id): void { start_session(); session_regenerate_id(true); $_SESSION['user_id'] = $user_id; } function get_user_id(): ?int { if (!has_session()) { return null; } start_session(); return isset($_SESSION['user_id']) ? (int)$_SESSION['user_id'] : null; } function get_username(): ?string { if (!has_session()) { return null; } start_session(); return isset($_SESSION['username']) ? (string)$_SESSION['username'] : null; } ?>