UNPKG

security-express

Version:
102 lines (101 loc) 3.37 kB
"use strict" Object.defineProperty(exports, "__esModule", { value: true }) // tslint:disable-next-line:max-classes-per-file var Authorizer = /** @class */ (function () { function Authorizer(privilege, logError, exact, userId, permissions) { this.privilege = privilege this.logError = logError this.exact = exact this.userId = userId ? userId : "userId" this.permissions = permissions ? permissions : "permissions" this.exact = exact !== undefined ? exact : true this.authorize = this.authorize.bind(this) } Authorizer.prototype.authorize = function (privilege, action) { var _this = this return function (req, res, next) { var userId = res.locals[_this.userId] if (!userId) { res.status(401).end("Authentication is required or session has expired.") } else { _this .privilege(userId, privilege) .then(function (p) { if (p === exports.none) { res.status(403).end("no permission for " + userId) } else { res.locals[_this.permissions] = p if (!action) { next() } else { if (_this.exact) { // tslint:disable-next-line:no-bitwise var sum = action & p if (sum === action) { return next() } else { res.status(403).end("no permission") } } else { if (p >= action) { return next() } else { res.status(403).end("no permission") } } } } }) .catch(function (err) { _this.logError("Error in privilege check for user " + userId + " with privilege " + privilege + ". Details: " + toString(err)) res.status(403).end("no permission") }) } } } return Authorizer })() exports.Authorizer = Authorizer exports.none = 0 exports.read = 1 exports.write = 2 exports.approve = 4 exports.all = 2147483647 // tslint:disable-next-line:max-classes-per-file var PrivilegeLoader = /** @class */ (function () { function PrivilegeLoader(sql, query) { this.sql = sql this.query = query this.privilege = this.privilege.bind(this) } PrivilegeLoader.prototype.privilege = function (userId, privilegeId) { return this.query(this.sql, [userId, privilegeId]).then(function (v) { if (!v || v.length === 0) { return exports.none } var keys = Object.keys(v[0]) if (keys.length === 0) { return exports.all } var k = keys[0] var permissions = 0 var ok = false for (var _i = 0, v_1 = v; _i < v_1.length; _i++) { var p = v_1[_i] var x = p[k] if (typeof x === "number") { // tslint:disable-next-line:no-bitwise permissions = permissions | x ok = true } } return ok ? permissions : exports.all }) } return PrivilegeLoader })() exports.PrivilegeLoader = PrivilegeLoader function toString(err) { return typeof err === "string" ? err : JSON.stringify(err) } exports.toString = toString