aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorLuka Trovic <luka@nextcloud.com>2024-08-07 11:13:35 +0200
committerCôme Chilliet <91878298+come-nc@users.noreply.github.com>2024-10-14 11:58:47 +0200
commit42181c2f490025860e22907255b6917583c798af (patch)
treebfef507c7b08551af4113fb70f75d9d88f7fd4e6 /lib
parent3f75c4808d5153588c671c6a47c6aadb501f6308 (diff)
downloadnextcloud-server-42181c2f490025860e22907255b6917583c798af.tar.gz
nextcloud-server-42181c2f490025860e22907255b6917583c798af.zip
fix: delete re-shares when deleting the parent share
Note: Removed part about fix command from original PR Signed-off-by: Luka Trovic <luka@nextcloud.com> Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/private/Share20/Manager.php69
1 files changed, 69 insertions, 0 deletions
diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php
index f46d163e58a..96dd88c6793 100644
--- a/lib/private/Share20/Manager.php
+++ b/lib/private/Share20/Manager.php
@@ -18,6 +18,7 @@ use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\Files\Mount\IMountManager;
use OCP\Files\Node;
+use OCP\Files\NotFoundException;
use OCP\HintException;
use OCP\IConfig;
use OCP\IDateTimeZone;
@@ -1039,6 +1040,71 @@ class Manager implements IManager {
return $deletedShares;
}
+ public function deleteReshare(IShare $share) {
+ // Skip if node not found
+ try {
+ $node = $share->getNode();
+ } catch (NotFoundException) {
+ return;
+ }
+
+ $userIds = [];
+
+ if ($share->getShareType() === IShare::TYPE_USER) {
+ $userIds[] = $share->getSharedWith();
+ }
+
+ if ($share->getShareType() === IShare::TYPE_GROUP) {
+ $group = $this->groupManager->get($share->getSharedWith());
+ $users = $group->getUsers();
+
+ foreach ($users as $user) {
+ // Skip if share owner is member of shared group
+ if ($user->getUID() === $share->getShareOwner()) {
+ continue;
+ }
+ $userIds[] = $user->getUID();
+ }
+ }
+
+ $reshareRecords = [];
+ $shareTypes = [
+ IShare::TYPE_GROUP,
+ IShare::TYPE_USER,
+ IShare::TYPE_LINK,
+ IShare::TYPE_REMOTE,
+ IShare::TYPE_EMAIL
+ ];
+
+ foreach ($userIds as $userId) {
+ foreach ($shareTypes as $shareType) {
+ $provider = $this->factory->getProviderForType($shareType);
+ $shares = $provider->getSharesBy($userId, $shareType, $node, false, -1, 0);
+ foreach ($shares as $child) {
+ $reshareRecords[] = $child;
+ }
+ }
+
+ if ($share->getNodeType() === 'folder') {
+ $sharesInFolder = $this->getSharesInFolder($userId, $node, true);
+
+ foreach ($sharesInFolder as $shares) {
+ foreach ($shares as $child) {
+ $reshareRecords[] = $child;
+ }
+ }
+ }
+ }
+
+ foreach ($reshareRecords as $child) {
+ try {
+ $this->generalCreateChecks($child);
+ } catch (GenericShareException $e) {
+ $this->deleteShare($child);
+ }
+ }
+ }
+
/**
* Delete a share
*
@@ -1062,6 +1128,9 @@ class Manager implements IManager {
$provider = $this->factory->getProviderForType($share->getShareType());
$provider->delete($share);
+ // Delete shares that shared by the "share with user/group"
+ $this->deleteReshare($share);
+
$this->dispatcher->dispatchTyped(new ShareDeletedEvent($share));
}