Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoeland Jago Douma <rullzer@users.noreply.github.com>2020-05-28 17:19:50 +0300
committerGitHub <noreply@github.com>2020-05-28 17:19:50 +0300
commit913ce60dc3353f1eb2b5fa3ab1f7077389c0f62c (patch)
treea9161cf8be15f41416e3f15c17e61242ffa7b9ff
parentace0ace0818fcc2eec1cb022814832437187ce37 (diff)
parent3584797c16903478335fc07b5e6c7b901ca95e33 (diff)
Merge pull request #21110 from nextcloud/backport/19793/stable17
[stable17] Fix resharing of federated shares that were created out of links
-rw-r--r--apps/federatedfilesharing/lib/Controller/MountPublicLinkController.php2
-rw-r--r--apps/files_sharing/lib/Controller/ShareAPIController.php20
-rw-r--r--apps/files_sharing/tests/ApiTest.php10
-rw-r--r--build/integration/features/sharing-v1.feature10
-rw-r--r--lib/private/Share20/Manager.php5
-rw-r--r--tests/lib/Share20/ManagerTest.php18
6 files changed, 29 insertions, 36 deletions
diff --git a/apps/federatedfilesharing/lib/Controller/MountPublicLinkController.php b/apps/federatedfilesharing/lib/Controller/MountPublicLinkController.php
index d54f24d97fe..63f5350754d 100644
--- a/apps/federatedfilesharing/lib/Controller/MountPublicLinkController.php
+++ b/apps/federatedfilesharing/lib/Controller/MountPublicLinkController.php
@@ -48,6 +48,7 @@ use OCP\ISession;
use OCP\IUserSession;
use OCP\Share\IManager;
use OCP\Util;
+use OCP\Share\IShare;
/**
* Class MountPublicLinkController
@@ -161,6 +162,7 @@ class MountPublicLinkController extends Controller {
}
$share->setSharedWith($shareWith);
+ $share->setShareType(IShare::TYPE_REMOTE);
try {
$this->federatedShareProvider->create($share);
diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php
index 09489861e1c..f8847125a29 100644
--- a/apps/files_sharing/lib/Controller/ShareAPIController.php
+++ b/apps/files_sharing/lib/Controller/ShareAPIController.php
@@ -470,16 +470,21 @@ class ShareAPIController extends OCSController {
throw new OCSNotFoundException($this->l->t('Public upload is only possible for publicly shared folders'));
}
- $share->setPermissions(
- Constants::PERMISSION_READ |
+ $permissions = Constants::PERMISSION_READ |
Constants::PERMISSION_CREATE |
Constants::PERMISSION_UPDATE |
- Constants::PERMISSION_DELETE
- );
+ Constants::PERMISSION_DELETE;
} else {
- $share->setPermissions(Constants::PERMISSION_READ);
+ $permissions = Constants::PERMISSION_READ;
+ }
+
+ // TODO: It might make sense to have a dedicated setting to allow/deny converting link shares into federated ones
+ if (($permissions & Constants::PERMISSION_READ) && $this->shareManager->outgoingServer2ServerSharesAllowed()) {
+ $permissions |= Constants::PERMISSION_SHARE;
}
+ $share->setPermissions($permissions);
+
// Set password
if ($password !== '') {
$share->setPassword($password);
@@ -903,6 +908,11 @@ class ShareAPIController extends OCSController {
}
if ($newPermissions !== null) {
+ // TODO: It might make sense to have a dedicated setting to allow/deny converting link shares into federated ones
+ if (($newPermissions & Constants::PERMISSION_READ) && $this->shareManager->outgoingServer2ServerSharesAllowed()) {
+ $newPermissions |= Constants::PERMISSION_SHARE;
+ }
+
$share->setPermissions($newPermissions);
$permissions = $newPermissions;
}
diff --git a/apps/files_sharing/tests/ApiTest.php b/apps/files_sharing/tests/ApiTest.php
index 0616daed62d..ef5a4330d3f 100644
--- a/apps/files_sharing/tests/ApiTest.php
+++ b/apps/files_sharing/tests/ApiTest.php
@@ -203,7 +203,9 @@ class ApiTest extends TestCase {
$ocs->cleanup();
$data = $result->getData();
- $this->assertEquals(1, $data['permissions']);
+ $this->assertEquals(\OCP\Constants::PERMISSION_READ |
+ \OCP\Constants::PERMISSION_SHARE,
+ $data['permissions']);
$this->assertEmpty($data['expiration']);
$this->assertTrue(is_string($data['token']));
@@ -228,7 +230,8 @@ class ApiTest extends TestCase {
\OCP\Constants::PERMISSION_READ |
\OCP\Constants::PERMISSION_CREATE |
\OCP\Constants::PERMISSION_UPDATE |
- \OCP\Constants::PERMISSION_DELETE,
+ \OCP\Constants::PERMISSION_DELETE |
+ \OCP\Constants::PERMISSION_SHARE,
$data['permissions']
);
$this->assertEmpty($data['expiration']);
@@ -974,7 +977,8 @@ class ApiTest extends TestCase {
\OCP\Constants::PERMISSION_READ |
\OCP\Constants::PERMISSION_CREATE |
\OCP\Constants::PERMISSION_UPDATE |
- \OCP\Constants::PERMISSION_DELETE,
+ \OCP\Constants::PERMISSION_DELETE |
+ \OCP\Constants::PERMISSION_SHARE,
$share1->getPermissions()
);
diff --git a/build/integration/features/sharing-v1.feature b/build/integration/features/sharing-v1.feature
index dd5cc9fff4f..c271ac158b4 100644
--- a/build/integration/features/sharing-v1.feature
+++ b/build/integration/features/sharing-v1.feature
@@ -90,7 +90,7 @@ Feature: sharing
And the HTTP status code should be "200"
And Share fields of last share match with
| id | A_NUMBER |
- | permissions | 15 |
+ | permissions | 31 |
| expiration | +3 days |
| url | AN_URL |
| token | A_TOKEN |
@@ -128,7 +128,7 @@ Feature: sharing
| share_type | 3 |
| file_source | A_NUMBER |
| file_target | /FOLDER |
- | permissions | 1 |
+ | permissions | 17 |
| stime | A_NUMBER |
| expiration | +3 days |
| token | A_TOKEN |
@@ -160,7 +160,7 @@ Feature: sharing
| share_type | 3 |
| file_source | A_NUMBER |
| file_target | /FOLDER |
- | permissions | 1 |
+ | permissions | 17 |
| stime | A_NUMBER |
| token | A_TOKEN |
| storage | A_NUMBER |
@@ -191,7 +191,7 @@ Feature: sharing
| share_type | 3 |
| file_source | A_NUMBER |
| file_target | /FOLDER |
- | permissions | 15 |
+ | permissions | 31 |
| stime | A_NUMBER |
| token | A_TOKEN |
| storage | A_NUMBER |
@@ -253,7 +253,7 @@ Feature: sharing
| share_type | 3 |
| file_source | A_NUMBER |
| file_target | /FOLDER |
- | permissions | 15 |
+ | permissions | 31 |
| stime | A_NUMBER |
| token | A_TOKEN |
| storage | A_NUMBER |
diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php
index f13878d71b4..6a6b52f2c80 100644
--- a/lib/private/Share20/Manager.php
+++ b/lib/private/Share20/Manager.php
@@ -537,11 +537,6 @@ class Manager implements IManager {
throw new \Exception('Link sharing is not allowed');
}
- // Link shares by definition can't have share permissions
- if ($share->getPermissions() & \OCP\Constants::PERMISSION_SHARE) {
- throw new \InvalidArgumentException('Link shares can’t have reshare permissions');
- }
-
// Check if public upload is allowed
if (!$this->shareApiLinkAllowPublicUpload() &&
($share->getPermissions() & (\OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE))) {
diff --git a/tests/lib/Share20/ManagerTest.php b/tests/lib/Share20/ManagerTest.php
index cf22ff53bab..da5890f8372 100644
--- a/tests/lib/Share20/ManagerTest.php
+++ b/tests/lib/Share20/ManagerTest.php
@@ -1363,24 +1363,6 @@ class ManagerTest extends \Test\TestCase {
/**
* @expectedException Exception
- * @expectedExceptionMessage Link shares can’t have reshare permissions
- */
- public function testLinkCreateChecksSharePermissions() {
- $share = $this->manager->newShare();
-
- $share->setPermissions(\OCP\Constants::PERMISSION_SHARE);
-
- $this->config
- ->method('getAppValue')
- ->will($this->returnValueMap([
- ['core', 'shareapi_allow_links', 'yes', 'yes'],
- ]));
-
- self::invokePrivate($this->manager, 'linkCreateChecks', [$share]);
- }
-
- /**
- * @expectedException Exception
* @expectedExceptionMessage Public upload is not allowed
*/
public function testLinkCreateChecksNoPublicUpload() {