diff --git a/customize.dist/main.js b/customize.dist/main.js index 8452a2480..bb1ec31f3 100644 --- a/customize.dist/main.js +++ b/customize.dist/main.js @@ -127,11 +127,17 @@ define([ var passwd = $passwd.val(); Login.loginOrRegister(uname, passwd, false, function (err, result) { if (!err) { + var proxy = result.proxy; + // successful validation and user already exists // set user hash in localStorage and redirect to drive - if (result.proxy && !result.proxy.login_name) { - result.proxy.login_name = result.userName; + if (proxy && !proxy.login_name) { + proxy.login_name = result.userName; } + + proxy.edPrivate = result.edPrivate; + proxy.edPublic = result.edPublic; + Cryptpad.whenRealtimeSyncs(result.realtime, function () { Cryptpad.login(result.userHash, result.userName, function () { document.location.href = '/drive/'; diff --git a/www/common/login.js b/www/common/login.js index 7576ff4d4..8e9067bc7 100644 --- a/www/common/login.js +++ b/www/common/login.js @@ -11,6 +11,7 @@ define([ Cred: Cred, }; + var Nacl = window.nacl; var allocateBytes = function (bytes) { var dispense = Cred.dispenser(bytes); @@ -25,6 +26,12 @@ define([ // 32 more for a signing key var edSeed = opt.edSeed = dispense(32); + // derive a private key from the ed seed + var signingKeypair = Nacl.sign.keyPair.fromSeed(new Uint8Array(edSeed)); + + opt.edPrivate = Nacl.util.encodeBase64(signingKeypair.secretKey); + opt.edPublic = Nacl.util.encodeBase64(signingKeypair.publicKey); + var keys = opt.keys = Crypto.createEditCryptor(null, encryptionSeed); // 24 bytes of base64 @@ -98,6 +105,10 @@ define([ res.userHash = opt.userHash; res.userName = uname; + // export their signing key + res.edPrivate = opt.edPrivate; + res.edPublic = opt.edPublic; + // they tried to just log in but there's no such user if (!isRegister && isProxyEmpty(rt.proxy)) { rt.network.disconnect(); // clean up after yourself diff --git a/www/login/main.js b/www/login/main.js index b8ec37c0b..706d5429a 100644 --- a/www/login/main.js +++ b/www/login/main.js @@ -71,12 +71,17 @@ define([ var passwd = $passwd.val(); Login.loginOrRegister(uname, passwd, false, function (err, result) { if (!err) { + var proxy = result.proxy; + // successful validation and user already exists // set user hash in localStorage and redirect to drive - if (result.proxy && !result.proxy.login_name) { + if (!proxy.login_name) { result.proxy.login_name = result.userName; } + proxy.edPrivate = result.edPrivate; + proxy.edPublic = result.edPublic; + Cryptpad.whenRealtimeSyncs(result.realtime, function() { Cryptpad.login(result.userHash, result.userName, function () { if (sessionStorage.redirectTo) { diff --git a/www/register/main.js b/www/register/main.js index ef1ace07c..37cb17155 100644 --- a/www/register/main.js +++ b/www/register/main.js @@ -63,6 +63,11 @@ define([ var logMeIn = function (result) { localStorage.User_hash = result.userHash; + + var proxy = result.proxy; + proxy.edPublic = result.edPublic; + proxy.edPrivate = result.edPrivate; + Cryptpad.whenRealtimeSyncs(result.realtime, function () { Cryptpad.login(result.userHash, result.userName, function () { if (sessionStorage.redirectTo) {