Skip to content

Commit

Permalink
feat: Support X-NC-Skip-Trashbin header
Browse files Browse the repository at this point in the history
This is useful for clients that want to directly and permanently delete a file.

Signed-off-by: Louis Chemineau <[email protected]>
  • Loading branch information
artonge committed Jan 23, 2025
1 parent 108972a commit f3551b2
Showing 1 changed file with 19 additions and 17 deletions.
36 changes: 19 additions & 17 deletions apps/files_trashbin/lib/Storage.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use OCP\Files\IRootFolder;
use OCP\Files\Node;
use OCP\Files\Storage\IStorage;
use OCP\IRequest;
use OCP\IUserManager;
use Psr\Log\LoggerInterface;

Expand All @@ -33,6 +34,7 @@ public function __construct(
private ?LoggerInterface $logger = null,
private ?IEventDispatcher $eventDispatcher = null,
private ?IRootFolder $rootFolder = null,
private ?IRequest $request = null,
) {
$this->mountPoint = $parameters['mountPoint'];
parent::__construct($parameters);
Expand Down Expand Up @@ -118,26 +120,26 @@ protected function createMoveToTrashEvent(Node $node): MoveToTrashEvent {
* @return bool true if the operation succeeded, false otherwise
*/
private function doDelete(string $path, string $method): bool {
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 = \OC::$server->getAppManager()->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);

if ($shouldMoveToTrash) {
// check permissions before we continue, this is especially important for
// shared files
if (!$this->isDeletable($path)) {
return false;
}

// 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 true;
}
}

$isMovedToTrash = $this->trashManager->moveToTrash($this, $path);
if (!$isMovedToTrash) {
return call_user_func([$this->storage, $method], $path);
} else {
return true;
}
return call_user_func([$this->storage, $method], $path);
}

/**
Expand Down

0 comments on commit f3551b2

Please sign in to comment.