diff --git a/apps/files_sharing/lib/API/Share20OCS.php b/apps/files_sharing/lib/API/Share20OCS.php index 7b0016a6953d..89b1d413f329 100644 --- a/apps/files_sharing/lib/API/Share20OCS.php +++ b/apps/files_sharing/lib/API/Share20OCS.php @@ -365,7 +365,8 @@ public function createShare() { \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE ); - } else if ($permissions === \OCP\Constants::PERMISSION_CREATE) { + } else if ($permissions === \OCP\Constants::PERMISSION_CREATE || + $permissions === (\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE)) { $share->setPermissions($permissions); } else { // because when "publicUpload" is passed usually no permissions are set, diff --git a/apps/files_sharing/tests/API/Share20OCSTest.php b/apps/files_sharing/tests/API/Share20OCSTest.php index 8be3e701fb9e..022fe2db7865 100644 --- a/apps/files_sharing/tests/API/Share20OCSTest.php +++ b/apps/files_sharing/tests/API/Share20OCSTest.php @@ -1097,6 +1097,50 @@ public function testCreateShareLinkPublicUploadFolder() { $this->assertEquals($expected->getData(), $result->getData()); } + public function testCreateShareLinkReadWritePermissions() { + $ocs = $this->mockFormatShare(); + + $this->request + ->method('getParam') + ->will($this->returnValueMap([ + ['path', null, 'valid-path'], + ['shareType', '-1', Share::SHARE_TYPE_LINK], + ['permissions', null, '15'], + ['expireDate', '', ''], + ['password', '', ''], + ])); + + $path = $this->createMock('\OCP\Files\Folder'); + $storage = $this->createMock('OCP\Files\Storage'); + $storage->method('instanceOfStorage') + ->with('OCA\Files_Sharing\External\Storage') + ->willReturn(false); + $path->method('getStorage')->willReturn($storage); + $this->rootFolder->method('getUserFolder')->with($this->currentUser->getUID())->will($this->returnSelf()); + $this->rootFolder->method('get')->with('valid-path')->willReturn($path); + + $this->shareManager->method('newShare')->willReturn(\OC::$server->getShareManager()->newShare()); + $this->shareManager->method('shareApiAllowLinks')->willReturn(true); + $this->shareManager->method('shareApiLinkAllowPublicUpload')->willReturn(true); + + $this->shareManager->expects($this->once())->method('createShare')->with( + $this->callback(function (\OCP\Share\IShare $share) use ($path) { + return $share->getNode() === $path && + $share->getShareType() === Share::SHARE_TYPE_LINK && + $share->getPermissions() === (\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE) && + $share->getSharedBy() === 'currentUser' && + $share->getPassword() === null && + $share->getExpirationDate() === null; + }) + )->will($this->returnArgument(0)); + + $expected = new \OC\OCS\Result(null); + $result = $ocs->createShare(); + + $this->assertEquals($expected->getMeta(), $result->getMeta()); + $this->assertEquals($expected->getData(), $result->getData()); + } + public function testCreateShareLinkCreateOnlyFolder() { $ocs = $this->mockFormatShare(); diff --git a/tests/integration/features/sharing-v1.feature b/tests/integration/features/sharing-v1.feature index 70b1de98b25f..1988510045e9 100644 --- a/tests/integration/features/sharing-v1.feature +++ b/tests/integration/features/sharing-v1.feature @@ -1189,6 +1189,22 @@ Feature: sharing | share_type | 3 | | permissions | 1 | + Scenario: Creating link share with edit permissions keeps it + Given As an "admin" + And user "user0" exists + And user "user0" created a folder "/afolder" + And As an "user0" + And creating a share with + | path | /afolder | + | shareType | 3 | + | permissions | 15 | + Then the OCS status code should be "100" + And the HTTP status code should be "200" + And Share fields of last share match with + | id | A_NUMBER | + | share_type | 3 | + | permissions | 15 | + Scenario: resharing using a public link with read only permissions is not allowed Given As an "admin" And user "user0" exists