diff --git a/www/common/common-hash.js b/www/common/common-hash.js index c4f452dc7..888c0a338 100644 --- a/www/common/common-hash.js +++ b/www/common/common-hash.js @@ -54,7 +54,7 @@ Version 1 if (!hash) { return; } var parsed = {}; var hashArr = fixDuplicateSlashes(hash).split('/'); - if (['media', 'file', 'user'].indexOf(type) === -1) { + if (['media', 'file', 'user', 'invite'].indexOf(type) === -1) { parsed.type = 'pad'; if (hash.slice(0,1) !== '/' && hash.length >= 56) { // Old hash @@ -93,6 +93,16 @@ Version 1 } return parsed; } + if (['invite'].indexOf(type) !== -1) { + parsed.type = 'invite'; + if (hashArr[1] && hashArr[1] === '1') { + parsed.version = 1; + parsed.channel = hashArr[2]; + parsed.pubkey = hashArr[3].replace(/-/g, '/'); + return parsed; + } + return parsed; + } return; }; var parsePadUrl = Hash.parsePadUrl = function (href) { @@ -320,5 +330,11 @@ Version 1 return hash; }; + Hash.createInviteUrl = function (curvePublic, channel) { + channel = channel || Hash.createChannelId(); + return window.location.origin + '/invite/#/1/' + channel + + '/' + curvePublic.replace(/\//g, '-') + '/'; + }; + return Hash; }); diff --git a/www/common/cryptpad-common.js b/www/common/cryptpad-common.js index 3df7b6766..8d162d15e 100644 --- a/www/common/cryptpad-common.js +++ b/www/common/cryptpad-common.js @@ -108,6 +108,7 @@ define([ common.findWeaker = Hash.findWeaker; common.findStronger = Hash.findStronger; common.serializeHash = Hash.serializeHash; + common.createInviteUrl = Hash.createInviteUrl; // Messaging common.addDirectMessageHandler = Messaging.addDirectMessageHandler; diff --git a/www/common/curve-put.js b/www/common/curve-put.js new file mode 100644 index 000000000..a57e7ac5e --- /dev/null +++ b/www/common/curve-put.js @@ -0,0 +1,47 @@ +define([ + '/common/curve.js', + '/bower_components/chainpad-listmap/chainpad-listmap.js', +], function (Curve, Listmap) { + var Edit = {}; + + Edit.create = function (network, channel, theirs, mine, cb) { + try { + var encryptor = Curve.createEncryptor(theirs, mine); + var lm = Listmap.create({ + network: network, + data: {}, + channel: channel, + readOnly: false, + validateKey: undefined, + crypto: encryptor, + userName: 'lol', + logLevel: 1, + }); + + var done = function () { + // TODO make this abort and disconnect the session after the + // user has finished making changes to the object, and they + // have propagated. + }; + + lm.proxy + .on('create', function () { + console.log('created'); + }) + .on('ready', function () { + console.log('ready'); + cb(lm, done); + }) + .on('disconnect', function () { + console.log('disconnected'); + }) + .on('change', [], function (o, n, p) { + console.log(o, n, p); + }); + } catch (e) { + console.error(e); + } + }; + + return Edit; +}); diff --git a/www/common/curve.js b/www/common/curve.js index 62432a703..f0707662e 100644 --- a/www/common/curve.js +++ b/www/common/curve.js @@ -2,35 +2,36 @@ define([ '/bower_components/tweetnacl/nacl-fast.min.js', ], function () { var Nacl = window.nacl; - var Curve = {}; // nacl.box(message, nonce, theirPublicKey, mySecretKey) Curve.encrypt = function (message, theirPub, mySecret) { var buffer = Nacl.util.decodeUTF8(message); - var nonce = Nacl.randomBytes(24); - var box = Nacl.box(buffer, nonce, theirPub, mySecret); - - return [Nacl.util.encodeBase64(nonce), Nacl.util.encodeBase64(box)].join('|'); + return Nacl.util.encodeBase64(nonce) + '|' + Nacl.util.encodeBase64(box); }; // nacl.box.open(box, nonce, theirPublicKey, mySecretKey) Curve.decrypt = function (packed, theirPub, mySecret) { var unpacked = packed.split('|'); var nonce = Nacl.util.decodeBase64(unpacked[0]); - var box = Nacl.util.decodeBase64(unpacked[1]); - var message = Nacl.box.open(box, nonce, theirPub, mySecret); - return Nacl.util.encodeUTF8(message); }; - Curve.createEncryptor = function () { - console.log("PEWPEW"); - throw new Error("E_NOT_IMPL"); + Curve.createEncryptor = function (theirPublic, mySecret) { + var theirs = Nacl.util.decodeBase64(theirPublic); + var mine = Nacl.util.decodeBase64(mySecret); + return { + encrypt: function (msg) { + return Curve.encrypt(msg, theirs, mine); + }, + decrypt: function (packed) { + return Curve.decrypt(packed, theirs, mine); + } + }; }; return Curve; diff --git a/www/invite/main.js b/www/invite/main.js index 900c02e58..df58db885 100644 --- a/www/invite/main.js +++ b/www/invite/main.js @@ -7,52 +7,49 @@ define([ ], function ($, Cryptpad, Listmap, Curve) { var APP = window.APP = {}; - var Nacl = window.nacl; - - var alice = Nacl.box.keyPair(); - var bob = Nacl.box.keyPair(); - - var packed = Curve.encrypt('pewpew', bob.publicKey, alice.secretKey); - console.log(packed); - - var message = Curve.decrypt(packed, alice.publicKey, bob.secretKey); - - console.log(message); + //var Messages = Cryptpad.Messages; + var onInit = function () {}; - Cryptpad.removeLoadingScreen(); - Cryptpad.alert(message); + var onDisconnect = function () {}; + var onChange = function () {}; - return {}; + var andThen = function () { + var hash = window.location.hash.slice(1); - //var Messages = Cryptpad.Messages; - var onReady = function () { + var info = Cryptpad.parseTypeHash('invite', hash); + console.log(info); - if (!APP.initialized) { - APP.initialized = true; + if (!info.pubkey) { + Cryptpad.removeLoadingScreen(); + Cryptpad.alert('invalid invite'); + return; } - }; - var onInit = function () {}; + var proxy = Cryptpad.getProxy(); + var mySecret = proxy.curvePrivate; - var onDisconnect = function () {}; - var onChange = function () {}; + var encryptor = Curve.createEncryptor(info.pubkey, mySecret); + + Cryptpad.removeLoadingScreen(); + var message = 'hello!'; + Cryptpad.alert(message); - var andThen = function (profileHash) { - var secret = Cryptpad.getSecrets('profile', profileHash); - var readOnly = APP.readOnly = secret.keys && !secret.keys.editKeyStr; var listmapConfig = { data: {}, - websocketURL: Cryptpad.getWebsocketURL(), - channel: secret.channel, - readOnly: readOnly, - validateKey: secret.keys.validateKey || undefined, - crypto: Crypto.createEncryptor(secret.keys), + network: Cryptpad.getNetwork(), + channel: info.channel, + readOnly: false, //undefined, + validateKey: undefined, + crypto: encryptor, userName: 'profile', logLevel: 1, }; var lm = APP.lm = Listmap.create(listmapConfig); lm.proxy.on('create', onInit) - .on('ready', onReady) + .on('ready', function () { + APP.initialized = true; + console.log(JSON.stringify(lm.proxy)); + }) .on('disconnect', onDisconnect) .on('change', [], onChange); }; @@ -84,11 +81,7 @@ define([ Cryptpad.ready(function () { Cryptpad.reportAppUsage(); - - if (window.location.hash) { - return void andThen(window.location.hash.slice(1)); - } + andThen(); }); }); - });