diff --git a/lib/private/Settings/Manager.php b/lib/private/Settings/Manager.php index 260e33d192..f1baf35b7a 100644 --- a/lib/private/Settings/Manager.php +++ b/lib/private/Settings/Manager.php @@ -133,7 +133,11 @@ class Manager implements IManager { * @return void */ public function registerSection(string $type, string $section) { - $this->sectionClasses[$section] = $type; + if (!isset($this->sectionClasses[$type])) { + $this->sectionClasses[$type] = []; + } + + $this->sectionClasses[$type][] = $section; } /** @@ -145,7 +149,11 @@ class Manager implements IManager { $this->sections[$type] = []; } - foreach ($this->sectionClasses as $class => $sectionType) { + if (!isset($this->sectionClasses[$type])) { + return $this->sections[$type]; + } + + foreach ($this->sectionClasses[$type] as $index => $class) { try { /** @var ISection $section */ $section = \OC::$server->query($class); @@ -159,9 +167,16 @@ class Manager implements IManager { continue; } - $this->sections[$sectionType][$section->getID()] = $section; + $sectionID = $section->getID(); - unset($this->sectionClasses[$class]); + if (isset($this->sections[$type][$sectionID])) { + $this->log->logException(new \InvalidArgumentException('Section with the same ID already registered'), ['level' => ILogger::INFO]); + continue; + } + + $this->sections[$type][$sectionID] = $section; + + unset($this->sectionClasses[$type][$index]); } return $this->sections[$type]; diff --git a/tests/lib/Settings/ManagerTest.php b/tests/lib/Settings/ManagerTest.php index df7e59841c..6f9af39d59 100644 --- a/tests/lib/Settings/ManagerTest.php +++ b/tests/lib/Settings/ManagerTest.php @@ -220,4 +220,45 @@ class ManagerTest extends TestCase { 10 => [new Security($this->userManager)], ], $this->manager->getPersonalSettings('security')); } + + public function testSameSectionAsPersonalAndAdmin() { + $this->l10n + ->expects($this->any()) + ->method('t') + ->will($this->returnArgument(0)); + + $this->manager->registerSection('personal', \OCA\WorkflowEngine\Settings\Section::class); + $this->manager->registerSection('admin', \OCA\WorkflowEngine\Settings\Section::class); + + $this->url->expects($this->exactly(9)) + ->method('imagePath') + ->willReturnMap([ + ['core', 'actions/info.svg', '1'], + ['settings', 'password.svg', '2'], + ['core', 'clients/phone.svg', '3'], + ['settings', 'admin.svg', '0'], + ['core', 'actions/settings-dark.svg', '1'], + ['core', 'actions/share.svg', '2'], + ['core', 'actions/password.svg', '3'], + ['core', 'places/contacts.svg', '5'], + ['settings', 'help.svg', '4'], + ]); + + $this->assertEquals([ + 0 => [new Section('personal-info', 'Personal info', 0, '1')], + 5 => [new Section('security', 'Security', 0, '2')], + 15 => [new Section('sync-clients', 'Mobile & desktop', 0, '3')], + 55 => [\OC::$server->query(\OCA\WorkflowEngine\Settings\Section::class)], + ], $this->manager->getPersonalSections()); + + $this->assertEquals([ + 0 => [new Section('overview', 'Overview', 0, '0')], + 1 => [new Section('server', 'Basic settings', 0, '1')], + 5 => [new Section('sharing', 'Sharing', 0, '2')], + 10 => [new Section('security', 'Security', 0, '3')], + 50 => [new Section('groupware', 'Groupware', 0, '5')], + 55 => [\OC::$server->query(\OCA\WorkflowEngine\Settings\Section::class)], + 98 => [new Section('additional', 'Additional settings', 0, '1')], + ], $this->manager->getAdminSections()); + } }