diff --git a/apps/dav/appinfo/v1/publicwebdav.php b/apps/dav/appinfo/v1/publicwebdav.php index 8aa084a1114b3..7b84ec86c4b83 100644 --- a/apps/dav/appinfo/v1/publicwebdav.php +++ b/apps/dav/appinfo/v1/publicwebdav.php @@ -82,7 +82,6 @@ } $share = $authBackend->getShare(); - $owner = $share->getShareOwner(); $isReadable = $share->getPermissions() & \OCP\Constants::PERMISSION_READ; $fileId = $share->getNodeId(); @@ -97,10 +96,10 @@ \OC\Files\Filesystem::logWarningWhenAddingStorageWrapper($previousLog); OC_Util::tearDownFS(); - OC_Util::setupFS($owner); - $ownerView = new \OC\Files\View('/'. $owner . '/files'); - $path = $ownerView->getPath($fileId); - $fileInfo = $ownerView->getFileInfo($path); + OC_Util::setupFS($share->getSharedBy()); + $initiatorView = new \OC\Files\View('/'. $share->getSharedBy() . '/files'); + $path = $initiatorView->getPath($fileId); + $fileInfo = $initiatorView->getFileInfo($path); $linkCheckPlugin->setFileInfo($fileInfo); // If not readable (files_drop) enable the filesdrop plugin @@ -108,7 +107,7 @@ $filesDropPlugin->enable(); } - $view = new \OC\Files\View($ownerView->getAbsolutePath($path)); + $view = new \OC\Files\View($initiatorView->getAbsolutePath($path)); $filesDropPlugin->setView($view); return $view; diff --git a/apps/dav/appinfo/v2/publicremote.php b/apps/dav/appinfo/v2/publicremote.php index c48f582ab4a37..dc2bf6db4225f 100644 --- a/apps/dav/appinfo/v2/publicremote.php +++ b/apps/dav/appinfo/v2/publicremote.php @@ -108,7 +108,6 @@ } $share = $authBackend->getShare(); - $owner = $share->getShareOwner(); $isReadable = $share->getPermissions() & \OCP\Constants::PERMISSION_READ; $fileId = $share->getNodeId(); @@ -130,10 +129,10 @@ Filesystem::logWarningWhenAddingStorageWrapper($previousLog); OC_Util::tearDownFS(); - OC_Util::setupFS($owner); - $ownerView = new View('/'. $owner . '/files'); - $path = $ownerView->getPath($fileId); - $fileInfo = $ownerView->getFileInfo($path); + OC_Util::setupFS($share->getSharedBy()); + $initiatorView = new View('/'. $share->getSharedBy() . '/files'); + $path = $initiatorView->getPath($fileId); + $fileInfo = $initiatorView->getFileInfo($path); if ($fileInfo === false) { throw new NotFound(); @@ -146,7 +145,7 @@ $filesDropPlugin->enable(); } - $view = new View($ownerView->getAbsolutePath($path)); + $view = new View($initiatorView->getAbsolutePath($path)); $filesDropPlugin->setView($view); return $view; diff --git a/apps/dav/lib/Files/Sharing/PublicLinkCheckPlugin.php b/apps/dav/lib/Files/Sharing/PublicLinkCheckPlugin.php index 94cd6d29c6c1e..1cd254a32085a 100644 --- a/apps/dav/lib/Files/Sharing/PublicLinkCheckPlugin.php +++ b/apps/dav/lib/Files/Sharing/PublicLinkCheckPlugin.php @@ -57,7 +57,7 @@ public function initialize(\Sabre\DAV\Server $server) { } public function beforeMethod(RequestInterface $request, ResponseInterface $response) { - // verify that the owner didn't have his share permissions revoked + // verify that the initiator didn't have their share permissions revoked if ($this->fileInfo && !$this->fileInfo->isShareable()) { throw new NotFound(); } diff --git a/apps/federatedfilesharing/lib/FederatedShareProvider.php b/apps/federatedfilesharing/lib/FederatedShareProvider.php index b35bdd90ed3da..0546f3489e17d 100644 --- a/apps/federatedfilesharing/lib/FederatedShareProvider.php +++ b/apps/federatedfilesharing/lib/FederatedShareProvider.php @@ -160,30 +160,30 @@ public function create(IShare $share) { $share->setSharedWith($cloudId->getId()); try { - $remoteShare = $this->getShareFromExternalShareTable($share); + $remoteShare = $this->getShareFromExternalShareTable($share->getShareOwner(), $share->getTarget()); } catch (ShareNotFound $e) { $remoteShare = null; } if ($remoteShare) { - try { - $ownerCloudId = $this->cloudIdManager->getCloudId($remoteShare['owner'], $remoteShare['remote']); - $shareId = $this->addShareToDB($itemSource, $itemType, $shareWith, $sharedBy, $ownerCloudId->getId(), $permissions, 'tmp_token_' . time(), $shareType, $expirationDate); - $share->setId($shareId); - [$token, $remoteId] = $this->askOwnerToReShare($shareWith, $share, $shareId); - // remote share was create successfully if we get a valid token as return - $send = is_string($token) && $token !== ''; - } catch (\Exception $e) { - // fall back to old re-share behavior if the remote server - // doesn't support flat re-shares (was introduced with Nextcloud 9.1) - $this->removeShareFromTable($share); - $shareId = $this->createFederatedShare($share); - } - if ($send) { + $ownerCloudId = $this->cloudIdManager->getCloudId($remoteShare['owner'], $remoteShare['remote']); + $shareId = $this->addShareToDB($itemSource, $itemType, $shareWith, $sharedBy, $ownerCloudId->getId(), $permissions, 'tmp_token_' . time(), $shareType, $expirationDate); + [$token, $remoteId] = $this->notifications->requestReShare( + $remoteShare['share_token'], + $remoteShare['remote_id'], + $shareId, + $remoteShare['remote'], + $shareWith, + $permissions, + $share->getNode()->getName(), + $shareType, + ); + // remote share was create successfully if we get a valid token as return + if (is_string($token) && $token !== '') { $this->updateSuccessfulReshare($shareId, $token); $this->storeRemoteId($shareId, $remoteId); } else { - $this->removeShareFromTable($share); + $this->removeShareFromTable($shareId); $message_t = $this->l->t('File is already shared with %s', [$shareWith]); throw new \Exception($message_t); } @@ -250,7 +250,7 @@ protected function createFederatedShare(IShare $share) { } if ($failure) { - $this->removeShareFromTableById($shareId); + $this->removeShareFromTable($shareId); $message_t = $this->l->t('Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate.', [$share->getNode()->getName(), $share->getSharedWith()]); throw new \Exception($message_t); @@ -259,45 +259,18 @@ protected function createFederatedShare(IShare $share) { return $shareId; } - /** - * @param string $shareWith - * @param IShare $share - * @param string $shareId internal share Id - * @return array - * @throws \Exception - */ - protected function askOwnerToReShare($shareWith, IShare $share, $shareId) { - $remoteShare = $this->getShareFromExternalShareTable($share); - $token = $remoteShare['share_token']; - $remoteId = $remoteShare['remote_id']; - $remote = $remoteShare['remote']; - - [$token, $remoteId] = $this->notifications->requestReShare( - $token, - $remoteId, - $shareId, - $remote, - $shareWith, - $share->getPermissions(), - $share->getNode()->getName() - ); - - return [$token, $remoteId]; - } - /** * get federated share from the share_external table but exclude mounted link shares * - * @param IShare $share * @return array * @throws ShareNotFound */ - protected function getShareFromExternalShareTable(IShare $share) { + protected function getShareFromExternalShareTable(string $owner, string $target) { $query = $this->dbConnection->getQueryBuilder(); $query->select('*')->from($this->externalShareTable) - ->where($query->expr()->eq('user', $query->createNamedParameter($share->getShareOwner()))) - ->andWhere($query->expr()->eq('mountpoint', $query->createNamedParameter($share->getTarget()))); - $qResult = $query->execute(); + ->where($query->expr()->eq('user', $query->createNamedParameter($owner))) + ->andWhere($query->expr()->eq('mountpoint', $query->createNamedParameter($target))); + $qResult = $query->executeQuery(); $result = $qResult->fetchAll(); $qResult->closeCursor(); @@ -505,7 +478,7 @@ public function delete(IShare $share) { // only remove the share when all messages are send to not lose information // about the share to early - $this->removeShareFromTable($share); + $this->removeShareFromTable($share->getId()); } /** @@ -536,20 +509,9 @@ protected function revokeShare($share, $isOwner) { } /** - * remove share from table - * - * @param IShare $share - */ - public function removeShareFromTable(IShare $share) { - $this->removeShareFromTableById($share->getId()); - } - - /** - * remove share from table - * - * @param string $shareId + * Remove share from table. */ - private function removeShareFromTableById($shareId) { + public function removeShareFromTable(string $shareId): void { $qb = $this->dbConnection->getQueryBuilder(); $qb->delete('share') ->where($qb->expr()->eq('id', $qb->createNamedParameter($shareId))) diff --git a/apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php b/apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php index 923214f0f2d53..b43ae46ee229a 100644 --- a/apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php +++ b/apps/federatedfilesharing/lib/OCM/CloudFederationProviderFiles.php @@ -399,8 +399,8 @@ protected function shareDeclined($id, array $notification) { * @param IShare $share * @throws ShareNotFound */ - protected function executeDeclineShare(IShare $share) { - $this->federatedShareProvider->removeShareFromTable($share); + protected function executeDeclineShare(IShare $share): void { + $this->federatedShareProvider->removeShareFromTable($share->getId()); try { $fileId = (int)$share->getNode()->getId(); @@ -437,7 +437,7 @@ private function undoReshare($id, array $notification) { $share = $this->federatedShareProvider->getShareById($id); $this->verifyShare($share, $token); - $this->federatedShareProvider->removeShareFromTable($share); + $this->federatedShareProvider->removeShareFromTable($share->getId()); return []; } diff --git a/apps/federatedfilesharing/tests/FederatedShareProviderTest.php b/apps/federatedfilesharing/tests/FederatedShareProviderTest.php index f6d685b14022c..6d8bd8924d89a 100644 --- a/apps/federatedfilesharing/tests/FederatedShareProviderTest.php +++ b/apps/federatedfilesharing/tests/FederatedShareProviderTest.php @@ -178,7 +178,8 @@ public function testCreate($expirationDate, $expectedDataDate) { ->setPermissions(19) ->setShareType(IShare::TYPE_REMOTE) ->setExpirationDate($expirationDate) - ->setNode($node); + ->setNode($node) + ->setTarget(''); $this->tokenHandler->method('generateToken')->willReturn('token'); @@ -259,7 +260,8 @@ public function testCreateCouldNotFindServer() { ->setShareOwner('shareOwner') ->setPermissions(19) ->setShareType(IShare::TYPE_REMOTE) - ->setNode($node); + ->setNode($node) + ->setTarget(''); $this->tokenHandler->method('generateToken')->willReturn('token'); @@ -320,7 +322,8 @@ public function testCreateException() { ->setShareOwner('shareOwner') ->setPermissions(19) ->setShareType(IShare::TYPE_REMOTE) - ->setNode($node); + ->setNode($node) + ->setTarget(''); $this->tokenHandler->method('generateToken')->willReturn('token'); @@ -428,7 +431,8 @@ public function testCreateAlreadyShared() { ->setShareOwner('shareOwner') ->setPermissions(19) ->setShareType(IShare::TYPE_REMOTE) - ->setNode($node); + ->setNode($node) + ->setTarget(''); $this->tokenHandler->method('generateToken')->willReturn('token'); @@ -500,7 +504,8 @@ public function testUpdate($owner, $sharedBy, $expirationDate) { ->setPermissions(19) ->setShareType(IShare::TYPE_REMOTE) ->setExpirationDate(new \DateTime('2019-02-01T01:02:03')) - ->setNode($node); + ->setNode($node) + ->setTarget(''); $this->tokenHandler->method('generateToken')->willReturn('token'); $this->addressHandler->expects($this->any())->method('generateRemoteURL') @@ -577,7 +582,8 @@ public function testGetSharedBy() { ->setShareOwner('shareOwner') ->setPermissions(19) ->setShareType(IShare::TYPE_REMOTE) - ->setNode($node); + ->setNode($node) + ->setTarget(''); $this->provider->create($share); $share2 = $this->shareManager->newShare(); @@ -586,7 +592,8 @@ public function testGetSharedBy() { ->setShareOwner('shareOwner') ->setPermissions(19) ->setShareType(IShare::TYPE_REMOTE) - ->setNode($node); + ->setNode($node) + ->setTarget(''); $this->provider->create($share2); $shares = $this->provider->getSharesBy('sharedBy', IShare::TYPE_REMOTE, null, false, -1, 0); @@ -621,7 +628,8 @@ public function testGetSharedByWithNode() { ->setShareOwner('shareOwner') ->setPermissions(19) ->setShareType(IShare::TYPE_REMOTE) - ->setNode($node); + ->setNode($node) + ->setTarget(''); $this->provider->create($share); $node2 = $this->getMockBuilder(File::class)->getMock(); @@ -634,7 +642,8 @@ public function testGetSharedByWithNode() { ->setShareOwner('shareOwner') ->setPermissions(19) ->setShareType(IShare::TYPE_REMOTE) - ->setNode($node2); + ->setNode($node2) + ->setTarget(''); $this->provider->create($share2); $shares = $this->provider->getSharesBy('sharedBy', IShare::TYPE_REMOTE, $node2, false, -1, 0); @@ -668,7 +677,8 @@ public function testGetSharedByWithReshares() { ->setShareOwner('shareOwner') ->setPermissions(19) ->setShareType(IShare::TYPE_REMOTE) - ->setNode($node); + ->setNode($node) + ->setTarget(''); $this->provider->create($share); $share2 = $this->shareManager->newShare(); @@ -677,7 +687,8 @@ public function testGetSharedByWithReshares() { ->setShareOwner('shareOwner') ->setPermissions(19) ->setShareType(IShare::TYPE_REMOTE) - ->setNode($node); + ->setNode($node) + ->setTarget(''); $this->provider->create($share2); $shares = $this->provider->getSharesBy('shareOwner', IShare::TYPE_REMOTE, null, true, -1, 0); @@ -718,7 +729,8 @@ public function testGetSharedByWithLimit() { ->setShareOwner('shareOwner') ->setPermissions(19) ->setShareType(IShare::TYPE_REMOTE) - ->setNode($node); + ->setNode($node) + ->setTarget(''); $this->provider->create($share); $share2 = $this->shareManager->newShare(); @@ -727,7 +739,8 @@ public function testGetSharedByWithLimit() { ->setShareOwner('shareOwner') ->setPermissions(19) ->setShareType(IShare::TYPE_REMOTE) - ->setNode($node); + ->setNode($node) + ->setTarget(''); $this->provider->create($share2); $shares = $this->provider->getSharesBy('shareOwner', IShare::TYPE_REMOTE, null, true, 1, 1); @@ -928,7 +941,8 @@ public function testGetSharesInFolder() { ->setShareOwner($u1->getUID()) ->setPermissions(\OCP\Constants::PERMISSION_READ) ->setShareType(IShare::TYPE_REMOTE) - ->setNode($file1); + ->setNode($file1) + ->setTarget(''); $this->provider->create($share1); $share2 = $this->shareManager->newShare(); @@ -937,7 +951,8 @@ public function testGetSharesInFolder() { ->setShareOwner($u1->getUID()) ->setPermissions(\OCP\Constants::PERMISSION_READ) ->setShareType(IShare::TYPE_REMOTE) - ->setNode($file2); + ->setNode($file2) + ->setTarget(''); $this->provider->create($share2); $result = $this->provider->getSharesInFolder($u1->getUID(), $folder1, false); @@ -988,7 +1003,8 @@ public function testGetAccessList() { ->setShareOwner($u1->getUID()) ->setPermissions(\OCP\Constants::PERMISSION_READ) ->setShareType(IShare::TYPE_REMOTE) - ->setNode($file1); + ->setNode($file1) + ->setTarget(''); $this->provider->create($share1); $share2 = $this->shareManager->newShare(); @@ -997,7 +1013,8 @@ public function testGetAccessList() { ->setShareOwner($u1->getUID()) ->setPermissions(\OCP\Constants::PERMISSION_READ) ->setShareType(IShare::TYPE_REMOTE) - ->setNode($file1); + ->setNode($file1) + ->setTarget(''); $this->provider->create($share2); $result = $this->provider->getAccessList([$file1], true);