UNPKG

@m-ld/gateway

Version:

m-ld gateway for services

89 lines 7.95 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; import { EndPoint, patch, post, use } from './EndPoint.js'; import { ForbiddenError, NotFoundError, UnauthorizedError } from './errors.js'; import { Authorization } from '../server/index.js'; import { AccountOwnedId, as, validate } from '../lib/index.js'; export class UserEndPoint extends EndPoint { constructor(outer, notifier) { super(outer, '/user/:user'); this.notifier = notifier; } get gateway() { return this.outer.gateway; } bindUser(req) { const { user } = req.params; if (!AccountOwnedId.isComponentId(user)) throw new NotFoundError; req.set('user', user); } /** * Root can create an account with a key. * User can get a new key for themselves. */ async getKey(req, res) { const { type } = req.params; validate(type, as.equal('rsa').optional()); // A key request could be using an activation code const code = req.header('x-activation-code'); if (code) { if (req.authorization) { const jwe = req.authorization.credentials; const { user, email } = this.gateway.verifyActivation(code, jwe); if (user !== req.get('user')) throw new UnauthorizedError('User does not match activation'); const acc = await this.gateway.account(user, true); const config = await acc.generateKey({ email, type }); res.json(200, config); } else { throw new UnauthorizedError('Missing bearer token'); } } else { const acc = await this.getAuthorisedAccount(req, true); res.json(200, await acc.generateKey({ type })); } } // TODO: This needs to be secured against denial-of-service async getActivation(req, res) { const { email } = req.body; validate(email, as.string().email().required()); const { jwe, code } = await this.gateway.activation(req.get('user'), email); await this.notifier.sendActivationCode(email, code); res.json(200, { jwe }); } async updateDetails(req, res) { const acc = await this.getAuthorisedAccount(req, false); await acc.update(req.body); res.send(204); } async getAuthorisedAccount(req, orCreate) { const who = await Authorization.fromRequest(req).verifyUser(this.gateway); const acc = who.acc.name === req.get('user') ? who.acc : // The root account is allowed to access user accounts who.acc.name === this.gateway.rootAccountName ? await this.gateway.account(req.get('user'), orCreate) : null; if (acc == null) throw new ForbiddenError; return acc; } } __decorate([ use ], UserEndPoint.prototype, "bindUser", null); __decorate([ post('/key') ], UserEndPoint.prototype, "getKey", null); __decorate([ post('/activation') ], UserEndPoint.prototype, "getActivation", null); __decorate([ patch ], UserEndPoint.prototype, "updateDetails", null); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXNlckVuZFBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2h0dHAvVXNlckVuZFBvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQWMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDL0UsT0FBTyxFQUFFLGFBQWEsRUFBWSxNQUFNLG9CQUFvQixDQUFDO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSy9ELE1BQU0sT0FBTyxZQUFhLFNBQVEsUUFBcUI7SUFDckQsWUFBWSxLQUFrQixFQUFVLFFBQWtCO1FBQ3hELEtBQUssQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFEVSxhQUFRLEdBQVIsUUFBUSxDQUFVO0lBRTFELENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0lBQzVCLENBQUM7SUFHRCxRQUFRLENBQUMsR0FBZ0I7UUFDdkIsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxhQUFhLENBQUM7UUFDMUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7T0FHRztJQUVHLEFBQU4sS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFnQixFQUFFLEdBQWE7UUFDMUMsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDNUIsUUFBUSxDQUFD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