cryptpad/www/drive/inner.js

323 lines
12 KiB
JavaScript
Raw Normal View History

define([
2017-09-27 08:31:35 +00:00
'jquery',
2020-05-07 09:58:58 +00:00
'/common/toolbar.js',
2019-09-04 14:00:16 +00:00
'/common/drive-ui.js',
2017-09-27 08:31:35 +00:00
'/common/common-util.js',
2019-10-07 12:35:11 +00:00
'/common/common-hash.js',
'/common/common-interface.js',
2020-02-05 15:18:09 +00:00
'/common/common-ui-elements.js',
2017-11-23 11:28:49 +00:00
'/common/common-feedback.js',
2017-09-27 08:31:35 +00:00
'/bower_components/nthen/index.js',
'/common/sframe-common.js',
2018-07-05 14:33:37 +00:00
'/common/proxy-manager.js',
2017-09-27 08:31:35 +00:00
'/customize/application_config.js',
'/customize/messages.js',
2017-09-27 08:31:35 +00:00
'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',
2018-07-14 13:15:23 +00:00
'less!/drive/app-drive.less',
2017-09-27 08:31:35 +00:00
], function (
$,
Toolbar,
2019-09-04 14:00:16 +00:00
DriveUI,
2017-09-27 08:31:35 +00:00
Util,
2019-10-07 12:35:11 +00:00
Hash,
UI,
2020-02-05 15:18:09 +00:00
UIElements,
2017-11-23 11:28:49 +00:00
Feedback,
2017-09-27 08:31:35 +00:00
nThen,
SFCommon,
2018-07-05 14:33:37 +00:00
ProxyManager,
2017-09-27 08:31:35 +00:00
AppConfig,
Messages)
2017-09-27 08:31:35 +00:00
{
2019-09-04 14:00:16 +00:00
var APP = {};
var SHARED_FOLDER_NAME = Messages.fm_sharedFolderName;
2017-09-27 08:31:35 +00:00
2019-09-04 14:00:16 +00:00
var copyObjectValue = function (objRef, objToCopy) {
for (var k in objRef) { delete objRef[k]; }
$.extend(true, objRef, objToCopy);
};
var updateSharedFolders = function (sframeChan, manager, drive, folders, cb) {
if (!drive || !drive.sharedFolders) {
return void cb();
2018-01-19 16:03:58 +00:00
}
2020-06-17 15:40:29 +00:00
var r = drive.restrictedFolders = drive.restrictedFolders || {};
2019-09-04 14:00:16 +00:00
var oldIds = Object.keys(folders);
nThen(function (waitFor) {
Object.keys(drive.sharedFolders).forEach(function (fId) {
2019-10-07 16:30:46 +00:00
var sfData = drive.sharedFolders[fId] || {};
2019-10-14 10:01:44 +00:00
var href = (sfData.href && sfData.href.indexOf('#') !== -1) ? sfData.href : sfData.roHref;
var parsed = Hash.parsePadUrl(href);
2019-10-07 12:35:11 +00:00
var secret = Hash.getSecrets('drive', parsed.hash, sfData.password);
2019-09-04 14:00:16 +00:00
sframeChan.query('Q_DRIVE_GETOBJECT', {
sharedFolder: fId
}, waitFor(function (err, newObj) {
2019-10-21 13:22:59 +00:00
if (!APP.loggedIn && APP.newSharedFolder) {
if (!newObj || !Object.keys(newObj).length) {
// Empty anon drive: deleted
var msg = Messages.deletedError + '<br>' + Messages.errorRedirectToHome;
setTimeout(function () { UI.errorLoadingScreen(msg, false, function () {}); });
APP.newSharedFolder = null;
}
}
2020-06-17 15:40:29 +00:00
if (newObj && newObj.restricted) {
r[fId] = drive.sharedFolders[fId];
if (!r[fId].title) { r[fId].title = r[fId].lastTitle; }
}
if (newObj && (newObj.deprecated /*|| newObj.restricted*/)) {
delete folders[fId];
delete drive.sharedFolders[fId];
if (manager && manager.folders) {
delete manager.folders[fId];
}
return;
}
2019-09-04 14:00:16 +00:00
folders[fId] = folders[fId] || {};
copyObjectValue(folders[fId], newObj);
2019-10-14 14:02:21 +00:00
folders[fId].readOnly = !secret.keys.secondaryKey;
2019-09-04 14:00:16 +00:00
if (manager && oldIds.indexOf(fId) === -1) {
2019-10-10 10:35:01 +00:00
manager.addProxy(fId, { proxy: folders[fId] }, null, secret.keys.secondaryKey);
2017-09-27 08:31:35 +00:00
}
var readOnly = !secret.keys.editKeyStr;
if (!manager || !manager.folders[fId]) { return; }
manager.folders[fId].userObject.setReadOnly(readOnly, secret.keys.secondaryKey);
manager.folders[fId].offline = newObj.offline;
2019-09-04 14:00:16 +00:00
}));
});
// Remove from memory folders that have been deleted from the drive remotely
oldIds.forEach(function (fId) {
if (!drive.sharedFolders[fId]) {
delete folders[fId];
delete drive.sharedFolders[fId];
if (manager && manager.folders) {
delete manager.folders[fId];
}
}
});
2019-09-04 14:00:16 +00:00
}).nThen(function () {
cb();
2017-12-05 17:09:43 +00:00
});
2019-09-04 14:00:16 +00:00
};
var updateObject = function (sframeChan, obj, cb) {
sframeChan.query('Q_DRIVE_GETOBJECT', null, function (err, newObj) {
copyObjectValue(obj, newObj);
2020-02-10 13:43:22 +00:00
// If anon shared folder, make a virtual drive containing this folder
2019-09-04 14:00:16 +00:00
if (!APP.loggedIn && APP.newSharedFolder) {
2020-02-10 13:43:22 +00:00
obj.drive.root = {
sf: APP.newSharedFolder
};
2019-09-04 14:00:16 +00:00
obj.drive.sharedFolders = obj.drive.sharedFolders || {};
obj.drive.sharedFolders[APP.newSharedFolder] = {
href: APP.anonSFHref,
password: APP.anonSFPassword
};
2017-09-27 08:31:35 +00:00
}
2019-09-04 14:00:16 +00:00
cb();
2017-12-05 17:09:43 +00:00
});
2019-09-04 14:00:16 +00:00
};
2017-09-27 08:31:35 +00:00
2019-09-04 14:00:16 +00:00
var history = {
isHistoryMode: false,
2017-09-27 08:31:35 +00:00
};
2019-09-04 14:00:16 +00:00
var setEditable = DriveUI.setEditable;
2017-09-27 08:31:35 +00:00
var setHistory = function (bool, update) {
history.isHistoryMode = bool;
setEditable(!bool, true);
2017-09-27 08:31:35 +00:00
if (!bool && update) {
history.onLeaveHistory();
}
2020-09-29 09:36:42 +00:00
return true;
2017-09-27 08:31:35 +00:00
};
var main = function () {
var common;
var proxy = {};
2018-07-05 14:33:37 +00:00
var folders = {};
2017-09-27 08:36:16 +00:00
var readOnly;
2017-09-27 08:31:35 +00:00
nThen(function (waitFor) {
$(waitFor(function () {
UI.addLoadingScreen();
2017-09-27 08:31:35 +00:00
}));
window.cryptpadStore.getAll(waitFor(function (val) {
APP.store = JSON.parse(JSON.stringify(val));
}));
2019-09-04 14:00:16 +00:00
SFCommon.create(waitFor(function (c) { common = c; }));
2017-09-27 08:31:35 +00:00
}).nThen(function (waitFor) {
2019-10-14 14:02:21 +00:00
$('#cp-app-drive-connection-state').text(Messages.disconnected);
2017-09-27 08:31:35 +00:00
var privReady = Util.once(waitFor());
var metadataMgr = common.getMetadataMgr();
if (JSON.stringify(metadataMgr.getPrivateData()) !== '{}') {
privReady();
return;
}
metadataMgr.onChange(function () {
if (typeof(metadataMgr.getPrivateData().readOnly) === 'boolean') {
readOnly = APP.readOnly = metadataMgr.getPrivateData().readOnly;
2017-09-27 08:31:35 +00:00
privReady();
}
});
}).nThen(function (waitFor) {
2017-09-27 08:31:35 +00:00
APP.loggedIn = common.isLoggedIn();
2017-11-23 11:28:49 +00:00
if (!APP.loggedIn) { Feedback.send('ANONYMOUS_DRIVE'); }
2017-09-27 08:31:35 +00:00
APP.$body = $('body');
APP.$bar = $('#cp-toolbar');
common.setTabTitle(Messages.type.drive);
var metadataMgr = common.getMetadataMgr();
var privateData = metadataMgr.getPrivateData();
if (privateData.newSharedFolder) {
APP.newSharedFolder = privateData.newSharedFolder;
APP.anonSFHref = privateData.anonSFHref;
APP.anonSFPassword = privateData.password;
}
var sframeChan = common.getSframeChannel();
2018-07-09 12:36:55 +00:00
updateObject(sframeChan, proxy, waitFor(function () {
2018-07-12 15:27:16 +00:00
updateSharedFolders(sframeChan, null, proxy.drive, folders, waitFor());
2018-07-09 12:36:55 +00:00
}));
}).nThen(function () {
var sframeChan = common.getSframeChannel();
var metadataMgr = common.getMetadataMgr();
var privateData = metadataMgr.getPrivateData();
var user = metadataMgr.getUserData();
APP.disableSF = !privateData.enableSF && AppConfig.disableSharedFolders;
if (APP.newSharedFolder && !APP.loggedIn) {
readOnly = APP.readOnly = true;
var data = folders[APP.newSharedFolder];
if (data) {
sframeChan.query('Q_SET_PAD_TITLE_IN_DRIVE', {
title: data.metadata && data.metadata.title,
}, function () {});
}
}
// ANON_SHARED_FOLDER
var pageTitle = (!APP.loggedIn && APP.newSharedFolder) ? SHARED_FOLDER_NAME : Messages.type.drive;
var configTb = {
2019-05-23 14:09:04 +00:00
displayed: ['useradmin', 'pageTitle', 'newpad', 'limit', 'notifications'],
pageTitle: pageTitle,
metadataMgr: metadataMgr,
readOnly: privateData.readOnly,
sfCommon: common,
$container: APP.$bar
2017-09-27 08:31:35 +00:00
};
2020-05-14 11:20:29 +00:00
var toolbar = Toolbar.create(configTb);
2017-09-27 08:31:35 +00:00
var $displayName = APP.$bar.find('.' + Toolbar.constants.username);
metadataMgr.onChange(function () {
var name = metadataMgr.getUserData().name || Messages.anonymous;
$displayName.text(name);
});
$displayName.text(user.name || Messages.anonymous);
2017-09-27 08:31:35 +00:00
/* add the usage */
var usageBar;
if (APP.loggedIn) {
2020-03-30 10:10:06 +00:00
usageBar = common.createUsageBar(null, function (err) {
2019-09-04 14:00:16 +00:00
if (err) { return void DriveUI.logError(err); }
}, true);
}
/* add a history button */
APP.histConfig = {
onLocal: function () {
2018-07-19 16:49:14 +00:00
UI.addLoadingScreen({ loadingText: Messages.fm_restoreDrive });
2019-06-17 12:13:06 +00:00
var data = {};
if (history.sfId) {
copyObjectValue(folders[history.sfId], history.currentObj);
data.sfId = history.sfId;
data.drive = history.currentObj;
} else {
proxy.drive = history.currentObj.drive;
data.drive = history.currentObj.drive;
}
sframeChan.query("Q_DRIVE_RESTORE", data, function () {
2018-07-19 15:51:38 +00:00
UI.removeLoadingScreen();
}, {
timeout: 5 * 60 * 1000
});
},
2019-06-17 12:13:06 +00:00
onOpen: function () {},
onRemote: function () {},
setHistory: setHistory,
applyVal: function (val) {
var obj = JSON.parse(val || '{}');
history.currentObj = obj;
history.onEnterHistory(obj);
},
drive: true,
$toolbar: APP.$bar,
};
2017-09-27 08:31:35 +00:00
// Add a "Burn this drive" button
2019-10-14 15:37:54 +00:00
if (!APP.loggedIn && !APP.readOnly) {
APP.$burnThisDrive = common.createButton(null, true, {
text: '',
name: 'burn-anon-drive',
icon: 'fa-ban',
2020-06-03 14:26:59 +00:00
tippy: Messages.fm_burnThisDriveButton,
drawer: false
}, function () {
UI.confirm(Messages.fm_burnThisDrive, function (yes) {
if (!yes) { return; }
common.getSframeChannel().event('EV_BURN_ANON_DRIVE');
}, null, true);
});
}
$('body').css('display', '');
if (!proxy.drive || typeof(proxy.drive) !== 'object') {
throw new Error("Corrupted drive");
}
2019-09-06 16:47:18 +00:00
var drive = DriveUI.create(common, {
$limit: usageBar && usageBar.$container,
2019-09-04 14:00:16 +00:00
proxy: proxy,
folders: folders,
updateObject: updateObject,
updateSharedFolders: updateSharedFolders,
history: history,
2020-05-14 11:20:29 +00:00
toolbar: toolbar,
2019-09-04 14:00:16 +00:00
APP: APP
});
2019-09-04 14:00:16 +00:00
var onDisconnect = function (noAlert) {
2017-09-27 08:31:35 +00:00
setEditable(false);
2019-09-06 16:47:18 +00:00
if (drive.refresh) { drive.refresh(); }
2020-06-10 10:50:18 +00:00
toolbar.failed();
2020-02-05 15:18:09 +00:00
if (!noAlert) { UIElements.disconnectAlert(); }
2017-09-27 08:31:35 +00:00
};
2019-11-14 10:44:23 +00:00
var onReconnect = function () {
2017-09-27 08:31:35 +00:00
setEditable(true);
2019-09-06 16:47:18 +00:00
if (drive.refresh) { drive.refresh(); }
2020-06-10 10:50:18 +00:00
toolbar.reconnecting();
2020-02-05 15:18:09 +00:00
UIElements.reconnectAlert();
2017-09-27 08:31:35 +00:00
};
sframeChan.on('EV_DRIVE_LOG', function (msg) {
UI.log(msg);
2017-09-27 08:31:35 +00:00
});
sframeChan.on('EV_NETWORK_DISCONNECT', function () {
2017-09-27 08:31:35 +00:00
onDisconnect();
});
2019-11-14 10:44:23 +00:00
sframeChan.on('EV_NETWORK_RECONNECT', function () {
onReconnect();
2017-09-27 08:31:35 +00:00
});
common.onLogout(function () { setEditable(false); });
2020-11-17 15:02:06 +00:00
// Check if our drive history needs to be trimmed
common.checkTrimHistory(null, true);
2017-09-27 08:31:35 +00:00
});
};
main();
});