From 8f23cc82596d11ccd71942a6d93dc9d643b0fe1a Mon Sep 17 00:00:00 2001 From: Louis Chemineau Date: Tue, 29 Nov 2022 14:58:27 +0100 Subject: Rename Hooks.php to FileEventsListener.php Signed-off-by: Louis Chemineau --- .../composer/composer/autoload_classmap.php | 2 +- .../composer/composer/autoload_static.php | 2 +- apps/files_versions/lib/AppInfo/Application.php | 18 +- apps/files_versions/lib/Hooks.php | 209 -------------------- .../lib/Listener/FileEventsListener.php | 210 +++++++++++++++++++++ 5 files changed, 221 insertions(+), 220 deletions(-) delete mode 100644 apps/files_versions/lib/Hooks.php create mode 100644 apps/files_versions/lib/Listener/FileEventsListener.php diff --git a/apps/files_versions/composer/composer/autoload_classmap.php b/apps/files_versions/composer/composer/autoload_classmap.php index 07dc290b604..25a1e1c4913 100644 --- a/apps/files_versions/composer/composer/autoload_classmap.php +++ b/apps/files_versions/composer/composer/autoload_classmap.php @@ -18,7 +18,7 @@ return array( 'OCA\\Files_Versions\\Db\\VersionsMapper' => $baseDir . '/../lib/Db/VersionsMapper.php', 'OCA\\Files_Versions\\Events\\CreateVersionEvent' => $baseDir . '/../lib/Events/CreateVersionEvent.php', 'OCA\\Files_Versions\\Expiration' => $baseDir . '/../lib/Expiration.php', - 'OCA\\Files_Versions\\Hooks' => $baseDir . '/../lib/Hooks.php', + 'OCA\\Files_Versions\\Listener\\FileEventsListener' => $baseDir . '/../lib/Listener/FileEventsListener.php', 'OCA\\Files_Versions\\Listener\\LoadAdditionalListener' => $baseDir . '/../lib/Listener/LoadAdditionalListener.php', 'OCA\\Files_Versions\\Listener\\LoadSidebarListener' => $baseDir . '/../lib/Listener/LoadSidebarListener.php', 'OCA\\Files_Versions\\Migration\\Version1020Date20221114144058' => $baseDir . '/../lib/Migration/Version1020Date20221114144058.php', diff --git a/apps/files_versions/composer/composer/autoload_static.php b/apps/files_versions/composer/composer/autoload_static.php index 59fa10b4aa0..ee445fe9636 100644 --- a/apps/files_versions/composer/composer/autoload_static.php +++ b/apps/files_versions/composer/composer/autoload_static.php @@ -33,7 +33,7 @@ class ComposerStaticInitFiles_Versions 'OCA\\Files_Versions\\Db\\VersionsMapper' => __DIR__ . '/..' . '/../lib/Db/VersionsMapper.php', 'OCA\\Files_Versions\\Events\\CreateVersionEvent' => __DIR__ . '/..' . '/../lib/Events/CreateVersionEvent.php', 'OCA\\Files_Versions\\Expiration' => __DIR__ . '/..' . '/../lib/Expiration.php', - 'OCA\\Files_Versions\\Hooks' => __DIR__ . '/..' . '/../lib/Hooks.php', + 'OCA\\Files_Versions\\Listener\\FileEventsListener' => __DIR__ . '/..' . '/../lib/Listener/FileEventsListener.php', 'OCA\\Files_Versions\\Listener\\LoadAdditionalListener' => __DIR__ . '/..' . '/../lib/Listener/LoadAdditionalListener.php', 'OCA\\Files_Versions\\Listener\\LoadSidebarListener' => __DIR__ . '/..' . '/../lib/Listener/LoadSidebarListener.php', 'OCA\\Files_Versions\\Migration\\Version1020Date20221114144058' => __DIR__ . '/..' . '/../lib/Migration/Version1020Date20221114144058.php', diff --git a/apps/files_versions/lib/AppInfo/Application.php b/apps/files_versions/lib/AppInfo/Application.php index 08c49f280af..7ab6d0ddc34 100644 --- a/apps/files_versions/lib/AppInfo/Application.php +++ b/apps/files_versions/lib/AppInfo/Application.php @@ -33,7 +33,7 @@ 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\Hooks; +use OCA\Files_Versions\Listener\FileEventsListener; use OCA\Files_Versions\Listener\LoadAdditionalListener; use OCA\Files_Versions\Listener\LoadSidebarListener; use OCA\Files_Versions\Versions\IVersionManager; @@ -105,14 +105,14 @@ class Application extends App implements IBootstrap { $context->registerEventListener(LoadAdditionalScriptsEvent::class, LoadAdditionalListener::class); $context->registerEventListener(LoadSidebar::class, LoadSidebarListener::class); - $context->registerEventListener(BeforeNodeWrittenEvent::class, Hooks::class); - $context->registerEventListener(NodeWrittenEvent::class, Hooks::class); - $context->registerEventListener(BeforeNodeDeletedEvent::class, Hooks::class); - $context->registerEventListener(NodeDeletedEvent::class, Hooks::class); - $context->registerEventListener(NodeRenamedEvent::class, Hooks::class); - $context->registerEventListener(NodeCopiedEvent::class, Hooks::class); - $context->registerEventListener(BeforeNodeRenamedEvent::class, Hooks::class); - $context->registerEventListener(BeforeNodeCopiedEvent::class, Hooks::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); } public function boot(IBootContext $context): void { diff --git a/apps/files_versions/lib/Hooks.php b/apps/files_versions/lib/Hooks.php deleted file mode 100644 index ba22349e221..00000000000 --- a/apps/files_versions/lib/Hooks.php +++ /dev/null @@ -1,209 +0,0 @@ - - * @author Björn Schießle - * @author Christoph Wurst - * @author John Molakvoæ - * @author Jörn Friedrich Dreyer - * @author Morris Jobke - * @author Robin Appelman - * @author Robin McCorkell - * @author Sam Tuke - * - * @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 - * - */ -namespace OCA\Files_Versions; - -use OC\Files\Filesystem; -use OC\Files\Mount\MoveableMount; -use OC\Files\View; -use OCA\Files_Versions\Db\VersionEntity; -use OCA\Files_Versions\Db\VersionsMapper; -use OCP\EventDispatcher\Event; -use OCP\EventDispatcher\IEventListener; -use OCP\Files\Events\Node\BeforeNodeCopiedEvent; -use OCP\Files\Events\Node\BeforeNodeDeletedEvent; -use OCP\Files\Events\Node\BeforeNodeRenamedEvent; -use OCP\Files\Events\Node\BeforeNodeWrittenEvent; -use OCP\Files\Events\Node\NodeCopiedEvent; -use OCP\Files\Events\Node\NodeDeletedEvent; -use OCP\Files\Events\Node\NodeRenamedEvent; -use OCP\Files\Events\Node\NodeWrittenEvent; -use OCP\Files\Folder; -use OCP\Files\IMimeTypeLoader; -use OCP\Files\Node; - -class Hooks implements IEventListener { - private Folder $userFolder; - private VersionsMapper $versionsMapper; - /** - * @var array - */ - private array $versionsCreated = []; - private IMimeTypeLoader $mimeTypeLoader; - - public function __construct( - Folder $userFolder, - VersionsMapper $versionsMapper, - IMimeTypeLoader $mimeTypeLoader - ) { - $this->userFolder = $userFolder; - $this->versionsMapper = $versionsMapper; - $this->mimeTypeLoader = $mimeTypeLoader; - } - - public function handle(Event $event): void { - if ($event instanceof BeforeNodeWrittenEvent) { - $this->write_hook($event->getNode()); - } - - if ($event instanceof NodeWrittenEvent) { - $this->post_write_hook($event->getNode()); - } - - if ($event instanceof BeforeNodeDeletedEvent) { - $this->pre_remove_hook($event->getNode()); - } - - if ($event instanceof NodeDeletedEvent) { - $this->remove_hook($event->getNode()); - } - - if ($event instanceof NodeRenamedEvent) { - $this->rename_hook($event->getSource(), $event->getTarget()); - } - - if ($event instanceof NodeCopiedEvent) { - $this->copy_hook($event->getSource(), $event->getTarget()); - } - - if ($event instanceof BeforeNodeRenamedEvent) { - $this->pre_renameOrCopy_hook($event->getSource(), $event->getTarget()); - } - - if ($event instanceof BeforeNodeCopiedEvent) { - $this->pre_renameOrCopy_hook($event->getSource(), $event->getTarget()); - } - } - - /** - * listen to write event. - */ - public function write_hook(Node $node): void { - $path = $this->userFolder->getRelativePath($node->getPath()); - $result = Storage::store($path); - - if ($result === false) { - return; - } - - // Store the result of the version creation so it can be used in post_write_hook. - $this->versionsCreated[$node->getId()] = true; - } - - /** - * listen to post_write event. - */ - public function post_write_hook(Node $node): void { - if (!array_key_exists($node->getId(), $this->versionsCreated)) { - return; - } - - unset($this->versionsCreated[$node->getId()]); - - $versionEntity = new VersionEntity(); - $versionEntity->setFileId($node->getId()); - $versionEntity->setTimestamp($node->getMTime()); - $versionEntity->setSize($node->getSize()); - $versionEntity->setMimetype($this->mimeTypeLoader->getId($node->getMimetype())); - $versionEntity->setMetadata([]); - $this->versionsMapper->insert($versionEntity); - } - - /** - * Erase versions of deleted file - * - * This function is connected to the delete signal of OC_Filesystem - * cleanup the versions directory if the actual file gets deleted - */ - public function remove_hook(Node $node): void { - $path = $this->userFolder->getRelativePath($node->getPath()); - Storage::delete($path); - $this->versionsMapper->deleteAllVersionsForFileId($node->getId()); - } - - /** - * mark file as "deleted" so that we can clean up the versions if the file is gone - */ - public function pre_remove_hook(Node $node): void { - $path = $this->userFolder->getRelativePath($node->getPath()); - Storage::markDeletedFile($path); - } - - /** - * rename/move versions of renamed/moved files - * - * This function is connected to the rename signal of OC_Filesystem and adjust the name and location - * of the stored versions along the actual file - */ - public function rename_hook(Node $source, Node $target): void { - $oldPath = $this->userFolder->getRelativePath($source->getPath()); - $newPath = $this->userFolder->getRelativePath($target->getPath()); - Storage::renameOrCopy($oldPath, $newPath, 'rename'); - } - - /** - * copy versions of copied files - * - * This function is connected to the copy signal of OC_Filesystem and copies the - * the stored versions to the new location - */ - public function copy_hook(Node $source, Node $target): void { - $oldPath = $this->userFolder->getRelativePath($source->getPath()); - $newPath = $this->userFolder->getRelativePath($target->getPath()); - Storage::renameOrCopy($oldPath, $newPath, 'copy'); - } - - /** - * Remember owner and the owner path of the source file. - * If the file already exists, then it was a upload of a existing file - * over the web interface and we call Storage::store() directly - * - * - */ - public function pre_renameOrCopy_hook(Node $source, Node $target): void { - // if we rename a movable mount point, then the versions don't have - // to be renamed - $oldPath = $this->userFolder->getRelativePath($source->getPath()); - $newPath = $this->userFolder->getRelativePath($target->getPath()); - $absOldPath = Filesystem::normalizePath('/' . \OC_User::getUser() . '/files' . $oldPath); - $manager = Filesystem::getMountManager(); - $mount = $manager->find($absOldPath); - $internalPath = $mount->getInternalPath($absOldPath); - if ($internalPath === '' and $mount instanceof MoveableMount) { - return; - } - - $view = new View(\OC_User::getUser() . '/files'); - if ($view->file_exists($newPath)) { - Storage::store($newPath); - } else { - Storage::setSourcePathAndUser($oldPath); - } - } -} diff --git a/apps/files_versions/lib/Listener/FileEventsListener.php b/apps/files_versions/lib/Listener/FileEventsListener.php new file mode 100644 index 00000000000..0633155f7cf --- /dev/null +++ b/apps/files_versions/lib/Listener/FileEventsListener.php @@ -0,0 +1,210 @@ + + * @author Björn Schießle + * @author Christoph Wurst + * @author John Molakvoæ + * @author Jörn Friedrich Dreyer + * @author Morris Jobke + * @author Robin Appelman + * @author Robin McCorkell + * @author Sam Tuke + * + * @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 + * + */ +namespace OCA\Files_Versions\Listener; + +use OC\Files\Filesystem; +use OC\Files\Mount\MoveableMount; +use OC\Files\View; +use OCA\Files_Versions\Db\VersionEntity; +use OCA\Files_Versions\Db\VersionsMapper; +use OCA\Files_Versions\Storage; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\Files\Events\Node\BeforeNodeCopiedEvent; +use OCP\Files\Events\Node\BeforeNodeDeletedEvent; +use OCP\Files\Events\Node\BeforeNodeRenamedEvent; +use OCP\Files\Events\Node\BeforeNodeWrittenEvent; +use OCP\Files\Events\Node\NodeCopiedEvent; +use OCP\Files\Events\Node\NodeDeletedEvent; +use OCP\Files\Events\Node\NodeRenamedEvent; +use OCP\Files\Events\Node\NodeWrittenEvent; +use OCP\Files\Folder; +use OCP\Files\IMimeTypeLoader; +use OCP\Files\Node; + +class FileEventsListener implements IEventListener { + private Folder $userFolder; + private VersionsMapper $versionsMapper; + /** + * @var array + */ + private array $versionsCreated = []; + private IMimeTypeLoader $mimeTypeLoader; + + public function __construct( + Folder $userFolder, + VersionsMapper $versionsMapper, + IMimeTypeLoader $mimeTypeLoader + ) { + $this->userFolder = $userFolder; + $this->versionsMapper = $versionsMapper; + $this->mimeTypeLoader = $mimeTypeLoader; + } + + public function handle(Event $event): void { + if ($event instanceof BeforeNodeWrittenEvent) { + $this->write_hook($event->getNode()); + } + + if ($event instanceof NodeWrittenEvent) { + $this->post_write_hook($event->getNode()); + } + + if ($event instanceof BeforeNodeDeletedEvent) { + $this->pre_remove_hook($event->getNode()); + } + + if ($event instanceof NodeDeletedEvent) { + $this->remove_hook($event->getNode()); + } + + if ($event instanceof NodeRenamedEvent) { + $this->rename_hook($event->getSource(), $event->getTarget()); + } + + if ($event instanceof NodeCopiedEvent) { + $this->copy_hook($event->getSource(), $event->getTarget()); + } + + if ($event instanceof BeforeNodeRenamedEvent) { + $this->pre_renameOrCopy_hook($event->getSource(), $event->getTarget()); + } + + if ($event instanceof BeforeNodeCopiedEvent) { + $this->pre_renameOrCopy_hook($event->getSource(), $event->getTarget()); + } + } + + /** + * listen to write event. + */ + public function write_hook(Node $node): void { + $path = $this->userFolder->getRelativePath($node->getPath()); + $result = Storage::store($path); + + if ($result === false) { + return; + } + + // Store the result of the version creation so it can be used in post_write_hook. + $this->versionsCreated[$node->getId()] = true; + } + + /** + * listen to post_write event. + */ + public function post_write_hook(Node $node): void { + if (!array_key_exists($node->getId(), $this->versionsCreated)) { + return; + } + + unset($this->versionsCreated[$node->getId()]); + + $versionEntity = new VersionEntity(); + $versionEntity->setFileId($node->getId()); + $versionEntity->setTimestamp($node->getMTime()); + $versionEntity->setSize($node->getSize()); + $versionEntity->setMimetype($this->mimeTypeLoader->getId($node->getMimetype())); + $versionEntity->setMetadata([]); + $this->versionsMapper->insert($versionEntity); + } + + /** + * Erase versions of deleted file + * + * This function is connected to the delete signal of OC_Filesystem + * cleanup the versions directory if the actual file gets deleted + */ + public function remove_hook(Node $node): void { + $path = $this->userFolder->getRelativePath($node->getPath()); + Storage::delete($path); + $this->versionsMapper->deleteAllVersionsForFileId($node->getId()); + } + + /** + * mark file as "deleted" so that we can clean up the versions if the file is gone + */ + public function pre_remove_hook(Node $node): void { + $path = $this->userFolder->getRelativePath($node->getPath()); + Storage::markDeletedFile($path); + } + + /** + * rename/move versions of renamed/moved files + * + * This function is connected to the rename signal of OC_Filesystem and adjust the name and location + * of the stored versions along the actual file + */ + public function rename_hook(Node $source, Node $target): void { + $oldPath = $this->userFolder->getRelativePath($source->getPath()); + $newPath = $this->userFolder->getRelativePath($target->getPath()); + Storage::renameOrCopy($oldPath, $newPath, 'rename'); + } + + /** + * copy versions of copied files + * + * This function is connected to the copy signal of OC_Filesystem and copies the + * the stored versions to the new location + */ + public function copy_hook(Node $source, Node $target): void { + $oldPath = $this->userFolder->getRelativePath($source->getPath()); + $newPath = $this->userFolder->getRelativePath($target->getPath()); + Storage::renameOrCopy($oldPath, $newPath, 'copy'); + } + + /** + * Remember owner and the owner path of the source file. + * If the file already exists, then it was a upload of a existing file + * over the web interface and we call Storage::store() directly + * + * + */ + public function pre_renameOrCopy_hook(Node $source, Node $target): void { + // if we rename a movable mount point, then the versions don't have + // to be renamed + $oldPath = $this->userFolder->getRelativePath($source->getPath()); + $newPath = $this->userFolder->getRelativePath($target->getPath()); + $absOldPath = Filesystem::normalizePath('/' . \OC_User::getUser() . '/files' . $oldPath); + $manager = Filesystem::getMountManager(); + $mount = $manager->find($absOldPath); + $internalPath = $mount->getInternalPath($absOldPath); + if ($internalPath === '' and $mount instanceof MoveableMount) { + return; + } + + $view = new View(\OC_User::getUser() . '/files'); + if ($view->file_exists($newPath)) { + Storage::store($newPath); + } else { + Storage::setSourcePathAndUser($oldPath); + } + } +} -- cgit v1.2.3