From 126f10b782a8bd3a31637476d25ce95a22ecff4e Mon Sep 17 00:00:00 2001 From: yflory Date: Tue, 22 Oct 2019 17:23:31 +0200 Subject: [PATCH] Fix shared folder password change issues --- www/common/cryptpad-common.js | 4 +-- www/common/drive-ui.js | 2 +- www/common/outer/sharedfolder.js | 44 ++++++++++++++++++++------------ www/common/proxy-manager.js | 5 ++++ www/teams/inner.js | 2 +- 5 files changed, 35 insertions(+), 22 deletions(-) diff --git a/www/common/cryptpad-common.js b/www/common/cryptpad-common.js index f0def2f9c..827884db6 100644 --- a/www/common/cryptpad-common.js +++ b/www/common/cryptpad-common.js @@ -957,9 +957,7 @@ define([ href: href, oldChannel: oldChannel, password: newPassword - }, waitFor(function (obj) { - console.error(obj); - })); + }, waitFor()); return; } pad.leavePad({ diff --git a/www/common/drive-ui.js b/www/common/drive-ui.js index 072f144fa..a48f922ee 100644 --- a/www/common/drive-ui.js +++ b/www/common/drive-ui.js @@ -4481,7 +4481,7 @@ define([ onClose: cb }); }; - if (typeof (deprecated) === "object") { + if (typeof (deprecated) === "object" && APP.editable) { Object.keys(deprecated).forEach(function (fId) { var data = deprecated[fId]; var sfId = manager.user.userObject.getSFIdFromHref(data.href); diff --git a/www/common/outer/sharedfolder.js b/www/common/outer/sharedfolder.js index 1778db3f3..7816029c3 100644 --- a/www/common/outer/sharedfolder.js +++ b/www/common/outer/sharedfolder.js @@ -49,29 +49,31 @@ define([ store.manager.addProxy(id, sf.rt.proxy, leave); cb(sf.rt, sf.metadata); }); - sf.teams.push(store); + sf.teams.push({ + cb: cb, + store: store, + id: id + }); if (handler) { handler(id, sf.rt); } - return sf.rt; + return; } - if (sf && sf.queue && sf.rt) { + if (sf && !sf.ready && sf.rt) { // The shared folder is loading, add our callbacks to the queue - sf.queue.push({ + sf.teams.push({ cb: cb, store: store, id: id }); - sf.teams.push(store); if (handler) { handler(id, sf.rt); } - return sf.rt; + return; } sf = allSharedFolders[secret.channel] = { - queue: [{ + teams: [{ cb: cb, store: store, id: id }], - teams: [store] }; var owners = data.owners; @@ -92,25 +94,27 @@ define([ }; var rt = sf.rt = Listmap.create(listmapConfig); rt.proxy.on('ready', function (info) { - if (!sf.queue) { + if (!sf.teams) { return; } - sf.queue.forEach(function (obj) { + sf.teams.forEach(function (obj) { var leave = function () { SF.leave(secret.channel, teamId); }; obj.store.manager.addProxy(obj.id, rt.proxy, leave); obj.cb(rt, info.metadata); }); sf.metadata = info.metadata; sf.ready = true; - delete sf.queue; }); rt.proxy.on('error', function (info) { if (info && info.error) { if (info.error === "EDELETED" ) { try { // Deprecate the shared folder from each team - sf.teams.forEach(function (store) { - store.manager.deprecateProxy(id, secret.channel); + // XXX We can't deprecate a read-only proxy: the read-only seed will change... + // We can only remove it + sf.teams.forEach(function (obj) { + console.log(obj.store.id, obj.store, obj.id); + obj.store.manager.deprecateProxy(obj.id, secret.channel); }); } catch (e) {} delete allSharedFolders[secret.channel]; @@ -128,8 +132,8 @@ define([ var clients = sf.teams; if (!Array.isArray(clients)) { return; } var idx; - clients.some(function (store, i) { - if (store.id === teamId) { + clients.some(function (obj, i) { + if (obj.store.id === teamId) { idx = i; return true; } @@ -145,6 +149,7 @@ define([ } }; + // Update the password locally SF.updatePassword = function (Store, data, network, cb) { var oldChannel = data.oldChannel; var href = data.href; @@ -157,13 +162,18 @@ define([ sf.rt.stop(); } var nt = nThen; - sf.teams.forEach(function (s) { + sf.teams.forEach(function (obj) { + // XXX if we're a viewer in this team, we can't update the keys nt = nt(function (waitFor) { - var sfId = s.manager.user.userObject.getSFIdFromHref(href); + var s = obj.store; + var sfId = obj.id; var shared = Util.find(s.proxy, ['drive', UserObject.SHARED_FOLDERS]) || {}; if (!sfId || !shared[sfId]) { return; } var sf = JSON.parse(JSON.stringify(shared[sfId])); sf.password = password; + sf.channel = secret.channel; + sf.href = '/drive/#'+Hash.getEditHashFromKeys(secret); // XXX encrypt + sf.roHref = '/drive/#'+Hash.getViewHashFromKeys(secret); SF.load({ network: network, store: s, diff --git a/www/common/proxy-manager.js b/www/common/proxy-manager.js index cf7f7d78b..13515be5c 100644 --- a/www/common/proxy-manager.js +++ b/www/common/proxy-manager.js @@ -508,7 +508,12 @@ define([ if (isNew) { return void cb({ error: 'ENOTFOUND' }); } + var parsed = Hash.parsePadUrl(href); + var secret = Hash.getSecrets(parsed.type, parsed.hash, newPassword); data.password = newPassword; + data.channel = secret.channel; + data.href = '/drive/#'+Hash.getEditHashFromKeys(secret); // XXX encrypt + data.roHref = '/drive/#'+Hash.getViewHashFromKeys(secret); _addSharedFolder(Env, { path: ['root'], folderData: data, diff --git a/www/teams/inner.js b/www/teams/inner.js index 40b410954..6c42429ca 100644 --- a/www/teams/inner.js +++ b/www/teams/inner.js @@ -374,7 +374,7 @@ define([ var isOwner = Object.keys(privateData.teams || {}).filter(function (id) { return privateData.teams[id].owner; - }).length >= Constants.MAX_TEAMS_OWNED; // && !privateData.devMode; + }).length >= Constants.MAX_TEAMS_OWNED && !privateData.devMode; var getWarningBox = function () { return h('div.alert.alert-warning', {