diff --git a/lib/private/App/InfoParser.php b/lib/private/App/InfoParser.php index e0ed63fc784add44c6dc0c82dc256f827d5dfc0a..ef96156dfed273634fb70a3313d332f57463d8c9 100644 --- a/lib/private/App/InfoParser.php +++ b/lib/private/App/InfoParser.php @@ -52,7 +52,7 @@ class InfoParser { return null; } - if(!is_null($this->cache)) { + if ($this->cache !== null) { $fileCacheKey = $file . filemtime($file); if ($cachedValue = $this->cache->get($fileCacheKey)) { return json_decode($cachedValue, true); @@ -205,12 +205,24 @@ class InfoParser { $array['settings']['personal-section'] = [$array['settings']['personal-section']]; } - if(!is_null($this->cache)) { + if (isset($array['navigations']['navigation']) && $this->isNavigationItem($array['navigations']['navigation'])) { + $array['navigations']['navigation'] = [$array['navigations']['navigation']]; + } + + if ($this->cache !== null) { $this->cache->set($fileCacheKey, json_encode($array)); } return $array; } + /** + * @param $data + * @return bool + */ + private function isNavigationItem($data): bool { + return isset($data['name'], $data['route']); + } + /** * @param \SimpleXMLElement $xml * @return array diff --git a/lib/private/NavigationManager.php b/lib/private/NavigationManager.php index 1874cd0e4ff968d31cfb817130c34f944be4d3de..a1d3d252af1068eedb086e62c718673e1513e1a8 100644 --- a/lib/private/NavigationManager.php +++ b/lib/private/NavigationManager.php @@ -271,10 +271,10 @@ class NavigationManager implements INavigationManager { // load plugins and collections from info.xml $info = $this->appManager->getAppInfo($app); - if (empty($info['navigations'])) { + if (!isset($info['navigations']['navigation'])) { continue; } - foreach ($info['navigations'] as $nav) { + foreach ($info['navigations']['navigation'] as $nav) { if (!isset($nav['name'])) { continue; } diff --git a/tests/data/app/navigation-one-item.json b/tests/data/app/navigation-one-item.json new file mode 100644 index 0000000000000000000000000000000000000000..c9002da6b0dbae3dbe20a3b2382c12a32a97b804 --- /dev/null +++ b/tests/data/app/navigation-one-item.json @@ -0,0 +1,85 @@ +{ + "id": "activity", + "name": "Activity", + "summary": "This application enables users to view actions related to their files in Nextcloud.", + "description": "\n\t\tThis application enables users to view actions related to their files in Nextcloud.\n\t\tOnce enabled, users will see a new icon \u201cActivity\u201d in their apps menu.\n\t\tWhen clicked, a new page appears for users to track the activity related to files \u2013 from new files, to deleted files, move, rename, updates and shared activity.\n\t\tThe user can configure their individual activity settings in their personal menu.\n\t\tThis sets the type of activity to record, as well as whether to the user sees their own activities,\n\t\twhether these are only available online, and whether they get an email digest on a regular basis.\n\t\tMore information is available in the Activity documentation.\n\t", + "version": "2.9.0", + "licence": "agpl", + "author": [ + "Frank Karlitschek", + "Joas Schilling" + ], + "default_enable": "", + "types": [ + "filesystem" + ], + "documentation": { + "admin": "https:\/\/docs.nextcloud.org\/server\/14\/admin_manual\/configuration_server\/activity_configuration.html" + }, + "category": [ + "monitoring", + "social" + ], + "website": "https:\/\/github.com\/nextcloud\/activity\/", + "bugs": "https:\/\/github.com\/nextcloud\/activity\/issues", + "repository": "https:\/\/github.com\/nextcloud\/activity.git", + "dependencies": { + "nextcloud": { + "@attributes": { + "min-version": "16", + "max-version": "16" + } + } + }, + "background-jobs": [ + "OCA\\Activity\\BackgroundJob\\EmailNotification", + "OCA\\Activity\\BackgroundJob\\ExpireActivities" + ], + "commands": { + "command": "OCA\\Activity\\Command\\SendEmails" + }, + "settings": { + "admin": [ + "OCA\\Activity\\Settings\\Admin" + ], + "admin-section": [ + "OCA\\Activity\\Settings\\AdminSection" + ], + "personal": [ + "OCA\\Activity\\Settings\\Personal" + ], + "personal-section": [ + "OCA\\Activity\\Settings\\PersonalSection" + ] + }, + "activity": { + "filters": [ + "OCA\\Activity\\Filter\\AllFilter", + "OCA\\Activity\\Filter\\SelfFilter", + "OCA\\Activity\\Filter\\ByFilter" + ], + "settings": [], + "providers": [] + }, + "navigations": { + "navigation": [ + { + "name": "Activity", + "route": "activity.Activities.showList", + "icon": "activity.svg", + "order": "1" + } + ] + }, + "info": [], + "remote": [], + "public": [], + "repair-steps": { + "install": [], + "pre-migration": [], + "post-migration": [], + "live-migration": [], + "uninstall": [] + }, + "two-factor-providers": [] +} \ No newline at end of file diff --git a/tests/data/app/navigation-one-item.xml b/tests/data/app/navigation-one-item.xml new file mode 100644 index 0000000000000000000000000000000000000000..a03e5c8ffbf11a6d39ed25a48f7d2a0a6c44a60a --- /dev/null +++ b/tests/data/app/navigation-one-item.xml @@ -0,0 +1,74 @@ +<?xml version="1.0"?> +<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd"> + <id>activity</id> + <name>Activity</name> + <summary>This application enables users to view actions related to their files in Nextcloud.</summary> + <description> + This application enables users to view actions related to their files in Nextcloud. + Once enabled, users will see a new icon “Activity†in their apps menu. + When clicked, a new page appears for users to track the activity related to files – from new files, to deleted files, move, rename, updates and shared activity. + The user can configure their individual activity settings in their personal menu. + This sets the type of activity to record, as well as whether to the user sees their own activities, + whether these are only available online, and whether they get an email digest on a regular basis. + More information is available in the Activity documentation. + </description> + + <version>2.9.0</version> + <licence>agpl</licence> + <author>Frank Karlitschek</author> + <author>Joas Schilling</author> + + <default_enable/> + <types> + <filesystem/> + </types> + + <documentation> + <admin>https://docs.nextcloud.org/server/14/admin_manual/configuration_server/activity_configuration.html</admin> + </documentation> + + <category>monitoring</category> + <category>social</category> + + <website>https://github.com/nextcloud/activity/</website> + <bugs>https://github.com/nextcloud/activity/issues</bugs> + <repository>https://github.com/nextcloud/activity.git</repository> + + <dependencies> + <nextcloud min-version="16" max-version="16"/> + </dependencies> + + <background-jobs> + <job>OCA\Activity\BackgroundJob\EmailNotification</job> + <job>OCA\Activity\BackgroundJob\ExpireActivities</job> + </background-jobs> + + <commands> + <command>OCA\Activity\Command\SendEmails</command> + </commands> + + <settings> + <admin>OCA\Activity\Settings\Admin</admin> + <admin-section>OCA\Activity\Settings\AdminSection</admin-section> + <personal>OCA\Activity\Settings\Personal</personal> + <personal-section>OCA\Activity\Settings\PersonalSection</personal-section> + </settings> + + <activity> + <filters> + <filter>OCA\Activity\Filter\AllFilter</filter> + <filter>OCA\Activity\Filter\SelfFilter</filter> + <filter>OCA\Activity\Filter\ByFilter</filter> + </filters> + </activity> + + <navigations> + <navigation> + <name>Activity</name> + <route>activity.Activities.showList</route> + <icon>activity.svg</icon> + <order>1</order> + </navigation> + </navigations> +</info> diff --git a/tests/data/app/navigation-two-item.json b/tests/data/app/navigation-two-item.json new file mode 100644 index 0000000000000000000000000000000000000000..a7579217238fd3e378acd89856c7b8ce10a62c87 --- /dev/null +++ b/tests/data/app/navigation-two-item.json @@ -0,0 +1,91 @@ +{ + "id": "activity", + "name": "Activity", + "summary": "This application enables users to view actions related to their files in Nextcloud.", + "description": "\n\t\tThis application enables users to view actions related to their files in Nextcloud.\n\t\tOnce enabled, users will see a new icon \u201cActivity\u201d in their apps menu.\n\t\tWhen clicked, a new page appears for users to track the activity related to files \u2013 from new files, to deleted files, move, rename, updates and shared activity.\n\t\tThe user can configure their individual activity settings in their personal menu.\n\t\tThis sets the type of activity to record, as well as whether to the user sees their own activities,\n\t\twhether these are only available online, and whether they get an email digest on a regular basis.\n\t\tMore information is available in the Activity documentation.\n\t", + "version": "2.9.0", + "licence": "agpl", + "author": [ + "Frank Karlitschek", + "Joas Schilling" + ], + "default_enable": "", + "types": [ + "filesystem" + ], + "documentation": { + "admin": "https:\/\/docs.nextcloud.org\/server\/14\/admin_manual\/configuration_server\/activity_configuration.html" + }, + "category": [ + "monitoring", + "social" + ], + "website": "https:\/\/github.com\/nextcloud\/activity\/", + "bugs": "https:\/\/github.com\/nextcloud\/activity\/issues", + "repository": "https:\/\/github.com\/nextcloud\/activity.git", + "dependencies": { + "nextcloud": { + "@attributes": { + "min-version": "16", + "max-version": "16" + } + } + }, + "background-jobs": [ + "OCA\\Activity\\BackgroundJob\\EmailNotification", + "OCA\\Activity\\BackgroundJob\\ExpireActivities" + ], + "commands": { + "command": "OCA\\Activity\\Command\\SendEmails" + }, + "settings": { + "admin": [ + "OCA\\Activity\\Settings\\Admin" + ], + "admin-section": [ + "OCA\\Activity\\Settings\\AdminSection" + ], + "personal": [ + "OCA\\Activity\\Settings\\Personal" + ], + "personal-section": [ + "OCA\\Activity\\Settings\\PersonalSection" + ] + }, + "activity": { + "filters": [ + "OCA\\Activity\\Filter\\AllFilter", + "OCA\\Activity\\Filter\\SelfFilter", + "OCA\\Activity\\Filter\\ByFilter" + ], + "settings": [], + "providers": [] + }, + "navigations": { + "navigation": [ + { + "name": "Activity", + "route": "activity.Activities.showList", + "icon": "activity.svg", + "order": "1" + }, + { + "name": "Activity-Test", + "route": "activity.Activities.showList", + "icon": "activity.svg", + "order": "2" + } + ] + }, + "info": [], + "remote": [], + "public": [], + "repair-steps": { + "install": [], + "pre-migration": [], + "post-migration": [], + "live-migration": [], + "uninstall": [] + }, + "two-factor-providers": [] +} \ No newline at end of file diff --git a/tests/data/app/navigation-two-item.xml b/tests/data/app/navigation-two-item.xml new file mode 100644 index 0000000000000000000000000000000000000000..fba60a2871d8f7ba672eb11e09c926692951660f --- /dev/null +++ b/tests/data/app/navigation-two-item.xml @@ -0,0 +1,80 @@ +<?xml version="1.0"?> +<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd"> + <id>activity</id> + <name>Activity</name> + <summary>This application enables users to view actions related to their files in Nextcloud.</summary> + <description> + This application enables users to view actions related to their files in Nextcloud. + Once enabled, users will see a new icon “Activity†in their apps menu. + When clicked, a new page appears for users to track the activity related to files – from new files, to deleted files, move, rename, updates and shared activity. + The user can configure their individual activity settings in their personal menu. + This sets the type of activity to record, as well as whether to the user sees their own activities, + whether these are only available online, and whether they get an email digest on a regular basis. + More information is available in the Activity documentation. + </description> + + <version>2.9.0</version> + <licence>agpl</licence> + <author>Frank Karlitschek</author> + <author>Joas Schilling</author> + + <default_enable/> + <types> + <filesystem/> + </types> + + <documentation> + <admin>https://docs.nextcloud.org/server/14/admin_manual/configuration_server/activity_configuration.html</admin> + </documentation> + + <category>monitoring</category> + <category>social</category> + + <website>https://github.com/nextcloud/activity/</website> + <bugs>https://github.com/nextcloud/activity/issues</bugs> + <repository>https://github.com/nextcloud/activity.git</repository> + + <dependencies> + <nextcloud min-version="16" max-version="16"/> + </dependencies> + + <background-jobs> + <job>OCA\Activity\BackgroundJob\EmailNotification</job> + <job>OCA\Activity\BackgroundJob\ExpireActivities</job> + </background-jobs> + + <commands> + <command>OCA\Activity\Command\SendEmails</command> + </commands> + + <settings> + <admin>OCA\Activity\Settings\Admin</admin> + <admin-section>OCA\Activity\Settings\AdminSection</admin-section> + <personal>OCA\Activity\Settings\Personal</personal> + <personal-section>OCA\Activity\Settings\PersonalSection</personal-section> + </settings> + + <activity> + <filters> + <filter>OCA\Activity\Filter\AllFilter</filter> + <filter>OCA\Activity\Filter\SelfFilter</filter> + <filter>OCA\Activity\Filter\ByFilter</filter> + </filters> + </activity> + + <navigations> + <navigation> + <name>Activity</name> + <route>activity.Activities.showList</route> + <icon>activity.svg</icon> + <order>1</order> + </navigation> + <navigation> + <name>Activity-Test</name> + <route>activity.Activities.showList</route> + <icon>activity.svg</icon> + <order>2</order> + </navigation> + </navigations> +</info> diff --git a/tests/lib/App/InfoParserTest.php b/tests/lib/App/InfoParserTest.php index 5a3847a71e8e6a62421161a5157cc98b42cd96f1..4fa8b2a06a5f721e737d2cc1a67994f90a64406f 100644 --- a/tests/lib/App/InfoParserTest.php +++ b/tests/lib/App/InfoParserTest.php @@ -47,12 +47,14 @@ class InfoParserTest extends TestCase { $this->parserTest($expectedJson, $xmlFile, self::$cache); } - function providesInfoXml() { - return array( - array('expected-info.json', 'valid-info.xml'), - array(null, 'invalid-info.xml'), - array('expected-info.json', 'valid-info.xml'), - array(null, 'invalid-info.xml'), - ); + public function providesInfoXml(): array { + return [ + ['expected-info.json', 'valid-info.xml'], + [null, 'invalid-info.xml'], + ['expected-info.json', 'valid-info.xml'], + [null, 'invalid-info.xml'], + ['navigation-one-item.json', 'navigation-one-item.xml'], + ['navigation-two-item.json', 'navigation-two-item.xml'], + ]; } } diff --git a/tests/lib/NavigationManagerTest.php b/tests/lib/NavigationManagerTest.php index f552bd2eeed0601369d6b6460d97891519d3e807..31efbce929c5286d9c8061c4ca92ed958f0e342b 100644 --- a/tests/lib/NavigationManagerTest.php +++ b/tests/lib/NavigationManagerTest.php @@ -296,7 +296,9 @@ class NavigationManagerTest extends TestCase { ['logout' => $defaults['logout']] ), ['navigations' => [ - ['route' => 'test.page.index', 'name' => 'Test'] + 'navigation' => [ + ['route' => 'test.page.index', 'name' => 'Test'] + ] ]] ], 'minimalistic-settings' => [ @@ -315,9 +317,11 @@ class NavigationManagerTest extends TestCase { ['logout' => $defaults['logout']] ), ['navigations' => [ - ['route' => 'test.page.index', 'name' => 'Test', 'type' => 'settings'] - ] - ]], + 'navigation' => [ + ['route' => 'test.page.index', 'name' => 'Test', 'type' => 'settings'] + ], + ]] + ], 'admin' => [ array_merge( ['settings' => $defaults['settings']], @@ -335,7 +339,9 @@ class NavigationManagerTest extends TestCase { ['logout' => $defaults['logout']] ), ['navigations' => [ - ['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index', 'name' => 'Test'] + 'navigation' => [ + ['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index', 'name' => 'Test'] + ], ]], true ], @@ -346,7 +352,9 @@ class NavigationManagerTest extends TestCase { ['logout' => $defaults['logout']] ), ['navigations' => [ - ['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index'] + 'navigation' => [ + ['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index'] + ], ]], true ],