]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix repairing non user shares when repairing all shares
authorRobin Appelman <robin@icewind.nl>
Tue, 18 Oct 2022 13:42:25 +0000 (15:42 +0200)
committerRobin Appelman <robin@icewind.nl>
Tue, 8 Nov 2022 16:13:52 +0000 (17:13 +0100)
Signed-off-by: Robin Appelman <robin@icewind.nl>
core/Command/Maintenance/RepairShareOwnership.php

index 1101cffd0cc1b2b8bcb641cb52ddf2e7a570cd7d..267e0ca1d487ec00697e13316202a69f867a1d67 100644 (file)
@@ -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}[]