Merge pull request #10695 from nextcloud/sharing-public-settings-fixes

Fix password enforce on public links
This commit is contained in:
Julius Härtl 2018-08-16 09:38:58 +02:00 committed by GitHub
commit a4e042c706
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 95 additions and 25 deletions

View File

@ -180,8 +180,8 @@
display: block; display: block;
.icon-more { .icon-more {
padding: 14px; padding: 14px;
height: 16px; height: 44px;
width: 16px; width: 44px;
opacity: .5; opacity: .5;
display: block; display: block;
cursor: pointer; cursor: pointer;

View File

@ -30,9 +30,13 @@
' <input id="linkCheckbox-{{cid}}" {{#if isLinkShare}}checked="checked"{{/if}} type="checkbox" name="linkCheckbox" class="linkCheckbox permissions checkbox">' + ' <input id="linkCheckbox-{{cid}}" {{#if isLinkShare}}checked="checked"{{/if}} type="checkbox" name="linkCheckbox" class="linkCheckbox permissions checkbox">' +
' <label for="linkCheckbox-{{cid}}">{{linkShareEnableLabel}}</label>' + ' <label for="linkCheckbox-{{cid}}">{{linkShareEnableLabel}}</label>' +
' </span>' + ' </span>' +
' {{#if isLinkShare}}' + ' {{#if showMenu}}' +
' <div class="share-menu" tabindex="0"><span class="icon icon-more"></span>' + ' <div class="share-menu" tabindex="0"><span class="icon icon-more"></span>' +
' {{{popoverMenu}}}' + ' {{#if showPending}}' +
' {{{pendingPopoverMenu}}}' +
' {{else}}' +
' {{{popoverMenu}}}' +
' {{/if}}' +
' </div>' + ' </div>' +
' {{/if}}' + ' {{/if}}' +
' </span>' + ' </span>' +
@ -83,7 +87,8 @@
'{{/if}}' + '{{/if}}' +
'{{#if showPasswordCheckBox}}' + '{{#if showPasswordCheckBox}}' +
' <li><span class="shareOption menuitem">' + ' <li><span class="shareOption menuitem">' +
' <input type="checkbox" name="showPassword" id="showPassword-{{cid}}" class="checkbox showPasswordCheckbox" {{#if isPasswordSet}}checked="checked"{{/if}} value="1" />' + ' <input type="checkbox" name="showPassword" id="showPassword-{{cid}}" class="checkbox showPasswordCheckbox"' +
' {{#if isPasswordSet}}checked="checked"{{/if}} {{#if isPasswordEnforced}}disabled="disabled"{{/if}} value="1" />' +
' <label for="showPassword-{{cid}}">{{enablePasswordLabel}}</label>' + ' <label for="showPassword-{{cid}}">{{enablePasswordLabel}}</label>' +
' </span></li>' + ' </span></li>' +
' <li class="{{#unless isPasswordSet}}hidden{{/unless}} linkPassMenu"><span class="shareOption menuitem icon-share-pass">' + ' <li class="{{#unless isPasswordSet}}hidden{{/unless}} linkPassMenu"><span class="shareOption menuitem icon-share-pass">' +
@ -92,16 +97,17 @@
' </span></li>' + ' </span></li>' +
'{{/if}}' + '{{/if}}' +
'<li>' + '<li>' +
'<span class="shareOption menuitem">' + ' <span class="shareOption menuitem">' +
'<input id="expireDate-{{cid}}" type="checkbox" name="expirationDate" class="expireDate checkbox" {{#if hasExpireDate}}checked="checked"{{/if}}" />' + ' <input id="expireDate-{{cid}}" type="checkbox" name="expirationDate" class="expireDate checkbox"' +
'<label for="expireDate-{{cid}}">{{expireDateLabel}}</label>' + ' {{#if hasExpireDate}}checked="checked"{{/if}} {{#if isExpirationEnforced}}disabled="disabled"{{/if}}" />' +
' <label for="expireDate-{{cid}}">{{expireDateLabel}}</label>' +
' </span>' +
'</li>' + '</li>' +
'<li class="{{#unless hasExpireDate}}hidden{{/unless}}">' + '<li class="{{#unless hasExpireDate}}hidden{{/unless}}">' +
'<span class="menuitem icon-expiredate expirationDateContainer-{{cid}}">' + ' <span class="menuitem icon-expiredate expirationDateContainer-{{cid}}">' +
' <label for="expirationDatePicker-{{cid}}" class="hidden-visually" value="{{expirationDate}}">{{expirationLabel}}</label>' + ' <label for="expirationDatePicker-{{cid}}" class="hidden-visually" value="{{expirationDate}}">{{expirationLabel}}</label>' +
' <input id="expirationDatePicker-{{cid}}" class="datepicker" type="text" placeholder="{{expirationDatePlaceholder}}" value="{{#if hasExpireDate}}{{expireDate}}{{else}}{{defaultExpireDate}}{{/if}}" />' + ' <input id="expirationDatePicker-{{cid}}" class="datepicker" type="text" placeholder="{{expirationDatePlaceholder}}" value="{{#if hasExpireDate}}{{expireDate}}{{else}}{{defaultExpireDate}}{{/if}}" />' +
'</span>' + ' </span>' +
'</span>' +
'</li>' + '</li>' +
'<li>' + '<li>' +
'<a href="#" class="share-add"><span class="icon-loading-small hidden"></span>' + '<a href="#" class="share-add"><span class="icon-loading-small hidden"></span>' +
@ -128,6 +134,23 @@
'</ul>' + '</ul>' +
'</div>'; '</div>';
// popovermenu waiting for password or expiration date before saving the share
var TEMPLATE_POPOVER_MENU_PENDING =
'<div class="popovermenu pendingpopover menu">' +
'<ul>' +
'{{#if isPasswordEnforced}}' +
' <li><span class="shareOption menuitem">' +
' <input type="checkbox" name="showPassword" id="showPassword-{{cid}}" checked="checked" disabled class="checkbox showPasswordCheckbox" value="1" />' +
' <label for="showPassword-{{cid}}">{{enablePasswordLabel}}</label>' +
' </span></li>' +
' <li class="linkPassMenu"><span class="shareOption menuitem icon-share-pass">' +
' <input id="linkPassText-{{cid}}" class="linkPassText" type="password" placeholder="{{passwordPlaceholder}}" autocomplete="new-password" />' +
' <span class="icon icon-loading-small hidden"></span>' +
' </span></li>' +
'{{/if}}' +
'</ul>' +
'</div>';
/** /**
* @class OCA.Share.ShareDialogLinkShareView * @class OCA.Share.ShareDialogLinkShareView
* @member {OC.Share.ShareItemModel} model * @member {OC.Share.ShareItemModel} model
@ -151,22 +174,36 @@
/** @type {Function} **/ /** @type {Function} **/
_popoverMenuTemplate: undefined, _popoverMenuTemplate: undefined,
/** @type {Function} **/
_pendingPopoverMenuTemplate: undefined,
/** @type {boolean} **/ /** @type {boolean} **/
showLink: true, showLink: true,
/** @type {boolean} **/
showPending: false,
events: { events: {
// enable/disable
'change .linkCheckbox': 'onLinkCheckBoxChange',
// open menu
'click .share-menu .icon-more': 'onToggleMenu',
// password
'focusout input.linkPassText': 'onPasswordEntered', 'focusout input.linkPassText': 'onPasswordEntered',
'keyup input.linkPassText': 'onPasswordKeyUp', 'keyup input.linkPassText': 'onPasswordKeyUp',
'click .linkCheckbox': 'onLinkCheckBoxChange', 'change .showPasswordCheckbox': 'onShowPasswordClick',
'click .linkText': 'onLinkTextClick',
'change .publicEditingCheckbox': 'onAllowPublicEditingChange', 'change .publicEditingCheckbox': 'onAllowPublicEditingChange',
'click .showPasswordCheckbox': 'onShowPasswordClick', // copy link url
'click .share-menu .icon-more': 'onToggleMenu', 'click .linkText': 'onLinkTextClick',
// social
'click .pop-up': 'onPopUpClick', 'click .pop-up': 'onPopUpClick',
// permission change
'change .publicUploadRadio': 'onPublicUploadChange', 'change .publicUploadRadio': 'onPublicUploadChange',
// expire date
'click .expireDate' : 'onExpireDateChange', 'click .expireDate' : 'onExpireDateChange',
'change .datepicker': 'onChangeExpirationDate', 'change .datepicker': 'onChangeExpirationDate',
'click .datepicker' : 'showDatePicker', 'click .datepicker' : 'showDatePicker',
// note
'click .share-add': 'showNoteForm', 'click .share-add': 'showNoteForm',
'click .share-note-delete': 'deleteNote', 'click .share-note-delete': 'deleteNote',
'click .share-note-submit': 'updateNote' 'click .share-note-submit': 'updateNote'
@ -253,20 +290,26 @@
} }
if($checkBox.is(':checked')) { if($checkBox.is(':checked')) {
if(this.configModel.get('enforcePasswordForPublicLink') === false && this.configModel.get('enableLinkPasswordByDefault') === false) { if(this.configModel.get('enforcePasswordForPublicLink') === false) {
$loading.removeClass('hidden'); $loading.removeClass('hidden');
// this will create it // this will create it
this.model.saveLinkShare(); this.model.saveLinkShare();
$('.share-menu .icon-more').click();
$('.share-menu .icon-more + .popovermenu .clipboardButton').click();
} else { } else {
this.$el.find('.linkPass').slideToggle(OC.menuSpeed); // force the rendering of the menu
this.$el.find('.linkPassText').focus(); this.showPending = true;
this.render()
$('.share-menu .icon-more').click();
$('.share-menu .icon-more + .popovermenu input:eq(1)').focus()
} }
} else { } else {
if (this.model.get('linkShare').isLinkShare) { if (this.model.get('linkShare').isLinkShare) {
$loading.removeClass('hidden'); $loading.removeClass('hidden');
this.model.removeLinkShare(); this.model.removeLinkShare();
} else { } else {
this.$el.find('.linkPass').slideToggle(OC.menuSpeed); this.showPending = false;
this.render()
} }
} }
}, },
@ -388,8 +431,7 @@
var shareId = $li.data('share-id'); var shareId = $li.data('share-id');
var $menu = $element.closest('li'); var $menu = $element.closest('li');
var $form = $menu.next('li.share-note-form'); var $form = $menu.next('li.share-note-form');
console.log($form.find('.share-note'));
$form.find('.share-note').val(''); $form.find('.share-note').val('');
$form.addClass('hidden'); $form.addClass('hidden');
@ -492,6 +534,8 @@
var isLinkShare = this.model.get('linkShare').isLinkShare; var isLinkShare = this.model.get('linkShare').isLinkShare;
var isPasswordSet = !!this.model.get('linkShare').password; var isPasswordSet = !!this.model.get('linkShare').password;
var isPasswordEnforced = this.configModel.get('enforcePasswordForPublicLink')
var isPasswordEnabledByDefault = this.configModel.get('enableLinkPasswordByDefault') === true
var showPasswordCheckBox = isLinkShare var showPasswordCheckBox = isLinkShare
&& ( !this.configModel.get('enforcePasswordForPublicLink') && ( !this.configModel.get('enforcePasswordForPublicLink')
|| !this.model.get('linkShare').password); || !this.model.get('linkShare').password);
@ -565,7 +609,7 @@
passwordLabel: t('core', 'Password'), passwordLabel: t('core', 'Password'),
passwordPlaceholder: isPasswordSet ? PASSWORD_PLACEHOLDER : PASSWORD_PLACEHOLDER_MESSAGE, passwordPlaceholder: isPasswordSet ? PASSWORD_PLACEHOLDER : PASSWORD_PLACEHOLDER_MESSAGE,
passwordPlaceholderInitial: passwordPlaceholderInitial, passwordPlaceholderInitial: passwordPlaceholderInitial,
isPasswordSet: isPasswordSet, isPasswordSet: isPasswordSet || isPasswordEnabledByDefault || isPasswordEnforced,
showPasswordCheckBox: showPasswordCheckBox, showPasswordCheckBox: showPasswordCheckBox,
publicUpload: publicUpload && isLinkShare, publicUpload: publicUpload && isLinkShare,
publicEditing: publicEditable, publicEditing: publicEditable,
@ -587,12 +631,23 @@
expirationDatePlaceholder: t('core', 'Expiration date'), expirationDatePlaceholder: t('core', 'Expiration date'),
hasExpireDate: hasExpireDate, hasExpireDate: hasExpireDate,
isExpirationEnforced: isExpirationEnforced, isExpirationEnforced: isExpirationEnforced,
isPasswordEnforced: isPasswordEnforced,
expireDate: expireDate, expireDate: expireDate,
defaultExpireDate: moment().add(1, 'day').format('DD-MM-YYYY'), // Can't expire today defaultExpireDate: moment().add(1, 'day').format('DD-MM-YYYY'), // Can't expire today
shareNote: this.model.get('linkShare').note, shareNote: this.model.get('linkShare').note,
addNoteLabel: t('core', 'Note to recipient'), addNoteLabel: t('core', 'Note to recipient'),
}); });
var pendingPopover = this.pendingPopoverMenuTemplate({
cid: this.model.get('linkShare').id,
enablePasswordLabel: t('core', 'Password protect'),
passwordLabel: t('core', 'Password'),
passwordPlaceholder: isPasswordSet ? PASSWORD_PLACEHOLDER : PASSWORD_PLACEHOLDER_MESSAGE,
passwordPlaceholderInitial: passwordPlaceholderInitial,
showPasswordCheckBox: showPasswordCheckBox,
isPasswordEnforced: isPasswordEnforced,
});
this.$el.html(linkShareTemplate({ this.$el.html(linkShareTemplate({
cid: this.model.get('linkShare').id, cid: this.model.get('linkShare').id,
shareAllowed: true, shareAllowed: true,
@ -600,6 +655,9 @@
linkShareLabel: t('core', 'Share link'), linkShareLabel: t('core', 'Share link'),
linkShareEnableLabel: t('core', 'Enable'), linkShareEnableLabel: t('core', 'Enable'),
popoverMenu: popover, popoverMenu: popover,
pendingPopoverMenu: pendingPopover,
showMenu: isLinkShare || this.showPending,
showPending: this.showPending && !isLinkShare
})); }));
this.delegateEvents(); this.delegateEvents();
@ -645,6 +703,19 @@
return this._popoverMenuTemplate(data); return this._popoverMenuTemplate(data);
}, },
/**
* renders the pending popover template and returns the resulting HTML
*
* @param {Object} data
* @returns {string}
*/
pendingPopoverMenuTemplate: function(data) {
if(!this._pendingPopoverMenuTemplate) {
this._pendingPopoverMenuTemplate = Handlebars.compile(TEMPLATE_POPOVER_MENU_PENDING);
}
return this._pendingPopoverMenuTemplate(data);
},
onPopUpClick: function(event) { onPopUpClick: function(event) {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
@ -701,7 +772,6 @@
self.setExpirationDate(expireDate); self.setExpirationDate(expireDate);
} }
}); });
console.log(event, $(expirationDatePicker));
$(expirationDatePicker).datepicker('show'); $(expirationDatePicker).datepicker('show');
$(expirationDatePicker).focus(); $(expirationDatePicker).focus();