|
|
|
|
@ -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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|