Merge pull request #29058 from nextcloud/bugfix/28981/transfer-ownership-deleted-user

Do not transfer shares for deleted users
pull/29079/head
Vincent Petry 2021-10-05 08:19:49 +07:00 committed by GitHub
commit ee32c7c328
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 20 additions and 7 deletions

@ -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>');