@m-ld/gateway
Version:
m-ld gateway for services
89 lines • 7.95 kB
JavaScript
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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