From d43cb509dc3e687a55f7e3f9f40d9bf49840eb00 Mon Sep 17 00:00:00 2001 From: yflory Date: Tue, 2 Mar 2021 16:05:18 +0100 Subject: [PATCH] Checkup: test sandbox domain and login block --- customize.dist/login.js | 5 +- .../src/less2/pages/page-checkup.less | 4 + www/checkup/index.html | 1 + www/checkup/inner.html | 11 ++ www/checkup/inner.js | 5 + www/checkup/main.js | 122 +++++++++++++++++- 6 files changed, 141 insertions(+), 7 deletions(-) create mode 100644 www/checkup/inner.html create mode 100644 www/checkup/inner.js diff --git a/customize.dist/login.js b/customize.dist/login.js index 0e932c4f6..c0daaec91 100644 --- a/customize.dist/login.js +++ b/customize.dist/login.js @@ -22,6 +22,7 @@ define([ Feedback, LocalStore, Messages, nThen, Block, Hash) { var Exports = { Cred: Cred, + Block: Block, // this is depended on by non-customizable files // be careful when modifying login.js requiredBytes: 192, @@ -92,7 +93,7 @@ define([ }; - var loginOptionsFromBlock = function (blockInfo) { + var loginOptionsFromBlock = Exports.loginOptionsFromBlock = function (blockInfo) { var opt = {}; var parsed = Hash.getSecrets('pad', blockInfo.User_hash); opt.channelHex = parsed.channel; @@ -102,7 +103,7 @@ define([ return opt; }; - var loadUserObject = function (opt, cb) { + var loadUserObject = Exports.loadUserObject = function (opt, cb) { var config = { websocketURL: NetConfig.getWebsocketURL(), channel: opt.channelHex, diff --git a/customize.dist/src/less2/pages/page-checkup.less b/customize.dist/src/less2/pages/page-checkup.less index a4ece61a4..2839ec9ea 100644 --- a/customize.dist/src/less2/pages/page-checkup.less +++ b/customize.dist/src/less2/pages/page-checkup.less @@ -53,5 +53,9 @@ html, body { background-color: @cp_alerts-danger-bg; color: @cp_alerts-danger-text; } + + iframe { + display: none; + } } diff --git a/www/checkup/index.html b/www/checkup/index.html index afa469f7f..164793466 100644 --- a/www/checkup/index.html +++ b/www/checkup/index.html @@ -6,4 +6,5 @@ + diff --git a/www/checkup/inner.html b/www/checkup/inner.html new file mode 100644 index 000000000..4554943d5 --- /dev/null +++ b/www/checkup/inner.html @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/www/checkup/inner.js b/www/checkup/inner.js new file mode 100644 index 000000000..690bfde24 --- /dev/null +++ b/www/checkup/inner.js @@ -0,0 +1,5 @@ +define([ + 'jquery', +], function ($) { + console.log('inner loaded'); +}); diff --git a/www/checkup/main.js b/www/checkup/main.js index 171699a22..3caed1a84 100644 --- a/www/checkup/main.js +++ b/www/checkup/main.js @@ -4,12 +4,19 @@ define([ '/assert/assertions.js', '/common/hyperscript.js', '/customize/messages.js', + '/common/dom-ready.js', + '/bower_components/nthen/index.js', '/common/sframe-common-outer.js', + '/customize/login.js', + '/common/common-hash.js', + '/common/common-util.js', + '/common/pinpad.js', '/bower_components/tweetnacl/nacl-fast.min.js', 'less!/customize/src/less2/pages/page-checkup.less', -], function ($, ApiConfig, Assertions, h, Messages /*, SFCommonO*/) { +], function ($, ApiConfig, Assertions, h, Messages, DomReady, + nThen, SFCommonO, Login, Hash, Util, Pinpad) { var assert = Assertions(); var trimSlashes = function (s) { @@ -41,7 +48,7 @@ define([ var checkAvailability = function (url, cb) { $.ajax({ url: url, - date: {}, + data: {}, complete: function (xhr) { cb(xhr.status === 200); }, @@ -52,10 +59,115 @@ define([ checkAvailability(trimmedUnsafe, cb); }, _alert("Main domain is not available")); + // Try loading an iframe on the safe domain assert(function (cb) { - console.log(trimmedSafe); - checkAvailability(trimmedSafe, cb); - }, _alert("Sandbox domain is not available")); // FIXME Blocked by CSP. try loading it via sframe ? + var to; + nThen(function (waitFor) { + DomReady.onReady(waitFor()); + }).nThen(function (waitFor) { + to = setTimeout(function () { + console.error('TIMEOUT loading iframe on the safe domain') + cb(false); + }, 5000); + SFCommonO.initIframe(waitFor); + }).nThen(function () { + // Iframe is loaded + clearTimeout(to); + cb(true); + }); + }, _alert("Sandbox domain is not available")); + + // Write/ready access to /block/ + assert(function (cb) { + var bytes = new Uint8Array(Login.requiredBytes); + + var opt = Login.allocateBytes(bytes); + + var blockUrl = Login.Block.getBlockUrl(opt.blockKeys); + var blockRequest = Login.Block.serialize("{}", opt.blockKeys); + var removeRequest = Login.Block.remove(opt.blockKeys); + console.log('Test block URL:', blockUrl); + + var userHash = '/2/drive/edit/000000000000000000000000'; + var secret = Hash.getSecrets('drive', userHash); + opt.keys = secret.keys; + opt.channelHex = secret.channel; + + var RT, rpc, exists; + + nThen(function (waitFor) { + Util.fetch(blockUrl, waitFor(function (err, block) { + if (err) { return; } // No block found + exists = true; + })); + }).nThen(function (waitFor) { + // Create proxy + Login.loadUserObject(opt, waitFor(function (err, rt) { + if (err) { + waitFor.abort(); + console.error("Can't create new channel. This may also be a websocket issue."); + return void cb(false); + } + RT = rt; + var proxy = rt.proxy; + proxy.edPublic = opt.edPublic; + proxy.edPrivate = opt.edPrivate; + proxy.curvePublic = opt.curvePublic; + proxy.curvePrivate = opt.curvePrivate; + rt.realtime.onSettle(waitFor()); + })); + }).nThen(function (waitFor) { + // Init RPC + Pinpad.create(RT.network, RT.proxy, waitFor(function (e, _rpc) { + if (e) { + waitFor.abort(); + console.error("Can't initialize RPC", e); // INVALID_KEYS + return void cb(false); + } + rpc = _rpc; + })); + }).nThen(function (waitFor) { + // Write block + if (exists) { return; } + rpc.writeLoginBlock(blockRequest, waitFor(function (e) { + if (e) { + waitFor.abort(); + console.error("Can't write login block", e); + return void cb(false); + } + })); + }).nThen(function (waitFor) { + // Read block + Util.fetch(blockUrl, waitFor(function (e, block) { + if (e) { + waitFor.abort(); + console.error("Can't read login block", e); + return void cb(false); + } + })); + }).nThen(function (waitFor) { + // Remove block + rpc.removeLoginBlock(removeRequest, waitFor(function (e) { + if (e) { + waitFor.abort(); + console.error("Can't remove login block", e); + console.error(blockRequest); + return void cb(false); + } + })); + }).nThen(function (waitFor) { + rpc.removeOwnedChannel(secret.channel, waitFor(function (e) { + if (e) { + waitFor.abort(); + console.error("Can't remove channel", e); + return void cb(false); + } + })); + }).nThen(function () { + cb(true); + }); + + }, _alert("Login Block is not working (write/read/remove)")); var row = function (cells) { return h('tr', cells.map(function (cell) {