forked from Alex/Pterodactyl-Panel
129 lines
3.8 KiB
PHP
129 lines
3.8 KiB
PHP
<?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',
|
|
'app:analytics',
|
|
'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.
|
|
*
|
|
* @param \Illuminate\Contracts\Config\Repository $config
|
|
* @param \Illuminate\Contracts\Encryption\Encrypter $encrypter
|
|
* @param \Psr\Log\LoggerInterface $log
|
|
* @param \Pterodactyl\Contracts\Repository\SettingsRepositoryInterface $settings
|
|
*/
|
|
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);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public static function getEncryptedKeys(): array
|
|
{
|
|
return self::$encrypted;
|
|
}
|
|
}
|