mirror of
				https://github.com/firefly-iii/firefly-iii.git
				synced 2025-10-31 18:54:58 +00:00 
			
		
		
		
	Improve installer middleware for Sandstorm.
This commit is contained in:
		| @@ -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(); | ||||
|   | ||||
| @@ -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; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user