From 03996f8bb3f715c7116313b3c24a3be84f03bf23 Mon Sep 17 00:00:00 2001 From: Kovah Date: Fri, 25 Mar 2022 00:10:58 +0100 Subject: [PATCH] Remove SETUP_COMPLETED variable (#398) Replaces SETUP_COMPLETED variable with a database setting. Changes setup to add the setting to the database. Also adds a migration for existing installations. --- .env.docker | 4 +--- .env.docker.production | 4 +--- .env.example | 2 -- app/Helper/functions.php | 16 ++++++++++++++++ .../Controllers/Setup/DatabaseController.php | 6 +++--- app/Http/Controllers/Setup/MetaController.php | 18 ++++-------------- .../Setup/RequirementsController.php | 2 +- app/Http/Middleware/SettingsMiddleware.php | 6 +++++- app/Http/Middleware/SetupCheckMiddleware.php | 8 +++++--- config/app.php | 10 +++------- ...3_24_222856_add_completed_setup_setting.php | 16 ++++++++++++++++ phpunit.xml | 1 - resources/lang/ca_ES/setup.php | 2 +- resources/lang/de_DE/setup.php | 2 +- resources/lang/en_US/setup.php | 2 +- resources/lang/es_ES/setup.php | 2 +- resources/lang/fr_FR/setup.php | 2 +- resources/lang/hu_HU/setup.php | 2 +- resources/lang/zh_CN/setup.php | 2 +- tests/Controller/Setup/MetaControllerTest.php | 17 ++++++----------- tests/TestCase.php | 11 +++++++++++ 21 files changed, 79 insertions(+), 56 deletions(-) create mode 100644 database/migrations/2022_03_24_222856_add_completed_setup_setting.php diff --git a/.env.docker b/.env.docker index 5f4dd764..e3a72aed 100644 --- a/.env.docker +++ b/.env.docker @@ -8,8 +8,6 @@ APP_ENV=local APP_KEY=someRandomStringWith32Characters # Enable the debug more if you are running into issues or while developing APP_DEBUG=true -# Indicates that the setup was completed and the app can be used now -SETUP_COMPLETED=false ## Configuration of the database connection ## Attention: Those settings are configured during the web setup, please do not modify them now. @@ -28,7 +26,7 @@ DB_PASSWORD=ChangeThisToASecurePassword! ## Redis cache configuration # Set the Redis connection here if you want to use it REDIS_HOST=redis -REDIS_PASSWORD=changeThisPassword +REDIS_PASSWORD=ChangeThisToASecurePassword! REDIS_PORT=6379 ## You probably do not want to change any values blow. Only continue if you know what you are doing. diff --git a/.env.docker.production b/.env.docker.production index 8cf679c2..72bc50f4 100644 --- a/.env.docker.production +++ b/.env.docker.production @@ -4,8 +4,6 @@ COMPOSE_PROJECT_NAME=linkace # The app key is generated later, please leave it blank APP_KEY=someRandomStringWith32Characters -# Indicates that the setup was completed and the app can be used now -SETUP_COMPLETED=false ## Configuration of the database connection ## Attention: Those settings are configured during the web setup, please do not modify them now. @@ -24,5 +22,5 @@ DB_PASSWORD=ChangeThisToASecurePassword! ## Redis cache configuration # Set the Redis connection here if you want to use it REDIS_HOST=redis -REDIS_PASSWORD=changeThisPassword +REDIS_PASSWORD=ChangeThisToASecurePassword! REDIS_PORT=6379 diff --git a/.env.example b/.env.example index bd845be8..50922983 100644 --- a/.env.example +++ b/.env.example @@ -3,8 +3,6 @@ ## Basic app configuration # The app key is generated later, please leave it blank APP_KEY=someRandomStringWith32Characters -# Indicates that the setup was completed and the app can be used now -SETUP_COMPLETED=false ## Configuration of the database connection ## Attention: Those settings are configured during the web setup, please do not modify them now. diff --git a/app/Helper/functions.php b/app/Helper/functions.php index a9201060..b83e0ac4 100644 --- a/app/Helper/functions.php +++ b/app/Helper/functions.php @@ -7,6 +7,22 @@ use App\Models\Setting; use Carbon\Carbon; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\Log; + +/** + * Check if the setup was completed. + * + * @return bool + */ +function setupCompleted() +{ + try { + return systemsettings('system_setup_completed'); + } catch (PDOException $e) { + Log::error($e->getMessage()); + return false; + } +} /** * Shorthand for the current user settings diff --git a/app/Http/Controllers/Setup/DatabaseController.php b/app/Http/Controllers/Setup/DatabaseController.php index 6b95921a..f67f8f93 100644 --- a/app/Http/Controllers/Setup/DatabaseController.php +++ b/app/Http/Controllers/Setup/DatabaseController.php @@ -16,7 +16,7 @@ use PDOException; class DatabaseController extends Controller { - protected $dbConfig; + protected array $dbConfig; /** * Display the form for configuration of the database. @@ -100,7 +100,7 @@ class DatabaseController extends Controller /** * At this point we write the database credentials to the .env file. * We can ignore the FileNotFoundException exception as we already checked - * the presence and writability of the file in the previous setup step. + * the presence and write-ability of the file in the previous setup step. */ protected function storeConfigurationInEnv(): void { @@ -127,7 +127,7 @@ class DatabaseController extends Controller /** * To prevent unwanted data loss we check for data in the database. It does - * not matter which data, because users may accidentially enter the + * not matter which data, because users may accidentally enter the * credentials for a wrong database. * * @return bool diff --git a/app/Http/Controllers/Setup/MetaController.php b/app/Http/Controllers/Setup/MetaController.php index 681db459..a6fff6a0 100644 --- a/app/Http/Controllers/Setup/MetaController.php +++ b/app/Http/Controllers/Setup/MetaController.php @@ -3,7 +3,9 @@ namespace App\Http\Controllers\Setup; use App\Http\Controllers\Controller; +use App\Models\Setting; use Illuminate\Contracts\View\View; +use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\File; class MetaController extends Controller @@ -25,21 +27,9 @@ class MetaController extends Controller */ public function complete(): View { - $this->markSetupCompleted(); + Setting::create(['key' => 'system_setup_completed', 'value' => true]); + Cache::forget('systemsettings'); return view('setup.complete'); } - - /** - * After the setup is finished, we change the SETUP_COMPLETED variable - * from false to true to prevent the setup from being run again. - */ - protected function markSetupCompleted(): void - { - $envContent = File::get(base_path('.env')); - - $envContent = str_replace('SETUP_COMPLETED=false', 'SETUP_COMPLETED=true', $envContent); - - File::put(base_path('.env'), $envContent); - } } diff --git a/app/Http/Controllers/Setup/RequirementsController.php b/app/Http/Controllers/Setup/RequirementsController.php index 6de54427..68163920 100644 --- a/app/Http/Controllers/Setup/RequirementsController.php +++ b/app/Http/Controllers/Setup/RequirementsController.php @@ -26,7 +26,7 @@ class RequirementsController extends Controller protected function checkRequirements(): array { $results = [ - 'php_version' => PHP_VERSION_ID >= 70300, + 'php_version' => PHP_VERSION_ID >= 70400, 'extension_bcmath' => extension_loaded('bcmath'), 'extension_ctype' => extension_loaded('ctype'), 'extension_json' => extension_loaded('json'), diff --git a/app/Http/Middleware/SettingsMiddleware.php b/app/Http/Middleware/SettingsMiddleware.php index 684e0d02..d14d776f 100644 --- a/app/Http/Middleware/SettingsMiddleware.php +++ b/app/Http/Middleware/SettingsMiddleware.php @@ -8,7 +8,7 @@ use Illuminate\Http\Request; class SettingsMiddleware { /** - * Handle an incoming request. + * Load some settings for the current user if applicable. * * @param Request $request * @param Closure $next @@ -16,6 +16,10 @@ class SettingsMiddleware */ public function handle(Request $request, Closure $next) { + if (!setupCompleted()) { + return $next($request); + } + // Set global configs based on the user settings if ($user_timezone = usersettings('timezone')) { config(['app.timezone' => $user_timezone]); diff --git a/app/Http/Middleware/SetupCheckMiddleware.php b/app/Http/Middleware/SetupCheckMiddleware.php index d95a8bd6..8b3c814d 100644 --- a/app/Http/Middleware/SetupCheckMiddleware.php +++ b/app/Http/Middleware/SetupCheckMiddleware.php @@ -31,9 +31,11 @@ class SetupCheckMiddleware return redirect()->refresh(); } + $setupCompleted = setupCompleted(); + if ($request->is('setup/*')) { - if (config('app.setup_completed') === true) { - // Do not allow access to setup after it was completed + if ($setupCompleted) { + // Do not allow access to the setup after it was completed return redirect()->route('front'); } @@ -41,7 +43,7 @@ class SetupCheckMiddleware return $next($request); } - if (config('app.setup_completed') !== true) { + if (!$setupCompleted) { // Start the setup if it was not completed yet return redirect()->route('setup.welcome'); } diff --git a/config/app.php b/config/app.php index eccbca79..e026f891 100644 --- a/config/app.php +++ b/config/app.php @@ -133,15 +133,11 @@ return [ 'guest_access' => env('GUEST_ACCESS', false), - /* + /** |-------------------------------------------------------------------------- - | setup Completed + | Setup Completed Flag |-------------------------------------------------------------------------- - | - | After the user completed the app setup, the env file will change the - | SETUP_COMPLETED value in the .env file. This setting makes the - | environment variable available in the application. - | + * @deprecated v1.10.0 Setting is no longer actively used and remains for proper migration to a database setting. */ 'setup_completed' => env('SETUP_COMPLETED', false), diff --git a/database/migrations/2022_03_24_222856_add_completed_setup_setting.php b/database/migrations/2022_03_24_222856_add_completed_setup_setting.php new file mode 100644 index 00000000..37534a2c --- /dev/null +++ b/database/migrations/2022_03_24_222856_add_completed_setup_setting.php @@ -0,0 +1,16 @@ + 'system_setup_completed', 'value' => true]); + Cache::forget('systemsettings'); + } + } +} diff --git a/phpunit.xml b/phpunit.xml index 1dc42b3a..a57079d0 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -48,7 +48,6 @@ - diff --git a/resources/lang/ca_ES/setup.php b/resources/lang/ca_ES/setup.php index 19734fb4..50264bb0 100644 --- a/resources/lang/ca_ES/setup.php +++ b/resources/lang/ca_ES/setup.php @@ -12,7 +12,7 @@ return [ 'intro.step3' => 'Crea compte d\'usuari nou.', 'check_requirements' => 'Comprovar requeriments', - 'requirements.php_version' => 'Versió de PHP >= 7.3.0', + 'requirements.php_version' => 'Versió de PHP >= 7.4.0', 'requirements.extension_bcmath' => 'Extensió PHP: BCMath', 'requirements.extension_ctype' => 'Extensió PHP: Ctype', 'requirements.extension_json' => 'Extensió PHP: JSON', diff --git a/resources/lang/de_DE/setup.php b/resources/lang/de_DE/setup.php index a1ba7d91..c2db1214 100644 --- a/resources/lang/de_DE/setup.php +++ b/resources/lang/de_DE/setup.php @@ -12,7 +12,7 @@ return [ 'intro.step3' => 'Erstellen Sie Ihr Benutzerkonto.', 'check_requirements' => 'Anforderungen prüfen', - 'requirements.php_version' => 'PHP Version >= 7.3.0', + 'requirements.php_version' => 'PHP Version >= 7.4.0', 'requirements.extension_bcmath' => 'PHP Extension: BCMath', 'requirements.extension_ctype' => 'PHP Extension: Ctype', 'requirements.extension_json' => 'PHP Extension: JSON', diff --git a/resources/lang/en_US/setup.php b/resources/lang/en_US/setup.php index f039a6d3..becb46a4 100644 --- a/resources/lang/en_US/setup.php +++ b/resources/lang/en_US/setup.php @@ -12,7 +12,7 @@ return [ 'intro.step3' => 'Create your user account.', 'check_requirements' => 'Check Requirements', - 'requirements.php_version' => 'PHP version >= 7.3.0', + 'requirements.php_version' => 'PHP version >= 7.4.0', 'requirements.extension_bcmath' => 'PHP Extension: BCMath', 'requirements.extension_ctype' => 'PHP Extension: Ctype', 'requirements.extension_json' => 'PHP Extension: JSON', diff --git a/resources/lang/es_ES/setup.php b/resources/lang/es_ES/setup.php index 36297555..e6ee2a35 100644 --- a/resources/lang/es_ES/setup.php +++ b/resources/lang/es_ES/setup.php @@ -12,7 +12,7 @@ return [ 'intro.step3' => 'Crea tu cuenta de usuario.', 'check_requirements' => 'Comprobar requisitos', - 'requirements.php_version' => 'Versión PHP >= 7.3.0', + 'requirements.php_version' => 'Versión PHP >= 7.4.0', 'requirements.extension_bcmath' => 'Extensión PHP: BCMath', 'requirements.extension_ctype' => 'Extensión PHP: Ctype', 'requirements.extension_json' => 'Extensión PHP: JSON', diff --git a/resources/lang/fr_FR/setup.php b/resources/lang/fr_FR/setup.php index 9508b975..a0bc0ce0 100644 --- a/resources/lang/fr_FR/setup.php +++ b/resources/lang/fr_FR/setup.php @@ -12,7 +12,7 @@ return [ 'intro.step3' => 'Créez votre compte utilisateur.', 'check_requirements' => 'Vérifier Prérequis', - 'requirements.php_version' => 'Version PHP >= 7.3.0', + 'requirements.php_version' => 'Version PHP >= 7.4.0', 'requirements.extension_bcmath' => 'Module PHP : BCMath', 'requirements.extension_ctype' => 'Module PHP : Ctype', 'requirements.extension_json' => 'Module PHP : JSON', diff --git a/resources/lang/hu_HU/setup.php b/resources/lang/hu_HU/setup.php index e4f8f6b4..01f18124 100644 --- a/resources/lang/hu_HU/setup.php +++ b/resources/lang/hu_HU/setup.php @@ -12,7 +12,7 @@ return [ 'intro.step3' => 'Hozzon létre felhasználói fiókot.', 'check_requirements' => 'Ellenőrizze a követelményeket', - 'requirements.php_version' => 'PHP-verzió >= 7.3.0', + 'requirements.php_version' => 'PHP-verzió >= 7.4.0', 'requirements.extension_bcmath' => 'PHP-bővítmény: BCMath', 'requirements.extension_ctype' => 'PHP-bővítmény: Ctype', 'requirements.extension_json' => 'PHP-bővítmény: JSON', diff --git a/resources/lang/zh_CN/setup.php b/resources/lang/zh_CN/setup.php index 1e58545d..776ab4bc 100644 --- a/resources/lang/zh_CN/setup.php +++ b/resources/lang/zh_CN/setup.php @@ -12,7 +12,7 @@ return [ 'intro.step3' => '创建您的帐户。', 'check_requirements' => '检查要求', - 'requirements.php_version' => 'PHP version >= 7.3.0', + 'requirements.php_version' => 'PHP version >= 7.4.0', 'requirements.extension_bcmath' => 'PHP Extension: BCMath', 'requirements.extension_ctype' => 'PHP Extension: Ctype', 'requirements.extension_json' => 'PHP Extension: JSON', diff --git a/tests/Controller/Setup/MetaControllerTest.php b/tests/Controller/Setup/MetaControllerTest.php index 0e60f788..00beaed0 100644 --- a/tests/Controller/Setup/MetaControllerTest.php +++ b/tests/Controller/Setup/MetaControllerTest.php @@ -2,22 +2,19 @@ namespace Tests\Controller\Setup; +use App\Models\Setting; use Illuminate\Foundation\Testing\RefreshDatabase; +use Illuminate\Support\Facades\Cache; use Tests\TestCase; class MetaControllerTest extends TestCase { use RefreshDatabase; - protected function setUp(): void - { - parent::setUp(); - - config(['app.setup_completed' => false]); - } - public function testSetupCheckRedirect(): void { + Setting::where('key', 'system_setup_completed')->delete(); + $response = $this->get('/'); $response->assertRedirect('setup/start'); @@ -25,8 +22,6 @@ class MetaControllerTest extends TestCase public function testSetupCheckWithoutRedirect(): void { - config(['app.setup_completed' => true]); - $response = $this->get('/'); $response->assertRedirect('login'); @@ -34,8 +29,6 @@ class MetaControllerTest extends TestCase public function testRedirectIfSetupCompleted(): void { - config(['app.setup_completed' => true]); - $response = $this->get('setup/start'); $response->assertRedirect('/'); @@ -43,6 +36,8 @@ class MetaControllerTest extends TestCase public function testSetupWelcomeView(): void { + Setting::where('key', 'system_setup_completed')->delete(); + $response = $this->get('setup/start'); $response->assertOk() diff --git a/tests/TestCase.php b/tests/TestCase.php index 2932d4a6..c8598cb1 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -2,9 +2,20 @@ namespace Tests; +use App\Models\Setting; use Illuminate\Foundation\Testing\TestCase as BaseTestCase; abstract class TestCase extends BaseTestCase { use CreatesApplication; + + protected function setUp(): void + { + parent::setUp(); + + Setting::updateOrCreate( + ['key' => 'system_setup_completed'], + ['key' => 'system_setup_completed', 'value' => true] + ); + } }