diff --git a/apps/files_trashbin/lib/Storage.php b/apps/files_trashbin/lib/Storage.php index 11ace4248d96c..6fd8fef884b0c 100644 --- a/apps/files_trashbin/lib/Storage.php +++ b/apps/files_trashbin/lib/Storage.php @@ -32,12 +32,15 @@ use OC\Files\Storage\Wrapper\Wrapper; use OCA\Files_Trashbin\Events\MoveToTrashEvent; use OCA\Files_Trashbin\Trash\ITrashManager; +use OCP\App\IAppManager; use OCP\Encryption\Exceptions\GenericEncryptionException; use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\IRootFolder; use OCP\Files\Node; use OCP\Files\Storage\IStorage; +use OCP\IRequest; use OCP\IUserManager; +use OCP\Server; use Psr\Log\LoggerInterface; class Storage extends Wrapper { @@ -65,7 +68,8 @@ public function __construct( ?IUserManager $userManager = null, ?LoggerInterface $logger = null, ?IEventDispatcher $eventDispatcher = null, - ?IRootFolder $rootFolder = null + ?IRootFolder $rootFolder = null, + private ?IRequest $request = null, ) { $this->mountPoint = $parameters['mountPoint']; $this->trashManager = $trashManager; @@ -173,26 +177,26 @@ protected function createMoveToTrashEvent(Node $node) { * @return bool true if the operation succeeded, false otherwise */ private function doDelete($path, $method) { - if ( - !\OC::$server->getAppManager()->isEnabledForUser('files_trashbin') - || (pathinfo($path, PATHINFO_EXTENSION) === 'part') - || $this->shouldMoveToTrash($path) === false - ) { - return call_user_func([$this->storage, $method], $path); - } + $isTrashbinEnabled = Server::get(IAppManager::class)->isEnabledForUser('files_trashbin'); + $isPartFile = pathinfo($path, PATHINFO_EXTENSION) === 'part'; + $isSkipTrashHeaderSet = $this->request !== null && $this->request->getHeader('X-NC-Skip-Trashbin') === 'true'; + // We keep the shouldMoveToTrash call at the end to prevent emitting unnecessary event. + $shouldMoveToTrash = $isTrashbinEnabled && !$isPartFile && !$isSkipTrashHeaderSet && $this->shouldMoveToTrash($path); - // check permissions before we continue, this is especially important for - // shared files - if (!$this->isDeletable($path)) { - return false; - } + if ($shouldMoveToTrash) { + // check permissions before we continue, this is especially important for + // shared files + if (!$this->isDeletable($path)) { + return false; + } - $isMovedToTrash = $this->trashManager->moveToTrash($this, $path); - if (!$isMovedToTrash) { - return call_user_func([$this->storage, $method], $path); - } else { - return true; + $isMovedToTrash = $this->trashManager->moveToTrash($this, $path); + if ($isMovedToTrash) { + return true; + } } + + return call_user_func([$this->storage, $method], $path); } /** @@ -204,9 +208,10 @@ public static function setupStorage() { $logger = \OC::$server->get(LoggerInterface::class); $eventDispatcher = \OC::$server->get(IEventDispatcher::class); $rootFolder = \OC::$server->get(IRootFolder::class); + $request = \OC::$server->get(IRequest::class); Filesystem::addStorageWrapper( 'oc_trashbin', - function (string $mountPoint, IStorage $storage) use ($trashManager, $userManager, $logger, $eventDispatcher, $rootFolder) { + function (string $mountPoint, IStorage $storage) use ($trashManager, $userManager, $logger, $eventDispatcher, $rootFolder, $request) { return new Storage( ['storage' => $storage, 'mountPoint' => $mountPoint], $trashManager, @@ -214,6 +219,7 @@ function (string $mountPoint, IStorage $storage) use ($trashManager, $userManage $logger, $eventDispatcher, $rootFolder, + $request, ); }, 1);