mirror of
https://github.com/nextcloud/server.git
synced 2026-06-11 09:42:09 -04:00
fix(shares): Promote reshares into direct shares when share is deleted
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
This commit is contained in:
parent
7a48f8d929
commit
d78f8280e8
1 changed files with 14 additions and 6 deletions
|
|
@ -783,6 +783,7 @@ class Manager implements IManager {
|
|||
* @param IShare $share
|
||||
* @return IShare The share object
|
||||
* @throws \InvalidArgumentException
|
||||
* @throws GenericShareException
|
||||
*/
|
||||
public function updateShare(IShare $share) {
|
||||
$expirationDateUpdated = false;
|
||||
|
|
@ -1040,7 +1041,8 @@ class Manager implements IManager {
|
|||
return $deletedShares;
|
||||
}
|
||||
|
||||
protected function deleteReshares(IShare $share): void {
|
||||
/* Promote reshares into direct shares so that target user keeps access */
|
||||
protected function promoteReshares(IShare $share): void {
|
||||
try {
|
||||
$node = $share->getNode();
|
||||
} catch (NotFoundException) {
|
||||
|
|
@ -1058,7 +1060,7 @@ class Manager implements IManager {
|
|||
|
||||
foreach ($users as $user) {
|
||||
/* Skip share owner */
|
||||
if ($user->getUID() === $share->getShareOwner()) {
|
||||
if ($user->getUID() === $share->getShareOwner() || $user->getUID() === $share->getSharedBy()) {
|
||||
continue;
|
||||
}
|
||||
$userIds[] = $user->getUID();
|
||||
|
|
@ -1101,8 +1103,14 @@ class Manager implements IManager {
|
|||
try {
|
||||
$this->generalCreateChecks($child);
|
||||
} catch (GenericShareException $e) {
|
||||
$this->logger->debug('Delete reshare because of exception '.$e->getMessage(), ['exception' => $e]);
|
||||
$this->deleteShare($child);
|
||||
/* The check is invalid, promote it to a direct share from the sharer of parent share */
|
||||
$this->logger->debug('Promote reshare because of exception ' . $e->getMessage(), ['exception' => $e, 'fullId' => $child->getFullId()]);
|
||||
try {
|
||||
$child->setSharedBy($share->getSharedBy());
|
||||
$this->updateShare($child);
|
||||
} catch (GenericShareException|\InvalidArgumentException $e) {
|
||||
$this->logger->warning('Failed to promote reshare because of exception ' . $e->getMessage(), ['exception' => $e, 'fullId' => $child->getFullId()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1132,8 +1140,8 @@ class Manager implements IManager {
|
|||
|
||||
$this->dispatcher->dispatchTyped(new ShareDeletedEvent($share));
|
||||
|
||||
// Delete reshares of the deleted share
|
||||
$this->deleteReshares($share);
|
||||
// Promote reshares of the deleted share
|
||||
$this->promoteReshares($share);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue