Improve team and account deletion for pads multiple owners

This commit is contained in:
yflory 2019-09-30 17:36:56 +02:00
parent 72ba9ab999
commit b5cce5f215
4 changed files with 85 additions and 11 deletions

View File

@ -620,19 +620,68 @@ define([
// No password for profile // No password for profile
list.push(Hash.hrefToHexChannelId('/profile/#' + store.proxy.profile.edit, null)); 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; return list;
}; };
var removeOwnedPads = function (waitFor) { var removeOwnedPads = function (waitFor) {
// Delete owned pads // Delete owned pads
var edPublic = Util.find(store, ['proxy', 'edPublic']);
var ownedPads = getOwnedPads(); var ownedPads = getOwnedPads();
var sem = Saferphore.create(10); var sem = Saferphore.create(10);
ownedPads.forEach(function (c) { ownedPads.forEach(function (c) {
var w = waitFor(); var w = waitFor();
sem.take(function (give) { sem.take(function (give) {
Store.removeOwnedChannel(null, c, give(function (obj) { var otherOwners = false;
if (obj && obj.error) { console.error(obj.error); } 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(); w();
})); });
}); });
}); });
}; };

View File

@ -577,16 +577,43 @@ define([
})); }));
}).nThen(function (waitFor) { }).nThen(function (waitFor) {
team.proxy.delete = true; 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 ownedPads = team.manager.getChannelsList('owned');
var sem = Saferphore.create(10); var sem = Saferphore.create(10);
ownedPads.forEach(function (c) { ownedPads.forEach(function (c) {
var w = waitFor(); var w = waitFor();
sem.take(function (give) { sem.take(function (give) {
team.rpc.removeOwnedChannel(c, give(function (err) { var otherOwners = false;
if (err) { console.error(err); } 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(); w();
})); });
}); });
}); });
}).nThen(function (waitFor) { }).nThen(function (waitFor) {
@ -603,12 +630,10 @@ define([
})); }));
// Delete the chat // Delete the chat
var chatChan = Util.find(teamData, ['keys', 'chat', 'channel']); var chatChan = Util.find(teamData, ['keys', 'chat', 'channel']);
/*
ctx.store.rpc.removeOwnedChannel(chatChan, waitFor(function (err) { ctx.store.rpc.removeOwnedChannel(chatChan, waitFor(function (err) {
if (err) { console.error(err); } if (err) { console.error(err); }
console.error(err); console.error(err);
})); }));
*/ // XXX
// Delete the team drive // Delete the team drive
ctx.store.rpc.removeOwnedChannel(teamData.channel, waitFor(function (err) { ctx.store.rpc.removeOwnedChannel(teamData.channel, waitFor(function (err) {
if (err) { console.error(err); } if (err) { console.error(err); }

View File

@ -827,7 +827,7 @@ define([
// Don't push duplicates // Don't push duplicates
if (result.indexOf(data.channel) !== -1) { return; } if (result.indexOf(data.channel) !== -1) { return; }
// Return owned pads // Return owned pads
if (_ownedByMe(Env, data.owners) && data.owners.length === 1) { if (_ownedByMe(Env, data.owners)) {
result.push(data.channel); result.push(data.channel);
} }
}; };

View File

@ -462,7 +462,7 @@ define([
console.error(obj.error); console.error(obj.error);
return void UI.warn(Messages.error); return void UI.warn(Messages.error);
} }
UI.log(Messags.sent); UI.log(Messages.sent);
}); });
}); });
}); });