diff --git a/app/Core/App.php b/app/Core/App.php index cc07153bf..0c1c132f8 100644 --- a/app/Core/App.php +++ b/app/Core/App.php @@ -48,7 +48,7 @@ final class App /** * @var string */ - public const VERSION = '1.0.5'; + public const VERSION = '1.0.6'; /** * Set the base path of the application diff --git a/app/Core/Modules/Admin/Packages/Server/Screens/ServerEditScreen.php b/app/Core/Modules/Admin/Packages/Server/Screens/ServerEditScreen.php index 4cc3615da..457eb4fa0 100644 --- a/app/Core/Modules/Admin/Packages/Server/Screens/ServerEditScreen.php +++ b/app/Core/Modules/Admin/Packages/Server/Screens/ServerEditScreen.php @@ -20,6 +20,7 @@ use Flute\Core\Database\Entities\Server; use Flute\Core\Rcon\RconService; use Flute\Core\ServerQuery\ServerQueryService; +use Flute\Core\Services\DatabaseService; use Illuminate\Support\Str; use PDO; use Throwable; @@ -595,6 +596,7 @@ public function addDbConnection() $connection->additional = json_encode($additional); $connection->server = $this->server; $connection->save(); + DatabaseService::flushModesCache(); $this->dbConnections = DatabaseConnection::query()->where('server_id', $this->serverId)->fetchAll(); $this->flashMessage(__('admin-server.messages.connection_add_success'), 'success'); @@ -856,6 +858,7 @@ public function updateDbConnection() $connection->dbname = $data['dbname']; $connection->additional = json_encode($additional); $connection->save(); + DatabaseService::flushModesCache(); $this->dbConnections = DatabaseConnection::query()->where('server_id', $this->serverId)->fetchAll(); $this->flashMessage(__('admin-server.messages.connection_update_success'), 'success'); diff --git a/app/Core/Modules/Admin/Packages/Server/Services/AdminServersService.php b/app/Core/Modules/Admin/Packages/Server/Services/AdminServersService.php index 34fae15a3..5f5c333f8 100644 --- a/app/Core/Modules/Admin/Packages/Server/Services/AdminServersService.php +++ b/app/Core/Modules/Admin/Packages/Server/Services/AdminServersService.php @@ -7,6 +7,7 @@ use Flute\Admin\Packages\Server\Factories\ModDriverFactory; use Flute\Core\Database\Entities\DatabaseConnection; use Flute\Core\Database\Entities\Server; +use Flute\Core\Services\DatabaseService; class AdminServersService { @@ -294,7 +295,7 @@ public function saveServer(?Server $server, array $data): Server $server->setSettings($settings); } - $server->save(); + $server->save(false); return $server; } @@ -311,6 +312,7 @@ public function deleteDbConnection(int $connectionId): void } $connection->delete(); + DatabaseService::flushModesCache(); } /** diff --git a/app/Core/Modules/Installer/Controllers/InstallerController.php b/app/Core/Modules/Installer/Controllers/InstallerController.php index 588c1f819..82dc0d40b 100644 --- a/app/Core/Modules/Installer/Controllers/InstallerController.php +++ b/app/Core/Modules/Installer/Controllers/InstallerController.php @@ -731,15 +731,6 @@ public function saveAndLaunch(FluteRequest $request): mixed */ private function guardInstallerAccess(FluteRequest $request): mixed { - if (!$this->isInstallerRequestAllowed($request)) { - logs('installer')->warning('Denied installer access from non-local request.', [ - 'ip' => $request->getClientIp(), - 'path' => $request->getPathInfo(), - ]); - - return response()->error(403, 'Installer access denied'); - } - if ($request->isMethod('GET') || $request->isMethod('HEAD') || $request->isMethod('OPTIONS')) { return null; } @@ -756,46 +747,6 @@ private function guardInstallerAccess(FluteRequest $request): mixed return null; } - private function isInstallerRequestAllowed(FluteRequest $request): bool - { - if ($this->isLocalInstallerRequest($request)) { - return true; - } - - if (session('installer.setup_authorized') === true) { - return true; - } - - $expectedToken = (string) ( getenv('FLUTE_INSTALLER_SETUP_TOKEN') ?: config('installer.setup_token', '') ); - if ($expectedToken === '') { - return false; - } - - $providedToken = $request->input('setup_token') ?? $request->headers->get('X-Setup-Token'); - - if (!is_string($providedToken) || !hash_equals($expectedToken, $providedToken)) { - return false; - } - - session()->set('installer.setup_authorized', true); - - return true; - } - - private function isLocalInstallerRequest(FluteRequest $request): bool - { - $clientIp = $request->getClientIp(); - if (!in_array($clientIp, ['127.0.0.1', '::1'], true)) { - return false; - } - - return ( - !$request->headers->has('Forwarded') - && !$request->headers->has('X-Forwarded-For') - && !$request->headers->has('X-Real-IP') - ); - } - protected function renderStep(int $id, array $extraData = [], bool $allowAdvance = true): mixed { $currentStep = $this->installerConfig->getCurrentStep(); diff --git a/app/Core/Modules/Installer/Resources/views/layout.blade.php b/app/Core/Modules/Installer/Resources/views/layout.blade.php index f283fe7df..4054301d3 100644 --- a/app/Core/Modules/Installer/Resources/views/layout.blade.php +++ b/app/Core/Modules/Installer/Resources/views/layout.blade.php @@ -3,6 +3,10 @@ @php $title = __('install.title'); + $currentStep = $currentStep ?? null; + $steps = $steps ?? []; + $totalSteps = $totalSteps ?? 0; + $stepData = $stepData ?? []; @endphp diff --git a/app/Core/Services/DatabaseService.php b/app/Core/Services/DatabaseService.php index 9fb38e74e..b40c1acb5 100644 --- a/app/Core/Services/DatabaseService.php +++ b/app/Core/Services/DatabaseService.php @@ -13,6 +13,11 @@ class DatabaseService private static array $modesCache = []; + public static function flushModesCache(): void + { + self::$modesCache = []; + } + /** * Retrieves server modes based on provided mods. *