From 7dc8e6a01448fd028f5e60f7e0cb1cdb7c911815 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 18 Oct 2022 15:42:25 +0200 Subject: [PATCH] fix repairing non user shares when repairing all shares Signed-off-by: Robin Appelman --- .../Maintenance/RepairShareOwnership.php | 43 ++++++++++++++----- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/core/Command/Maintenance/RepairShareOwnership.php b/core/Command/Maintenance/RepairShareOwnership.php index 1101cffd0cc..267e0ca1d48 100644 --- a/core/Command/Maintenance/RepairShareOwnership.php +++ b/core/Command/Maintenance/RepairShareOwnership.php @@ -31,7 +31,6 @@ use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; use OCP\IUser; use OCP\IUserManager; -use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -70,15 +69,7 @@ class RepairShareOwnership extends Command { } $shares = $this->getWrongShareOwnershipForUser($user); } else { - $shares = []; - $userCount = $this->userManager->countSeenUsers(); - $progress = new ProgressBar($output, $userCount); - $this->userManager->callForSeenUsers(function (IUser $user) use (&$shares, $progress) { - $progress->advance(); - $shares = array_merge($shares, $this->getWrongShareOwnershipForUser($user)); - }); - $progress->finish(); - $output->writeln(""); + $shares = $this->getWrongShareOwnership(); } if ($shares) { @@ -107,6 +98,38 @@ class RepairShareOwnership extends Command { return 0; } + /** + * @return array{shareId: int, fileTarget: string, initiator: string, receiver: string, owner: string, mountOwner: string}[] + * @throws \OCP\DB\Exception + */ + protected function getWrongShareOwnership(): array { + $qb = $this->dbConnection->getQueryBuilder(); + $brokenShares = $qb + ->select('s.id', 'm.user_id', 's.uid_owner', 's.uid_initiator', 's.share_with', 's.file_target') + ->from('share', 's') + ->join('s', 'filecache', 'f', $qb->expr()->eq('s.item_source', $qb->expr()->castColumn('f.fileid', IQueryBuilder::PARAM_STR))) + ->join('s', 'mounts', 'm', $qb->expr()->eq('f.storage', 'm.storage_id')) + ->where($qb->expr()->neq('m.user_id', 's.uid_owner')) + ->andWhere($qb->expr()->eq($qb->func()->concat($qb->expr()->literal('/'), 'm.user_id', $qb->expr()->literal('/')), 'm.mount_point')) + ->executeQuery() + ->fetchAll(); + + $found = []; + + foreach ($brokenShares as $share) { + $found[] = [ + 'shareId' => (int) $share['id'], + 'fileTarget' => $share['file_target'], + 'initiator' => $share['uid_initiator'], + 'receiver' => $share['share_with'], + 'owner' => $share['uid_owner'], + 'mountOwner' => $share['user_id'], + ]; + } + + return $found; + } + /** * @param IUser $user * @return array{shareId: int, fileTarget: string, initiator: string, receiver: string, owner: string, mountOwner: string}[] -- 2.39.5