<?php namespace Pterodactyl\Providers; use Psr\Log\LoggerInterface as Log; use Illuminate\Database\QueryException; use Illuminate\Support\ServiceProvider; use Illuminate\Contracts\Encryption\Encrypter; use Illuminate\Contracts\Encryption\DecryptException; use Illuminate\Contracts\Config\Repository as ConfigRepository; use Pterodactyl\Contracts\Repository\SettingsRepositoryInterface; class SettingsServiceProvider extends ServiceProvider { /** * An array of configuration keys to override with database values * if they exist. * * @var array */ protected $keys = [ 'app:name', 'app:locale', 'recaptcha:enabled', 'recaptcha:secret_key', 'recaptcha:website_key', 'pterodactyl:guzzle:timeout', 'pterodactyl:guzzle:connect_timeout', 'pterodactyl:console:count', 'pterodactyl:console:frequency', 'pterodactyl:auth:2fa_required', 'pterodactyl:client_features:allocations:enabled', 'pterodactyl:client_features:allocations:range_start', 'pterodactyl:client_features:allocations:range_end', ]; /** * Keys specific to the mail driver that are only grabbed from the database * when using the SMTP driver. * * @var array */ protected $emailKeys = [ 'mail:host', 'mail:port', 'mail:from:address', 'mail:from:name', 'mail:encryption', 'mail:username', 'mail:password', ]; /** * Keys that are encrypted and should be decrypted when set in the * configuration array. * * @var array */ protected static $encrypted = [ 'mail:password', ]; /** * Boot the service provider. */ public function boot(ConfigRepository $config, Encrypter $encrypter, Log $log, SettingsRepositoryInterface $settings) { // Only set the email driver settings from the database if we // are configured using SMTP as the driver. if ($config->get('mail.driver') === 'smtp') { $this->keys = array_merge($this->keys, $this->emailKeys); } try { $values = $settings->all()->mapWithKeys(function ($setting) { return [$setting->key => $setting->value]; })->toArray(); } catch (QueryException $exception) { $log->notice('A query exception was encountered while trying to load settings from the database: ' . $exception->getMessage()); return; } foreach ($this->keys as $key) { $value = array_get($values, 'settings::' . $key, $config->get(str_replace(':', '.', $key))); if (in_array($key, self::$encrypted)) { try { $value = $encrypter->decrypt($value); } catch (DecryptException $exception) { } } switch (strtolower($value)) { case 'true': case '(true)': $value = true; break; case 'false': case '(false)': $value = false; break; case 'empty': case '(empty)': $value = ''; break; case 'null': case '(null)': $value = null; } $config->set(str_replace(':', '.', $key), $value); } } public static function getEncryptedKeys(): array { return self::$encrypted; } }