aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files_trashbin
diff options
context:
space:
mode:
authorCarl Schwan <carl@carlschwan.eu>2022-04-19 19:50:36 +0200
committerCôme Chilliet <come.chilliet@nextcloud.com>2024-09-23 18:13:21 +0200
commit77821f8f3e7fbef97bf65284f5263726c9433599 (patch)
tree3f991607ac9c2d79f753bca138266e5700407d7a /apps/files_trashbin
parenta8ee7424ad12f923b681856b1e282905a10a081e (diff)
downloadnextcloud-server-77821f8f3e7fbef97bf65284f5263726c9433599.tar.gz
nextcloud-server-77821f8f3e7fbef97bf65284f5263726c9433599.zip
feat(trashbin): Port files trashbin events to IEventDispatcher/IEventListener
oc_hooks is deprecated and will at some point be removed Signed-off-by: Carl Schwan <carl@carlschwan.eu> Signed-off-by: Thomas Citharel <tcit@tcit.fr> Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
Diffstat (limited to 'apps/files_trashbin')
-rw-r--r--apps/files_trashbin/composer/composer/autoload_classmap.php2
-rw-r--r--apps/files_trashbin/composer/composer/autoload_static.php2
-rw-r--r--apps/files_trashbin/lib/AppInfo/Application.php22
-rw-r--r--apps/files_trashbin/lib/Hooks.php29
-rw-r--r--apps/files_trashbin/lib/Listener/EventListener.php61
-rw-r--r--apps/files_trashbin/lib/Storage.php6
-rw-r--r--apps/files_trashbin/lib/Trashbin.php24
7 files changed, 92 insertions, 54 deletions
diff --git a/apps/files_trashbin/composer/composer/autoload_classmap.php b/apps/files_trashbin/composer/composer/autoload_classmap.php
index 052063d3550..4ff7c561748 100644
--- a/apps/files_trashbin/composer/composer/autoload_classmap.php
+++ b/apps/files_trashbin/composer/composer/autoload_classmap.php
@@ -22,7 +22,7 @@ return array(
'OCA\\Files_Trashbin\\Exceptions\\CopyRecursiveException' => $baseDir . '/../lib/Exceptions/CopyRecursiveException.php',
'OCA\\Files_Trashbin\\Expiration' => $baseDir . '/../lib/Expiration.php',
'OCA\\Files_Trashbin\\Helper' => $baseDir . '/../lib/Helper.php',
- 'OCA\\Files_Trashbin\\Hooks' => $baseDir . '/../lib/Hooks.php',
+ 'OCA\\Files_Trashbin\\Listener\\EventListener' => $baseDir . '/../lib/Listener/EventListener.php',
'OCA\\Files_Trashbin\\Listeners\\LoadAdditionalScripts' => $baseDir . '/../lib/Listeners/LoadAdditionalScripts.php',
'OCA\\Files_Trashbin\\Listeners\\SyncLivePhotosListener' => $baseDir . '/../lib/Listeners/SyncLivePhotosListener.php',
'OCA\\Files_Trashbin\\Migration\\Version1010Date20200630192639' => $baseDir . '/../lib/Migration/Version1010Date20200630192639.php',
diff --git a/apps/files_trashbin/composer/composer/autoload_static.php b/apps/files_trashbin/composer/composer/autoload_static.php
index 4f5227b8889..4b09239aa1e 100644
--- a/apps/files_trashbin/composer/composer/autoload_static.php
+++ b/apps/files_trashbin/composer/composer/autoload_static.php
@@ -37,7 +37,7 @@ class ComposerStaticInitFiles_Trashbin
'OCA\\Files_Trashbin\\Exceptions\\CopyRecursiveException' => __DIR__ . '/..' . '/../lib/Exceptions/CopyRecursiveException.php',
'OCA\\Files_Trashbin\\Expiration' => __DIR__ . '/..' . '/../lib/Expiration.php',
'OCA\\Files_Trashbin\\Helper' => __DIR__ . '/..' . '/../lib/Helper.php',
- 'OCA\\Files_Trashbin\\Hooks' => __DIR__ . '/..' . '/../lib/Hooks.php',
+ 'OCA\\Files_Trashbin\\Listener\\EventListener' => __DIR__ . '/..' . '/../lib/Listener/EventListener.php',
'OCA\\Files_Trashbin\\Listeners\\LoadAdditionalScripts' => __DIR__ . '/..' . '/../lib/Listeners/LoadAdditionalScripts.php',
'OCA\\Files_Trashbin\\Listeners\\SyncLivePhotosListener' => __DIR__ . '/..' . '/../lib/Listeners/SyncLivePhotosListener.php',
'OCA\\Files_Trashbin\\Migration\\Version1010Date20200630192639' => __DIR__ . '/..' . '/../lib/Migration/Version1010Date20200630192639.php',
diff --git a/apps/files_trashbin/lib/AppInfo/Application.php b/apps/files_trashbin/lib/AppInfo/Application.php
index e1a8e02afaf..115e6e418b4 100644
--- a/apps/files_trashbin/lib/AppInfo/Application.php
+++ b/apps/files_trashbin/lib/AppInfo/Application.php
@@ -11,16 +11,22 @@ use OCA\Files\Event\LoadAdditionalScriptsEvent;
use OCA\Files_Trashbin\Capabilities;
use OCA\Files_Trashbin\Events\BeforeNodeRestoredEvent;
use OCA\Files_Trashbin\Expiration;
+use OCA\Files_Trashbin\Listener\EventListener;
use OCA\Files_Trashbin\Listeners\LoadAdditionalScripts;
use OCA\Files_Trashbin\Listeners\SyncLivePhotosListener;
use OCA\Files_Trashbin\Trash\ITrashManager;
use OCA\Files_Trashbin\Trash\TrashManager;
+use OCA\Files_Trashbin\Trashbin;
use OCA\Files_Trashbin\UserMigration\TrashbinMigrator;
use OCP\App\IAppManager;
use OCP\AppFramework\App;
use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
use OCP\AppFramework\Bootstrap\IRegistrationContext;
+use OCP\Files\Events\BeforeFileSystemSetupEvent;
+use OCP\Files\Events\Node\BeforeNodeDeletedEvent;
+use OCP\Files\Events\Node\NodeWrittenEvent;
+use OCP\User\Events\BeforeUserDeletedEvent;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
@@ -47,19 +53,17 @@ class Application extends App implements IBootstrap {
);
$context->registerEventListener(BeforeNodeRestoredEvent::class, SyncLivePhotosListener::class);
+
+ $context->registerEventListener(NodeWrittenEvent::class, EventListener::class);
+ $context->registerEventListener(BeforeUserDeletedEvent::class, EventListener::class);
+ $context->registerEventListener(BeforeFileSystemSetupEvent::class, EventListener::class);
+
+ // pre and post-rename, disable trash logic for the copy+unlink case
+ $context->registerEventListener(BeforeNodeDeletedEvent::class, Trashbin::class);
}
public function boot(IBootContext $context): void {
$context->injectFn([$this, 'registerTrashBackends']);
-
- // create storage wrapper on setup
- \OCP\Util::connectHook('OC_Filesystem', 'preSetup', 'OCA\Files_Trashbin\Storage', 'setupStorage');
- //Listen to delete user signal
- \OCP\Util::connectHook('OC_User', 'pre_deleteUser', 'OCA\Files_Trashbin\Hooks', 'deleteUser_hook');
- //Listen to post write hook
- \OCP\Util::connectHook('OC_Filesystem', 'post_write', 'OCA\Files_Trashbin\Hooks', 'post_write_hook');
- // pre and post-rename, disable trash logic for the copy+unlink case
- \OCP\Util::connectHook('OC_Filesystem', 'delete', 'OCA\Files_Trashbin\Trashbin', 'ensureFileScannedHook');
}
public function registerTrashBackends(ContainerInterface $serverContainer, LoggerInterface $logger, IAppManager $appManager, ITrashManager $trashManager): void {
diff --git a/apps/files_trashbin/lib/Hooks.php b/apps/files_trashbin/lib/Hooks.php
deleted file mode 100644
index 1e2a8d41098..00000000000
--- a/apps/files_trashbin/lib/Hooks.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-/**
- * SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-only
- */
-namespace OCA\Files_Trashbin;
-
-class Hooks {
-
- /**
- * clean up user specific settings if user gets deleted
- * @param array $params array with uid
- *
- * This function is connected to the pre_deleteUser signal of OC_Users
- * to remove the used space for the trash bin stored in the database
- */
- public static function deleteUser_hook($params) {
- $uid = $params['uid'];
- Trashbin::deleteUser($uid);
- }
-
- public static function post_write_hook($params) {
- $user = \OC_User::getUser();
- if (!empty($user)) {
- Trashbin::resizeTrash($user);
- }
- }
-}
diff --git a/apps/files_trashbin/lib/Listener/EventListener.php b/apps/files_trashbin/lib/Listener/EventListener.php
new file mode 100644
index 00000000000..882f963103f
--- /dev/null
+++ b/apps/files_trashbin/lib/Listener/EventListener.php
@@ -0,0 +1,61 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright 2022 Carl Schwan <carl@carlschwan.eu>
+ *
+ * @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/>.
+ *
+ */
+
+
+namespace OCA\Files_Trashbin\Listener;
+
+use OCA\Files_Trashbin\Storage;
+use OCA\Files_Trashbin\Trashbin;
+use OCP\EventDispatcher\Event;
+use OCP\EventDispatcher\IEventListener;
+use OCP\Files\Events\BeforeFileSystemSetupEvent;
+use OCP\Files\Events\Node\NodeWrittenEvent;
+use OCP\User\Events\BeforeUserDeletedEvent;
+
+/** @template-implements IEventListener<NodeWrittenEvent|BeforeUserDeletedEvent|BeforeFileSystemSetupEvent> */
+class EventListener implements IEventListener {
+ private ?string $userId;
+
+ public function __construct(?string $userId = null) {
+ $this->userId = $userId;
+ }
+
+ public function handle(Event $event): void {
+ if ($event instanceof NodeWrittenEvent) {
+ // Resize trash
+ if (!empty($this->userId)) {
+ Trashbin::resizeTrash($this->userId);
+ }
+ }
+
+ // Clean up user specific settings if user gets deleted
+ if ($event instanceof BeforeUserDeletedEvent) {
+ Trashbin::deleteUser($event->getUser()->getUID());
+ }
+
+ if ($event instanceof BeforeFileSystemSetupEvent) {
+ Storage::setupStorage();
+ }
+ }
+}
diff --git a/apps/files_trashbin/lib/Storage.php b/apps/files_trashbin/lib/Storage.php
index 412b9f44df9..c05d248c9d0 100644
--- a/apps/files_trashbin/lib/Storage.php
+++ b/apps/files_trashbin/lib/Storage.php
@@ -29,13 +29,7 @@ class Storage extends Wrapper {
/**
* Storage constructor.
- *
* @param array $parameters
- * @param ITrashManager|null $trashManager
- * @param IUserManager|null $userManager
- * @param LoggerInterface|null $logger
- * @param IEventDispatcher|null $eventDispatcher
- * @param IRootFolder|null $rootFolder
*/
public function __construct(
$parameters,
diff --git a/apps/files_trashbin/lib/Trashbin.php b/apps/files_trashbin/lib/Trashbin.php
index de79f22ae5b..a30ba0ce055 100644
--- a/apps/files_trashbin/lib/Trashbin.php
+++ b/apps/files_trashbin/lib/Trashbin.php
@@ -11,8 +11,6 @@ use OC\Files\Cache\Cache;
use OC\Files\Cache\CacheEntry;
use OC\Files\Cache\CacheQueryBuilder;
use OC\Files\Filesystem;
-use OC\Files\Node\File;
-use OC\Files\Node\Folder;
use OC\Files\Node\NonExistingFile;
use OC\Files\Node\NonExistingFolder;
use OC\Files\View;
@@ -23,7 +21,12 @@ use OCA\Files_Trashbin\Events\BeforeNodeRestoredEvent;
use OCA\Files_Trashbin\Events\NodeRestoredEvent;
use OCP\App\IAppManager;
use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventDispatcher;
+use OCP\EventDispatcher\IEventListener;
+use OCP\Files\Events\Node\BeforeNodeDeletedEvent;
+use OCP\Files\File;
+use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\Files\Node;
use OCP\Files\NotFoundException;
@@ -38,21 +41,20 @@ use OCP\Lock\LockedException;
use OCP\Server;
use Psr\Log\LoggerInterface;
-class Trashbin {
+/** @template-implements IEventListener<BeforeNodeDeletedEvent> */
+class Trashbin implements IEventListener {
// unit: percentage; 50% of available disk space/quota
public const DEFAULTMAXSIZE = 50;
/**
* Ensure we don't need to scan the file during the move to trash
* by triggering the scan in the pre-hook
- *
- * @param array $params
*/
- public static function ensureFileScannedHook($params) {
+ public static function ensureFileScannedHook(Node $node): void {
try {
- self::getUidAndFilename($params['path']);
+ self::getUidAndFilename($node->getPath());
} catch (NotFoundException $e) {
- // nothing to scan for non existing files
+ // Nothing to scan for non existing files
}
}
@@ -1170,4 +1172,10 @@ class Trashbin {
return new NonExistingFile($rootFolder, $view, $fullPath);
}
}
+
+ public function handle(Event $event): void {
+ if ($event instanceof BeforeNodeDeletedEvent) {
+ self::ensureFileScannedHook($event->getNode());
+ }
+ }
}