cryptpad/www/secureiframe/inner.js

278 lines
9.7 KiB
JavaScript
Raw Normal View History

define([
'jquery',
'/bower_components/chainpad-crypto/crypto.js',
'/bower_components/nthen/index.js',
'/common/sframe-common.js',
'/common/common-interface.js',
'/common/common-ui-elements.js',
2017-11-13 15:32:40 +00:00
'/common/common-util.js',
'/common/common-hash.js',
2020-04-07 12:27:44 +00:00
'/common/hyperscript.js',
2017-09-05 09:35:15 +00:00
'json.sortify',
'/customize/messages.js',
'css!/bower_components/bootstrap/dist/css/bootstrap.min.css',
2018-03-21 17:31:53 +00:00
'css!/bower_components/components-font-awesome/css/font-awesome.min.css',
2020-04-07 12:27:44 +00:00
'less!/secureiframe/app-secure.less',
], function (
$,
Crypto,
nThen,
2017-09-05 09:35:15 +00:00
SFCommon,
UI,
UIElements,
2017-11-13 15:32:40 +00:00
Util,
Hash,
2020-04-07 12:27:44 +00:00
h,
Sortify,
Messages)
{
var APP = window.APP = {};
var andThen = function (common) {
2017-09-05 09:35:15 +00:00
var metadataMgr = common.getMetadataMgr();
var sframeChan = common.getSframeChannel();
2020-04-07 12:27:44 +00:00
var $body = $('body');
2020-04-21 11:35:36 +00:00
var displayed;
2020-04-07 12:27:44 +00:00
var hideIframe = function () {
2020-04-20 16:14:38 +00:00
if (!displayed) { return; }
2020-04-07 12:27:44 +00:00
sframeChan.event('EV_SECURE_IFRAME_CLOSE');
2017-09-05 09:35:15 +00:00
};
2020-04-07 12:27:44 +00:00
var create = {};
// Share modal
2020-04-07 12:27:44 +00:00
create['share'] = function (data) {
var priv = metadataMgr.getPrivateData();
var friends = common.getFriends();
require(['/common/inner/share.js'], function (Share) {
var f = (data && data.file) ? Share.getFileShareModal
: Share.getShareModal;
f(common, {
origin: priv.origin,
pathname: priv.pathname,
password: priv.password,
isTemplate: priv.isTemplate,
hashes: priv.hashes,
common: common,
title: data.title,
versionHash: data.versionHash,
friends: friends,
onClose: function () {
hideIframe();
},
fileData: {
hash: priv.hashes.fileHash,
password: priv.password
}
}, function (e, modal) {
if (e) { console.error(e); }
displayed = modal;
});
2020-04-07 12:27:44 +00:00
});
};
// Properties modal
create['properties'] = function () {
require(['/common/inner/properties.js'], function (Properties) {
Properties.getPropertiesModal(common, {
onClose: function () {
hideIframe();
}
2020-04-07 15:14:06 +00:00
}, function (e, modal) {
if (e) { console.error(e); }
displayed = modal;
});
});
};
// Access modal
2020-04-07 15:14:06 +00:00
create['access'] = function () {
require(['/common/inner/access.js'], function (Access) {
Access.getAccessModal(common, {
onClose: function () {
hideIframe();
}
}, function (e, modal) {
if (e) { console.error(e); }
displayed = modal;
});
});
};
2020-04-07 12:27:44 +00:00
// File uploader
var onFilePicked = function (data) {
2020-04-07 12:27:44 +00:00
var privateData = metadataMgr.getPrivateData();
2017-11-13 15:32:40 +00:00
var parsed = Hash.parsePadUrl(data.url);
2020-04-07 12:27:44 +00:00
if (displayed && displayed.hide) { displayed.hide(); }
hideIframe();
2017-09-05 09:35:15 +00:00
if (parsed.type === 'file') {
2018-05-25 16:00:10 +00:00
var secret = Hash.getSecrets('file', parsed.hash, data.password);
2019-08-27 13:31:22 +00:00
var fileHost = privateData.fileHost || privateData.origin;
var src = fileHost + Hash.getBlobPathFromHex(secret.channel);
2018-05-25 16:00:10 +00:00
var key = Hash.encodeBase64(secret.keys.cryptKey);
2020-04-07 12:27:44 +00:00
sframeChan.event("EV_SECURE_ACTION", {
2017-09-05 09:35:15 +00:00
type: parsed.type,
href: data.url,
2017-09-05 09:35:15 +00:00
src: src,
name: data.name,
2018-05-25 16:00:10 +00:00
key: key
2017-09-05 09:35:15 +00:00
});
return;
}
2020-04-07 12:27:44 +00:00
sframeChan.event("EV_SECURE_ACTION", {
2017-09-05 09:35:15 +00:00
type: parsed.type,
2020-10-08 15:53:39 +00:00
password: data.password,
2017-09-05 09:35:15 +00:00
href: data.url,
name: data.name
});
};
var fmConfig = {
body: $('body'),
noHandlers: true,
onUploaded: function (ev, data) {
onFilePicked(data);
}
};
APP.FM = common.createFileManager(fmConfig);
2020-04-07 12:27:44 +00:00
create['filepicker'] = function (_filters) {
var updateContainer = function () {};
2017-09-04 13:09:54 +00:00
2020-04-07 12:27:44 +00:00
var filters = _filters;
2017-09-08 13:54:54 +00:00
var types = filters.types || [];
2020-04-07 12:27:44 +00:00
var data = {
FM: APP.FM
};
2017-09-04 13:09:54 +00:00
// Create modal
2020-04-06 09:42:47 +00:00
var modal = UI.createModal({
2017-09-04 13:09:54 +00:00
$body: $body,
2020-04-07 12:27:44 +00:00
onClose: function () {
hideIframe();
}
2020-04-06 09:42:47 +00:00
});
2020-04-07 12:27:44 +00:00
displayed = modal;
2020-04-06 09:42:47 +00:00
modal.show();
2020-04-07 12:27:44 +00:00
2017-09-04 13:09:54 +00:00
// Set the fixed content
2020-04-07 12:27:44 +00:00
modal.$modal.attr('id', 'cp-filepicker-dialog');
var $block = modal.$modal.find('.cp-modal');
2017-09-05 09:35:15 +00:00
// Description
var text = Messages.filePicker_description;
2017-09-08 15:39:41 +00:00
if (types && types.length === 1 && types[0] !== 'file') {
2017-09-05 09:35:15 +00:00
text = Messages.selectTemplate;
}
2020-04-07 12:27:44 +00:00
$block.append(h('p', text));
2017-09-05 09:35:15 +00:00
2020-04-07 12:27:44 +00:00
// Add filter input
var $filter = $(h('p.cp-modal-form')).appendTo($block);
2017-09-04 13:09:54 +00:00
var to;
2020-04-07 12:27:44 +00:00
var $input = $('<input>', {
2017-09-04 13:09:54 +00:00
type: 'text',
'class': 'cp-filepicker-filter',
'placeholder': Messages.filePicker_filter
}).appendTo($filter).on('keypress', function () {
if (to) { window.clearTimeout(to); }
to = window.setTimeout(updateContainer, 300);
});
2017-09-05 09:35:15 +00:00
2020-04-07 12:27:44 +00:00
// If file, display the upload button
if (types.indexOf('file') !== -1) {
2020-01-22 16:15:37 +00:00
var f = (filters && filters.filter) || {};
delete data.accept;
2020-01-22 16:29:23 +00:00
if (Array.isArray(f.fileType)) {
2020-01-22 16:15:37 +00:00
data.accept = f.fileType.map(function (val) {
if (/^[a-z]+\/$/.test(val)) {
val += '*';
}
return val;
});
}
}
var $uploadButton = common.createButton('upload', false, data);
$filter.append($uploadButton);
if (!common.isLoggedIn()) {
$uploadButton.prop('disabled', true)
.prop('title', Messages.upload_mustLogin);
2017-09-05 09:35:15 +00:00
}
2020-04-07 12:27:44 +00:00
var $container = $(h('span.cp-filepicker-content', [
h('div.cp-loading-spinner-container', h('span.cp-spinner'))
])).appendTo($block);
2017-09-04 13:09:54 +00:00
// Update the files list when needed
updateContainer = function () {
2017-09-08 13:01:47 +00:00
var filter = $input.val().trim();
2017-09-04 13:09:54 +00:00
var todo = function (err, list) {
if (err) { return void console.error(err); }
2020-04-07 12:27:44 +00:00
$container.html('');
2017-09-04 13:09:54 +00:00
Object.keys(list).forEach(function (id) {
var data = list[id];
var name = data.filename || data.title || '?';
2017-09-04 13:09:54 +00:00
if (filter && name.toLowerCase().indexOf(filter.toLowerCase()) === -1) {
return;
}
var $span = $('<span>', {
'class': 'cp-filepicker-content-element',
'title': name,
}).appendTo($container);
$span.append(UI.getFileIcon(data));
$('<span>', {'class': 'cp-filepicker-content-element-name'}).text(name)
.appendTo($span);
2017-09-04 13:09:54 +00:00
$span.click(function () {
2020-04-07 12:27:44 +00:00
if (typeof onFilePicked === "function") {
onFilePicked({url: data.href, name: name, password: data.password});
2018-05-25 16:00:10 +00:00
}
2017-09-04 13:09:54 +00:00
});
// Add thumbnail if it exists
2018-05-25 16:00:10 +00:00
common.displayThumbnail(data.href, data.channel, data.password, $span);
2017-09-04 13:09:54 +00:00
});
2017-09-08 13:01:47 +00:00
$input.focus();
2017-09-04 13:09:54 +00:00
};
2017-09-05 09:35:15 +00:00
common.getFilesList(filters, todo);
2017-09-04 13:09:54 +00:00
};
updateContainer();
};
2020-04-07 12:27:44 +00:00
sframeChan.on('EV_REFRESH', function (data) {
if (!data) { return; }
var type = data.modal;
if (!create[type]) { return; }
if (displayed && displayed.close) { displayed.close(); }
else if (displayed && displayed.hide) { displayed.hide(); }
2020-04-20 16:14:38 +00:00
$('button.cancel').click(); // Close any existing alertify
2020-04-07 12:27:44 +00:00
displayed = undefined;
create[type](data);
2017-09-05 09:35:15 +00:00
});
2017-09-04 13:09:54 +00:00
UI.removeLoadingScreen();
};
var main = function () {
var common;
2020-04-07 12:27:44 +00:00
var _andThen = Util.once(andThen);
nThen(function (waitFor) {
$(waitFor(function () {
UI.addLoadingScreen({hideTips: true, hideLogo: true});
}));
SFCommon.create(waitFor(function (c) { APP.common = common = c; }));
}).nThen(function (/*waitFor*/) {
2017-09-05 09:35:15 +00:00
var metadataMgr = common.getMetadataMgr();
if (metadataMgr.getMetadataLazy() !== 'uninitialized') {
2020-04-07 12:27:44 +00:00
_andThen(common);
2017-09-05 09:35:15 +00:00
return;
}
metadataMgr.onChange(function () {
2020-04-07 12:27:44 +00:00
_andThen(common);
2017-09-05 09:35:15 +00:00
});
});
};
main();
});