From 07d39a23a8b80d92477ac99f6faad44ffb3de3e9 Mon Sep 17 00:00:00 2001 From: James Cole Date: Sun, 17 Mar 2019 09:06:45 +0100 Subject: [PATCH] Improve installer middleware for Sandstorm. --- .../Controllers/System/InstallController.php | 11 +- app/Http/Middleware/Installer.php | 118 +++++++++++++----- database/seeds/ConfigSeeder.php | 2 +- 3 files changed, 100 insertions(+), 31 deletions(-) diff --git a/app/Http/Controllers/System/InstallController.php b/app/Http/Controllers/System/InstallController.php index 9a3b633156..81a26e19bf 100644 --- a/app/Http/Controllers/System/InstallController.php +++ b/app/Http/Controllers/System/InstallController.php @@ -25,16 +25,16 @@ namespace FireflyIII\Http\Controllers\System; use Artisan; +use Cache; use Exception; use FireflyIII\Http\Controllers\Controller; +use FireflyIII\Support\Facades\Preferences; use FireflyIII\Support\Http\Controllers\GetConfigurationData; -use FireflyIII\Support\Preferences; use Illuminate\Http\JsonResponse; use Illuminate\Support\Arr; use Laravel\Passport\Passport; use Log; use phpseclib\Crypt\RSA; -use Cache; /** * Class InstallController @@ -79,6 +79,7 @@ class InstallController extends Controller Log::error($e->getTraceAsString()); if (strpos($e->getMessage(), 'open_basedir restriction in effect')) { Cache::clear(); + return response()->json(['error' => true, 'message' => self::BASEDIR_ERROR]); } @@ -99,6 +100,9 @@ class InstallController extends Controller */ public function index() { + // index will set FF3 version. + app('fireflyconfig')->set('ff3_version', (string)config('firefly.version')); + return view('install.index'); } @@ -195,6 +199,7 @@ class InstallController extends Controller Cache::clear(); Preferences::mark(); + return response()->json(['error' => false, 'message' => 'OK']); } @@ -221,6 +226,8 @@ class InstallController extends Controller return response()->json(['error' => true, 'message' => self::OTHER_ERROR . ' ' . $e->getMessage()]); } + + // clear cache as well. Cache::clear(); Preferences::mark(); diff --git a/app/Http/Middleware/Installer.php b/app/Http/Middleware/Installer.php index 70c3dd964f..cf24d83e54 100644 --- a/app/Http/Middleware/Installer.php +++ b/app/Http/Middleware/Installer.php @@ -54,9 +54,11 @@ class Installer */ public function handle($request, Closure $next) { + // ignore installer in test environment. if ('testing' === config('app.env')) { return $next($request); } + // don't run installer when already in installer. $url = $request->url(); $strpos = stripos($url, '/install'); if (!(false === $strpos)) { @@ -64,37 +66,16 @@ class Installer return $next($request); } - // no tables present? - try { - DB::table('users')->count(); - } catch (QueryException $e) { - $message = $e->getMessage(); - Log::error('Access denied: ' . $message); - if ($this->isAccessDenied($message)) { - throw new FireflyException('It seems your database configuration is not correct. Please verify the username and password in your .env file.'); - } - if ($this->noTablesExist($message)) { - // redirect to UpdateController - Log::warning('There are no Firefly III tables present. Redirect to migrate routine.'); - return response()->redirectTo(route('installer.index')); - } - throw new FireflyException(sprintf('Could not access the database: %s', $message)); - } - - // older version in config than database? - $configVersion = (int)config('firefly.db_version'); - $dbVersion = (int)app('fireflyconfig')->getFresh('db_version', 1)->data; - if ($configVersion > $dbVersion) { - Log::warning( - sprintf( - 'The current installed version (%d) is older than the required version (%d). Redirect to migrate routine.', $dbVersion, $configVersion - ) - ); - - // redirect to migrate routine: + // run installer when no tables are present, + // or when old scheme version + // or when old firefly version + if ($this->hasNoTables() || $this->oldDBVersion() || $this->oldVersion()) { return response()->redirectTo(route('installer.index')); } + // update scheme version + // update firefly version + return $next($request); } @@ -122,4 +103,85 @@ class Installer { return !(false === stripos($message, 'Base table or view not found')); } + + /** + * Check if the tables are created and accounted for. + * + * @return bool + * @throws FireflyException + */ + private function hasNoTables(): bool + { + Log::debug('Now in routine hasNoTables()'); + + try { + DB::table('users')->count(); + } catch (QueryException $e) { + $message = $e->getMessage(); + Log::error(sprintf('Error message trying to access users-table: %s', $message)); + if ($this->isAccessDenied($message)) { + throw new FireflyException('It seems your database configuration is not correct. Please verify the username and password in your .env file.'); + } + if ($this->noTablesExist($message)) { + // redirect to UpdateController + Log::warning('There are no Firefly III tables present. Redirect to migrate routine.'); + + return true; + + } + throw new FireflyException(sprintf('Could not access the database: %s', $message)); + } + Log::debug('Everything seems OK with the tables.'); + + return false; + + } + + /** + * Check if the "db_version" variable is correct. + * + * @return bool + */ + private function oldDBVersion(): bool + { + // older version in config than database? + $configVersion = (int)config('firefly.db_version'); + $dbVersion = (int)app('fireflyconfig')->getFresh('db_version', 1)->data; + if ($configVersion > $dbVersion) { + Log::warning( + sprintf( + 'The current configured version (%d) is older than the required version (%d). Redirect to migrate routine.', $dbVersion, $configVersion + ) + ); + + return true; + } + Log::info(sprintf('Configured DB version (%d) equals expected DB version (%d)', $dbVersion, $configVersion)); + + return false; + } + + /** + * Check if the "firefly_version" variable is correct. + * + * @return bool + */ + private function oldVersion(): bool + { + // version compare thing. + $configVersion = (string)config('firefly.version'); + $dbVersion = (string)app('fireflyconfig')->getFresh('ff3_version', '1.0')->data; + if (1 === version_compare($configVersion, $dbVersion)) { + Log::warning( + sprintf( + 'The current configured Firefly III version (%s) is older than the required version (%s). Redirect to migrate routine.', $dbVersion, $configVersion + ) + ); + + return true; + } + Log::info(sprintf('Installed Firefly III version (%s) equals expected Firefly III version (%s)', $dbVersion, $configVersion)); + + return false; + } } diff --git a/database/seeds/ConfigSeeder.php b/database/seeds/ConfigSeeder.php index e5c8d250d5..f9323bcba0 100644 --- a/database/seeds/ConfigSeeder.php +++ b/database/seeds/ConfigSeeder.php @@ -32,7 +32,7 @@ class ConfigSeeder extends Seeder /** * Run the database seeds. */ - public function run() + public function run(): void { $entry = Configuration::where('name', 'db_version')->first(); if (null === $entry) {