diff --git a/.woodpecker/.publish.yml b/.woodpecker/.publish.yml index d369dcf..2a4776b 100644 --- a/.woodpecker/.publish.yml +++ b/.woodpecker/.publish.yml @@ -18,12 +18,9 @@ steps: "Create signature": image: nextcloud:25 + secrets: [app_certificate, app_public_certificate] volumes: *volumes environment: - APP_CERTIFICATE: - from_secret: app_certificate - APP_PUBLIC_CERTIFICATE: - from_secret: app_public_certificate SQLITE_DATABASE: /var/www/data/data.db NEXTCLOUD_ADMIN_USER: admin NEXTCLOUD_ADMIN_PASSWORD: admin @@ -42,9 +39,7 @@ steps: "Create package": image: deblan/php:8.3 volumes: *volumes - environment: - APP_CERTIFICATE: - from_secret: app_certificate + secrets: [app_certificate] commands: - cd "/builds/$CI_COMMIT_SHA" - apt-get update diff --git a/CHANGELOG.md b/CHANGELOG.md index d55690a..80fe366 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,19 +1,5 @@ ## [Unreleased] -## 4.1.1 -### Fixed -* fix(CssController): add missing NoCSRFRequired import (#397) -* fix(SideMenu): ncApps must be an array (#369) - -## 4.1.0 -### Added -* add compatibility with NC31 -### Fixed -* fix(service): add service constructor arguments -* fix(settings): remove non-existing and unused ILogger service -### Changed -* refactor(controller): usage of attributes instead of annotations - ## 4.0.1 ### Fixed * fix top menu labels (fix #368) diff --git a/appinfo/info.xml b/appinfo/info.xml index d6a0f5f..cf4cfbf 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -1,5 +1,6 @@ - - + + side_menu Custom menu Modify the display of the menu. @@ -16,7 +17,7 @@ You can report a bug or request a feature by opening an issue. Requirements: -* PHP >= 8.1 +* PHP >= 8.0 * App `theming` enabled If you like this application and if you want to support the development: @@ -31,9 +32,9 @@ Notice Because I believe in a free and decentralized Internet, [Gitnet](https://gitnet.fr) is **self-hosted at home**. In case of downtime, you can download **Custom Menu** from [here](https://kim.deblan.fr/~side_menu/). ]]> - 4.1.1 + 4.0.1 agpl - Simon Vieille + Simon Vieille SideMenu https://deblan.gitnet.page/side_menu_doc/ @@ -41,20 +42,20 @@ In case of downtime, you can download **Custom Menu** from [here](https://kim.de customization https://gitnet.fr/deblan/side_menu - + https://matrix.to/#/!TFPucDATKODpHNVAtu:neutralnetwork.org?via=neutralnetwork.org https://gitnet.fr/deblan/side_menu/issues https://gitnet.fr/deblan/side_menu - - - - - - - - + https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc19_default_menu.png + https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/admin_settings.png + https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/n19_big_menu.png + https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc18_menu_always_displayed.png + https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc20_big_menu_responsive.png + https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/personal_settings.png + https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc25_big_menu.png + https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc25_default_menu.png - - + + OCA\SideMenu\Settings\Admin diff --git a/appinfo/routes.php b/appinfo/routes.php new file mode 100644 index 0000000..bdc3fba --- /dev/null +++ b/appinfo/routes.php @@ -0,0 +1,31 @@ +. + */ + +return [ + 'routes' => [ + ['name' => 'App#index', 'url' => '/', 'verb' => 'GET'], + ['name' => 'Css#stylesheet', 'url' => '/css/stylesheet', 'verb' => 'GET'], + ['name' => 'Js#script', 'url' => '/js/script', 'verb' => 'GET'], + ['name' => 'Js#config', 'url' => '/js/config', 'verb' => 'GET'], + ['name' => 'Nav#items', 'url' => '/nav/items', 'verb' => 'GET'], + ['name' => 'PersonalSetting#valueSet', 'url' => '/personalSetting/valueSet', 'verb' => 'POST'], + ['name' => 'AdminSetting#removeCache', 'url' => '/admin/cache/remove', 'verb' => 'GET'], + ['name' => 'AdminSetting#exportConfiguration', 'url' => '/admin/config/export', 'verb' => 'GET'], + ], +]; diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index c5181ef..b812fd7 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -3,7 +3,6 @@ namespace OCA\SideMenu\AppInfo; use OC; -use OC\App\AppStore\Fetcher\CategoryFetcher; use OC\Security\CSP\ContentSecurityPolicyNonceManager; use OC\User\User; use OCA\SideMenu\Service\AppRepository; @@ -13,11 +12,7 @@ use OCP\AppFramework\App; use OCP\AppFramework\Bootstrap\IBootContext; use OCP\AppFramework\Bootstrap\IBootstrap; use OCP\AppFramework\Bootstrap\IRegistrationContext; -use OCP\EventDispatcher\IEventDispatcher; -use OCP\IConfig; -use OCP\INavigationManager; use OCP\IUserSession; -use OCP\L10N\IFactory; use OCP\Util; use Psr\Container\ContainerInterface; @@ -31,7 +26,6 @@ class Application extends App implements IBootstrap public const APP_ID = 'side_menu'; public const APP_NAME = 'Custom menu'; - /** * @var OC\AllConfig */ @@ -47,55 +41,14 @@ class Application extends App implements IBootstrap */ protected $user; + /** + * {@inheritdoc} + */ public function __construct(array $urlParams = []) { parent::__construct(self::APP_ID, $urlParams); } - public function register(IRegistrationContext $context): void - { - $context->registerService(CategoryRepository::class, function (ContainerInterface $c) { - return new CategoryRepository( - $c->get(CategoryFetcher::class), - $c->get(ConfigProxy::class), - $c->get(IConfig::class), - $c->get(IFactory::class), - $c->get(IUserSession::class) - ); - }); - - $context->registerService(AppRepository::class, function (ContainerInterface $c) { - return new AppRepository( - $c->get(\OC_App::class), - $c->get(INavigationManager::class), - $c->get(IFactory::class), - $c->get(ConfigProxy::class), - $c->get(CategoryRepository::class), - $c->get(IEventDispatcher::class), - $c->get(IUserSession::class) - ); - }); - - $context->registerService(ConfigProxy::class, function (ContainerInterface $c) { - return new ConfigProxy( - $c->get(IConfig::class), - ); - }); - } - - public function boot(IBootContext $context): void - { - $this->config = \OC::$server->getConfig(); - $this->cspnm = \OC::$server->getContentSecurityPolicyNonceManager(); - $this->user = \OC::$server[IUserSession::class]->getUser(); - - if (!$this->isEnabled()) { - return; - } - - $this->addAssets(); - } - protected function isEnabled(): bool { $enabled = true; @@ -144,14 +97,38 @@ class Application extends App implements IBootstrap $cache = $this->config->getAppValue(self::APP_ID, 'cache', '0'); foreach ($assets as $value) { - $route = \OC::$server->getURLGenerator()->linkToRoute( - $value['route'], - ['v' => $cache] - ); - + $route = OC::$server->getURLGenerator()->linkToRoute($value['route'], ['v' => $cache]); $value['attr'][$value['route_attr']] = $route; Util::addHeader($value['type'], $value['attr'], ''); } } + + public function register(IRegistrationContext $context): void + { + $context->registerService('AppRepository', function () { + return new AppRepository(); + }); + + $context->registerService('CategoryRepository', function () { + return new CategoryRepository(); + }); + + $context->registerService('ConfigProxy', function () { + return new ConfigProxy(); + }); + } + + public function boot(IBootContext $context): void + { + $this->config = OC::$server->getConfig(); + $this->cspnm = OC::$server->getContentSecurityPolicyNonceManager(); + $this->user = OC::$server[IUserSession::class]->getUser(); + + if (!$this->isEnabled()) { + return; + } + + $this->addAssets(); + } } diff --git a/lib/Controller/AdminSettingController.php b/lib/Controller/AdminSettingController.php index 279a34c..4ecfbea 100644 --- a/lib/Controller/AdminSettingController.php +++ b/lib/Controller/AdminSettingController.php @@ -1,5 +1,4 @@ config->setAppValue(Application::APP_ID, 'cache-categories', '[]'); @@ -51,8 +49,9 @@ class AdminSettingController extends Controller ]).'#more'); } - #[NoCSRFRequired] - #[FrontpageRoute(verb: 'GET', url: '/admin/config/export')] + /** + * @NoCSRFRequired + */ public function exportConfiguration(): DataDownloadResponse { $keys = $this->config->getAppKeys(Application::APP_ID); diff --git a/lib/Controller/AppController.php b/lib/Controller/AppController.php index f8cb357..dd2993e 100644 --- a/lib/Controller/AppController.php +++ b/lib/Controller/AppController.php @@ -1,5 +1,4 @@ getUser(); + $user = OC::$server[IUserSession::class]->getUser(); $topMenuApps = $this->config->getAppValueArray('top-menu-apps', '[]'); $hiddenApps = $this->config->getAppValueArray('big-menu-hidden-apps', '[]'); $isForced = $this->config->getAppValueBool('force', '0'); @@ -75,7 +73,7 @@ class AppController extends Controller protected function redirectToApp($app, bool $isHref = false): RedirectResponse { if (!$isHref) { - $isIgnoreFrontController = true === \OC::$server->getConfig()->getSystemValue( + $isIgnoreFrontController = true === OC::$server->getConfig()->getSystemValue( 'htaccess.IgnoreFrontController', false ); diff --git a/lib/Controller/CssController.php b/lib/Controller/CssController.php index 5b3a2dd..93fafb3 100644 --- a/lib/Controller/CssController.php +++ b/lib/Controller/CssController.php @@ -1,5 +1,4 @@ user = \OC::$server[IUserSession::class]->getUser(); + $this->user = OC::$server[IUserSession::class]->getUser(); } - #[NoCSRFRequired] - #[NoAdminRequired] - #[PublicPage] - #[FrontpageRoute(verb: 'GET', url: '/css/stylesheet')] + /** + * @NoAdminRequired + * @NoCSRFRequired + * @PublicPage + */ public function stylesheet(): TemplateResponse { $response = new TemplateResponse(Application::APP_ID, 'css/stylesheet', $this->getConfig(), 'blank'); diff --git a/lib/Controller/JsController.php b/lib/Controller/JsController.php index 8f06345..a1b26e3 100644 --- a/lib/Controller/JsController.php +++ b/lib/Controller/JsController.php @@ -1,5 +1,4 @@ themingDefaults = $themingDefaults; - $this->user = \OC::$server[IUserSession::class]->getUser(); + $this->user = OC::$server[IUserSession::class]->getUser(); $this->config = $config; $this->l10nFactory = $l10nFactory; } - #[NoCSRFRequired] - #[NoAdminRequired] - #[PublicPage] - #[FrontpageRoute(verb: 'GET', url: '/js/script')] + /** + * @NoAdminRequired + * @NoCSRFRequired + * @PublicPage + */ public function script(): TemplateResponse { $response = new TemplateResponse(Application::APP_ID, 'js/script', $this->getConfig(), 'blank'); @@ -66,10 +63,11 @@ class JsController extends Controller return $response; } - #[NoCSRFRequired] - #[NoAdminRequired] - #[PublicPage] - #[FrontpageRoute(verb: 'GET', url: '/js/config')] + /** + * @NoAdminRequired + * @NoCSRFRequired + * @PublicPage + */ public function config(): JSONResponse { return new JSONResponse($this->getConfig()); @@ -111,10 +109,10 @@ class JsController extends Controller $targetBlankApps = $userTargetBlankApps; } - $isAvatarSet = \OC::$server->getAvatarManager()->getAvatar($this->user->getUid())->exists(); + $isAvatarSet = OC::$server->getAvatarManager()->getAvatar($this->user->getUid())->exists(); if ($useAvatar && $isAvatarSet) { - $avatar = \OC::$server->getURLGenerator()->linkToRoute('core.avatar.getAvatar', [ + $avatar = OC::$server->getURLGenerator()->linkToRoute('core.avatar.getAvatar', [ 'userId' => $this->user->getUid(), 'size' => 128, 'v' => $this->config->getUserValueInt($this->user, 'avatar', 'version', 0), @@ -122,13 +120,13 @@ class JsController extends Controller } if ($this->config->getAppValueBool('show-settings', '0')) { - $settingsNav = \OC::$server->getNavigationManager()->getAll('settings'); + $settingsNav = OC::$server->getNavigationManager()->getAll('settings'); if (isset($settingsNav['settings'])) { $settings = [ 'href' => $settingsNav['settings']['href'], 'name' => $settingsNav['settings']['name'], - 'avatar' => \OC::$server->getURLGenerator()->linkToRoute('core.avatar.getAvatar', [ + 'avatar' => OC::$server->getURLGenerator()->linkToRoute('core.avatar.getAvatar', [ 'userId' => $this->user->getUid(), 'size' => 32, 'v' => $this->config->getUserValueInt($this->user, 'avatar', 'version', 0), @@ -138,7 +136,7 @@ class JsController extends Controller } } - $indexUrl = \OC::$server->getURLGenerator()->linkTo('', 'index.php'); + $indexUrl = OC::$server->getURLGenerator()->linkTo('', 'index.php'); return [ 'opener-position' => $this->config->getAppValue('opener-position', 'before'), diff --git a/lib/Controller/NavController.php b/lib/Controller/NavController.php index 1d90849..21fb23c 100644 --- a/lib/Controller/NavController.php +++ b/lib/Controller/NavController.php @@ -1,5 +1,4 @@ getUser(); + $user = OC::$server[IUserSession::class]->getUser(); $items = []; if (!$user) { diff --git a/lib/Controller/PersonalSettingController.php b/lib/Controller/PersonalSettingController.php index 482a7c6..e4f6331 100644 --- a/lib/Controller/PersonalSettingController.php +++ b/lib/Controller/PersonalSettingController.php @@ -1,5 +1,4 @@ url->imagePath(Application::APP_ID, 'icon.svg'); diff --git a/lib/Settings/Personal.php b/lib/Settings/Personal.php index 2aebec8..efa5e16 100644 --- a/lib/Settings/Personal.php +++ b/lib/Settings/Personal.php @@ -1,5 +1,4 @@ url->imagePath(Application::APP_ID, 'icon.svg'); diff --git a/package.json b/package.json index f002d50..2648b1f 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "@nextcloud/stylelint-config": "^3.0.1", "@nextcloud/typings": "^1.9.1", "@nextcloud/webpack-vue-config": "^6.0.1", - "@simplewebauthn/types": "^10.0.0", + "@simplewebauthn/types": "^12.0.0", "@types/dockerode": "^3.3.29", "@types/wait-on": "^5.3.4", "@vue/tsconfig": "^0.5.1", diff --git a/src/SideMenu.vue b/src/SideMenu.vue index 00bd3d1..2e8bfa3 100644 --- a/src/SideMenu.vue +++ b/src/SideMenu.vue @@ -86,7 +86,7 @@ export default { }, methods: { retrieveApps() { - const ncApps = loadState('core', 'apps', []) + const ncApps = loadState('core', 'apps', {}) let orders = {} let finalApps = []