diff options
Diffstat (limited to 'lib/private/Settings/Manager.php')
-rw-r--r-- | lib/private/Settings/Manager.php | 452 |
1 files changed, 151 insertions, 301 deletions
diff --git a/lib/private/Settings/Manager.php b/lib/private/Settings/Manager.php index efeedbe6fcc..387460852ab 100644 --- a/lib/private/Settings/Manager.php +++ b/lib/private/Settings/Manager.php @@ -32,7 +32,6 @@ namespace OC\Settings; use OC\Accounts\AccountManager; use OCP\App\IAppManager; use OCP\AppFramework\QueryException; -use OCP\AutoloadNotAllowedException; use OCP\Encryption\IManager as EncryptionManager; use OCP\IConfig; use OCP\IDBConnection; @@ -54,8 +53,6 @@ class Manager implements IManager { private $log; /** @var IDBConnection */ private $dbc; - /** @var Mapper */ - private $mapper; /** @var IL10N */ private $l; /** @var IConfig */ @@ -76,8 +73,6 @@ class Manager implements IManager { private $groupManager; /** @var IFactory */ private $l10nFactory; - /** @var \OC_Defaults */ - private $defaults; /** @var IAppManager */ private $appManager; @@ -90,12 +85,11 @@ class Manager implements IManager { * @param IUserManager $userManager * @param ILockingProvider $lockingProvider * @param IRequest $request - * @param Mapper $mapper * @param IURLGenerator $url * @param AccountManager $accountManager * @param IGroupManager $groupManager * @param IFactory $l10nFactory - * @param \OC_Defaults $defaults + * @param IAppManager $appManager */ public function __construct( ILogger $log, @@ -106,17 +100,14 @@ class Manager implements IManager { IUserManager $userManager, ILockingProvider $lockingProvider, IRequest $request, - Mapper $mapper, IURLGenerator $url, AccountManager $accountManager, IGroupManager $groupManager, IFactory $l10nFactory, - \OC_Defaults $defaults, IAppManager $appManager ) { $this->log = $log; $this->dbc = $dbc; - $this->mapper = $mapper; $this->l = $l; $this->config = $config; $this->encryptionManager = $encryptionManager; @@ -127,233 +118,112 @@ class Manager implements IManager { $this->accountManager = $accountManager; $this->groupManager = $groupManager; $this->l10nFactory = $l10nFactory; - $this->defaults = $defaults; $this->appManager = $appManager; } + /** @var array */ + protected $sectionClasses = []; + + /** @var array */ + protected $sections = []; + /** - * @inheritdoc + * @param string $type 'admin' or 'personal' + * @param string $section Class must implement OCP\Settings\ISection + * @return void */ - public function setupSettings(array $settings) { - if (!empty($settings[IManager::KEY_ADMIN_SECTION])) { - foreach ($settings[IManager::KEY_ADMIN_SECTION] as $className) { - $this->setupSectionEntry($className, 'admin'); - } - } - if (!empty($settings[IManager::KEY_ADMIN_SETTINGS])) { - foreach ($settings[IManager::KEY_ADMIN_SETTINGS] as $className) { - $this->setupSettingsEntry($className, 'admin'); - } - } - - if (!empty($settings[IManager::KEY_PERSONAL_SECTION])) { - foreach ($settings[IManager::KEY_PERSONAL_SECTION] as $className) { - $this->setupSectionEntry($className, 'personal'); - } - } - if (!empty($settings[IManager::KEY_PERSONAL_SETTINGS])) { - foreach ($settings[IManager::KEY_PERSONAL_SETTINGS] as $className) { - $this->setupSettingsEntry($className, 'personal'); - } - } + public function registerSection(string $type, string $section) { + $this->sectionClasses[$section] = $type; } /** - * attempts to remove an apps section and/or settings entry. A listener is - * added centrally making sure that this method is called ones an app was - * disabled. - * - * @param string $appId - * @since 9.1.0 + * @param string $type 'admin' or 'personal' + * @return ISection[] */ - public function onAppDisabled($appId) { - $appInfo = \OC_App::getAppInfo($appId); // hello static legacy - - if (!empty($appInfo['settings'][IManager::KEY_ADMIN_SECTION])) { - foreach ($appInfo['settings'][IManager::KEY_ADMIN_SECTION] as $className) { - $this->mapper->remove(Mapper::TABLE_ADMIN_SECTIONS, trim($className, '\\')); - } - } - if (!empty($appInfo['settings'][IManager::KEY_ADMIN_SETTINGS])) { - foreach ($appInfo['settings'][IManager::KEY_ADMIN_SETTINGS] as $className) { - $this->mapper->remove(Mapper::TABLE_ADMIN_SETTINGS, trim($className, '\\')); - } + protected function getSections(string $type): array { + if (!isset($this->sections[$type])) { + $this->sections[$type] = []; } - if (!empty($appInfo['settings'][IManager::KEY_PERSONAL_SECTION])) { - foreach ($appInfo['settings'][IManager::KEY_PERSONAL_SECTION] as $className) { - $this->mapper->remove(Mapper::TABLE_PERSONAL_SECTIONS, trim($className, '\\')); - } - } - if (!empty($appInfo['settings'][IManager::KEY_PERSONAL_SETTINGS])) { - foreach ($appInfo['settings'][IManager::KEY_PERSONAL_SETTINGS] as $className) { - $this->mapper->remove(Mapper::TABLE_PERSONAL_SETTINGS, trim($className, '\\')); + foreach ($this->sectionClasses as $class => $sectionType) { + try { + /** @var ISection $section */ + $section = \OC::$server->query($class); + } catch (QueryException $e) { + $this->log->logException($e, ['level' => Util::INFO]); + continue; } - } - } - public function checkForOrphanedClassNames() { - $tables = [Mapper::TABLE_ADMIN_SECTIONS, Mapper::TABLE_ADMIN_SETTINGS, Mapper::TABLE_PERSONAL_SECTIONS, Mapper::TABLE_PERSONAL_SETTINGS]; - foreach ($tables as $table) { - $classes = $this->mapper->getClasses($table); - foreach ($classes as $className) { - try { - \OC::$server->query($className); - } catch (QueryException $e) { - $this->mapper->remove($table, $className); - } + if (!$section instanceof ISection) { + $this->log->logException(new \InvalidArgumentException('Invalid settings section registered'), ['level' => Util::INFO]); + continue; } - } - } - /** - * @param string $sectionClassName - * @param string $type either 'admin' or 'personal' - */ - private function setupSectionEntry($sectionClassName, $type) { - if (!class_exists($sectionClassName)) { - $this->log->debug('Could not find ' . ucfirst($type) . ' section class ' . $sectionClassName); - return; - } - try { - $section = $this->query($sectionClassName); - } catch (QueryException $e) { - // cancel - return; - } + $this->sections[$sectionType][$section->getID()] = $section; - if (!$section instanceof ISection) { - $this->log->error( - ucfirst($type) .' section instance must implement \OCP\ISection. Invalid class: {class}', - ['class' => $sectionClassName] - ); - return; - } - $table = $this->getSectionTableForType($type); - if(!$this->hasSection(get_class($section), $table)) { - $this->addSection($section, $table); - } else { - $this->updateSection($section, $table); + unset($this->sectionClasses[$class]); } - } - - private function addSection(ISection $section, $table) { - $this->mapper->add($table, [ - 'id' => $section->getID(), - 'class' => get_class($section), - 'priority' => $section->getPriority(), - ]); - } - private function addSettings(ISettings $settings, $table) { - $this->mapper->add($table, [ - 'class' => get_class($settings), - 'section' => $settings->getSection(), - 'priority' => $settings->getPriority(), - ]); + return $this->sections[$type]; } - private function updateSettings(ISettings $settings, $table) { - $this->mapper->update( - $table, - 'class', - get_class($settings), - [ - 'section' => $settings->getSection(), - 'priority' => $settings->getPriority(), - ] - ); - } + /** @var array */ + protected $settingClasses = []; - private function updateSection(ISection $section, $table) { - $this->mapper->update( - $table, - 'class', - get_class($section), - [ - 'id' => $section->getID(), - 'priority' => $section->getPriority(), - ] - ); - } + /** @var array */ + protected $settings = []; /** - * @param string $className - * @param string $table - * @return bool + * @param string $type 'admin' or 'personal' + * @param string $setting Class must implement OCP\Settings\ISetting + * @return void */ - private function hasSection($className, $table) { - return $this->mapper->has($table, $className); + public function registerSetting(string $type, string $setting) { + $this->settingClasses[$setting] = $type; } /** - * @param string $className - * @return bool + * @param string $type 'admin' or 'personal' + * @param string $section + * @return ISettings[] */ - private function hasSettings($className, $table) { - return $this->mapper->has($table, $className); - } - - private function setupSettingsEntry($settingsClassName, $type) { - if (!class_exists($settingsClassName)) { - $this->log->debug('Could not find ' . $type . ' section class ' . $settingsClassName); - return; + protected function getSettings(string $type, string $section): array { + if (!isset($this->settings[$type])) { + $this->settings[$type] = []; } - - try { - /** @var ISettings $settings */ - $settings = $this->query($settingsClassName); - } catch (QueryException $e) { - // cancel - return; + if (!isset($this->settings[$type][$section])) { + $this->settings[$type][$section] = []; } - if (!$settings instanceof ISettings) { - $this->log->error( - ucfirst($type) . ' section instance must implement \OCP\Settings\ISettings. Invalid class: {class}', - ['class' => $settingsClassName] - ); - return; - } - $table = $this->getSettingsTableForType($type); - if (!$this->hasSettings(get_class($settings), $table)) { - $this->addSettings($settings, $table); - } else { - $this->updateSettings($settings, $table); - } - } + foreach ($this->settingClasses as $class => $settingsType) { + try { + /** @var ISettings $setting */ + $setting = \OC::$server->query($class); + } catch (QueryException $e) { + $this->log->logException($e, ['level' => Util::INFO]); + continue; + } - private function getSectionTableForType($type) { - if($type === 'admin') { - return Mapper::TABLE_ADMIN_SECTIONS; - } else if($type === 'personal') { - return Mapper::TABLE_PERSONAL_SECTIONS; - } - throw new \InvalidArgumentException('"admin" or "personal" expected'); - } + if (!$setting instanceof ISettings) { + $this->log->logException(new \InvalidArgumentException('Invalid settings setting registered'), ['level' => Util::INFO]); + continue; + } - private function getSettingsTableForType($type) { - if($type === 'admin') { - return Mapper::TABLE_ADMIN_SETTINGS; - } else if($type === 'personal') { - return Mapper::TABLE_PERSONAL_SETTINGS; - } - throw new \InvalidArgumentException('"admin" or "personal" expected'); - } + if (!isset($this->settings[$settingsType][$setting->getSection()])) { + $this->settings[$settingsType][$setting->getSection()] = []; + } + $this->settings[$settingsType][$setting->getSection()][] = $setting; - private function query($className) { - try { - return \OC::$server->query($className); - } catch (QueryException $e) { - $this->log->logException($e, ['level' => Util::INFO]); - throw $e; + unset($this->settingClasses[$class]); } + + return $this->settings[$type][$section]; } /** * @inheritdoc */ - public function getAdminSections() { + public function getAdminSections(): array { // built-in sections $sections = [ 0 => [new Section('server', $this->l->t('Basic settings'), 0, $this->url->imagePath('settings', 'admin.svg'))], @@ -364,17 +234,15 @@ class Manager implements IManager { 99 => [new Section('tips-tricks', $this->l->t('Tips & tricks'), 0, $this->url->imagePath('settings', 'help.svg'))], ]; - $rows = $this->mapper->getAdminSectionsFromDB(); + $appSections = $this->getSections('admin'); - foreach ($rows as $row) { - if (!isset($sections[$row['priority']])) { - $sections[$row['priority']] = []; - } - try { - $sections[$row['priority']][] = $this->query($row['class']); - } catch (QueryException $e) { - // skip + foreach ($appSections as $section) { + /** @var ISection $section */ + if (!isset($sections[$section->getPriority()])) { + $sections[$section->getPriority()] = []; } + + $sections[$section->getPriority()][] = $section; } ksort($sections); @@ -386,39 +254,37 @@ class Manager implements IManager { * @param string $section * @return ISection[] */ - private function getBuiltInAdminSettings($section) { + private function getBuiltInAdminSettings($section): array { $forms = []; - try { - if ($section === 'server') { - /** @var ISettings $form */ - $form = new Admin\Server($this->dbc, $this->request, $this->config, $this->lockingProvider, $this->l); - $forms[$form->getPriority()] = [$form]; - $form = new Admin\ServerDevNotice(); - $forms[$form->getPriority()] = [$form]; - } - if ($section === 'encryption') { - /** @var ISettings $form */ - $form = new Admin\Encryption($this->encryptionManager, $this->userManager); - $forms[$form->getPriority()] = [$form]; - } - if ($section === 'sharing') { - /** @var ISettings $form */ - $form = new Admin\Sharing($this->config); - $forms[$form->getPriority()] = [$form]; - } - if ($section === 'additional') { - /** @var ISettings $form */ - $form = new Admin\Additional($this->config); - $forms[$form->getPriority()] = [$form]; - } - if ($section === 'tips-tricks') { - /** @var ISettings $form */ - $form = new Admin\TipsTricks($this->config); - $forms[$form->getPriority()] = [$form]; - } - } catch (QueryException $e) { - // skip + + if ($section === 'server') { + /** @var ISettings $form */ + $form = new Admin\Server($this->dbc, $this->request, $this->config, $this->lockingProvider, $this->l); + $forms[$form->getPriority()] = [$form]; + $form = new Admin\ServerDevNotice(); + $forms[$form->getPriority()] = [$form]; + } + if ($section === 'encryption') { + /** @var ISettings $form */ + $form = new Admin\Encryption($this->encryptionManager, $this->userManager); + $forms[$form->getPriority()] = [$form]; } + if ($section === 'sharing') { + /** @var ISettings $form */ + $form = new Admin\Sharing($this->config); + $forms[$form->getPriority()] = [$form]; + } + if ($section === 'additional') { + /** @var ISettings $form */ + $form = new Admin\Additional($this->config); + $forms[$form->getPriority()] = [$form]; + } + if ($section === 'tips-tricks') { + /** @var ISettings $form */ + $form = new Admin\TipsTricks($this->config); + $forms[$form->getPriority()] = [$form]; + } + return $forms; } @@ -426,58 +292,48 @@ class Manager implements IManager { * @param string $section * @return ISection[] */ - private function getBuiltInPersonalSettings($section) { + private function getBuiltInPersonalSettings($section): array { $forms = []; - try { - if ($section === 'personal-info') { - /** @var ISettings $form */ - $form = new Personal\PersonalInfo( - $this->config, - $this->userManager, - $this->groupManager, - $this->accountManager, - $this->appManager, - $this->l10nFactory, - $this->l - ); - $forms[$form->getPriority()] = [$form]; - } - if($section === 'security') { - /** @var ISettings $form */ - $form = new Personal\Security(); - $forms[$form->getPriority()] = [$form]; - } - if ($section === 'additional') { - /** @var ISettings $form */ - $form = new Personal\Additional($this->config); - $forms[$form->getPriority()] = [$form]; - } - } catch (QueryException $e) { - // skip + + if ($section === 'personal-info') { + /** @var ISettings $form */ + $form = new Personal\PersonalInfo( + $this->config, + $this->userManager, + $this->groupManager, + $this->accountManager, + $this->appManager, + $this->l10nFactory, + $this->l + ); + $forms[$form->getPriority()] = [$form]; + } + if($section === 'security') { + /** @var ISettings $form */ + $form = new Personal\Security(); + $forms[$form->getPriority()] = [$form]; + } + if ($section === 'additional') { + /** @var ISettings $form */ + $form = new Personal\Additional(); + $forms[$form->getPriority()] = [$form]; } + return $forms; } /** * @inheritdoc */ - public function getAdminSettings($section) { + public function getAdminSettings($section): array { $settings = $this->getBuiltInAdminSettings($section); - $dbRows = $this->mapper->getAdminSettingsFromDB($section); + $appSettings = $this->getSettings('admin', $section); - foreach ($dbRows as $row) { - if (!isset($settings[$row['priority']])) { - $settings[$row['priority']] = []; - } - try { - $settings[$row['priority']][] = $this->query($row['class']); - } catch (QueryException $e) { - // skip - } catch (AutoloadNotAllowedException $e) { - // skip error and remove remnant of disabled app - $this->log->warning('Orphan setting entry will be removed from admin_settings: ' . json_encode($row)); - $this->mapper->remove(Mapper::TABLE_ADMIN_SETTINGS, $row['class']); + foreach ($appSettings as $setting) { + if (!isset($settings[$setting->getPriority()])) { + $settings[$setting->getPriority()] = []; } + $settings[$setting->getPriority()][] = $setting; } ksort($settings); @@ -487,7 +343,7 @@ class Manager implements IManager { /** * @inheritdoc */ - public function getPersonalSections() { + public function getPersonalSections(): array { $sections = [ 0 => [new Section('personal-info', $this->l->t('Personal info'), 0, $this->url->imagePath('core', 'actions/info.svg'))], 5 => [new Section('security', $this->l->t('Security'), 0, $this->url->imagePath('settings', 'password.svg'))], @@ -495,21 +351,19 @@ class Manager implements IManager { ]; $legacyForms = \OC_App::getForms('personal'); - if(count($legacyForms) > 0 && $this->hasLegacyPersonalSettingsToRender($legacyForms)) { + if(!empty($legacyForms) && $this->hasLegacyPersonalSettingsToRender($legacyForms)) { $sections[98] = [new Section('additional', $this->l->t('Additional settings'), 0, $this->url->imagePath('core', 'actions/settings-dark.svg'))]; } - $rows = $this->mapper->getPersonalSectionsFromDB(); + $appSections = $this->getSections('personal'); - foreach ($rows as $row) { - if (!isset($sections[$row['priority']])) { - $sections[$row['priority']] = []; - } - try { - $sections[$row['priority']][] = $this->query($row['class']); - } catch (QueryException $e) { - // skip + foreach ($appSections as $section) { + /** @var ISection $section */ + if (!isset($sections[$section->getPriority()])) { + $sections[$section->getPriority()] = []; } + + $sections[$section->getPriority()][] = $section; } ksort($sections); @@ -518,10 +372,10 @@ class Manager implements IManager { } /** - * @param $forms + * @param string[] $forms * @return bool */ - private function hasLegacyPersonalSettingsToRender($forms) { + private function hasLegacyPersonalSettingsToRender(array $forms): bool { foreach ($forms as $form) { if(trim($form) !== '') { return true; @@ -533,19 +387,15 @@ class Manager implements IManager { /** * @inheritdoc */ - public function getPersonalSettings($section) { + public function getPersonalSettings($section): array { $settings = $this->getBuiltInPersonalSettings($section); - $dbRows = $this->mapper->getPersonalSettingsFromDB($section); + $appSettings = $this->getSettings('personal', $section); - foreach ($dbRows as $row) { - if (!isset($settings[$row['priority']])) { - $settings[$row['priority']] = []; - } - try { - $settings[$row['priority']][] = $this->query($row['class']); - } catch (QueryException $e) { - // skip + foreach ($appSettings as $setting) { + if (!isset($settings[$setting->getPriority()])) { + $settings[$setting->getPriority()] = []; } + $settings[$setting->getPriority()][] = $setting; } ksort($settings); |