. */ declare(strict_types=1); namespace FireflyIII\Console\Commands\System; use FireflyIII\Console\Commands\ShowsFriendlyMessages; use Illuminate\Console\Command; use Illuminate\Database\QueryException; use Illuminate\Support\Facades\Log; use League\Flysystem\FilesystemException; use Storage; /** * Class VerifySecurityAlerts */ class VerifySecurityAlerts extends Command { use ShowsFriendlyMessages; /** * The console command description. * * @var string */ protected $description = 'Verify security alerts'; /** * The name and signature of the console command. * * @var string */ protected $signature = 'firefly-iii:verify-security-alerts'; /** * Execute the console command. * * @return int * @throws FilesystemException */ public function handle(): int { $this->removeOldAdvisory(); // check for security advisories. $version = config('firefly.version'); $disk = Storage::disk('resources'); // Next line is ignored because it's a Laravel Facade. if (!$disk->has('alerts.json')) { // @phpstan-ignore-line Log::debug('No alerts.json file present.'); return 0; } $content = $disk->get('alerts.json'); $json = json_decode($content, true, 10); /** @var array $array */ foreach ($json as $array) { if ($version === $array['version'] && true === $array['advisory']) { Log::debug(sprintf('Version %s has an alert!', $array['version'])); // add advisory to configuration. $this->saveSecurityAdvisory($array); // depends on level if ('info' === $array['level']) { Log::debug('INFO level alert'); $this->friendlyInfo($array['message']); return 0; } if ('warning' === $array['level']) { Log::debug('WARNING level alert'); $this->friendlyWarning('------------------------ :o'); $this->friendlyWarning($array['message']); $this->friendlyWarning('------------------------ :o'); return 0; } if ('danger' === $array['level']) { Log::debug('DANGER level alert'); $this->friendlyError('------------------------ :-('); $this->friendlyError($array['message']); $this->friendlyError('------------------------ :-('); return 0; } return 0; } } Log::debug(sprintf('No security alerts for version %s', $version)); $this->friendlyPositive(sprintf('No security alerts for version %s', $version)); return 0; } /** * @return void */ private function removeOldAdvisory(): void { try { app('fireflyconfig')->delete('upgrade_security_message'); app('fireflyconfig')->delete('upgrade_security_level'); } catch (QueryException $e) { Log::debug(sprintf('Could not delete old security advisory, but thats OK: %s', $e->getMessage())); } } /** * @param array $array * * @return void */ private function saveSecurityAdvisory(array $array): void { try { app('fireflyconfig')->set('upgrade_security_message', $array['message']); app('fireflyconfig')->set('upgrade_security_level', $array['level']); } catch (QueryException $e) { Log::debug(sprintf('Could not save new security advisory, but thats OK: %s', $e->getMessage())); } } }