Skip to content

Commit ccd5667

Browse files
committed
refactor: remove non-shallow getSharesInFolder
Signed-off-by: Robin Appelman <[email protected]>
1 parent d82fb01 commit ccd5667

5 files changed

Lines changed: 47 additions & 40 deletions

File tree

apps/federatedfilesharing/lib/FederatedShareProvider.php

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,10 @@ public function restore(IShare $share, string $recipient): IShare {
578578

579579

580580
public function getSharesInFolder($userId, Folder $node, $reshares, $shallow = true) {
581+
if (!$shallow) {
582+
throw new \Exception("non-shallow getSharesInFolder is no longer supported");
583+
}
584+
581585
$qb = $this->dbConnection->getQueryBuilder();
582586
$qb->select('*')
583587
->from('share', 's')
@@ -605,12 +609,7 @@ public function getSharesInFolder($userId, Folder $node, $reshares, $shallow = t
605609

606610
$qb->innerJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'));
607611

608-
$qb->andWhere($qb->expr()->eq('f.storage', $qb->createNamedParameter($node->getMountPoint()->getNumericStorageId(), IQueryBuilder::PARAM_INT)));
609-
if ($shallow) {
610-
$qb->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId(), IQueryBuilder::PARAM_INT)));
611-
} else {
612-
$qb->andWhere($qb->expr()->like('f.path', $qb->createNamedParameter($this->dbConnection->escapeLikeParameter($node->getInternalPath()) . '/%')));
613-
}
612+
$qb->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())));
614613

615614
$qb->orderBy('id');
616615

apps/files_sharing/lib/Updater.php

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@
2626
*/
2727
namespace OCA\Files_Sharing;
2828

29+
use OC\Files\Cache\FileAccess;
2930
use OC\Files\Mount\MountPoint;
3031
use OCP\Constants;
3132
use OCP\Files\Folder;
33+
use OCP\Server;
3234
use OCP\Share\IShare;
3335

3436
class Updater {
@@ -58,20 +60,40 @@ private static function moveShareInOrOutOfShare($path): void {
5860
if ($userFolder === null) {
5961
return;
6062
}
63+
$user = $userFolder->getOwner();
64+
if (!$user) {
65+
throw new \Exception("user folder has no owner");
66+
}
6167

6268
$src = $userFolder->get($path);
6369

6470
$shareManager = \OC::$server->getShareManager();
6571

6672
// FIXME: should CIRCLES be included here ??
67-
$shares = $shareManager->getSharesBy($userFolder->getOwner()->getUID(), IShare::TYPE_USER, $src, false, -1);
68-
$shares = array_merge($shares, $shareManager->getSharesBy($userFolder->getOwner()->getUID(), IShare::TYPE_GROUP, $src, false, -1));
69-
$shares = array_merge($shares, $shareManager->getSharesBy($userFolder->getOwner()->getUID(), IShare::TYPE_ROOM, $src, false, -1));
73+
$shares = $shareManager->getSharesBy($user->getUID(), IShare::TYPE_USER, $src, false, -1);
74+
$shares = array_merge($shares, $shareManager->getSharesBy($user->getUID(), IShare::TYPE_GROUP, $src, false, -1));
75+
$shares = array_merge($shares, $shareManager->getSharesBy($user->getUID(), IShare::TYPE_ROOM, $src, false, -1));
7076

7177
if ($src instanceof Folder) {
72-
$subShares = $shareManager->getSharesInFolder($userFolder->getOwner()->getUID(), $src, false, false);
78+
$cacheAccess = Server::get(FileAccess::class);
79+
80+
$sourceStorageId = $src->getStorage()->getCache()->getNumericStorageId();
81+
$sourceInternalPath = $src->getInternalPath();
82+
$subShares = array_merge(
83+
$shareManager->getSharesBy($user->getUID(), IShare::TYPE_USER),
84+
$shareManager->getSharesBy($user->getUID(), IShare::TYPE_GROUP),
85+
$shareManager->getSharesBy($user->getUID(), IShare::TYPE_ROOM),
86+
);
87+
$shareSourceIds = array_map(fn (IShare $share) => $share->getNodeId(), $subShares);
88+
$shareSources = $cacheAccess->getByFileIdsInStorage($shareSourceIds, $sourceStorageId);
7389
foreach ($subShares as $subShare) {
74-
$shares = array_merge($shares, array_values($subShare));
90+
$shareCacheEntry = $shareSources[$subShare->getNodeId()] ?? null;
91+
if (
92+
$shareCacheEntry &&
93+
str_starts_with($shareCacheEntry->getPath(), $sourceInternalPath . '/')
94+
) {
95+
$shares[] = $subShare;
96+
}
7597
}
7698
}
7799

apps/sharebymail/lib/ShareByMailProvider.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,12 +1069,7 @@ public function getSharesInFolder($userId, Folder $node, $reshares, $shallow = t
10691069

10701070
$qb->innerJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'));
10711071

1072-
$qb->andWhere($qb->expr()->eq('f.storage', $qb->createNamedParameter($node->getMountPoint()->getNumericStorageId(), IQueryBuilder::PARAM_INT)));
1073-
if ($shallow) {
1074-
$qb->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())));
1075-
} else {
1076-
$qb->andWhere($qb->expr()->like('f.path', $qb->createNamedParameter($this->dbConnection->escapeLikeParameter($node->getInternalPath()) . '/%')));
1077-
}
1072+
$qb->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())));
10781073

10791074
$qb->orderBy('id');
10801075

lib/private/Share20/DefaultShareProvider.php

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,10 @@ public function move(\OCP\Share\IShare $share, $recipient) {
652652
}
653653

654654
public function getSharesInFolder($userId, Folder $node, $reshares, $shallow = true) {
655+
if (!$shallow) {
656+
throw new \Exception("non-shallow getSharesInFolder is no longer supported");
657+
}
658+
655659
$qb = $this->dbConn->getQueryBuilder();
656660
$qb->select('s.*',
657661
'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
@@ -692,28 +696,12 @@ public function getSharesInFolder($userId, Folder $node, $reshares, $shallow = t
692696
}, $childMountNodes);
693697

694698
$qb->innerJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'));
695-
$storageFilter = $qb->expr()->eq('f.storage', $qb->createNamedParameter($node->getMountPoint()->getNumericStorageId(), IQueryBuilder::PARAM_INT));
696-
if ($shallow) {
697-
$qb->andWhere(
698-
$qb->expr()->orX(
699-
$qb->expr()->andX(
700-
$storageFilter,
701-
$qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())),
702-
),
703-
$qb->expr()->in('f.fileid', $qb->createParameter('chunk'))
704-
)
705-
);
706-
} else {
707-
$qb->andWhere(
708-
$qb->expr()->orX(
709-
$qb->expr()->andX(
710-
$storageFilter,
711-
$qb->expr()->like('f.path', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($node->getInternalPath()) . '/%')),
712-
),
713-
$qb->expr()->in('f.fileid', $qb->createParameter('chunk'))
714-
)
715-
);
716-
}
699+
$qb->andWhere(
700+
$qb->expr()->orX(
701+
$qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())),
702+
$qb->expr()->in('f.fileid', $qb->createParameter('chunk'))
703+
)
704+
);
717705

718706
$qb->orderBy('id');
719707

lib/private/Share20/Manager.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1317,9 +1317,12 @@ public function moveShare(IShare $share, $recipientId) {
13171317

13181318
public function getSharesInFolder($userId, Folder $node, $reshares = false, $shallow = true) {
13191319
$providers = $this->factory->getAllProviders();
1320+
if (!$shallow) {
1321+
throw new \Exception("non-shallow getSharesInFolder is no longer supported");
1322+
}
13201323

13211324
return array_reduce($providers, function ($shares, IShareProvider $provider) use ($userId, $node, $reshares, $shallow) {
1322-
$newShares = $provider->getSharesInFolder($userId, $node, $reshares, $shallow);
1325+
$newShares = $provider->getSharesInFolder($userId, $node, $reshares);
13231326
foreach ($newShares as $fid => $data) {
13241327
if (!isset($shares[$fid])) {
13251328
$shares[$fid] = [];

0 commit comments

Comments
 (0)