diff options
author | Vincent Petry <vincent@nextcloud.com> | 2021-10-04 12:04:04 +0300 |
---|---|---|
committer | backportbot[bot] <backportbot[bot]@users.noreply.github.com> | 2021-10-05 10:19:02 +0300 |
commit | abfc24ad993e538afe62fb2d22a911b5f714c669 (patch) | |
tree | ae70e7cdbe1667dc19efa5c12344cb9f7efe2199 /apps/files | |
parent | fad7135bc4e4ee73f82f6f42f249619ebeb85865 (diff) |
Do not transfer shares for deleted users
Whenever a user was deleted but is still recipient of share entries,
delete these entries upon transfer.
Usually such entries would disappear after running cleanup background
jobs.
Signed-off-by: Vincent Petry <vincent@nextcloud.com>
Diffstat (limited to 'apps/files')
-rw-r--r-- | apps/files/lib/Service/OwnershipTransferService.php | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/apps/files/lib/Service/OwnershipTransferService.php b/apps/files/lib/Service/OwnershipTransferService.php index ecb2365ef1b..93a3a188399 100644 --- a/apps/files/lib/Service/OwnershipTransferService.php +++ b/apps/files/lib/Service/OwnershipTransferService.php @@ -43,6 +43,7 @@ use OCP\Files\IHomeStorage; use OCP\Files\InvalidPathException; use OCP\Files\Mount\IMountManager; use OCP\IUser; +use OCP\IUserManager; use OCP\Share\IManager as IShareManager; use OCP\Share\IShare; use Symfony\Component\Console\Helper\ProgressBar; @@ -69,14 +70,19 @@ class OwnershipTransferService { /** @var IUserMountCache */ private $userMountCache; + /** @var IUserManager */ + private $userManager; + public function __construct(IEncryptionManager $manager, IShareManager $shareManager, IMountManager $mountManager, - IUserMountCache $userMountCache) { + IUserMountCache $userMountCache, + IUserManager $userManager) { $this->encryptionManager = $manager; $this->shareManager = $shareManager; $this->mountManager = $mountManager; $this->userMountCache = $userMountCache; + $this->userManager = $userManager; } /** @@ -401,13 +407,20 @@ class OwnershipTransferService { $share->setSharedBy($destinationUid); } + if ($share->getShareType() === IShare::TYPE_USER && + !$this->userManager->userExists($share->getSharedWith())) { + // stray share with deleted user + $output->writeln('<error>Share with id ' . $share->getId() . ' points at deleted user "' . $share->getSharedWith() . '", deleting</error>'); + $this->shareManager->deleteShare($share); + continue; + } else { + // trigger refetching of the node so that the new owner and mountpoint are taken into account + // otherwise the checks on the share update will fail due to the original node not being available in the new user scope + $this->userMountCache->clear(); + $share->setNodeId($share->getNode()->getId()); - // trigger refetching of the node so that the new owner and mountpoint are taken into account - // otherwise the checks on the share update will fail due to the original node not being available in the new user scope - $this->userMountCache->clear(); - $share->setNodeId($share->getNode()->getId()); - - $this->shareManager->updateShare($share); + $this->shareManager->updateShare($share); + } } } catch (\OCP\Files\NotFoundException $e) { $output->writeln('<error>Share with id ' . $share->getId() . ' points at deleted file, skipping</error>'); |