From 51067430f9c402a3f2ef49f112a0ea3546d8a91c Mon Sep 17 00:00:00 2001
From: ansuz <ansuz@transitiontech.ca>
Date: Mon, 26 Dec 2016 14:19:29 +0100
Subject: [PATCH] more restructuring of user app

---
 www/user/main.js | 133 +++++++++++++++++++----------------------------
 1 file changed, 54 insertions(+), 79 deletions(-)

diff --git a/www/user/main.js b/www/user/main.js
index e241c519d..27750c23a 100644
--- a/www/user/main.js
+++ b/www/user/main.js
@@ -3,13 +3,12 @@ define([
     '/bower_components/chainpad-listmap/chainpad-listmap.js',
     '/bower_components/chainpad-crypto/crypto.js',
     '/common/cryptpad-common.js',
-    '/login/credential.js',
+    'credential.js',
     '/bower_components/tweetnacl/nacl-fast.min.js',
-    '/bower_components/scrypt-async/scrypt-async.min.js',
+    '/bower_components/scrypt-async/scrypt-async.min.js', // better load speed
     '/bower_components/jquery/dist/jquery.min.js',
 ], function (Config, Listmap, Crypto, Cryptpad, Cred) {
     var $ = window.jQuery;
-    var Scrypt = window.scrypt;
     var Nacl = window.nacl;
 
     var secret = {};
@@ -20,37 +19,59 @@ define([
     };
 
     var $warning = $('#warning');
+
+    // login elements
+    var $loginBox = $('#login-box');
     var $login = $('#login');
-    var $logout = $('#logout');
     var $username = $('#username');
     var $password = $('#password');
     var $confirm = $('#confirm');
     var $remember = $('#remember');
-    var $loginBox = $('#login-box');
-    var $logoutBox = $('#logout-box');
 
-    var revealLogin = function () {
-        $loginBox.slideDown();
+    // log out elements
+    var $logoutBox = $('#logout-box');
+    var $logout = $('#logout');
+
+    var revealer = function ($el) {
+        return function (bool) { $el[bool?'slideDown': 'slideUp'](); };
+    };
+
+    var revealLogin = APP.revealLogin = revealer($loginBox);
+    var revealLogout = APP.revealLogout= revealer($logoutBox);
+    var revealConfirm = APP.revealConfirm = revealer($confirm);
+
+    var $register = $('#register').click(function () {
+        if (!$register.length) { return; }
+        var e = $register[0];
+        if (e.checked) {
+            revealConfirm(true);
+            $login.text(Cryptpad.Messages._getKey('login_register'));
+        }
+        else {
+            revealConfirm(false);
+            $login.text(Cryptpad.Messages._getKey('login_login'));
+        }
+    });
+
+    var resetUI = APP.resetUI = function () {
+        $username.val("");
+        $password.val("");
+        $confirm.val("");
+        $remember[0].checked = false;
+        $register[0].checked = false;
+    };
+
+    APP.logout = function () {
+        Cryptpad.logout(function () {
+            revealLogout(false);
+            revealLogin(true);
+        });
     };
 
     $logout.click(function () {
-        Cryptpad.logout(function () {
-            $logoutBox.slideUp();
-            revealLogin();
-        });
+        APP.logout();
     });
 
-    var hashFromCreds = function (username, password, len, cb) {
-        Scrypt(password,
-            username,
-            8, // memoryCost (n)
-            1024, // block size parameter (r)
-            len || 128, // dkLen
-            200, // interruptStep
-            cb,
-            undefined); // format, could be 'base64'
-    };
-
     var Events = APP.Events = {};
     var alreadyExists = Events.alreadyExists = function () {
         Cryptpad.alert("user account already exists.");
@@ -67,40 +88,16 @@ define([
             console.log("user would like to be forgotten");
         }
 
-        var entropy = {
-            used: 0,
-        };
+        var dispense = Cred.dispenser(bytes);
 
-        // crypto hygeine
-        var consume = function (n) {
-            // explode if you run out of bytes
-            if (entropy.used + n > bytes.length) {
-                throw new Error('exceeded available entropy');
-            }
-            if (typeof(n) !== 'number') { throw new Error('expected a number'); }
-            if (n <= 0) {
-                throw new Error('expected to consume a positive number of bytes');
-            }
-
-            // grab an unused slice of the entropy
-            var A = bytes.slice(entropy.used, entropy.used + n);
-
-            // account for the bytes you used so you don't reuse bytes
-            entropy.used += n;
-
-            //console.info("%s bytes of entropy remaining", bytes.length - entropy.used);
-            return A;
-        };
-
-        // consume 18 bytes of entropy for your encryption key
-        var encryptionSeed = consume(18);
+        // dispense 18 bytes of entropy for your encryption key
+        var encryptionSeed = dispense(18);
         // 16 bytes for a deterministic channel key
-        var channelSeed = consume(16);
+        var channelSeed = dispense(16);
         // 32 bytes for a curve key
-        var curveSeed = consume(32);
+        var curveSeed = dispense(32);
         // 32 more for a signing key
-        var edSeed = consume(32);
-
+        var edSeed = dispense(32);
 
         var seed = {};
         var keys = seed.keys = Crypto.createEditCryptor(null, encryptionSeed);
@@ -144,7 +141,6 @@ define([
 
 /*  if the user is registering, we expect that the userDoc will be empty
 */
-
             var proxyKeys = Object.keys(proxy);
 
             if (opt.register) {
@@ -184,7 +180,7 @@ define([
             console.log("remembering your userhash");
             Cryptpad.login(userHash, opt.remember);
             console.log(userHash);
-            $('div#login-box').slideUp();
+            APP.revealLogin(false);
             $('div#logout-box').slideDown();
             //console.log(proxy);
         })
@@ -193,33 +189,12 @@ define([
             console.log(info);
         });
     };
-    var $register = $('#register').click(function () {
-        if (!$register.length) { return; }
-        var e = $register[0];
-        if (e.checked) {
-            $confirm.slideDown();
-            $login.text(Cryptpad.Messages._getKey('login_register'));
-        }
-        else {
-            $confirm.slideUp();
-            $login.text(Cryptpad.Messages._getKey('login_login'));
-        }
-    });
-
-    var resetUI = function () {
-        $username.val("");
-        $password.val("");
-        $confirm.val("");
-        $remember[0].checked = false;
-        $register[0].checked = false;
-    };
-
     Cryptpad.ready(function () {
         if (Cryptpad.getUserHash()) {
             //Cryptpad.alert("You are already logged in!");
             $logoutBox.slideDown();
         } else {
-            revealLogin();
+            revealLogin(true);
         }
 
         $login.click(function () {
@@ -241,9 +216,9 @@ define([
 
             resetUI();
 
-            // consume 128 bytes, to be divided later
+            // dispense 128 bytes, to be divided later
             // we can safely increase this size, but we don't need much right now
-            hashFromCreds(uname, passwd, 128, function (bytes) {
+            Cred.deriveFromPassphrase(uname, passwd, 128, function (bytes) {
                 useBytes(bytes, {
                     remember: remember,
                     register: register,