$sessionLifetime, 'path' => '/', 'domain' => '', // adjust if you need a specific domain 'secure' => $secure, 'httponly' => true, 'samesite' => 'Lax' ]); ini_set('session.gc_maxlifetime', (string)$sessionLifetime); if (session_status() === PHP_SESSION_NONE) { session_start(); } // CSRF token if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } // Auto‑login via persistent token if (empty($_SESSION["authenticated"]) && !empty($_COOKIE['remember_me_token'])) { $tokFile = USERS_DIR . 'persistent_tokens.json'; $tokens = []; if (file_exists($tokFile)) { $enc = file_get_contents($tokFile); $dec = decryptData($enc, $encryptionKey); $tokens = json_decode($dec, true) ?: []; } $token = $_COOKIE['remember_me_token']; if (!empty($tokens[$token])) { $data = $tokens[$token]; if ($data['expiry'] >= time()) { $_SESSION["authenticated"] = true; $_SESSION["username"] = $data["username"]; $_SESSION["folderOnly"] = loadUserPermissions($data["username"]); $_SESSION["isAdmin"] = !empty($data["isAdmin"]); } else { // expired — clean up unset($tokens[$token]); file_put_contents($tokFile, encryptData(json_encode($tokens, JSON_PRETTY_PRINT), $encryptionKey), LOCK_EX); setcookie('remember_me_token', '', time() - 3600, '/', '', $secure, true); } } } // Share URL fallback define('BASE_URL', 'http://yourwebsite/uploads/'); if (strpos(BASE_URL, 'yourwebsite') !== false) { $defaultShare = isset($_SERVER['HTTP_HOST']) ? "http://{$_SERVER['HTTP_HOST']}/api/file/share.php" : "http://localhost/api/file/share.php"; } else { $defaultShare = rtrim(BASE_URL, '/') . "/api/file/share.php"; } define('SHARE_URL', getenv('SHARE_URL') ?: $defaultShare);