180 lines
5.2 KiB
PHP
180 lines
5.2 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Session Class
|
|
*
|
|
* Core session management functionality for the application
|
|
*/
|
|
class Session {
|
|
private static $sessionOptions = [
|
|
'cookie_httponly' => 1,
|
|
'cookie_secure' => 1,
|
|
'cookie_samesite' => 'Strict',
|
|
'gc_maxlifetime' => 7200 // 2 hours
|
|
];
|
|
|
|
/**
|
|
* Start or resume a session with secure options
|
|
*/
|
|
public static function startSession() {
|
|
session_name('jilo');
|
|
if (session_status() !== PHP_SESSION_ACTIVE && !headers_sent()) {
|
|
session_start(self::$sessionOptions);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Destroy current session and clean up
|
|
*/
|
|
public static function destroySession() {
|
|
if (session_status() === PHP_SESSION_ACTIVE) {
|
|
session_unset();
|
|
session_destroy();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get current username if set
|
|
*/
|
|
public static function getUsername() {
|
|
return isset($_SESSION['username']) ? htmlspecialchars($_SESSION['username']) : null;
|
|
}
|
|
|
|
/**
|
|
* Get current user ID if set
|
|
*/
|
|
public static function getUserId() {
|
|
return isset($_SESSION['user_id']) ? (int)$_SESSION['user_id'] : null;
|
|
}
|
|
|
|
/**
|
|
* Check if current session is valid
|
|
*/
|
|
public static function isValidSession() {
|
|
// Check required session variables
|
|
if (!isset($_SESSION['user_id']) || !isset($_SESSION['username'])) {
|
|
return false;
|
|
}
|
|
|
|
// Check session timeout
|
|
$session_timeout = isset($_SESSION['REMEMBER_ME']) ? (30 * 24 * 60 * 60) : 7200; // 30 days or 2 hours
|
|
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > $session_timeout)) {
|
|
return false;
|
|
}
|
|
|
|
// Update last activity time
|
|
$_SESSION['LAST_ACTIVITY'] = time();
|
|
|
|
// Regenerate session ID periodically (every 30 minutes)
|
|
if (!isset($_SESSION['CREATED'])) {
|
|
$_SESSION['CREATED'] = time();
|
|
} else if (time() - $_SESSION['CREATED'] > 1800) {
|
|
// Regenerate session ID and update creation time
|
|
if (!headers_sent() && session_status() === PHP_SESSION_ACTIVE) {
|
|
$oldData = $_SESSION;
|
|
session_regenerate_id(true);
|
|
$_SESSION = $oldData;
|
|
$_SESSION['CREATED'] = time();
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Set remember me option for extended session
|
|
*/
|
|
public static function setRememberMe($value = true) {
|
|
$_SESSION['REMEMBER_ME'] = $value;
|
|
}
|
|
|
|
/**
|
|
* Clear session data and cookies
|
|
*/
|
|
public static function cleanup($config) {
|
|
self::destroySession();
|
|
|
|
// Clear cookies if headers not sent
|
|
if (!headers_sent()) {
|
|
setcookie('username', '', [
|
|
'expires' => time() - 3600,
|
|
'path' => $config['folder'],
|
|
'domain' => $config['domain'],
|
|
'secure' => isset($_SERVER['HTTPS']),
|
|
'httponly' => true,
|
|
'samesite' => 'Strict'
|
|
]);
|
|
}
|
|
|
|
// Start fresh session
|
|
self::startSession();
|
|
|
|
// Reset session timeout flag
|
|
unset($_SESSION['session_timeout_shown']);
|
|
}
|
|
|
|
/**
|
|
* Create a new authenticated session for a user
|
|
*/
|
|
public static function createAuthSession($userId, $username, $rememberMe, $config) {
|
|
// Set cookie lifetime based on remember me
|
|
$cookieLifetime = $rememberMe ? time() + (30 * 24 * 60 * 60) : 0;
|
|
|
|
// Regenerate session ID to prevent session fixation
|
|
session_regenerate_id(true);
|
|
|
|
// Set cookie with secure options
|
|
setcookie('username', $username, [
|
|
'expires' => $cookieLifetime,
|
|
'path' => $config['folder'],
|
|
'domain' => $config['domain'],
|
|
'secure' => isset($_SERVER['HTTPS']),
|
|
'httponly' => true,
|
|
'samesite' => 'Strict'
|
|
]);
|
|
|
|
// Set session variables
|
|
$_SESSION['user_id'] = $userId;
|
|
$_SESSION['username'] = $username;
|
|
$_SESSION['LAST_ACTIVITY'] = time();
|
|
if ($rememberMe) {
|
|
self::setRememberMe(true);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Store 2FA pending information in session
|
|
*/
|
|
public static function store2FAPending($userId, $username, $rememberMe = false) {
|
|
$_SESSION['2fa_pending_user_id'] = $userId;
|
|
$_SESSION['2fa_pending_username'] = $username;
|
|
if ($rememberMe) {
|
|
$_SESSION['2fa_pending_remember'] = true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Clear 2FA pending information from session
|
|
*/
|
|
public static function clear2FAPending() {
|
|
unset($_SESSION['2fa_pending_user_id']);
|
|
unset($_SESSION['2fa_pending_username']);
|
|
unset($_SESSION['2fa_pending_remember']);
|
|
}
|
|
|
|
/**
|
|
* Get 2FA pending information
|
|
*/
|
|
public static function get2FAPending() {
|
|
if (!isset($_SESSION['2fa_pending_user_id']) || !isset($_SESSION['2fa_pending_username'])) {
|
|
return null;
|
|
}
|
|
|
|
return [
|
|
'user_id' => $_SESSION['2fa_pending_user_id'],
|
|
'username' => $_SESSION['2fa_pending_username'],
|
|
'remember_me' => isset($_SESSION['2fa_pending_remember'])
|
|
];
|
|
}
|
|
}
|