diff --git a/app/CApp.php b/app/CApp.php index cf9ce9a..1ad2edd 100644 --- a/app/CApp.php +++ b/app/CApp.php @@ -157,7 +157,7 @@ final class CApp { if (!str_starts_with($path, '/assets') && $path !== '/favicon.ico') { $lang = isset($_COOKIE['scmedia_lang']) ? (string)$_COOKIE['scmedia_lang'] : ''; - $token = (string)($_COOKIE['access_token'] ?? ''); + $token = (string)($_COOKIE['scmedia_access_token'] ?? ''); if ($lang === '' && $token !== '' && isset($this->container->all()['auth'])) { /** @var \ScMedia\Services\AuthService $auth */ $auth = $this->container->all()['auth']; diff --git a/app/controllers/auth.php b/app/controllers/auth.php index 2822ae8..d111b3f 100644 --- a/app/controllers/auth.php +++ b/app/controllers/auth.php @@ -65,10 +65,14 @@ final class AuthController extends BaseController { } $tokens = $res['tokens'] ?? []; if (!empty($tokens['access_token'])) { - setcookie('access_token', $tokens['access_token'], [ + setcookie('scmedia_access_token', $tokens['access_token'], [ 'expires' => (int)($tokens['access_expires_at'] ?? 0), 'path' => '/', - 'httponly' => true, + 'samesite' => 'Lax', + ]); + setcookie('access_token', '', [ + 'expires' => time() - 3600, + 'path' => '/', 'samesite' => 'Lax', ]); } @@ -96,10 +100,14 @@ final class AuthController extends BaseController { } $tokens = $res['tokens'] ?? []; if (!empty($tokens['access_token'])) { - setcookie('access_token', $tokens['access_token'], [ + setcookie('scmedia_access_token', $tokens['access_token'], [ 'expires' => (int)($tokens['access_expires_at'] ?? 0), 'path' => '/', - 'httponly' => true, + 'samesite' => 'Lax', + ]); + setcookie('access_token', '', [ + 'expires' => time() - 3600, + 'path' => '/', 'samesite' => 'Lax', ]); } @@ -120,10 +128,14 @@ final class AuthController extends BaseController { } $tokens = $res['tokens'] ?? []; if (!empty($tokens['access_token'])) { - setcookie('access_token', $tokens['access_token'], [ + setcookie('scmedia_access_token', $tokens['access_token'], [ 'expires' => (int)($tokens['access_expires_at'] ?? 0), 'path' => '/', - 'httponly' => true, + 'samesite' => 'Lax', + ]); + setcookie('access_token', '', [ + 'expires' => time() - 3600, + 'path' => '/', 'samesite' => 'Lax', ]); } @@ -138,16 +150,20 @@ final class AuthController extends BaseController { if ($refresh !== '') { $auth->logout($refresh); } else { - $token = (string)($_COOKIE['access_token'] ?? ''); + $token = (string)($_COOKIE['scmedia_access_token'] ?? ''); $auth->logoutByAccessToken($token); } + setcookie('scmedia_access_token', '', [ + 'expires' => time() - 3600, + 'path' => '/', + 'samesite' => 'Lax', + ]); setcookie('access_token', '', [ 'expires' => time() - 3600, 'path' => '/', - 'httponly' => true, 'samesite' => 'Lax', ]); - setcookie('sse_key', '', [ + setcookie('scmedia_sse_key', '', [ 'expires' => time() - 3600, 'path' => '/', 'httponly' => true, @@ -225,7 +241,7 @@ final class AuthController extends BaseController { $user = $auth->requireAuth(); $key = $auth->issueSseKey((int)$user['id']); $ttl = (int)($key['expires_in'] ?? 60); - setcookie('sse_key', $key['key'], [ + setcookie('scmedia_sse_key', $key['key'], [ 'expires' => time() + max(10, $ttl), 'path' => '/', 'httponly' => true, diff --git a/app/controllers/events.php b/app/controllers/events.php index 30dd7f7..0fca899 100644 --- a/app/controllers/events.php +++ b/app/controllers/events.php @@ -107,7 +107,7 @@ final class EventsController extends BaseController { // Read and validate SSE key. private function readUserId(): ?int { - $key = isset($_COOKIE['sse_key']) ? (string)$_COOKIE['sse_key'] : ''; + $key = isset($_COOKIE['scmedia_sse_key']) ? (string)$_COOKIE['scmedia_sse_key'] : ''; $key = trim($key, "\"'"); $key = urldecode($key); $userId = $this->auth->validateSseKey($key); diff --git a/app/services/AuthService.php b/app/services/AuthService.php index 186c5ca..402766c 100644 --- a/app/services/AuthService.php +++ b/app/services/AuthService.php @@ -988,7 +988,7 @@ final class AuthService { if (preg_match('/^Bearer\s+(.+)$/i', $header, $m)) { return trim($m[1]); } - $cookie = $_COOKIE['access_token'] ?? ''; + $cookie = $_COOKIE['scmedia_access_token'] ?? ''; if (is_string($cookie) && $cookie !== '') { return $cookie; } diff --git a/app/services/SettingsService.php b/app/services/SettingsService.php index 27d5bd8..45d0cc1 100644 --- a/app/services/SettingsService.php +++ b/app/services/SettingsService.php @@ -47,6 +47,7 @@ final class SettingsService { 'layout' => $map['layout'] ?? [], 'media_rules' => $map['media_rules'] ?? [], 'rules' => $map['rules'] ?? [], + 'templates' => $map['templates'] ?? [], 'sources' => $map['sources'] ?? [], 'metadata' => $map['metadata'] ?? [], 'exports' => $map['exports'] ?? [], @@ -67,7 +68,7 @@ final class SettingsService { throw new Exception("Settings revision mismatch"); } - $allowed = ['general', 'scanner_defaults', 'paths', 'tools', 'logs', 'layout', 'media_rules', 'rules', 'sources', 'metadata', 'exports', 'ui', 'background', 'safety', 'tasks', 'pending_tasks']; + $allowed = ['general', 'scanner_defaults', 'paths', 'tools', 'logs', 'layout', 'media_rules', 'rules', 'templates', 'sources', 'metadata', 'exports', 'ui', 'background', 'safety', 'tasks', 'pending_tasks']; $toSave = []; foreach ($allowed as $k) { if (array_key_exists($k, $payload)) { diff --git a/app/views/pages/settings.php b/app/views/pages/settings.php index 3b9954b..6b20825 100644 --- a/app/views/pages/settings.php +++ b/app/views/pages/settings.php @@ -27,17 +27,16 @@ $toolbarRightHtml = '';
- -