cryptpad/www/auth/main.js

155 lines
5.4 KiB
JavaScript
Raw Normal View History

define([
'jquery',
2019-11-27 16:26:21 +00:00
'/common/cryptget.js',
'/common/pinpad.js',
2017-11-23 11:28:49 +00:00
'/common/common-constants.js',
'/common/outer/local-store.js',
2019-11-27 16:26:21 +00:00
'/common/outer/login-block.js',
'/common/outer/network-config.js',
2019-12-03 09:37:47 +00:00
'/customize/login.js',
2017-05-31 17:40:17 +00:00
'/common/test.js',
2017-11-30 09:33:09 +00:00
'/bower_components/nthen/index.js',
2019-11-27 16:26:21 +00:00
'/bower_components/netflux-websocket/netflux-client.js',
'/bower_components/tweetnacl/nacl-fast.min.js'
2019-12-03 09:37:47 +00:00
], function ($, Crypt, Pinpad, Constants, LocalStore, Block, NetConfig, Login, Test, nThen, Netflux) {
var Nacl = window.nacl;
var signMsg = function (msg, privKey) {
var signKey = Nacl.util.decodeBase64(privKey);
var buffer = Nacl.util.decodeUTF8(msg);
return Nacl.util.encodeBase64(Nacl.sign(buffer, signKey));
};
// TODO: Allow authing for any domain as long as the user clicks an "accept" button
// inside of the iframe.
var AUTHORIZED_DOMAINS = [
/\.cryptpad\.fr$/,
/^http(s)?:\/\/localhost\:/
];
// Safari is weird about localStorage in iframes but seems to let sessionStorage slide.
2017-11-23 11:28:49 +00:00
localStorage[Constants.userHashKey] = localStorage[Constants.userHashKey] ||
sessionStorage[Constants.userHashKey];
2017-11-30 09:33:09 +00:00
var proxy;
2019-11-27 16:26:21 +00:00
var rpc;
var network;
var rpcError;
var loadProxy = function (hash) {
nThen(function (waitFor) {
var wsUrl = NetConfig.getWebsocketURL();
var w = waitFor();
Netflux.connect(wsUrl).then(function (_network) {
network = _network;
w();
}, function (err) {
rpcError = err;
console.error(err);
});
}).nThen(function (waitFor) {
2019-11-27 16:26:21 +00:00
Crypt.get(hash, waitFor(function (err, val) {
if (err) {
waitFor.abort();
console.error(err);
2019-11-29 09:46:34 +00:00
return;
2019-11-27 16:26:21 +00:00
}
try {
var parsed = JSON.parse(val);
proxy = parsed;
} catch (e) {
console.log("Can't parse user drive", e);
}
}), {
network: network
2019-11-27 16:26:21 +00:00
});
}).nThen(function (waitFor) {
if (!network) { return void waitFor.abort(); }
2019-11-27 16:26:21 +00:00
Pinpad.create(network, proxy, waitFor(function (e, call) {
if (e) {
rpcError = e;
return void waitFor.abort();
}
rpc = call;
}));
}).nThen(function () {
Test(function () {
// This is only here to maybe trigger an error.
window.drive = proxy['drive'];
Test.passed();
});
});
};
var whenReady = function (cb) {
2019-11-27 16:26:21 +00:00
if (proxy && (rpc || rpcError)) { return void cb(); }
console.log('CryptPad not ready...');
setTimeout(function () {
whenReady(cb);
}, 100);
};
$(window).on("message", function (jqe) {
var evt = jqe.originalEvent;
var data = JSON.parse(evt.data);
var domain = evt.origin;
var srcWindow = evt.source;
var ret = { txid: data.txid };
console.log('CP receiving', data);
if (data.cmd === 'PING') {
ret.res = 'PONG';
2019-11-29 09:46:34 +00:00
} else if (data.cmd === 'LOGIN') {
Login.loginOrRegister(data.data.name, data.data.password, false, false, function (err) {
2019-12-03 09:37:47 +00:00
if (err) {
ret.error = 'LOGIN_ERROR';
2019-12-03 09:37:47 +00:00
srcWindow.postMessage(JSON.stringify(ret), domain);
return;
}
loadProxy(LocalStore.getUserHash());
srcWindow.postMessage(JSON.stringify(ret), domain);
});
2019-11-29 09:46:34 +00:00
return;
} else if (data.cmd === 'SIGN') {
if (!AUTHORIZED_DOMAINS.filter(function (x) { return x.test(domain); }).length) {
ret.error = "UNAUTH_DOMAIN";
} else if (!LocalStore.isLoggedIn()) {
ret.error = "NOT_LOGGED_IN";
} else {
return void whenReady(function () {
var sig = signMsg(data.data, proxy.edPrivate);
ret.res = {
uname: proxy.login_name,
edPublic: proxy.edPublic,
sig: sig
};
srcWindow.postMessage(JSON.stringify(ret), domain);
});
}
} else if (data.cmd === 'UPDATE_LIMIT') {
return void whenReady(function () {
2019-11-27 16:26:21 +00:00
if (rpcError) {
// Tell the user on accounts that there was an issue and they need to wait maximum 24h or contact an admin
ret.warning = true;
srcWindow.postMessage(JSON.stringify(ret), domain);
return;
2019-11-27 16:26:21 +00:00
}
rpc.updatePinLimits(function (e, limit, plan, note) {
if (e) {
ret.warning = true;
2019-11-27 16:26:21 +00:00
}
ret.res = [limit, plan, note];
srcWindow.postMessage(JSON.stringify(ret), domain);
});
});
} else {
ret.error = "UNKNOWN_CMD";
}
srcWindow.postMessage(JSON.stringify(ret), domain);
});
2019-11-27 16:26:21 +00:00
var userHash = LocalStore.getUserHash();
if (userHash) {
loadProxy(userHash);
}
});