UNPKG

@planq-network/encrypted-backup

Version:

Libraries for implemented password encrypted account backups

171 lines 7.02 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.MockOdis = exports.MOCK_ODIS_ENVIRONMENT = void 0; var phone_number_privacy_common_1 = require("@planq-network/phone-number-privacy-common"); var poprf = __importStar(require("@celo/poprf")); var debug_1 = __importDefault(require("debug")); var debug = (0, debug_1.default)('kit:encrypted-backup:odis:mock'); var MOCK_ODIS_KEYPAIR = poprf.keygen(Buffer.from('MOCK ODIS KEYPAIR SEED')); exports.MOCK_ODIS_ENVIRONMENT = { odisUrl: 'https://mockodis.com', odisPubKey: Buffer.from(MOCK_ODIS_KEYPAIR.publicKey).toString('base64'), }; var MockOdis = /** @class */ (function () { function MockOdis() { this.state = {}; this.poprf = new phone_number_privacy_common_1.PoprfServer(MOCK_ODIS_KEYPAIR.privateKey); this.now = function () { return Math.floor(Date.now() / 1000); }; } MockOdis.prototype.domainState = function (hash) { var _a; return ((_a = this.state[hash.toString('hex')]) !== null && _a !== void 0 ? _a : { timer: 0, counter: 0, disabled: false, now: this.now() }); }; MockOdis.prototype.quota = function (req) { var authorized = (0, phone_number_privacy_common_1.verifyDomainQuotaStatusRequestAuthenticity)(req); if (!authorized) { return { status: 401, body: { success: false, version: 'mock', error: 'unauthorized', }, }; } return { status: 200, body: { success: true, version: 'mock', status: this.domainState((0, phone_number_privacy_common_1.domainHash)(req.domain)), }, }; }; MockOdis.prototype.sign = function (req) { var authorized = (0, phone_number_privacy_common_1.verifyDomainRestrictedSignatureRequestAuthenticity)(req); if (!authorized) { return { status: 401, body: { success: false, version: 'mock', error: 'unauthorized', status: undefined, }, }; } var hash = (0, phone_number_privacy_common_1.domainHash)(req.domain); var domainState = this.domainState(hash); var nonce = req.options.nonce.defined ? req.options.nonce.value : undefined; if (nonce !== domainState.counter) { return { status: 403, body: { success: false, version: 'mock', error: 'incorrect nonce', status: domainState, }, }; } var limitCheck = (0, phone_number_privacy_common_1.checkSequentialDelayRateLimit)(req.domain, this.now(), domainState); if (!limitCheck.accepted || limitCheck.state === undefined) { return { status: 429, body: { success: false, version: 'mock', error: 'request limit exceeded', status: domainState, }, }; } this.state[hash.toString('hex')] = limitCheck.state; var signature; try { signature = this.poprf .blindEval(hash, Buffer.from(req.blindedMessage, 'base64')) .toString('base64'); } catch (error) { return { // TODO(victor) Note that although this is a returned as a 500, the fault my actually be the // users because the blinded message is not validated in JS before attempting the evaluation. // This logic is the same in the real service. When validation functions are added to the // WASM interface for the POPRF, this can be improved. status: 500, body: { success: false, version: 'mock', status: undefined, error: error.toString(), }, }; } return { status: 200, body: { success: true, version: 'mock', status: limitCheck.state, signature: signature, }, }; }; MockOdis.prototype.installQuotaEndpoint = function (mock, override) { var _this = this; mock.mock({ url: new URL(phone_number_privacy_common_1.DomainEndpoint.DOMAIN_QUOTA_STATUS, MockOdis.environment.odisUrl).href, method: 'POST', }, override !== null && override !== void 0 ? override : (function (url, req) { var res = _this.quota(JSON.parse(req.body)); debug('Mocking request', JSON.stringify({ url: url, req: req, res: res })); return res; })); }; MockOdis.prototype.installSignEndpoint = function (mock, override) { var _this = this; mock.mock({ url: new URL(phone_number_privacy_common_1.DomainEndpoint.DOMAIN_SIGN, MockOdis.environment.odisUrl).href, method: 'POST', }, override !== null && override !== void 0 ? override : (function (url, req) { var res = _this.sign(JSON.parse(req.body)); debug('Mocking request', JSON.stringify({ url: url, req: req, res: res })); return res; })); }; MockOdis.prototype.install = function (mock) { this.installQuotaEndpoint(mock); this.installSignEndpoint(mock); }; MockOdis.environment = exports.MOCK_ODIS_ENVIRONMENT; return MockOdis; }()); exports.MockOdis = MockOdis; //# sourceMappingURL=odis.mock.js.map