diff --git a/app/Http/Controllers/System/InstallController.php b/app/Http/Controllers/System/InstallController.php index 5aded663df..40dc71ce37 100644 --- a/app/Http/Controllers/System/InstallController.php +++ b/app/Http/Controllers/System/InstallController.php @@ -35,6 +35,8 @@ use phpseclib\Crypt\RSA; */ class InstallController extends Controller { + + public const FORBIDDEN_ERROR = 'Internal PHP function "proc_close" is disabled for your installation. Auto-migration is not possible.'; /** @noinspection MagicMethodsValidityInspection */ /** @noinspection PhpMissingParentConstructorInspection */ /** @@ -58,6 +60,9 @@ class InstallController extends Controller */ public function keys() { + if ($this->hasForbiddenFunctions()) { + return response()->json(['error' => true, 'message' => self::FORBIDDEN_ERROR]); + } // create keys manually because for some reason the passport namespace // does not exist $rsa = new RSA(); @@ -69,13 +74,13 @@ class InstallController extends Controller ]; if (file_exists($publicKey) || file_exists($privateKey)) { - return response()->json(['OK']); + return response()->json(['error' => false, 'message' => 'OK']); } file_put_contents($publicKey, array_get($keys, 'publickey')); file_put_contents($privateKey, array_get($keys, 'privatekey')); - return response()->json(['OK']); + return response()->json(['error' => false, 'message' => 'OK']); } /** @@ -83,11 +88,15 @@ class InstallController extends Controller */ public function migrate() { + if ($this->hasForbiddenFunctions()) { + return response()->json(['error' => true, 'message' => self::FORBIDDEN_ERROR]); + } + Log::debug('Am now calling migrate routine...'); Artisan::call('migrate', ['--seed' => true, '--force' => true]); Log::debug(Artisan::output()); - return response()->json(['OK']); + return response()->json(['error' => false, 'message' => 'OK']); } /** @@ -95,11 +104,14 @@ class InstallController extends Controller */ public function upgrade() { + if ($this->hasForbiddenFunctions()) { + return response()->json(['error' => true, 'message' => self::FORBIDDEN_ERROR]); + } Log::debug('Am now calling upgrade database routine...'); Artisan::call('firefly:upgrade-database'); Log::debug(Artisan::output()); - return response()->json(['OK']); + return response()->json(['error' => false, 'message' => 'OK']); } /** @@ -107,11 +119,37 @@ class InstallController extends Controller */ public function verify() { + if ($this->hasForbiddenFunctions()) { + return response()->json(['error' => true, 'message' => self::FORBIDDEN_ERROR]); + } Log::debug('Am now calling verify database routine...'); Artisan::call('firefly:verify'); Log::debug(Artisan::output()); - return response()->json(['OK']); + return response()->json(['error' => false, 'message' => 'OK']); + } + + /** + * @return bool + */ + private function hasForbiddenFunctions(): bool + { + $list = ['proc_close']; + $forbidden = explode(',', ini_get('disable_functions')); + $trimmed = array_map( + function (string $value) { + return trim($value); + }, $forbidden + ); + foreach ($list as $entry) { + if (\in_array($entry, $trimmed, true)) { + Log::error('Method "%s" is FORBIDDEN, so the console command cannot be executed.'); + + return true; + } + } + + return false; } } diff --git a/public/js/ff/install/index.js b/public/js/ff/install/index.js index ac3f5e34b3..ce385c79a9 100644 --- a/public/js/ff/install/index.js +++ b/public/js/ff/install/index.js @@ -28,8 +28,13 @@ $(function () { function startMigration() { $('#status-box').html(' Setting up DB...'); - $.post(migrateUri, {_token: token}).done(function () { - startPassport(); + $.post(migrateUri, {_token: token}).done(function (data) { + if(data.error === false) { + startPassport(); + } else { + displaySoftFail(data.message); + } + }).fail(function () { $('#status-box').html(' Migration failed! See log files :('); }); @@ -41,7 +46,12 @@ function startMigration() { function startPassport() { $('#status-box').html(' Setting up OAuth2...'); $.post(keysUri, {_token: token}).done(function () { - startUpgrade(); + if(data.error === false) { + startUpgrade(); + } else { + displaySoftFail(data.message); + } + }).fail(function () { $('#status-box').html(' OAuth2 failed! See log files :('); }); @@ -53,7 +63,11 @@ function startPassport() { function startUpgrade() { $('#status-box').html(' Upgrading database...'); $.post(upgradeUri, {_token: token}).done(function () { - startVerify(); + if(data.error === false) { + startVerify(); + } else { + displaySoftFail(data.message); + } }).fail(function () { $('#status-box').html(' Upgrade failed! See log files :('); }); @@ -65,7 +79,11 @@ function startUpgrade() { function startVerify() { $('#status-box').html(' Verify database integrity...'); $.post(verifyUri, {_token: token}).done(function () { - completeDone(); + if(data.error === false) { + completeDone(); + } else { + displaySoftFail(data.message); + } }).fail(function () { $('#status-box').html(' Verification failed! See log files :('); }); @@ -79,4 +97,10 @@ function completeDone() { setTimeout(function () { window.location = homeUri; }, 3000); +} + +function displaySoftFail(message) { + $('#status-box').html(' ' + message + '

Please read the ' + + '' + + 'official documentation about this.'); } \ No newline at end of file