fix(trashbin): deletedBy of a file from a federated folder

Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
This commit is contained in:
Maxence Lange 2025-11-25 15:01:37 -01:00
parent c19d37f41e
commit ac8b747bbe

View file

@ -39,10 +39,14 @@ use OCP\Files\Storage\IStorage;
use OCP\FilesMetadata\IFilesMetadataManager;
use OCP\IConfig;
use OCP\IDBConnection;
use OCP\IRequest;
use OCP\Lock\ILockingProvider;
use OCP\Lock\LockedException;
use OCP\Server;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Util;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Psr\Log\LoggerInterface;
/** @template-implements IEventListener<BeforeNodeDeletedEvent> */
@ -323,13 +327,16 @@ class Trashbin implements IEventListener {
}
if ($moveSuccessful) {
// there is still a possibility that the file has been deleted by a remote user
$deletedBy = self::overwriteDeletedBy($user);
$query = \OC::$server->getDatabaseConnection()->getQueryBuilder();
$query->insert('files_trash')
->setValue('id', $query->createNamedParameter($filename))
->setValue('timestamp', $query->createNamedParameter($timestamp))
->setValue('location', $query->createNamedParameter($location))
->setValue('user', $query->createNamedParameter($owner))
->setValue('deleted_by', $query->createNamedParameter($user));
->setValue('deleted_by', $query->createNamedParameter($deletedBy));
$result = $query->executeStatement();
if (!$result) {
\OC::$server->get(LoggerInterface::class)->error('trash bin database couldn\'t be updated', ['app' => 'files_trashbin']);
@ -1188,6 +1195,29 @@ class Trashbin implements IEventListener {
}
}
/**
* in case the request is authed, and user token is from a federated share
* we use shared_with as initiator of the deletion
*/
private static function overwriteDeletedBy(string $user) {
try {
$request = Server::get(IRequest::class);
/** @psalm-suppress NoInterfaceProperties */
$token = $request->server['PHP_AUTH_USER'] ?? '';
if ($token === '') {
return $user;
}
$federatedShareProvider = Server::get(\OCA\FederatedFileSharing\FederatedShareProvider::class);
$share = $federatedShareProvider->getShareByToken($token);
return $share->getSharedWith();
} catch (NotFoundExceptionInterface|ContainerExceptionInterface|ShareNotFound) {
}
return $user;
}
public function handle(Event $event): void {
if ($event instanceof BeforeNodeDeletedEvent) {
self::ensureFileScannedHook($event->getNode());