diff options
Diffstat (limited to 'lib/private/Dashboard/Manager.php')
-rw-r--r-- | lib/private/Dashboard/Manager.php | 92 |
1 files changed, 49 insertions, 43 deletions
diff --git a/lib/private/Dashboard/Manager.php b/lib/private/Dashboard/Manager.php index 09525693b4f..d4a9eb189ff 100644 --- a/lib/private/Dashboard/Manager.php +++ b/lib/private/Dashboard/Manager.php @@ -3,50 +3,34 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2020 Julius Härtl <jus@bitgrid.net> - * - * @author Joas Schilling <coding@schilljs.com> - * @author Julius Härtl <jus@bitgrid.net> - * - * @license GNU AGPL version 3 or any later version - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OC\Dashboard; use InvalidArgumentException; -use OCP\AppFramework\QueryException; +use OCP\App\IAppManager; +use OCP\Dashboard\IConditionalWidget; use OCP\Dashboard\IManager; use OCP\Dashboard\IWidget; -use OCP\IServerContainer; -use Throwable; +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\ContainerInterface; use Psr\Log\LoggerInterface; +use Throwable; class Manager implements IManager { - /** @var array */ private $lazyWidgets = []; - /** @var IWidget[] */ - private $widgets = []; + /** @var array<string, IWidget> */ + private array $widgets = []; - /** @var IServerContainer */ - private $serverContainer; + private ?IAppManager $appManager = null; - public function __construct(IServerContainer $serverContainer) { - $this->serverContainer = $serverContainer; + public function __construct( + private ContainerInterface $serverContainer, + private LoggerInterface $logger, + ) { } private function registerWidget(IWidget $widget): void { @@ -54,34 +38,51 @@ class Manager implements IManager { throw new InvalidArgumentException('Dashboard widget with this id has already been registered'); } + if (!preg_match('/^[a-z][a-z0-9\-_]*$/', $widget->getId())) { + $this->logger->debug('Deprecated dashboard widget ID provided: "' . $widget->getId() . '" [ ' . get_class($widget) . ' ]. Please use a-z, 0-9, - and _ only, starting with a-z'); + } + $this->widgets[$widget->getId()] = $widget; } - public function lazyRegisterWidget(string $widgetClass): void { - $this->lazyWidgets[] = $widgetClass; + public function lazyRegisterWidget(string $widgetClass, string $appId): void { + $this->lazyWidgets[] = ['class' => $widgetClass, 'appId' => $appId]; } public function loadLazyPanels(): void { - $classes = $this->lazyWidgets; - foreach ($classes as $class) { + if ($this->appManager === null) { + $this->appManager = $this->serverContainer->get(IAppManager::class); + } + $services = $this->lazyWidgets; + foreach ($services as $service) { + /** @psalm-suppress InvalidCatch */ try { + if (!$this->appManager->isEnabledForUser($service['appId'])) { + // all apps are registered, but some may not be enabled for the user + continue; + } /** @var IWidget $widget */ - $widget = $this->serverContainer->query($class); - } catch (QueryException $e) { + $widget = $this->serverContainer->get($service['class']); + } catch (ContainerExceptionInterface $e) { /* * There is a circular dependency between the logger and the registry, so * we can not inject it. Thus the static call. */ \OC::$server->get(LoggerInterface::class)->critical( - 'Could not load lazy dashboard widget: ' . $e->getMessage(), - ['excepiton' => $e] + 'Could not load lazy dashboard widget: ' . $service['class'], + ['exception' => $e] ); + continue; } /** * Try to register the loaded reporter. Theoretically it could be of a wrong * type, so we might get a TypeError here that we should catch. */ try { + if ($widget instanceof IConditionalWidget && !$widget->isEnabled()) { + continue; + } + $this->registerWidget($widget); } catch (Throwable $e) { /* @@ -89,9 +90,10 @@ class Manager implements IManager { * we can not inject it. Thus the static call. */ \OC::$server->get(LoggerInterface::class)->critical( - 'Could not register lazy dashboard widget: ' . $e->getMessage(), - ['excepiton' => $e] + 'Could not register lazy dashboard widget: ' . $service['class'], + ['exception' => $e] ); + continue; } try { @@ -100,7 +102,7 @@ class Manager implements IManager { $endTime = microtime(true); $duration = $endTime - $startTime; if ($duration > 1) { - \OC::$server->get(LoggerInterface::class)->error( + \OC::$server->get(LoggerInterface::class)->info( 'Dashboard widget {widget} took {duration} seconds to load.', [ 'widget' => $widget->getId(), @@ -110,14 +112,18 @@ class Manager implements IManager { } } catch (Throwable $e) { \OC::$server->get(LoggerInterface::class)->critical( - 'Error during dashboard widget loading: ' . $e->getMessage(), - ['excepiton' => $e] + 'Error during dashboard widget loading: ' . $service['class'], + ['exception' => $e] ); + continue; } } $this->lazyWidgets = []; } + /** + * @return array<string, IWidget> + */ public function getWidgets(): array { $this->loadLazyPanels(); return $this->widgets; |