diff --git a/www/common/outer/async-store.js b/www/common/outer/async-store.js index 535f699a7..1faab92f8 100644 --- a/www/common/outer/async-store.js +++ b/www/common/outer/async-store.js @@ -620,19 +620,68 @@ define([ // No password for profile list.push(Hash.hrefToHexChannelId('/profile/#' + store.proxy.profile.edit, null)); } + if (store.proxy.mailboxes) { + Object.keys(store.proxy.mailboxes || {}).forEach(function (id) { + if (id === 'supportadmin') { return; } + var m = store.proxy.mailboxes[id]; + list.push(m.channel); + }); + } + if (store.proxy.teams) { + Object.keys(store.proxy.teams || {}).forEach(function (id) { + var t = store.proxy.teams[id]; + if (t.owner) { + list.push(t.channel); + list.push(t.keys.roster.channel); + list.push(t.keys.chat.channel); + } + }); + } return list; }; var removeOwnedPads = function (waitFor) { // Delete owned pads + var edPublic = Util.find(store, ['proxy', 'edPublic']); var ownedPads = getOwnedPads(); var sem = Saferphore.create(10); ownedPads.forEach(function (c) { var w = waitFor(); sem.take(function (give) { - Store.removeOwnedChannel(null, c, give(function (obj) { - if (obj && obj.error) { console.error(obj.error); } + var otherOwners = false; + nThen(function (_w) { + Store.anonRpcMsg(null, { + msg: 'GET_METADATA', + data: c + }, _w(function (obj) { + if (obj && obj.error) { + give(); + return void _w.abort(); + } + var md = obj[0]; + var isOwner = md && Array.isArray(md.owners) && md.owners.indexOf(edPublic) !== -1; + if (!isOwner) { + give(); + return void _w.abort(); + } + otherOwners = md.owners.some(function (ed) { return void ed !== edPublic; }); + })); + }).nThen(function (_w) { + if (otherOwners) { + Store.setPadMetadata(null, { + channel: c, + command: 'RM_OWNERS', + value: [edPublic], + }, _w()); + return; + } + // We're the only owner: delete the pad + store.rpc.removeOwnedChannel(c, _w(function (err) { + if (err) { console.error(err); } + })); + }).nThen(function () { + give(); w(); - })); + }); }); }); }; diff --git a/www/common/outer/team.js b/www/common/outer/team.js index 78e0d74ac..516a5c8bd 100644 --- a/www/common/outer/team.js +++ b/www/common/outer/team.js @@ -577,16 +577,43 @@ define([ })); }).nThen(function (waitFor) { team.proxy.delete = true; - // Delete the owned pads + // For each pad, check on the server if there are other owners. + // If yes, then remove yourself as an owner + // If no, delete the pad var ownedPads = team.manager.getChannelsList('owned'); var sem = Saferphore.create(10); ownedPads.forEach(function (c) { var w = waitFor(); sem.take(function (give) { - team.rpc.removeOwnedChannel(c, give(function (err) { - if (err) { console.error(err); } + var otherOwners = false; + nThen(function (_w) { + ctx.Store.anonRpcMsg(null, { + msg: 'GET_METADATA', + data: c + }, _w(function (obj) { + if (obj && obj.error) { return void _w.abort(); } + var md = obj[0]; + var isOwner = md && Array.isArray(md.owners) && md.owners.indexOf(edPublic) !== -1; + if (!isOwner) { return void _w.abort(); } + otherOwners = md.owners.some(function (ed) { return void ed !== edPublic; }); + })); + }).nThen(function (_w) { + if (otherOwners) { + ctx.Store.setPadMetadata(null, { + channel: c, + command: 'RM_OWNERS', + value: [edPublic], + }, _w()); + return; + } + // We're the only owner: delete the pad + team.rpc.removeOwnedChannel(c, _w(function (err) { + if (err) { console.error(err); } + })); + }).nThen(function () { + give(); w(); - })); + }); }); }); }).nThen(function (waitFor) { @@ -603,12 +630,10 @@ define([ })); // Delete the chat var chatChan = Util.find(teamData, ['keys', 'chat', 'channel']); - /* ctx.store.rpc.removeOwnedChannel(chatChan, waitFor(function (err) { if (err) { console.error(err); } console.error(err); })); - */ // XXX // Delete the team drive ctx.store.rpc.removeOwnedChannel(teamData.channel, waitFor(function (err) { if (err) { console.error(err); } diff --git a/www/common/proxy-manager.js b/www/common/proxy-manager.js index 3908727c2..ca914b57a 100644 --- a/www/common/proxy-manager.js +++ b/www/common/proxy-manager.js @@ -827,7 +827,7 @@ define([ // Don't push duplicates if (result.indexOf(data.channel) !== -1) { return; } // Return owned pads - if (_ownedByMe(Env, data.owners) && data.owners.length === 1) { + if (_ownedByMe(Env, data.owners)) { result.push(data.channel); } }; diff --git a/www/teams/inner.js b/www/teams/inner.js index 20dff609b..0b097db39 100644 --- a/www/teams/inner.js +++ b/www/teams/inner.js @@ -462,7 +462,7 @@ define([ console.error(obj.error); return void UI.warn(Messages.error); } - UI.log(Messags.sent); + UI.log(Messages.sent); }); }); });