376704e834
When Talk is enabled the menu for link shares now shows a checkbox to protect the password by Talk (that is, to show the "Request password by Talk" UI in the authentication page for the link share). Although in e-mail shares protecting the share with a password and protecting the password by Talk are mutually exclusive actions (as when the password is set it is sent to the sharee, so it must be set again when protecting it by Talk to be able to verify the identity of the sharee), in the case of link shares protecting the password by Talk is an additional step to protecting the share with a password (as just setting the password does not disclose it to anyone). As such, the checkbox is shown only when there is a password set for the link share (even if the field itself for the password is not shown, like when they are enforced in the settings). Note that the icon set for the field, "icon-passwordtalk", does not currently exist; it is the same used for e-mail shares, and it is needed simply to get the right padding in the menu. Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
351 lines
9.8 KiB
JavaScript
351 lines
9.8 KiB
JavaScript
/**
|
|
*
|
|
* @copyright Copyright (c) 2015, Tom Needham (tom@owncloud.com)
|
|
* @copyright Copyright (c) 2017, Daniel Calviño Sánchez (danxuliu@gmail.com)
|
|
*
|
|
* @license GNU AGPL version 3 or any later version
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as
|
|
* published by the Free Software Foundation, either version 3 of the
|
|
* License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
describe('OC.Share.ShareDialogLinkShareView', function () {
|
|
|
|
var configModel;
|
|
var shareModel;
|
|
var view;
|
|
|
|
beforeEach(function () {
|
|
|
|
var fileInfoModel = new OCA.Files.FileInfoModel({
|
|
id: 123,
|
|
name: 'shared_file_name.txt',
|
|
path: '/subdir',
|
|
size: 100,
|
|
mimetype: 'text/plain',
|
|
permissions: OC.PERMISSION_ALL,
|
|
sharePermissions: OC.PERMISSION_ALL
|
|
});
|
|
|
|
var attributes = {
|
|
itemType: fileInfoModel.isDirectory() ? 'folder' : 'file',
|
|
itemSource: fileInfoModel.get('id'),
|
|
possiblePermissions: OC.PERMISSION_ALL,
|
|
permissions: OC.PERMISSION_ALL
|
|
};
|
|
|
|
configModel = new OC.Share.ShareConfigModel({
|
|
enforcePasswordForPublicLink: false,
|
|
isResharingAllowed: true,
|
|
isDefaultExpireDateEnabled: false,
|
|
isDefaultExpireDateEnforced: false,
|
|
defaultExpireDate: 7
|
|
});
|
|
|
|
sinon.stub(configModel, 'isShareWithLinkAllowed');
|
|
|
|
shareModel = new OC.Share.ShareItemModel(attributes, {
|
|
configModel: configModel,
|
|
fileInfoModel: fileInfoModel
|
|
});
|
|
|
|
view = new OC.Share.ShareDialogLinkShareView({
|
|
configModel: configModel,
|
|
model: shareModel
|
|
});
|
|
|
|
});
|
|
|
|
afterEach(function () {
|
|
view.remove();
|
|
configModel.isShareWithLinkAllowed.restore();
|
|
});
|
|
|
|
describe('hide download', function () {
|
|
|
|
var $hideDownloadCheckbox;
|
|
var $workingIcon;
|
|
|
|
beforeEach(function () {
|
|
// Needed to render the view
|
|
configModel.isShareWithLinkAllowed.returns(true);
|
|
|
|
shareModel.set({
|
|
linkShares: [{
|
|
id: 123
|
|
}]
|
|
});
|
|
view.render();
|
|
|
|
$hideDownloadCheckbox = view.$el.find('.hideDownloadCheckbox');
|
|
$workingIcon = $hideDownloadCheckbox.prev('.icon-loading-small');
|
|
|
|
sinon.stub(shareModel, 'saveLinkShare');
|
|
|
|
expect($workingIcon.hasClass('hidden')).toBeTruthy();
|
|
});
|
|
|
|
afterEach(function () {
|
|
shareModel.saveLinkShare.restore();
|
|
});
|
|
|
|
it('is shown if the share is a file', function() {
|
|
expect($hideDownloadCheckbox.length).toBeTruthy();
|
|
});
|
|
|
|
it('is not shown if the share is a folder', function() {
|
|
shareModel.fileInfoModel.set('mimetype', 'httpd/unix-directory');
|
|
|
|
// Setting the item type also triggers the rendering
|
|
shareModel.set({
|
|
itemType: 'folder'
|
|
});
|
|
|
|
$hideDownloadCheckbox = view.$el.find('.hideDownloadCheckbox');
|
|
|
|
expect($hideDownloadCheckbox.length).toBeFalsy();
|
|
});
|
|
|
|
it('checkbox is checked when the setting is enabled', function () {
|
|
shareModel.set({
|
|
linkShares: [{
|
|
id: 123,
|
|
hideDownload: true
|
|
}]
|
|
});
|
|
view.render();
|
|
|
|
$hideDownloadCheckbox = view.$el.find('.hideDownloadCheckbox');
|
|
|
|
expect($hideDownloadCheckbox.is(':checked')).toEqual(true);
|
|
});
|
|
|
|
it('checkbox is not checked when the setting is disabled', function () {
|
|
expect($hideDownloadCheckbox.is(':checked')).toEqual(false);
|
|
});
|
|
|
|
it('enables the setting if clicked when unchecked', function () {
|
|
// Simulate the click by checking the checkbox and then triggering
|
|
// the "change" event.
|
|
$hideDownloadCheckbox.prop('checked', true);
|
|
$hideDownloadCheckbox.change();
|
|
|
|
expect($workingIcon.hasClass('hidden')).toBeFalsy();
|
|
expect(shareModel.saveLinkShare.withArgs({ hideDownload: true, cid: 123 }).calledOnce).toBeTruthy();
|
|
});
|
|
|
|
it('disables the setting if clicked when checked', function () {
|
|
shareModel.set({
|
|
linkShares: [{
|
|
id: 123,
|
|
hideDownload: true
|
|
}]
|
|
});
|
|
view.render();
|
|
|
|
$hideDownloadCheckbox = view.$el.find('.hideDownloadCheckbox');
|
|
$workingIcon = $hideDownloadCheckbox.prev('.icon-loading-small');
|
|
|
|
// Simulate the click by unchecking the checkbox and then triggering
|
|
// the "change" event.
|
|
$hideDownloadCheckbox.prop('checked', false);
|
|
$hideDownloadCheckbox.change();
|
|
|
|
expect($workingIcon.hasClass('hidden')).toBeFalsy();
|
|
expect(shareModel.saveLinkShare.withArgs({ hideDownload: false, cid: 123 }).calledOnce).toBeTruthy();
|
|
});
|
|
|
|
});
|
|
|
|
describe('onPasswordEntered', function () {
|
|
|
|
var $passwordText;
|
|
var $workingIcon;
|
|
|
|
beforeEach(function () {
|
|
|
|
// Needed to render the view
|
|
configModel.isShareWithLinkAllowed.returns(true);
|
|
|
|
shareModel.set({
|
|
linkShares: [{
|
|
id: 123,
|
|
password: 'password'
|
|
}]
|
|
});
|
|
view.render();
|
|
|
|
var $passwordDiv = view.$el.find('#linkPass');
|
|
$passwordText = view.$el.find('.linkPassText');
|
|
$workingIcon = view.$el.find('.linkPassMenu .icon-loading-small');
|
|
|
|
sinon.stub(shareModel, 'saveLinkShare');
|
|
|
|
expect($passwordDiv.hasClass('hidden')).toBeFalsy();
|
|
expect($passwordText.hasClass('hidden')).toBeFalsy();
|
|
expect($workingIcon.hasClass('hidden')).toBeTruthy();
|
|
|
|
$passwordText.val('myPassword');
|
|
});
|
|
|
|
afterEach(function () {
|
|
shareModel.saveLinkShare.restore();
|
|
});
|
|
|
|
it('shows the working icon when called', function () {
|
|
view.onPasswordEntered({target: view.$el.find('.linkPassText')});
|
|
|
|
expect($workingIcon.hasClass('hidden')).toBeFalsy();
|
|
expect(shareModel.saveLinkShare.withArgs({ password: 'myPassword', cid: 123 }).calledOnce).toBeTruthy();
|
|
});
|
|
|
|
it('hides the working icon when saving the password succeeds', function () {
|
|
view.onPasswordEntered({target: view.$el.find('.linkPassText')});
|
|
|
|
expect($workingIcon.hasClass('hidden')).toBeFalsy();
|
|
expect(shareModel.saveLinkShare.withArgs({ password: 'myPassword', cid: 123 }).calledOnce).toBeTruthy();
|
|
|
|
shareModel.saveLinkShare.yieldTo("complete", [shareModel]);
|
|
|
|
expect($workingIcon.hasClass('hidden')).toBeTruthy();
|
|
});
|
|
|
|
it('hides the working icon when saving the password fails', function () {
|
|
view.onPasswordEntered({target: view.$el.find('.linkPassText')});
|
|
|
|
expect($workingIcon.hasClass('hidden')).toBeFalsy();
|
|
expect(shareModel.saveLinkShare.withArgs({ password: 'myPassword', cid: 123 }).calledOnce).toBeTruthy();
|
|
|
|
shareModel.saveLinkShare.yieldTo("complete", [shareModel]);
|
|
shareModel.saveLinkShare.yieldTo("error", [shareModel, "The error message"]);
|
|
|
|
expect($workingIcon.hasClass('hidden')).toBeTruthy();
|
|
});
|
|
|
|
});
|
|
|
|
describe('protect password by Talk', function () {
|
|
|
|
var $passwordByTalkCheckbox;
|
|
var $workingIcon;
|
|
|
|
beforeEach(function () {
|
|
// Needed to render the view
|
|
configModel.isShareWithLinkAllowed.returns(true);
|
|
|
|
// "Enable" Talk
|
|
window.oc_appswebroots['spreed'] = window.oc_webroot + '/apps/files/';
|
|
|
|
shareModel.set({
|
|
linkShares: [{
|
|
id: 123,
|
|
password: 'password'
|
|
}]
|
|
});
|
|
view.render();
|
|
|
|
$passwordByTalkCheckbox = view.$el.find('.passwordByTalkCheckbox');
|
|
$workingIcon = $passwordByTalkCheckbox.prev('.icon-loading-small');
|
|
|
|
sinon.stub(shareModel, 'saveLinkShare');
|
|
|
|
expect($workingIcon.hasClass('hidden')).toBeTruthy();
|
|
});
|
|
|
|
afterEach(function () {
|
|
shareModel.saveLinkShare.restore();
|
|
});
|
|
|
|
it('is shown if Talk is enabled and there is a password set', function() {
|
|
expect($passwordByTalkCheckbox.length).toBeTruthy();
|
|
});
|
|
|
|
it('is not shown if Talk is enabled but there is no password set', function() {
|
|
// Changing the password value also triggers the rendering
|
|
shareModel.set({
|
|
linkShares: [{
|
|
id: 123
|
|
}]
|
|
});
|
|
|
|
$passwordByTalkCheckbox = view.$el.find('.passwordByTalkCheckbox');
|
|
|
|
expect($passwordByTalkCheckbox.length).toBeFalsy();
|
|
});
|
|
|
|
it('is not shown if there is a password set but Talk is not enabled', function() {
|
|
// "Disable" Talk
|
|
delete window.oc_appswebroots['spreed'];
|
|
|
|
view.render();
|
|
|
|
$passwordByTalkCheckbox = view.$el.find('.passwordByTalkCheckbox');
|
|
|
|
expect($passwordByTalkCheckbox.length).toBeFalsy();
|
|
});
|
|
|
|
it('checkbox is checked when the setting is enabled', function () {
|
|
shareModel.set({
|
|
linkShares: [{
|
|
id: 123,
|
|
password: 'password',
|
|
sendPasswordByTalk: true
|
|
}]
|
|
});
|
|
view.render();
|
|
|
|
$passwordByTalkCheckbox = view.$el.find('.passwordByTalkCheckbox');
|
|
|
|
expect($passwordByTalkCheckbox.is(':checked')).toEqual(true);
|
|
});
|
|
|
|
it('checkbox is not checked when the setting is disabled', function () {
|
|
expect($passwordByTalkCheckbox.is(':checked')).toEqual(false);
|
|
});
|
|
|
|
it('enables the setting if clicked when unchecked', function () {
|
|
// Simulate the click by checking the checkbox and then triggering
|
|
// the "change" event.
|
|
$passwordByTalkCheckbox.prop('checked', true);
|
|
$passwordByTalkCheckbox.change();
|
|
|
|
expect($workingIcon.hasClass('hidden')).toBeFalsy();
|
|
expect(shareModel.saveLinkShare.withArgs({ sendPasswordByTalk: true, cid: 123 }).calledOnce).toBeTruthy();
|
|
});
|
|
|
|
it('disables the setting if clicked when checked', function () {
|
|
shareModel.set({
|
|
linkShares: [{
|
|
id: 123,
|
|
password: 'password',
|
|
sendPasswordByTalk: true
|
|
}]
|
|
});
|
|
view.render();
|
|
|
|
$passwordByTalkCheckbox = view.$el.find('.passwordByTalkCheckbox');
|
|
$workingIcon = $passwordByTalkCheckbox.prev('.icon-loading-small');
|
|
|
|
// Simulate the click by unchecking the checkbox and then triggering
|
|
// the "change" event.
|
|
$passwordByTalkCheckbox.prop('checked', false);
|
|
$passwordByTalkCheckbox.change();
|
|
|
|
expect($workingIcon.hasClass('hidden')).toBeFalsy();
|
|
expect(shareModel.saveLinkShare.withArgs({ sendPasswordByTalk: false, cid: 123 }).calledOnce).toBeTruthy();
|
|
});
|
|
|
|
});
|
|
|
|
});
|