diff --git a/config/bootstrap.php b/config/bootstrap.php index ed41346..fcf5507 100644 --- a/config/bootstrap.php +++ b/config/bootstrap.php @@ -87,7 +87,12 @@ try { */ if (file_exists(CONFIG . 'app_local.php')) { Configure::load('app_local', 'default'); - Configure::load('cerebrate', 'default', true); + //Configure::load('cerebrate', 'default', true); + $settings = file_get_contents(CONFIG . 'config.json'); + $settings = json_decode($settings, true); + foreach ($settings as $path => $setting) { + Configure::write($path, $setting); + } } /* diff --git a/src/Controller/AppController.php b/src/Controller/AppController.php index b6d0e29..93306bd 100644 --- a/src/Controller/AppController.php +++ b/src/Controller/AppController.php @@ -136,7 +136,7 @@ class AppController extends Controller if (!empty($user) && !empty($user->user_settings_by_name_with_fallback['ui.bsTheme']['value'])) { $this->set('bsTheme', $user->user_settings_by_name_with_fallback['ui.bsTheme']['value']); } else { - $this->set('bsTheme', Configure::read('Cerebrate')['ui.bsTheme']); + $this->set('bsTheme', Configure::read('ui.bsTheme')); } if ($this->modelClass == 'Tags.Tags') { diff --git a/src/Model/Table/SettingProviders/CerebrateSettingsProvider.php b/src/Model/Table/SettingProviders/CerebrateSettingsProvider.php index d06bd43..97641d5 100644 --- a/src/Model/Table/SettingProviders/CerebrateSettingsProvider.php +++ b/src/Model/Table/SettingProviders/CerebrateSettingsProvider.php @@ -18,6 +18,24 @@ class CerebrateSettingsProvider extends BaseSettingsProvider parent::__construct(); } + public function retrieveSettingPathsBasedOnBlueprint(): array + { + $blueprint = $this->generateSettingsConfiguration(); + $paths = []; + foreach ($blueprint as $l1) { + foreach ($l1 as $l2) { + foreach ($l2 as $l3) { + foreach ($l3 as $k => $v) { + if ($k[0] !== '_') { + $paths[] = $k; + } + } + } + } + } + return $paths; + } + protected function generateSettingsConfiguration() { return [ @@ -26,7 +44,7 @@ class CerebrateSettingsProvider extends BaseSettingsProvider 'Essentials' => [ '_description' => __('Ensentials settings required for the application to run normally.'), '_icon' => 'user-cog', - 'app.baseurl' => [ + 'App.baseurl' => [ 'name' => __('Base URL'), 'type' => 'string', 'description' => __('The base url of the application (in the format https://www.mymispinstance.com or https://myserver.com/misp). Several features depend on this setting being correctly set to function.'), @@ -34,7 +52,7 @@ class CerebrateSettingsProvider extends BaseSettingsProvider 'severity' => 'critical', 'test' => 'testBaseURL', ], - 'app.uuid' => [ + 'App.uuid' => [ 'name' => 'UUID', 'type' => 'string', 'description' => __('The Cerebrate instance UUID. This UUID is used to identify this instance.'), @@ -85,26 +103,26 @@ class CerebrateSettingsProvider extends BaseSettingsProvider ], 'Network' => [ 'Proxy' => [ - 'proxy.host' => [ + 'Proxy.host' => [ 'name' => __('Host'), 'type' => 'string', 'description' => __('The hostname of an HTTP proxy for outgoing sync requests. Leave empty to not use a proxy.'), 'test' => 'testHostname', ], - 'proxy.port' => [ + 'Proxy.port' => [ 'name' => __('Port'), 'type' => 'integer', 'description' => __('The TCP port for the HTTP proxy.'), 'test' => 'testForRangeXY', ], - 'proxy.user' => [ + 'Proxy.user' => [ 'name' => __('User'), 'type' => 'string', 'description' => __('The authentication username for the HTTP proxy.'), 'default' => 'admin', 'dependsOn' => 'proxy.host', ], - 'proxy.password' => [ + 'Proxy.password' => [ 'name' => __('Password'), 'type' => 'string', 'description' => __('The authentication password for the HTTP proxy.'), @@ -181,11 +199,16 @@ class CerebrateSettingsProvider extends BaseSettingsProvider 'dependsOn' => 'keycloak.enabled' ], 'keycloak.default_role_name' => [ - 'name' => 'Authoritative', - 'type' => 'boolean', + 'name' => 'Default role', + 'type' => 'select', 'severity' => 'info', - 'description' => __('Override local role and organisation settings based on the settings in KeyCloak'), - 'default' => false, + 'description' => __('Select the default role name to be used when creating users'), + 'options' => function ($settingsProviders) { + $roleTable = TableRegistry::getTableLocator()->get('Roles'); + $allRoleNames = $roleTable->find()->toArray(); + $allRoleNames = array_column($allRoleNames, 'name'); + return array_combine($allRoleNames, $allRoleNames); + }, 'dependsOn' => 'keycloak.enabled' ], 'keycloak.mapping.org_uuid' => [ @@ -242,7 +265,7 @@ class CerebrateSettingsProvider extends BaseSettingsProvider 'Security' => [ 'Development' => [ 'Debugging' => [ - 'security.debug' => [ + 'debug' => [ 'name' => __('Debug Level'), 'type' => 'select', 'description' => __('The debug level of the instance'), diff --git a/src/Model/Table/SettingsTable.php b/src/Model/Table/SettingsTable.php index 4a2d0a6..c2d71c9 100644 --- a/src/Model/Table/SettingsTable.php +++ b/src/Model/Table/SettingsTable.php @@ -4,6 +4,7 @@ namespace App\Model\Table; use App\Model\Table\AppTable; use Cake\ORM\Table; use Cake\Core\Configure; +use Cake\Error\Debugger; require_once(APP . 'Model' . DS . 'Table' . DS . 'SettingProviders' . DS . 'CerebrateSettingsProvider.php'); use App\Settings\SettingsProvider\CerebrateSettingsProvider; @@ -12,7 +13,14 @@ class SettingsTable extends AppTable { private static $FILENAME = 'cerebrate'; private static $CONFIG_KEY = 'Cerebrate'; - + private static $DUMPABLE = [ + 'Cerebrate', + 'proxy', + 'ui', + 'keycloak', + 'app' + ]; + public function initialize(array $config): void { parent::initialize($config); @@ -96,15 +104,32 @@ class SettingsTable extends AppTable private function readSettings() { - return Configure::read()[$this::$CONFIG_KEY]; + $settingPaths = $this->SettingsProvider->retrieveSettingPathsBasedOnBlueprint(); + $settings = []; + foreach ($settingPaths as $path) { + if (Configure::check($path)) { + $settings[$path] = Configure::read($path); + } + } + return $settings; + } + + private function loadSettings(): void + { + $settings = file_get_contents(CONFIG . 'config.json'); + $settings = json_decode($settings, true); + foreach ($settings as $path => $setting) { + Configure::write($path, $setting); + } } private function saveSettingOnDisk($name, $value) { $settings = $this->readSettings(); $settings[$name] = $value; - Configure::write($this::$CONFIG_KEY, $settings); - Configure::dump($this::$FILENAME, 'default', [$this::$CONFIG_KEY]); + $settings = json_encode($settings, JSON_PRETTY_PRINT); + file_put_contents(CONFIG . 'config.json', $settings); + $this->loadSettings(); return true; } }