|
|
|
@ -16,6 +16,7 @@ use OCP\IServerContainer; |
|
|
|
|
use OCP\IURLGenerator; |
|
|
|
|
use OCP\IUser; |
|
|
|
|
use OCP\L10N\IFactory; |
|
|
|
|
use OCP\Settings\IDelegatedSettings; |
|
|
|
|
use OCP\Settings\IIconSection; |
|
|
|
|
use OCP\Settings\IManager; |
|
|
|
|
use OCP\Settings\ISettings; |
|
|
|
@ -23,54 +24,31 @@ use OCP\Settings\ISubAdminSettings; |
|
|
|
|
use Psr\Log\LoggerInterface; |
|
|
|
|
|
|
|
|
|
class Manager implements IManager { |
|
|
|
|
/** @var LoggerInterface */ |
|
|
|
|
private $log; |
|
|
|
|
private ?IL10N $l = null; |
|
|
|
|
|
|
|
|
|
/** @var IL10N */ |
|
|
|
|
private $l; |
|
|
|
|
|
|
|
|
|
/** @var IFactory */ |
|
|
|
|
private $l10nFactory; |
|
|
|
|
|
|
|
|
|
/** @var IURLGenerator */ |
|
|
|
|
private $url; |
|
|
|
|
|
|
|
|
|
/** @var IServerContainer */ |
|
|
|
|
private $container; |
|
|
|
|
/** @var array<self::SETTINGS_*, list<class-string<IIconSection>>> */ |
|
|
|
|
protected array $sectionClasses = []; |
|
|
|
|
|
|
|
|
|
/** @var AuthorizedGroupMapper $mapper */ |
|
|
|
|
private $mapper; |
|
|
|
|
/** @var array<self::SETTINGS_*, array<string, IIconSection>> */ |
|
|
|
|
protected array $sections = []; |
|
|
|
|
|
|
|
|
|
/** @var IGroupManager $groupManager */ |
|
|
|
|
private $groupManager; |
|
|
|
|
/** @var array<class-string<ISettings>, self::SETTINGS_*> */ |
|
|
|
|
protected array $settingClasses = []; |
|
|
|
|
|
|
|
|
|
/** @var ISubAdmin $subAdmin */ |
|
|
|
|
private $subAdmin; |
|
|
|
|
/** @var array<self::SETTINGS_*, array<string, list<ISettings>>> */ |
|
|
|
|
protected array $settings = []; |
|
|
|
|
|
|
|
|
|
public function __construct( |
|
|
|
|
LoggerInterface $log, |
|
|
|
|
IFactory $l10nFactory, |
|
|
|
|
IURLGenerator $url, |
|
|
|
|
IServerContainer $container, |
|
|
|
|
AuthorizedGroupMapper $mapper, |
|
|
|
|
IGroupManager $groupManager, |
|
|
|
|
ISubAdmin $subAdmin, |
|
|
|
|
private LoggerInterface $log, |
|
|
|
|
private IFactory $l10nFactory, |
|
|
|
|
private IURLGenerator $url, |
|
|
|
|
private IServerContainer $container, |
|
|
|
|
private AuthorizedGroupMapper $mapper, |
|
|
|
|
private IGroupManager $groupManager, |
|
|
|
|
private ISubAdmin $subAdmin, |
|
|
|
|
) { |
|
|
|
|
$this->log = $log; |
|
|
|
|
$this->l10nFactory = $l10nFactory; |
|
|
|
|
$this->url = $url; |
|
|
|
|
$this->container = $container; |
|
|
|
|
$this->mapper = $mapper; |
|
|
|
|
$this->groupManager = $groupManager; |
|
|
|
|
$this->subAdmin = $subAdmin; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** @var array<self::SETTINGS_*, list<class-string<IIconSection>>> */ |
|
|
|
|
protected $sectionClasses = []; |
|
|
|
|
|
|
|
|
|
/** @var array<self::SETTINGS_*, array<string, IIconSection>> */ |
|
|
|
|
protected $sections = []; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @inheritdoc |
|
|
|
|
*/ |
|
|
|
@ -138,12 +116,6 @@ class Manager implements IManager { |
|
|
|
|
], true); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** @var array<class-string<ISettings>, self::SETTINGS_*> */ |
|
|
|
|
protected $settingClasses = []; |
|
|
|
|
|
|
|
|
|
/** @var array<self::SETTINGS_*, array<string, list<ISettings>>> */ |
|
|
|
|
protected $settings = []; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @inheritdoc |
|
|
|
|
*/ |
|
|
|
@ -164,40 +136,41 @@ class Manager implements IManager { |
|
|
|
|
} |
|
|
|
|
if (!isset($this->settings[$type][$section])) { |
|
|
|
|
$this->settings[$type][$section] = []; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
foreach ($this->settingClasses as $class => $settingsType) { |
|
|
|
|
if ($type !== $settingsType) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
foreach ($this->settingClasses as $class => $settingsType) { |
|
|
|
|
if ($type !== $settingsType) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
/** @var ISettings $setting */ |
|
|
|
|
$setting = $this->container->get($class); |
|
|
|
|
} catch (QueryException $e) { |
|
|
|
|
$this->log->info($e->getMessage(), ['exception' => $e]); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
try { |
|
|
|
|
/** @var ISettings $setting */ |
|
|
|
|
$setting = $this->container->get($class); |
|
|
|
|
} catch (QueryException $e) { |
|
|
|
|
$this->log->info($e->getMessage(), ['exception' => $e]); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!$setting instanceof ISettings) { |
|
|
|
|
$e = new \InvalidArgumentException('Invalid settings setting registered (' . $class . ')'); |
|
|
|
|
$this->log->info($e->getMessage(), ['exception' => $e]); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if (!$setting instanceof ISettings) { |
|
|
|
|
$e = new \InvalidArgumentException('Invalid settings setting registered (' . $class . ')'); |
|
|
|
|
$this->log->info($e->getMessage(), ['exception' => $e]); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
$settingSection = $setting->getSection(); |
|
|
|
|
if ($settingSection === null) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($filter !== null && !$filter($setting)) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if ($setting->getSection() === null) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if (!isset($this->settings[$settingsType][$settingSection])) { |
|
|
|
|
$this->settings[$settingsType][$settingSection] = []; |
|
|
|
|
} |
|
|
|
|
$this->settings[$settingsType][$settingSection][] = $setting; |
|
|
|
|
|
|
|
|
|
if (!isset($this->settings[$settingsType][$setting->getSection()])) { |
|
|
|
|
$this->settings[$settingsType][$setting->getSection()] = []; |
|
|
|
|
unset($this->settingClasses[$class]); |
|
|
|
|
} |
|
|
|
|
$this->settings[$settingsType][$setting->getSection()][] = $setting; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
unset($this->settingClasses[$class]); |
|
|
|
|
if ($filter !== null) { |
|
|
|
|
return array_values(array_filter($this->settings[$type][$section], $filter)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return $this->settings[$type][$section]; |
|
|
|
@ -349,4 +322,31 @@ class Manager implements IManager { |
|
|
|
|
} |
|
|
|
|
return $settings; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @return array<string, array{section:IIconSection,settings:list<IDelegatedSettings>}> |
|
|
|
|
*/ |
|
|
|
|
public function getAdminDelegatedSettings(): array { |
|
|
|
|
$sections = $this->getAdminSections(); |
|
|
|
|
$settings = []; |
|
|
|
|
foreach ($sections as $sectionPriority) { |
|
|
|
|
foreach ($sectionPriority as $section) { |
|
|
|
|
/** @var IDelegatedSettings[] */ |
|
|
|
|
$sectionSettings = array_merge( |
|
|
|
|
$this->getSettings(self::SETTINGS_ADMIN, $section->getID(), fn (ISettings $settings): bool => $settings instanceof IDelegatedSettings), |
|
|
|
|
$this->getSettings(self::SETTINGS_DELEGATION, $section->getID(), fn (ISettings $settings): bool => $settings instanceof IDelegatedSettings), |
|
|
|
|
); |
|
|
|
|
usort( |
|
|
|
|
$sectionSettings, |
|
|
|
|
fn (ISettings $s1, ISettings $s2) => $s1->getPriority() <=> $s2->getPriority() |
|
|
|
|
); |
|
|
|
|
$settings[$section->getID()] = [ |
|
|
|
|
'section' => $section, |
|
|
|
|
'settings' => $sectionSettings, |
|
|
|
|
]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
uasort($settings, fn (array $a, array $b) => $a['section']->getPriority() <=> $b['section']->getPriority()); |
|
|
|
|
return $settings; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|