From af463c2de9d12967868d2b72d6e3412227c8eca3 Mon Sep 17 00:00:00 2001 From: ansuz Date: Mon, 16 Dec 2019 10:22:22 -0500 Subject: [PATCH] use the same APIs when creating invites as you do when redeeming them --- www/common/common-ui-elements.js | 23 ++++++------- www/common/invitation.js | 12 +++++++ www/teams/inner.js | 55 +++++++++++++++++++++----------- 3 files changed, 59 insertions(+), 31 deletions(-) diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 27fd67dca..1dc44329a 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -14,14 +14,14 @@ define([ '/customize/application_config.js', '/customize/pages.js', '/bower_components/nthen/index.js', + '/common/invitation.js', '/bower_components/scrypt-async/scrypt-async.js', 'css!/customize/fonts/cptools/style.css', '/bower_components/croppie/croppie.min.js', 'css!/bower_components/croppie/croppie.css', ], function ($, Config, Util, Hash, Language, UI, Constants, Feedback, h, MediaTag, Clipboard, - Messages, AppConfig, Pages, NThen) { - var Scrypt = window.scrypt; + Messages, AppConfig, Pages, NThen, InviteInner) { var UIElements = {}; // Configure MediaTags to use our local viewer @@ -1681,6 +1681,10 @@ define([ $(linkError).text('empty name...').show(); // XXX return true; } + + var seeds = InviteInner.deriveSeeds(hashData.key); + var salt = InviteInner.deriveSalt(pw, AppConfig.loginSalt); + var bytes64; NThen(function (waitFor) { $(linkForm).hide(); @@ -1688,17 +1692,9 @@ define([ $nav.find('button.cp-teams-invite-create').prop('disabled', 'disabled'); setTimeout(waitFor(), 150); }).nThen(function (waitFor) { - // Scrypt - Scrypt(hashData.key, - (pw || '') + (AppConfig.loginSalt || ''), // salt - 8, // memoryCost (n) - 1024, // block size parameter (r) - 192, // dkLen - 200, // interruptStep - waitFor(function (_bytes) { - bytes64 = _bytes; - }), - 'base64'); // format, could be 'base64' + InviteInner.deriveBytes(seeds.scrypt, salt, waitFor(function (_bytes) { + bytes64 = _bytes; + })); }).nThen(function (waitFor) { $(linkSpinText).text('Add invite link to team'); // XXX module.execCommand('CREATE_INVITE_LINK', { @@ -1708,6 +1704,7 @@ define([ bytes64: bytes64, hash: hash, teamId: config.teamId, + seeds: seeds, }, waitFor(function (obj) { if (obj && obj.error) { waitFor.abort(); diff --git a/www/common/invitation.js b/www/common/invitation.js index 72655c60a..e26a39597 100644 --- a/www/common/invitation.js +++ b/www/common/invitation.js @@ -42,6 +42,18 @@ var factory = function (Hash, Nacl, Scrypt/*, Util, Cred, nThen */) { cb, 'base64'); // format, could be 'base64' }; + + Invite.getPreviewContent = function (seeds, cb) { + var secrets = Invite.derivePreviewSecrets(seeds); + secrets = secrets; + cb("NOT_IMPLEMENTED"); // XXX cryptget + }; + + // XXX remember to pin invites... + Invite.setPreviewContent = function (seeds, cb) { + cb = cb; + }; + return Invite; }; if (typeof(module) !== 'undefined' && module.exports) { diff --git a/www/teams/inner.js b/www/teams/inner.js index 07f27b09f..21883609d 100644 --- a/www/teams/inner.js +++ b/www/teams/inner.js @@ -1053,26 +1053,45 @@ define([ var $div = $(div); $div.empty(); var bytes64; + nThen(function (waitFor) { - $div.append(h('div', [ - h('i.fa.fa-spin.fa-spinner'), - h('span', 'Scrypt...') // XXX - ])); - setTimeout(waitFor(), 150); + // XXX show something while we're waiting for the invite preview content + waitFor = waitFor; }).nThen(function (waitFor) { - var salt = InviteInner.deriveSalt(pw, AppConfig.loginSalt); - InviteInner.deriveBytes(seeds.scrypt, salt, waitFor(function (bytes) { - bytes64 = bytes; - })); - }).nThen(function (waitFor) { - APP.module.execCommand('GET_LINK_DATA', { - bytes64: bytes64, - hash: hash, - password: pw, - }, waitFor(function () { - $div.empty(); - // TODO - // Accept/decline/decide later UI + InviteInner.getPreviewContent(seeds, waitFor(function (err, json) { + json = json; // XXX {message: "", author: "", ???} + if (err) { + // XXX handle errors + } + // XXX show invite preview content + + var button = h('button', 'XXX'); + button.onclick = function () { + nThen(function (waitFor) { + $div.append(h('div', [ + h('i.fa.fa-spin.fa-spinner'), + h('span', 'Scrypt...') // XXX + ])); + setTimeout(waitFor(), 150); + }).nThen(function (waitFor) { + var salt = InviteInner.deriveSalt(pw, AppConfig.loginSalt); + InviteInner.deriveBytes(seeds.scrypt, salt, waitFor(function (bytes) { + bytes64 = bytes; + })); + }).nThen(function (waitFor) { + APP.module.execCommand('GET_LINK_DATA', { + bytes64: bytes64, + hash: hash, + password: pw, + }, waitFor(function () { + $div.empty(); + // TODO + // Accept/decline/decide later UI + })); + }); + }; + + $div.append(button); })); }); };