Skip to content

Commit 72b7c9f

Browse files
authored
Merge pull request #12105 from nextcloud/using-resharing-right-to-display-shares
Shares are displayed to users with resharing rights
2 parents 4ebb209 + 77b95cc commit 72b7c9f

File tree

7 files changed

+141
-23
lines changed

7 files changed

+141
-23
lines changed

apps/files_sharing/lib/Controller/ShareAPIController.php

Lines changed: 80 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
use OCP\AppFramework\OCSController;
4040
use OCP\AppFramework\QueryException;
4141
use OCP\Constants;
42-
use OCP\Files\Folder;
4342
use OCP\Files\Node;
4443
use OCP\Files\NotFoundException;
4544
use OCP\IConfig;
@@ -242,6 +241,9 @@ protected function formatShare(\OCP\Share\IShare $share, Node $recipientNode = n
242241

243242
$shareWithStart = ($hasCircleId? strrpos($share->getSharedWith(), '[') + 1: 0);
244243
$shareWithLength = ($hasCircleId? -1: strpos($share->getSharedWith(), ' '));
244+
if (is_bool($shareWithLength)) {
245+
$shareWithLength = -1;
246+
}
245247
$result['share_with'] = substr($share->getSharedWith(), $shareWithStart, $shareWithLength);
246248
} else if ($share->getShareType() === Share::SHARE_TYPE_ROOM) {
247249
$result['share_with'] = $share->getSharedWith();
@@ -730,15 +732,29 @@ public function getShares(
730732
$shares = array_merge($shares, $federatedShares);
731733
}
732734

733-
$formatted = [];
735+
$formatted = $miniFormatted = [];
736+
$resharingRight = false;
734737
foreach ($shares as $share) {
738+
/** @var IShare $share */
735739
try {
736-
$formatted[] = $this->formatShare($share, $path);
737-
} catch (NotFoundException $e) {
740+
$format = $this->formatShare($share, $path);
741+
$formatted[] = $format;
742+
if ($share->getSharedBy() === $this->currentUser) {
743+
$miniFormatted[] = $format;
744+
}
745+
746+
if (!$resharingRight && $this->shareProviderResharingRights($this->currentUser, $share, $path)) {
747+
$resharingRight = true;
748+
}
749+
} catch (\Exception $e) {
738750
//Ignore share
739751
}
740752
}
741753

754+
if (!$resharingRight) {
755+
$formatted = $miniFormatted;
756+
}
757+
742758
if ($include_tags) {
743759
$formatted = Helper::populateTags($formatted, 'file_source', \OC::$server->getTagManager());
744760
}
@@ -1122,4 +1138,64 @@ private function getRoomShareHelper() {
11221138

11231139
return $this->serverContainer->query('\OCA\Spreed\Share\Helper\ShareAPIController');
11241140
}
1141+
1142+
1143+
/**
1144+
* Returns if we can find resharing rights in an IShare object for a specific user.
1145+
*
1146+
* @suppress PhanUndeclaredClassMethod
1147+
*
1148+
* @param string $userId
1149+
* @param IShare $share
1150+
* @param Node $node
1151+
* @return bool
1152+
* @throws NotFoundException
1153+
* @throws \OCP\Files\InvalidPathException
1154+
*/
1155+
private function shareProviderResharingRights(string $userId, IShare $share, $node): bool {
1156+
1157+
if ($share->getShareOwner() === $userId) {
1158+
return true;
1159+
}
1160+
1161+
// we check that current user have parent resharing rights on the current file
1162+
if ($node !== null && ($node->getPermissions() & \OCP\Constants::PERMISSION_SHARE) !== 0) {
1163+
return true;
1164+
}
1165+
1166+
if ((\OCP\Constants::PERMISSION_SHARE & $share->getPermissions()) === 0) {
1167+
return false;
1168+
}
1169+
1170+
if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER && $share->getSharedWith() === $userId) {
1171+
return true;
1172+
}
1173+
1174+
if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP && $this->groupManager->isInGroup($userId, $share->getSharedWith())) {
1175+
return true;
1176+
}
1177+
1178+
if ($share->getShareType() === \OCP\Share::SHARE_TYPE_CIRCLE && \OC::$server->getAppManager()->isEnabledForUser('circles') &&
1179+
class_exists('\OCA\Circles\Api\v1\Circles')) {
1180+
$hasCircleId = (substr($share->getSharedWith(), -1) === ']');
1181+
$shareWithStart = ($hasCircleId ? strrpos($share->getSharedWith(), '[') + 1 : 0);
1182+
$shareWithLength = ($hasCircleId ? -1 : strpos($share->getSharedWith(), ' '));
1183+
if (is_bool($shareWithLength)) {
1184+
$shareWithLength = -1;
1185+
}
1186+
$sharedWith = substr($share->getSharedWith(), $shareWithStart, $shareWithLength);
1187+
try {
1188+
$member = \OCA\Circles\Api\v1\Circles::getMember($sharedWith, $userId, 1);
1189+
if ($member->getLevel() >= 4) {
1190+
return true;
1191+
}
1192+
return false;
1193+
} catch (QueryException $e) {
1194+
return false;
1195+
}
1196+
}
1197+
1198+
return false;
1199+
}
1200+
11251201
}

core/js/share/sharedialogshareelistview.handlebars

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
<ul id="shareWithList" class="shareWithList">
22
{{#each sharees}}
3+
{{#unless isShareWithCurrentUser}}
34
<li data-share-id="{{shareId}}" data-share-type="{{shareType}}" data-share-with="{{shareWith}}">
45
<div class="avatar {{#if modSeed}}imageplaceholderseed{{/if}}" data-username="{{shareWith}}" data-avatar="{{shareWithAvatar}}" data-displayname="{{shareWithDisplayName}}" {{#if modSeed}}data-seed="{{shareWith}} {{shareType}}"{{/if}}></div>
56
<span class="username" title="{{shareWithTitle}}">{{shareWithDisplayName}}</span>
7+
{{#if canUpdateShareSettings }}
68
<span class="sharingOptionsGroup">
79
{{#if editPermissionPossible}}
810
<span>
@@ -14,7 +16,9 @@
1416
{{{popoverMenu}}}
1517
</div>
1618
</span>
19+
{{/if}}
1720
</li>
21+
{{/unless}}
1822
{{/each}}
1923
{{#each linkReshares}}
2024
<li data-share-id="{{shareId}}" data-share-type="{{shareType}}">

core/js/sharedialogshareelistview.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
var shareType = this.model.getShareType(shareIndex);
8787
var sharedBy = this.model.getSharedBy(shareIndex);
8888
var sharedByDisplayName = this.model.getSharedByDisplayName(shareIndex);
89+
var fileOwnerUid = this.model.getFileOwnerUid(shareIndex);
8990

9091
var hasPermissionOverride = {};
9192
if (shareType === OC.Share.SHARE_TYPE_GROUP) {
@@ -143,13 +144,18 @@
143144
hasCreatePermission: this.model.hasCreatePermission(shareIndex),
144145
hasUpdatePermission: this.model.hasUpdatePermission(shareIndex),
145146
hasDeletePermission: this.model.hasDeletePermission(shareIndex),
147+
sharedBy: sharedBy,
148+
sharedByDisplayName: sharedByDisplayName,
146149
shareWith: shareWith,
147150
shareWithDisplayName: shareWithDisplayName,
148151
shareWithAvatar: shareWithAvatar,
149152
shareWithTitle: shareWithTitle,
150153
shareType: shareType,
151154
shareId: this.model.get('shares')[shareIndex].id,
152155
modSeed: shareWithAvatar || (shareType !== OC.Share.SHARE_TYPE_USER && shareType !== OC.Share.SHARE_TYPE_CIRCLE && shareType !== OC.Share.SHARE_TYPE_ROOM),
156+
owner: fileOwnerUid,
157+
isShareWithCurrentUser: (shareType === OC.Share.SHARE_TYPE_USER && shareWith === oc_current_user),
158+
canUpdateShareSettings: (sharedBy === oc_current_user || fileOwnerUid === oc_current_user),
153159
isRemoteShare: shareType === OC.Share.SHARE_TYPE_REMOTE,
154160
isRemoteGroupShare: shareType === OC.Share.SHARE_TYPE_REMOTE_GROUP,
155161
isNoteAvailable: shareType !== OC.Share.SHARE_TYPE_REMOTE && shareType !== OC.Share.SHARE_TYPE_REMOTE_GROUP,

core/js/shareitemmodel.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,19 @@
456456
return share.displayname_owner;
457457
},
458458

459+
/**
460+
* @param shareIndex
461+
* @returns {string}
462+
*/
463+
getFileOwnerUid: function(shareIndex) {
464+
/** @type OC.Share.Types.ShareInfo **/
465+
var share = this.get('shares')[shareIndex];
466+
if(!_.isObject(share)) {
467+
throw "Unknown Share";
468+
}
469+
return share.uid_file_owner;
470+
},
471+
459472
/**
460473
* returns the array index of a sharee for a provided shareId
461474
*

core/js/sharetemplates.js

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

core/js/tests/specs/sharedialogshareelistview.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ describe('OC.Share.ShareDialogShareeListView', function () {
129129
share_type: OC.Share.SHARE_TYPE_USER,
130130
share_with: 'user1',
131131
share_with_displayname: 'User One',
132+
uid_owner: oc_current_user,
132133
itemType: 'folder'
133134
}]);
134135
shareModel.set('itemType', 'folder');
@@ -144,6 +145,7 @@ describe('OC.Share.ShareDialogShareeListView', function () {
144145
share_type: OC.Share.SHARE_TYPE_USER,
145146
share_with: 'user _.@-\'',
146147
share_with_displayname: 'User One',
148+
uid_owner: oc_current_user,
147149
itemType: 'folder'
148150
}]);
149151
shareModel.set('itemType', 'folder');
@@ -159,6 +161,7 @@ describe('OC.Share.ShareDialogShareeListView', function () {
159161
share_type: OC.Share.SHARE_TYPE_USER,
160162
share_with: 'user1',
161163
share_with_displayname: 'User One',
164+
uid_owner: oc_current_user,
162165
itemType: 'folder'
163166
}]);
164167
shareModel.set('itemType', 'folder');
@@ -174,6 +177,7 @@ describe('OC.Share.ShareDialogShareeListView', function () {
174177
share_type: OC.Share.SHARE_TYPE_USER,
175178
share_with: 'user _.@-\'',
176179
share_with_displayname: 'User One',
180+
uid_owner: oc_current_user,
177181
itemType: 'folder'
178182
}]);
179183
shareModel.set('itemType', 'folder');
@@ -189,7 +193,8 @@ describe('OC.Share.ShareDialogShareeListView', function () {
189193
permissions: 1,
190194
share_type: OC.Share.SHARE_TYPE_USER,
191195
share_with: 'user1',
192-
share_with_displayname: 'User One'
196+
share_with_displayname: 'User One',
197+
uid_owner: oc_current_user,
193198
}]);
194199
shareModel.set('itemType', 'folder');
195200
listView.render();
@@ -206,6 +211,7 @@ describe('OC.Share.ShareDialogShareeListView', function () {
206211
share_type: OC.Share.SHARE_TYPE_USER,
207212
share_with: 'user1',
208213
share_with_displayname: 'User One',
214+
uid_owner: oc_current_user,
209215
itemType: 'folder'
210216
}]);
211217
shareModel.set('itemType', 'folder');
@@ -223,6 +229,7 @@ describe('OC.Share.ShareDialogShareeListView', function () {
223229
share_type: OC.Share.SHARE_TYPE_USER,
224230
share_with: 'user1',
225231
share_with_displayname: 'User One',
232+
uid_owner: oc_current_user,
226233
itemType: 'folder'
227234
}]);
228235
shareModel.set('itemType', 'folder');

lib/private/Share20/DefaultShareProvider.php

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -623,12 +623,14 @@ public function getSharesBy($userId, $shareType, $node, $reshares, $limit, $offs
623623
if ($reshares === false) {
624624
$qb->andWhere($qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)));
625625
} else {
626-
$qb->andWhere(
627-
$qb->expr()->orX(
628-
$qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
629-
$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
630-
)
631-
);
626+
if ($node === null) {
627+
$qb->andWhere(
628+
$qb->expr()->orX(
629+
$qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
630+
$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
631+
)
632+
);
633+
}
632634
}
633635

634636
if ($node !== null) {

0 commit comments

Comments
 (0)