Skip to content

Commit 8764797

Browse files
authored
Merge pull request #21109 from nextcloud/backport/19793/stable18
[stable18] Fix resharing of federated shares that were created out of links
2 parents 852b0ba + 9d422a2 commit 8764797

File tree

9 files changed

+45
-43
lines changed

9 files changed

+45
-43
lines changed

apps/federatedfilesharing/lib/Controller/MountPublicLinkController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
use OCP\IUserSession;
4949
use OCP\Share\IManager;
5050
use OCP\Util;
51+
use OCP\Share\IShare;
5152

5253
/**
5354
* Class MountPublicLinkController
@@ -161,6 +162,7 @@ public function createFederatedShare($shareWith, $token, $password = '') {
161162
}
162163

163164
$share->setSharedWith($shareWith);
165+
$share->setShareType(IShare::TYPE_REMOTE);
164166

165167
try {
166168
$this->federatedShareProvider->create($share);

apps/files_sharing/js/dist/files_sharing_tab.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/files_sharing/js/dist/files_sharing_tab.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/files_sharing/lib/Controller/ShareAPIController.php

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -490,16 +490,21 @@ public function createShare(
490490
throw new OCSNotFoundException($this->l->t('Public upload is only possible for publicly shared folders'));
491491
}
492492

493-
$share->setPermissions(
494-
Constants::PERMISSION_READ |
493+
$permissions = Constants::PERMISSION_READ |
495494
Constants::PERMISSION_CREATE |
496495
Constants::PERMISSION_UPDATE |
497-
Constants::PERMISSION_DELETE
498-
);
496+
Constants::PERMISSION_DELETE;
499497
} else {
500-
$share->setPermissions(Constants::PERMISSION_READ);
498+
$permissions = Constants::PERMISSION_READ;
499+
}
500+
501+
// TODO: It might make sense to have a dedicated setting to allow/deny converting link shares into federated ones
502+
if (($permissions & Constants::PERMISSION_READ) && $this->shareManager->outgoingServer2ServerSharesAllowed()) {
503+
$permissions |= Constants::PERMISSION_SHARE;
501504
}
502505

506+
$share->setPermissions($permissions);
507+
503508
// Set password
504509
if ($password !== '') {
505510
$share->setPassword($password);
@@ -1030,6 +1035,11 @@ public function updateShare(
10301035
}
10311036

10321037
if ($newPermissions !== null) {
1038+
// TODO: It might make sense to have a dedicated setting to allow/deny converting link shares into federated ones
1039+
if (($newPermissions & Constants::PERMISSION_READ) && $this->shareManager->outgoingServer2ServerSharesAllowed()) {
1040+
$newPermissions |= Constants::PERMISSION_SHARE;
1041+
}
1042+
10331043
$share->setPermissions($newPermissions);
10341044
$permissions = $newPermissions;
10351045
}

apps/files_sharing/src/components/SharingEntryLink.vue

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,21 +126,21 @@
126126
<template v-if="share.canEdit">
127127
<!-- folder -->
128128
<template v-if="isFolder && fileHasCreatePermission && config.isPublicUploadEnabled">
129-
<ActionRadio :checked="share.permissions === publicUploadRValue"
129+
<ActionRadio :checked="sharePermissions === publicUploadRValue"
130130
:value="publicUploadRValue"
131131
:name="randomId"
132132
:disabled="saving"
133133
@change="togglePermissions">
134134
{{ t('files_sharing', 'Read only') }}
135135
</ActionRadio>
136-
<ActionRadio :checked="share.permissions === publicUploadRWValue"
136+
<ActionRadio :checked="sharePermissions === publicUploadRWValue"
137137
:value="publicUploadRWValue"
138138
:disabled="saving"
139139
:name="randomId"
140140
@change="togglePermissions">
141141
{{ t('files_sharing', 'Allow upload and editing') }}
142142
</ActionRadio>
143-
<ActionRadio :checked="share.permissions === publicUploadWValue"
143+
<ActionRadio :checked="sharePermissions === publicUploadWValue"
144144
:value="publicUploadWValue"
145145
:disabled="saving"
146146
:name="randomId"
@@ -357,6 +357,15 @@ export default {
357357
},
358358
359359
computed: {
360+
/**
361+
* Return the current share permissions
362+
* We always ignore the SHARE permission as this is used for the
363+
* federated sharing.
364+
* @returns {number}
365+
*/
366+
sharePermissions() {
367+
return this.share.permissions & ~OC.PERMISSION_SHARE
368+
},
360369
/**
361370
* Generate a unique random id for this SharingEntryLink only
362371
* This allows ActionRadios to have the same name prop

apps/files_sharing/tests/ApiTest.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,9 @@ public function testCreateShareLink() {
205205
$ocs->cleanup();
206206

207207
$data = $result->getData();
208-
$this->assertEquals(1, $data['permissions']);
208+
$this->assertEquals(\OCP\Constants::PERMISSION_READ |
209+
\OCP\Constants::PERMISSION_SHARE,
210+
$data['permissions']);
209211
$this->assertEmpty($data['expiration']);
210212
$this->assertTrue(is_string($data['token']));
211213

@@ -230,7 +232,8 @@ public function testCreateShareLinkPublicUpload() {
230232
\OCP\Constants::PERMISSION_READ |
231233
\OCP\Constants::PERMISSION_CREATE |
232234
\OCP\Constants::PERMISSION_UPDATE |
233-
\OCP\Constants::PERMISSION_DELETE,
235+
\OCP\Constants::PERMISSION_DELETE |
236+
\OCP\Constants::PERMISSION_SHARE,
234237
$data['permissions']
235238
);
236239
$this->assertEmpty($data['expiration']);
@@ -1002,7 +1005,8 @@ function testUpdateShareUpload() {
10021005
\OCP\Constants::PERMISSION_READ |
10031006
\OCP\Constants::PERMISSION_CREATE |
10041007
\OCP\Constants::PERMISSION_UPDATE |
1005-
\OCP\Constants::PERMISSION_DELETE,
1008+
\OCP\Constants::PERMISSION_DELETE |
1009+
\OCP\Constants::PERMISSION_SHARE,
10061010
$share1->getPermissions()
10071011
);
10081012

build/integration/sharing_features/sharing-v1.feature

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ Feature: sharing
9191
And the HTTP status code should be "200"
9292
And Share fields of last share match with
9393
| id | A_NUMBER |
94-
| permissions | 15 |
94+
| permissions | 31 |
9595
| expiration | +3 days |
9696
| url | AN_URL |
9797
| token | A_TOKEN |
@@ -130,7 +130,7 @@ Feature: sharing
130130
| share_type | 3 |
131131
| file_source | A_NUMBER |
132132
| file_target | /FOLDER |
133-
| permissions | 1 |
133+
| permissions | 17 |
134134
| stime | A_NUMBER |
135135
| expiration | +3 days |
136136
| token | A_TOKEN |
@@ -163,7 +163,7 @@ Feature: sharing
163163
| share_type | 3 |
164164
| file_source | A_NUMBER |
165165
| file_target | /FOLDER |
166-
| permissions | 1 |
166+
| permissions | 17 |
167167
| stime | A_NUMBER |
168168
| token | A_TOKEN |
169169
| storage | A_NUMBER |
@@ -195,7 +195,7 @@ Feature: sharing
195195
| share_type | 3 |
196196
| file_source | A_NUMBER |
197197
| file_target | /FOLDER |
198-
| permissions | 15 |
198+
| permissions | 31 |
199199
| stime | A_NUMBER |
200200
| token | A_TOKEN |
201201
| storage | A_NUMBER |
@@ -259,7 +259,7 @@ Feature: sharing
259259
| share_type | 3 |
260260
| file_source | A_NUMBER |
261261
| file_target | /FOLDER |
262-
| permissions | 15 |
262+
| permissions | 31 |
263263
| stime | A_NUMBER |
264264
| token | A_TOKEN |
265265
| storage | A_NUMBER |

lib/private/Share20/Manager.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -626,11 +626,6 @@ protected function linkCreateChecks(\OCP\Share\IShare $share) {
626626
throw new \Exception('Link sharing is not allowed');
627627
}
628628

629-
// Link shares by definition can't have share permissions
630-
if ($share->getPermissions() & \OCP\Constants::PERMISSION_SHARE) {
631-
throw new \InvalidArgumentException('Link shares can’t have reshare permissions');
632-
}
633-
634629
// Check if public upload is allowed
635630
if (!$this->shareApiLinkAllowPublicUpload() &&
636631
($share->getPermissions() & (\OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE))) {

tests/lib/Share20/ManagerTest.php

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1375,24 +1375,6 @@ public function testLinkCreateChecksNoLinkSharesAllowed() {
13751375
}
13761376

13771377

1378-
public function testLinkCreateChecksSharePermissions() {
1379-
$this->expectException(\Exception::class);
1380-
$this->expectExceptionMessage('Link shares can’t have reshare permissions');
1381-
1382-
$share = $this->manager->newShare();
1383-
1384-
$share->setPermissions(\OCP\Constants::PERMISSION_SHARE);
1385-
1386-
$this->config
1387-
->method('getAppValue')
1388-
->will($this->returnValueMap([
1389-
['core', 'shareapi_allow_links', 'yes', 'yes'],
1390-
]));
1391-
1392-
self::invokePrivate($this->manager, 'linkCreateChecks', [$share]);
1393-
}
1394-
1395-
13961378
public function testLinkCreateChecksNoPublicUpload() {
13971379
$this->expectException(\Exception::class);
13981380
$this->expectExceptionMessage('Public upload is not allowed');

0 commit comments

Comments
 (0)