diff --git a/www/common/outer/team.js b/www/common/outer/team.js index 1c3c29a70..78e0d74ac 100644 --- a/www/common/outer/team.js +++ b/www/common/outer/team.js @@ -278,7 +278,9 @@ define([ }; - var openChannel = function (ctx, teamData, id, cb) { + var openChannel = function (ctx, teamData, id, _cb) { + var cb = Util.once(_cb); + var secret = Hash.getSecrets('team', teamData.hash, teamData.password); var crypto = Crypto.createEncryptor(secret.keys); @@ -286,7 +288,34 @@ define([ var roster; var lm; + + // Roster keys + var myKeys = { + curvePublic: ctx.store.proxy.curvePublic, + curvePrivate: ctx.store.proxy.curvePrivate + }; + var rosterData = keys.roster || {}; + var rosterKeys = rosterData.edit ? Crypto.Team.deriveMemberKeys(rosterData.edit, myKeys) + : Crypto.Team.deriveGuestKeys(rosterData.view || ''); + nThen(function (waitFor) { + ctx.store.anon_rpc.send("IS_NEW_CHANNEL", secret.channel, waitFor(function (e, response) { + if (response && response.length && typeof(response[0]) === 'boolean' && response[0]) { + // Channel is empty: remove this team + delete ctx.store.proxy.teams[id]; + waitFor.abort(); + cb({error: 'ENOENT'}); + } + })); + ctx.store.anon_rpc.send("IS_NEW_CHANNEL", rosterKeys.channel, waitFor(function (e, response) { + if (response && response.length && typeof(response[0]) === 'boolean' && response[0]) { + // Channel is empty: remove this team + delete ctx.store.proxy.teams[id]; + waitFor.abort(); + cb({error: 'ENOENT'}); + } + })); + }).nThen(function (waitFor) { // Load the proxy var cfg = { data: {}, @@ -308,15 +337,18 @@ define([ }; lm = Listmap.create(cfg); lm.proxy.on('ready', waitFor()); + lm.proxy.on('error', function (info) { + if (info && typeof (info.loaded) !== "undefined" && !info.loaded) { + cb({error:'ECONNECT'}); + } + if (info && info.error) { + if (info.error === "EDELETED" ) { + closeTeam(ctx, id); + } + } + }); // Load the roster - var myKeys = { - curvePublic: ctx.store.proxy.curvePublic, - curvePrivate: ctx.store.proxy.curvePrivate - }; - var rosterData = keys.roster || {}; - var rosterKeys = rosterData.edit ? Crypto.Team.deriveMemberKeys(rosterData.edit, myKeys) - : Crypto.Team.deriveGuestKeys(rosterData.view || ''); Roster.create({ network: ctx.store.network, channel: rosterKeys.channel, @@ -503,6 +535,11 @@ define([ if (info && typeof (info.loaded) !== "undefined" && !info.loaded) { cb({error:'ECONNECT'}); } + if (info && info.error) { + if (info.error === "EDELETED") { + closeTeam(ctx, id); + } + } }); }); };