Skip to content

Commit 5873a0a

Browse files
authored
Merge pull request #3231 from nextcloud/allow-editing-public-links
allow editing single files shared as public link
2 parents f469b3e + 92d7dd4 commit 5873a0a

3 files changed

Lines changed: 55 additions & 1 deletion

File tree

apps/files_sharing/lib/Controller/ShareAPIController.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,7 @@ public function updateShare(
668668
\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE, // legacy
669669
\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE, // correct
670670
\OCP\Constants::PERMISSION_CREATE, // hidden file list
671+
\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE, // allow to edit single files
671672
])
672673
) {
673674
throw new OCSBadRequestException($this->l->t('Can\'t change permissions for public share links'));

core/js/sharedialoglinkshareview.js

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@
4343
'</div>' +
4444
' {{/if}}' +
4545
' {{/if}}' +
46+
' {{#if publicEditing}}' +
47+
'<div id="allowPublicEditingWrapper">' +
48+
' <span class="icon-loading-small hidden"></span>' +
49+
' <input type="checkbox" value="1" name="allowPublicEditing" id="sharingDialogAllowPublicEditing-{{cid}}" class="checkbox publicEditingCheckbox" {{{publicEditingChecked}}} />' +
50+
'<label for="sharingDialogAllowPublicEditing-{{cid}}">{{publicEditingLabel}}</label>' +
51+
'</div>' +
52+
' {{/if}}' +
4653
' {{#if showPasswordCheckBox}}' +
4754
'<input type="checkbox" name="showPassword" id="showPassword-{{cid}}" class="checkbox showPasswordCheckbox" {{#if isPasswordSet}}checked="checked"{{/if}} value="1" />' +
4855
'<label for="showPassword-{{cid}}">{{enablePasswordLabel}}</label>' +
@@ -87,6 +94,7 @@
8794
'click .linkCheckbox': 'onLinkCheckBoxChange',
8895
'click .linkText': 'onLinkTextClick',
8996
'change .publicUploadCheckbox': 'onAllowPublicUploadChange',
97+
'change .publicEditingCheckbox': 'onAllowPublicEditingChange',
9098
'change .hideFileListCheckbox': 'onHideFileListChange',
9199
'click .showPasswordCheckbox': 'onShowPasswordClick'
92100
},
@@ -128,7 +136,8 @@
128136
'onLinkTextClick',
129137
'onShowPasswordClick',
130138
'onHideFileListChange',
131-
'onAllowPublicUploadChange'
139+
'onAllowPublicUploadChange',
140+
'onAllowPublicEditingChange'
132141
);
133142

134143
var clipboard = new Clipboard('.clipboardButton');
@@ -266,6 +275,20 @@
266275
});
267276
},
268277

278+
onAllowPublicEditingChange: function() {
279+
var $checkbox = this.$('.publicEditingCheckbox');
280+
$checkbox.siblings('.icon-loading-small').removeClass('hidden').addClass('inlineblock');
281+
282+
var permissions = OC.PERMISSION_READ;
283+
if($checkbox.is(':checked')) {
284+
permissions = OC.PERMISSION_UPDATE | OC.PERMISSION_READ;
285+
}
286+
287+
this.model.saveLinkShare({
288+
permissions: permissions
289+
});
290+
},
291+
269292
onHideFileListChange: function () {
270293
var $checkbox = this.$('.hideFileListCheckbox');
271294
$checkbox.siblings('.icon-loading-small').removeClass('hidden').addClass('inlineblock');
@@ -307,6 +330,12 @@
307330
publicUploadChecked = 'checked="checked"';
308331
}
309332

333+
var publicEditingChecked = '';
334+
if(this.model.isPublicEditingAllowed()) {
335+
publicEditingChecked = 'checked="checked"';
336+
}
337+
338+
310339
var hideFileList = publicUploadChecked;
311340

312341
var hideFileListChecked = '';
@@ -320,6 +349,11 @@
320349
&& ( !this.configModel.get('enforcePasswordForPublicLink')
321350
|| !this.model.get('linkShare').password);
322351

352+
var publicEditable =
353+
!this.model.isFolder()
354+
&& isLinkShare
355+
&& this.model.updatePermissionPossible();
356+
323357
this.$el.html(linkShareTemplate({
324358
cid: this.cid,
325359
shareAllowed: true,
@@ -337,6 +371,9 @@
337371
publicUploadChecked: publicUploadChecked,
338372
hideFileListChecked: hideFileListChecked,
339373
publicUploadLabel: t('core', 'Allow upload and editing'),
374+
publicEditing: publicEditable,
375+
publicEditingChecked: publicEditingChecked,
376+
publicEditingLabel: t('core', 'Allow editing'),
340377
hideFileListLabel: t('core', 'File drop (upload only)'),
341378
mailPrivatePlaceholder: t('core', 'Email link to person'),
342379
mailButtonText: t('core', 'Send')

core/js/shareitemmodel.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,10 @@
272272
return this.get('allowPublicUploadStatus');
273273
},
274274

275+
isPublicEditingAllowed: function() {
276+
return this.get('allowPublicEditingStatus');
277+
},
278+
275279
/**
276280
* @returns {boolean}
277281
*/
@@ -679,6 +683,17 @@
679683
});
680684
}
681685

686+
var allowPublicEditingStatus = true;
687+
if(!_.isUndefined(data.shares)) {
688+
$.each(data.shares, function (key, value) {
689+
if (value.share_type === OC.Share.SHARE_TYPE_LINK) {
690+
allowPublicEditingStatus = (value.permissions & OC.PERMISSION_UPDATE) ? true : false;
691+
return true;
692+
}
693+
});
694+
}
695+
696+
682697
var hideFileListStatus = false;
683698
if(!_.isUndefined(data.shares)) {
684699
$.each(data.shares, function (key, value) {
@@ -762,6 +777,7 @@
762777
linkShare: linkShare,
763778
permissions: permissions,
764779
allowPublicUploadStatus: allowPublicUploadStatus,
780+
allowPublicEditingStatus: allowPublicEditingStatus,
765781
hideFileListStatus: hideFileListStatus
766782
};
767783
},

0 commit comments

Comments
 (0)