From f9671346317e47fb5b98de1b04d8c77297b03b96 Mon Sep 17 00:00:00 2001 From: Ryan Date: Wed, 26 Nov 2025 21:41:59 -0500 Subject: [PATCH] release(v2.0.4): harden sessions and align Pro paths with USERS_DIR --- CHANGELOG.md | 12 ++++++++++++ config/config.php | 27 +++++++++++++++++++++------ public/js/dragAndDrop.js | 2 +- src/controllers/AdminController.php | 8 +++++--- 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17e9212..93ffb5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## Changes 11/26/2025 (v2.0.4) + +release(v2.0.4): harden sessions and align Pro paths with USERS_DIR + +- Enable strict_types in config.php and AdminController +- Decouple PHP session lifetime from "remember me" window +- Regenerate session ID on persistent token auto-login +- Point Pro license / bundle paths at USERS_DIR instead of hardcoded /users +- Tweak folder management card drag offset for better alignment + +--- + ## Changes 11/26/2025 (v2.0.3) release(v2.0.3): polish uploads, header dock, and panel fly animations diff --git a/config/config.php b/config/config.php index 40d6b8a..ff09599 100644 --- a/config/config.php +++ b/config/config.php @@ -1,4 +1,5 @@ = time()) { + // NEW: mitigate session fixation + if (session_status() === PHP_SESSION_ACTIVE) { + session_regenerate_id(true); + } + $_SESSION["authenticated"] = true; $_SESSION["username"] = $data["username"]; $_SESSION["folderOnly"] = loadUserPermissions($data["username"]); @@ -162,7 +173,11 @@ if (empty($_SESSION["authenticated"]) && !empty($_COOKIE['remember_me_token'])) } else { // expired — clean up unset($tokens[$token]); - file_put_contents($tokFile, encryptData(json_encode($tokens, JSON_PRETTY_PRINT), $encryptionKey), LOCK_EX); + file_put_contents( + $tokFile, + encryptData(json_encode($tokens, JSON_PRETTY_PRINT), $encryptionKey), + LOCK_EX + ); setcookie('remember_me_token', '', time() - 3600, '/', '', $secure, true); } } @@ -253,14 +268,14 @@ if (!defined('FR_PRO_LICENSE')) { // JSON license file used by AdminController::setLicense() if (!defined('PRO_LICENSE_FILE')) { - define('PRO_LICENSE_FILE', PROJECT_ROOT . '/users/proLicense.json'); + define('PRO_LICENSE_FILE', rtrim(USERS_DIR, "/\\") . '/proLicense.json'); } // Optional plain-text license file (used as fallback in bootstrap) if (!defined('FR_PRO_LICENSE_FILE')) { $lf = getenv('FR_PRO_LICENSE_FILE'); if ($lf === false || $lf === '') { - $lf = PROJECT_ROOT . '/users/proLicense.txt'; + $lf = rtrim(USERS_DIR, "/\\") . '/proLicense.txt'; } define('FR_PRO_LICENSE_FILE', $lf); } @@ -268,7 +283,7 @@ if (!defined('FR_PRO_LICENSE_FILE')) { // Where Pro code lives by default → inside users volume $proDir = getenv('FR_PRO_BUNDLE_DIR'); if ($proDir === false || $proDir === '') { - $proDir = PROJECT_ROOT . '/users/pro'; + $proDir = rtrim(USERS_DIR, "/\\") . '/pro'; } $proDir = rtrim($proDir, "/\\"); if (!defined('FR_PRO_BUNDLE_DIR')) { diff --git a/public/js/dragAndDrop.js b/public/js/dragAndDrop.js index abf13a3..0153327 100644 --- a/public/js/dragAndDrop.js +++ b/public/js/dragAndDrop.js @@ -524,7 +524,7 @@ function animateCardsOutOfHeaderThen(done) { if (card.id === 'uploadCard') { toCy -= 48; // a bit higher } else if (card.id === 'folderManagementCard') { - toCy += 60; // a bit lower + toCy += 48; // a bit lower } } diff --git a/src/controllers/AdminController.php b/src/controllers/AdminController.php index 7bb2114..d3a91eb 100644 --- a/src/controllers/AdminController.php +++ b/src/controllers/AdminController.php @@ -1,4 +1,5 @@