Skip to content

Commit 1738e17

Browse files
authored
Merge pull request #19793 from nextcloud/bugfix/noid/link-to-federated-reshare
Fix resharing of federated shares that were created out of links
2 parents a64681a + 7a9469f commit 1738e17

File tree

6 files changed

+18
-33
lines changed

6 files changed

+18
-33
lines changed

apps/federatedfilesharing/lib/Controller/MountPublicLinkController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
use OCP\ISession;
4444
use OCP\IUserSession;
4545
use OCP\Share\IManager;
46+
use OCP\Share\IShare;
4647

4748
/**
4849
* Class MountPublicLinkController
@@ -155,6 +156,7 @@ public function createFederatedShare($shareWith, $token, $password = '') {
155156
}
156157

157158
$share->setSharedWith($shareWith);
159+
$share->setShareType(IShare::TYPE_REMOTE);
158160

159161
try {
160162
$this->federatedShareProvider->create($share);

apps/files_sharing/lib/Controller/ShareAPIController.php

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

495-
$share->setPermissions(
496-
Constants::PERMISSION_READ |
495+
$permissions = Constants::PERMISSION_READ |
497496
Constants::PERMISSION_CREATE |
498497
Constants::PERMISSION_UPDATE |
499-
Constants::PERMISSION_DELETE
500-
);
498+
Constants::PERMISSION_DELETE;
501499
} else {
502-
$share->setPermissions(Constants::PERMISSION_READ);
500+
$permissions = Constants::PERMISSION_READ;
501+
}
502+
// TODO: It might make sense to have a dedicated setting to allow/deny converting link shares into federated ones
503+
if ($this->shareManager->outgoingServer2ServerSharesAllowed()) {
504+
$permissions |= Constants::PERMISSION_SHARE;
503505
}
506+
$share->setPermissions($permissions);
504507

505508
// Set password
506509
if ($password !== '') {

apps/files_sharing/tests/ApiTest.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,9 @@ public function testCreateShareLink() {
203203
$ocs->cleanup();
204204

205205
$data = $result->getData();
206-
$this->assertEquals(1, $data['permissions']);
206+
$this->assertEquals(\OCP\Constants::PERMISSION_READ |
207+
\OCP\Constants::PERMISSION_SHARE,
208+
$data['permissions']);
207209
$this->assertEmpty($data['expiration']);
208210
$this->assertTrue(is_string($data['token']));
209211

@@ -228,7 +230,8 @@ public function testCreateShareLinkPublicUpload() {
228230
\OCP\Constants::PERMISSION_READ |
229231
\OCP\Constants::PERMISSION_CREATE |
230232
\OCP\Constants::PERMISSION_UPDATE |
231-
\OCP\Constants::PERMISSION_DELETE,
233+
\OCP\Constants::PERMISSION_DELETE |
234+
\OCP\Constants::PERMISSION_SHARE,
232235
$data['permissions']
233236
);
234237
$this->assertEmpty($data['expiration']);

build/integration/sharing_features/sharing-v1.feature

Lines changed: 3 additions & 3 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 |

lib/private/Share20/Manager.php

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

628-
// Link shares by definition can't have share permissions
629-
if ($share->getPermissions() & \OCP\Constants::PERMISSION_SHARE) {
630-
throw new \InvalidArgumentException('Link shares can’t have reshare permissions');
631-
}
632-
633628
// Check if public upload is allowed
634629
if (!$this->shareApiLinkAllowPublicUpload() &&
635630
($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
@@ -1374,24 +1374,6 @@ public function testLinkCreateChecksNoLinkSharesAllowed() {
13741374
}
13751375

13761376

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

0 commit comments

Comments
 (0)