cryptpad/lib/sso-utils.js
2023-06-23 19:06:29 +02:00

72 lines
2.0 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const SSO = require("./storage/sso");
const Nacl = require("tweetnacl/nacl-fast");
const SSOUtils = module.exports;
// XXX const SAML = require('node-saml'); // https://www.npmjs.com/package/node-saml
SSOUtils.TYPES = {
oidc: require('./plugins/sso/oidc')
};
SSOUtils.deleteRequest = (Env, id) => {
SSO.request.delete(Env, id, (err) => {
if (!err) { return; }
console.log(`Failed to delete SSO request ${id}`);
// XXX log?
});
};
SSOUtils.readRequest = (Env, id, cb) => {
SSO.request.read(Env, id, cb);
};
SSOUtils.writeRequest = (Env, data, cb) => {
if (!data || !data.id || !data.type) { return void cb ('INVALID_REQUEST'); }
const id = data.id;
const value = {
type: data.type,
register: data.register,
provider: data.provider,
publicKey: data.publicKey,
time: +new Date()
};
SSO.request.write(Env, id, JSON.stringify(value), cb);
};
SSOUtils.makeUser = (Env, id, cb) => {
const seed = Nacl.util.encodeBase64(Nacl.util.randomBytes(24));
SSO.User.write(Env, id, JSON.stringify({
seed: seed,
password: false // XXX maybe we don't need that flag, we can check if the block exists later
}), (err) => {
if (err) { return void cb(err); }
cb(void 0, { seed });
});
};
SSOUtils.makeSession = (Env, publicKey, provider, ssoData, cb) => {
const sessionId = Sessions.randomId();
// XXX If we already have an OTP session, recover it
Sessions.write(Env, publicKey, sessionId, JSON.stringify({
sso: {
provider: provider,
data: ssoData
}
}), function (err) {
if (err) {
Env.Log.error("SSO_SESSION_WRITE", {
error: Util.serializeError(err),
publicKey: publicKey,
sessionId: sessionId,
});
return void cb("SESSION_WRITE_ERROR");
}
cb(void 0, {
bearer: sessionId,
});
});
};