|
|
@ -10,12 +10,13 @@ define([
|
|
|
|
|
|
|
|
|
|
|
|
'/bower_components/chainpad-listmap/chainpad-listmap.js',
|
|
|
|
'/bower_components/chainpad-listmap/chainpad-listmap.js',
|
|
|
|
'/bower_components/chainpad-crypto/crypto.js',
|
|
|
|
'/bower_components/chainpad-crypto/crypto.js',
|
|
|
|
|
|
|
|
'/bower_components/chainpad-netflux/chainpad-netflux.js',
|
|
|
|
'/bower_components/chainpad/chainpad.dist.js',
|
|
|
|
'/bower_components/chainpad/chainpad.dist.js',
|
|
|
|
'/bower_components/nthen/index.js',
|
|
|
|
'/bower_components/nthen/index.js',
|
|
|
|
'/bower_components/tweetnacl/nacl-fast.min.js',
|
|
|
|
'/bower_components/tweetnacl/nacl-fast.min.js',
|
|
|
|
], function (Util, Hash, Constants, Realtime,
|
|
|
|
], function (Util, Hash, Constants, Realtime,
|
|
|
|
ProxyManager, UserObject, SF,
|
|
|
|
ProxyManager, UserObject, SF,
|
|
|
|
Listmap, Crypto, ChainPad, nThen) {
|
|
|
|
Listmap, Crypto, CpNetflux, ChainPad, nThen) {
|
|
|
|
var Team = {};
|
|
|
|
var Team = {};
|
|
|
|
|
|
|
|
|
|
|
|
var Nacl = window.nacl;
|
|
|
|
var Nacl = window.nacl;
|
|
|
@ -139,15 +140,15 @@ define([
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
team.getChatData = function () {
|
|
|
|
team.getChatData = function () {
|
|
|
|
var hash = Util.find(proxy, ['metadata', 'chat']);
|
|
|
|
var hash = Util.find(ctx.store.proxy, ['teams', id, 'keys' 'chat', 'hash']);
|
|
|
|
if (!hash) {
|
|
|
|
if (!hash) { return {}; }
|
|
|
|
hash = proxy.metadata.chat = Hash.createRandomHash('chat');
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
var secret = Hash.getSecrets('chat', hash);
|
|
|
|
var secret = Hash.getSecrets('chat', hash);
|
|
|
|
return {
|
|
|
|
return {
|
|
|
|
|
|
|
|
teamId: id,
|
|
|
|
channel: secret.channel,
|
|
|
|
channel: secret.channel,
|
|
|
|
secret: secret,
|
|
|
|
secret: secret,
|
|
|
|
validateKey: secret.keys.validateKey
|
|
|
|
validateKey: secret.keys.validateKey
|
|
|
|
|
|
|
|
// XXX owners: team owner + all admins?
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
@ -286,6 +287,7 @@ define([
|
|
|
|
var secret = Hash.getSecrets('team', hash, password);
|
|
|
|
var secret = Hash.getSecrets('team', hash, password);
|
|
|
|
var keyPair = Nacl.sign.keyPair(); // keyPair.secretKey , keyPair.publicKey
|
|
|
|
var keyPair = Nacl.sign.keyPair(); // keyPair.secretKey , keyPair.publicKey
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Crypto.create
|
|
|
|
var membersSecret = Hash.getSecrets('members');
|
|
|
|
var membersSecret = Hash.getSecrets('members');
|
|
|
|
var membersHashes = Hash.getHashes(membersSecret);
|
|
|
|
var membersHashes = Hash.getHashes(membersSecret);
|
|
|
|
|
|
|
|
|
|
|
@ -304,43 +306,70 @@ define([
|
|
|
|
owners: [ctx.store.proxy.edPublic]
|
|
|
|
owners: [ctx.store.proxy.edPublic]
|
|
|
|
};
|
|
|
|
};
|
|
|
|
nThen(function (waitFor) {
|
|
|
|
nThen(function (waitFor) {
|
|
|
|
console.log('pin..');
|
|
|
|
// XXX add this to the reset list too
|
|
|
|
ctx.pinPads([secret.channel, membersSecret.channel], waitFor(function (obj) {
|
|
|
|
ctx.pinPads([secret.channel, membersSecret.channel, chatSecret.channel], waitFor(function (obj) {
|
|
|
|
if (obj && obj.error) {
|
|
|
|
if (obj && obj.error) {
|
|
|
|
waitFor.abort();
|
|
|
|
waitFor.abort();
|
|
|
|
return void cb(obj);
|
|
|
|
return void cb(obj);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
}));
|
|
|
|
// XXX initialize the members channel with yourself, and mark it as owned!
|
|
|
|
// XXX initialize the members channel with yourself, and mark it as owned!
|
|
|
|
|
|
|
|
var chatCfg = {
|
|
|
|
|
|
|
|
network: ctx.store.network,
|
|
|
|
|
|
|
|
channel: chatSecret.channel,
|
|
|
|
|
|
|
|
noChainPad: true,
|
|
|
|
|
|
|
|
crypto: crypto,
|
|
|
|
|
|
|
|
metadata: {
|
|
|
|
|
|
|
|
validateKey: secret.keys.validateKey,
|
|
|
|
|
|
|
|
owners: [ctx.store.proxy.edPublic],
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
var chatReady = waitFor();
|
|
|
|
|
|
|
|
var cpNf2;
|
|
|
|
|
|
|
|
chatCfg.onReady = function () {
|
|
|
|
|
|
|
|
if (cpNf2) { cpNf2.stop(); }
|
|
|
|
|
|
|
|
chatReady();
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
chatCfg.onError = function () { chatReady(); };
|
|
|
|
|
|
|
|
cpNf2 = CpNetflux.start(chatCfg);
|
|
|
|
}).nThen(function () {
|
|
|
|
}).nThen(function () {
|
|
|
|
console.log('init proxy');
|
|
|
|
|
|
|
|
var lm = Listmap.create(config);
|
|
|
|
var lm = Listmap.create(config);
|
|
|
|
var proxy = lm.proxy;
|
|
|
|
var proxy = lm.proxy;
|
|
|
|
proxy.on('ready', function () {
|
|
|
|
proxy.on('ready', function () {
|
|
|
|
console.log('ready');
|
|
|
|
|
|
|
|
// Store keys in our drive
|
|
|
|
|
|
|
|
var id = Util.createRandomInteger();
|
|
|
|
var id = Util.createRandomInteger();
|
|
|
|
|
|
|
|
// Store keys in our drive
|
|
|
|
var keys = {
|
|
|
|
var keys = {
|
|
|
|
edPrivate: Nacl.util.encodeBase64(keyPair.secretKey),
|
|
|
|
drive: {
|
|
|
|
edPublic: Nacl.util.encodeBase64(keyPair.publicKey)
|
|
|
|
edPrivate: Nacl.util.encodeBase64(keyPair.secretKey),
|
|
|
|
|
|
|
|
edPublic: Nacl.util.encodeBase64(keyPair.publicKey)
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
chat: {
|
|
|
|
|
|
|
|
hash: chatHashes.editHash,
|
|
|
|
|
|
|
|
channel: chatSecret.channel
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
members: {
|
|
|
|
|
|
|
|
// XXX
|
|
|
|
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
ctx.store.proxy.teams[id] = {
|
|
|
|
ctx.store.proxy.teams[id] = {
|
|
|
|
hash: hash,
|
|
|
|
hash: hash,
|
|
|
|
password: password,
|
|
|
|
password: password,
|
|
|
|
keys: keys,
|
|
|
|
keys: keys,
|
|
|
|
members: membersHashes.editHash,
|
|
|
|
//members: membersHashes.editHash,
|
|
|
|
name: data.name
|
|
|
|
metadata: {
|
|
|
|
|
|
|
|
name: data.name
|
|
|
|
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
// Initialize the team drive
|
|
|
|
// Initialize the team drive
|
|
|
|
proxy.drive = {};
|
|
|
|
proxy.drive = {};
|
|
|
|
// Create metadata
|
|
|
|
// Create metadata
|
|
|
|
proxy.metadata = {
|
|
|
|
proxy.metadata = {
|
|
|
|
chat: chatHashes.editHash,
|
|
|
|
//chat: chatHashes.editHash,
|
|
|
|
name: name,
|
|
|
|
//name: name,
|
|
|
|
members: membersHashes.viewHash,
|
|
|
|
//members: membersHashes.viewHash,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
// Add rpc key
|
|
|
|
// Add rpc key
|
|
|
|
proxy.edPublic = Nacl.util.encodeBase64(keyPair.publicKey);
|
|
|
|
//proxy.edPublic = Nacl.util.encodeBase64(keyPair.publicKey);
|
|
|
|
|
|
|
|
|
|
|
|
onReady(ctx, id, lm, {
|
|
|
|
onReady(ctx, id, lm, {
|
|
|
|
edPrivate: keyPair.secretKey,
|
|
|
|
edPrivate: keyPair.secretKey,
|
|
|
@ -403,6 +432,12 @@ define([
|
|
|
|
cb();
|
|
|
|
cb();
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var openTeamChat = function (ctx, data, cId, cb) {
|
|
|
|
|
|
|
|
var team = ctx.teams[data.teamId];
|
|
|
|
|
|
|
|
if (!team) { return void cb({error: 'ENOENT'}); }
|
|
|
|
|
|
|
|
ctx.store.messenger.openTeamChat(team.getChatData(), cId, cb);
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Remove a client from all the team they're subscribed to
|
|
|
|
// Remove a client from all the team they're subscribed to
|
|
|
|
var removeClient = function (ctx, cId) {
|
|
|
|
var removeClient = function (ctx, cId) {
|
|
|
|
Object.keys(ctx.teams).forEach(function (id) {
|
|
|
|
Object.keys(ctx.teams).forEach(function (id) {
|
|
|
@ -475,7 +510,7 @@ define([
|
|
|
|
return void cb(store.proxy.teams);
|
|
|
|
return void cb(store.proxy.teams);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (cmd === 'OPEN_TEAM_CHAT') {
|
|
|
|
if (cmd === 'OPEN_TEAM_CHAT') {
|
|
|
|
return void ctx.store.messenger.openTeamChat(data, clientId, cb);
|
|
|
|
return void openTeamChat(ctx, data, clientId, cb);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (cmd === 'CREATE_TEAM') {
|
|
|
|
if (cmd === 'CREATE_TEAM') {
|
|
|
|
return void createTeam(ctx, data, clientId, cb);
|
|
|
|
return void createTeam(ctx, data, clientId, cb);
|
|
|
|