|
26 | 26 | */ |
27 | 27 | namespace OCA\Files_Sharing; |
28 | 28 |
|
| 29 | +use OC\Files\Cache\FileAccess; |
29 | 30 | use OC\Files\Mount\MountPoint; |
30 | 31 | use OCP\Constants; |
31 | 32 | use OCP\Files\Folder; |
| 33 | +use OCP\Server; |
32 | 34 | use OCP\Share\IShare; |
33 | 35 |
|
34 | 36 | class Updater { |
@@ -58,20 +60,40 @@ private static function moveShareInOrOutOfShare($path): void { |
58 | 60 | if ($userFolder === null) { |
59 | 61 | return; |
60 | 62 | } |
| 63 | + $user = $userFolder->getOwner(); |
| 64 | + if (!$user) { |
| 65 | + throw new \Exception("user folder has no owner"); |
| 66 | + } |
61 | 67 |
|
62 | 68 | $src = $userFolder->get($path); |
63 | 69 |
|
64 | 70 | $shareManager = \OC::$server->getShareManager(); |
65 | 71 |
|
66 | 72 | // 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)); |
70 | 76 |
|
71 | 77 | 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); |
73 | 89 | 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 | + } |
75 | 97 | } |
76 | 98 | } |
77 | 99 |
|
|
0 commit comments