security-express
Version:
security-express
102 lines (101 loc) • 3.37 kB
JavaScript
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