diff options
Diffstat (limited to 'apps/files_versions/lib/AppInfo/Application.php')
-rw-r--r-- | apps/files_versions/lib/AppInfo/Application.php | 167 |
1 files changed, 134 insertions, 33 deletions
diff --git a/apps/files_versions/lib/AppInfo/Application.php b/apps/files_versions/lib/AppInfo/Application.php index f75fea1e117..29158276415 100644 --- a/apps/files_versions/lib/AppInfo/Application.php +++ b/apps/files_versions/lib/AppInfo/Application.php @@ -1,50 +1,151 @@ <?php + /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Victor Dubiniuk <dubiniuk@owncloud.com> - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * 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, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ - namespace OCA\Files_Versions\AppInfo; +use OC\KnownUser\KnownUserService; +use OCA\DAV\CalDAV\Proxy\ProxyMapper; +use OCA\DAV\Connector\Sabre\Principal; +use OCA\Files\Event\LoadAdditionalScriptsEvent; +use OCA\Files\Event\LoadSidebar; +use OCA\Files_Versions\Capabilities; +use OCA\Files_Versions\Events\VersionRestoredEvent; +use OCA\Files_Versions\Listener\FileEventsListener; +use OCA\Files_Versions\Listener\LegacyRollbackListener; +use OCA\Files_Versions\Listener\LoadAdditionalListener; +use OCA\Files_Versions\Listener\LoadSidebarListener; +use OCA\Files_Versions\Listener\VersionAuthorListener; +use OCA\Files_Versions\Listener\VersionStorageMoveListener; +use OCA\Files_Versions\Versions\IVersionManager; +use OCA\Files_Versions\Versions\VersionManager; +use OCP\Accounts\IAccountManager; +use OCP\App\IAppManager; use OCP\AppFramework\App; -use OCA\Files_Versions\Expiration; +use OCP\AppFramework\Bootstrap\IBootContext; +use OCP\AppFramework\Bootstrap\IBootstrap; +use OCP\AppFramework\Bootstrap\IRegistrationContext; +use OCP\Files\Events\Node\BeforeNodeCopiedEvent; +use OCP\Files\Events\Node\BeforeNodeDeletedEvent; +use OCP\Files\Events\Node\BeforeNodeRenamedEvent; +use OCP\Files\Events\Node\BeforeNodeTouchedEvent; +use OCP\Files\Events\Node\BeforeNodeWrittenEvent; +use OCP\Files\Events\Node\NodeCopiedEvent; +use OCP\Files\Events\Node\NodeCreatedEvent; +use OCP\Files\Events\Node\NodeDeletedEvent; +use OCP\Files\Events\Node\NodeRenamedEvent; +use OCP\Files\Events\Node\NodeTouchedEvent; +use OCP\Files\Events\Node\NodeWrittenEvent; +use OCP\IConfig; +use OCP\IGroupManager; +use OCP\IServerContainer; +use OCP\IUserManager; +use OCP\IUserSession; +use OCP\L10N\IFactory; +use OCP\Server; +use OCP\Share\IManager as IShareManager; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; -class Application extends App { - public function __construct(array $urlParams = array()) { - parent::__construct('files_versions', $urlParams); +class Application extends App implements IBootstrap { + public const APP_ID = 'files_versions'; - $container = $this->getContainer(); + public function __construct(array $urlParams = []) { + parent::__construct(self::APP_ID, $urlParams); + } - /* + public function register(IRegistrationContext $context): void { + /** * Register capabilities */ - $container->registerCapability('OCA\Files_Versions\Capabilities'); + $context->registerCapability(Capabilities::class); - /* - * Register expiration + /** + * Register $principalBackend for the DAV collection */ - $container->registerService('Expiration', function($c) { - return new Expiration( - $c->query('ServerContainer')->getConfig(), - $c->query('OCP\AppFramework\Utility\ITimeFactory') + $context->registerService('principalBackend', function (ContainerInterface $c) { + /** @var IServerContainer $server */ + $server = $c->get(IServerContainer::class); + return new Principal( + $server->get(IUserManager::class), + $server->get(IGroupManager::class), + Server::get(IAccountManager::class), + $server->get(IShareManager::class), + $server->get(IUserSession::class), + $server->get(IAppManager::class), + $server->get(ProxyMapper::class), + $server->get(KnownUserService::class), + $server->get(IConfig::class), + $server->get(IFactory::class), ); }); + + $context->registerServiceAlias(IVersionManager::class, VersionManager::class); + + /** + * Register Events + */ + $context->registerEventListener(LoadAdditionalScriptsEvent::class, LoadAdditionalListener::class); + $context->registerEventListener(LoadSidebar::class, LoadSidebarListener::class); + + $context->registerEventListener(BeforeNodeRenamedEvent::class, VersionStorageMoveListener::class); + $context->registerEventListener(NodeRenamedEvent::class, VersionStorageMoveListener::class); + $context->registerEventListener(BeforeNodeCopiedEvent::class, VersionStorageMoveListener::class); + $context->registerEventListener(NodeCopiedEvent::class, VersionStorageMoveListener::class); + + $context->registerEventListener(NodeCreatedEvent::class, FileEventsListener::class); + $context->registerEventListener(BeforeNodeTouchedEvent::class, FileEventsListener::class); + $context->registerEventListener(NodeTouchedEvent::class, FileEventsListener::class); + $context->registerEventListener(BeforeNodeWrittenEvent::class, FileEventsListener::class); + $context->registerEventListener(NodeWrittenEvent::class, FileEventsListener::class); + $context->registerEventListener(BeforeNodeDeletedEvent::class, FileEventsListener::class); + $context->registerEventListener(NodeDeletedEvent::class, FileEventsListener::class); + $context->registerEventListener(NodeRenamedEvent::class, FileEventsListener::class); + $context->registerEventListener(NodeCopiedEvent::class, FileEventsListener::class); + $context->registerEventListener(BeforeNodeRenamedEvent::class, FileEventsListener::class); + $context->registerEventListener(BeforeNodeCopiedEvent::class, FileEventsListener::class); + + // we add the version author listener with lower priority to make sure new versions already are created by FileEventsListener + $context->registerEventListener(NodeWrittenEvent::class, VersionAuthorListener::class, -1); + + $context->registerEventListener(VersionRestoredEvent::class, LegacyRollbackListener::class); + } + + public function boot(IBootContext $context): void { + $context->injectFn(\Closure::fromCallable([$this, 'registerVersionBackends'])); + } + + public function registerVersionBackends(ContainerInterface $container, IAppManager $appManager, LoggerInterface $logger): void { + foreach ($appManager->getEnabledApps() as $app) { + $appInfo = $appManager->getAppInfo($app); + if (isset($appInfo['versions'])) { + $backends = $appInfo['versions']; + foreach ($backends as $backend) { + if (isset($backend['@value'])) { + $this->loadBackend($backend, $container, $logger); + } else { + foreach ($backend as $singleBackend) { + $this->loadBackend($singleBackend, $container, $logger); + } + } + } + } + } + } + + private function loadBackend(array $backend, ContainerInterface $container, LoggerInterface $logger): void { + /** @var IVersionManager $versionManager */ + $versionManager = $container->get(IVersionManager::class); + $class = $backend['@value']; + $for = $backend['@attributes']['for']; + try { + $backendObject = $container->get($class); + $versionManager->registerBackend($for, $backendObject); + } catch (\Exception $e) { + $logger->error($e->getMessage(), ['exception' => $e]); + } } } |