middleware-express
Version:
middleware-express
412 lines (411 loc) • 14.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Handler = (function () {
function Handler(secret, verify, buildErr, prefix, token) {
this.secret = secret;
this.verify = verify;
this.buildError = (buildErr ? buildErr : buildError);
this.prefix = (prefix ? prefix : 'Bearer ');
this.token = (token ? token : 'token');
this.check = this.check.bind(this);
this.require = this.require.bind(this);
}
Handler.prototype.check = function () {
var _this = this;
return function (req, res, next) {
var data = req.headers['authorization'];
if (data) {
if (!data.startsWith(_this.prefix)) {
res.status(401).end("Authorization must start with '" + _this.prefix.trim() + "'");
}
else {
var token = data.substr(_this.prefix.length);
_this.verify(token, _this.secret).then(function (payload) {
res.locals[_this.token] = payload;
next();
}).catch(function (err) {
var _a = _this.buildError(err), status = _a.status, body = _a.body;
res.status(status).end(body);
});
}
}
else {
next();
}
};
};
Handler.prototype.require = function () {
return this.check();
};
return Handler;
}());
exports.Handler = Handler;
exports.AuthorizationHandler = Handler;
var AuthorizationChecker = (function () {
function AuthorizationChecker(secret, verify, buildErr, prefix, token) {
this.secret = secret;
this.verify = verify;
this.buildError = (buildErr ? buildErr : buildError);
this.prefix = (prefix ? prefix : 'Bearer ');
this.token = (token ? token : 'token');
this.check = this.check.bind(this);
this.require = this.require.bind(this);
}
AuthorizationChecker.prototype.check = function () {
var _this = this;
return function (req, res, next) {
var data = req.headers['authorization'];
if (data) {
if (!data.startsWith(_this.prefix)) {
res.status(401).end("Authorization must start with '" + _this.prefix.trim() + "'");
}
else {
var token = data.substr(_this.prefix.length);
_this.verify(token, _this.secret).then(function (payload) {
res.locals[_this.token] = payload;
next();
}).catch(function (err) {
var _a = _this.buildError(err), status = _a.status, body = _a.body;
res.status(status).end(body);
});
}
}
else {
res.status(401).end("Require 'Authorization' in header");
}
};
};
AuthorizationChecker.prototype.require = function () {
return this.check();
};
return AuthorizationChecker;
}());
exports.AuthorizationChecker = AuthorizationChecker;
function exist(obj, arr) {
if (Array.isArray(obj)) {
for (var _i = 0, obj_1 = obj; _i < obj_1.length; _i++) {
var o = obj_1[_i];
for (var _a = 0, arr_1 = arr; _a < arr_1.length; _a++) {
var v = arr_1[_a];
if (o == v) {
return true;
}
}
}
}
else {
for (var _b = 0, arr_2 = arr; _b < arr_2.length; _b++) {
var v = arr_2[_b];
if (obj == v) {
return true;
}
}
}
return false;
}
exports.exist = exist;
var QuickChecker = (function () {
function QuickChecker(key, buildErr, token) {
this.buildError = (buildErr ? buildErr : buildError);
this.key = (key ? key : 'userId');
this.token = (token ? token : 'token');
this.check = this.check.bind(this);
}
QuickChecker.prototype.check = function (v) {
var _this = this;
return function (req, res, next) {
var payload = res.locals[_this.token];
if (!payload) {
res.status(401).end('Payload cannot be undefined');
}
else {
var obj = payload[_this.key];
if (!obj) {
res.status(403).end('Payload must contain ' + _this.key);
}
else {
if (exist(obj, v)) {
next();
}
else {
res.status(403).end('invalid ' + _this.key);
}
}
}
};
};
return QuickChecker;
}());
exports.QuickChecker = QuickChecker;
var Checker = (function () {
function Checker(secret, verify, key, buildErr, prefix, token) {
this.secret = secret;
this.verify = verify;
this.buildError = (buildErr ? buildErr : buildError);
this.prefix = (prefix ? prefix : 'Bearer ');
this.key = (key ? key : 'userId');
this.token = (token ? token : 'token');
this.check = this.check.bind(this);
}
Checker.prototype.check = function (v) {
var _this = this;
return function (req, res, next) {
var data = req.headers['authorization'];
if (data) {
if (!data.startsWith(_this.prefix)) {
res.status(401).end("Authorization must start with '" + _this.prefix.trim() + "'");
}
else {
var token = data.substr(_this.prefix.length);
_this.verify(token, _this.secret).then(function (payload) {
if (payload === undefined) {
res.status(401).end('Payload cannot be undefined');
}
else {
res.locals[_this.token] = payload;
var obj = payload[_this.key];
if (!obj) {
res.status(403).end('Payload must contain ' + _this.key);
}
else {
if (exist(obj, v)) {
next();
}
else {
res.status(403).end('invalid ' + _this.key);
}
}
}
}).catch(function (err) {
var _a = _this.buildError(err), status = _a.status, body = _a.body;
res.status(status).end(body);
});
}
}
else {
res.status(401).end("Require 'Authorization' in header");
}
};
};
return Checker;
}());
exports.Checker = Checker;
var MultiAuthorizer = (function () {
function MultiAuthorizer(secret, verify, privilege, key, buildErr, exact, user, prefix, token) {
this.secret = secret;
this.verify = verify;
this.privilege = privilege;
this.buildError = (buildErr ? buildErr : buildError);
this.prefix = (prefix ? prefix : 'Bearer ');
this.user = (user ? user : 'userId');
this.key = (key ? key : 'userType');
this.token = (token ? token : 'token');
this.exact = (exact !== undefined ? exact : true);
this.authorize = this.authorize.bind(this);
}
MultiAuthorizer.prototype.authorize = function (v, privilege, action) {
var _this = this;
return function (req, res, next) {
var data = req.headers['authorization'];
if (data) {
if (!data.startsWith(_this.prefix)) {
res.status(401).end("Authorization must start with '" + _this.prefix.trim() + "'");
}
else {
var token = data.substr(_this.prefix.length);
_this.verify(token, _this.secret).then(function (payload) {
if (payload === undefined) {
res.status(401).end('Payload cannot be undefined');
}
else {
res.locals[_this.token] = payload;
var obj = payload[_this.key];
if (!obj) {
res.status(403).end('Payload must contain ' + _this.key);
}
else {
if (!exist(obj, v)) {
res.status(403).end('invalid ' + _this.key);
}
else {
var userId_1 = payload[_this.user];
if (!userId_1) {
res.status(403).end('Payload must contain ' + _this.user);
}
else {
_this.privilege(userId_1, privilege).then(function (p) {
if (p === exports.none) {
res.status(403).end('no permission for ' + userId_1);
}
else {
if (!action) {
next();
}
else {
if (_this.exact) {
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) {
var _a = _this.buildError(err), status = _a.status, body = _a.body;
res.status(status).end(body);
});
}
}
}
}
}).catch(function (err) {
var _a = _this.buildError(err), status = _a.status, body = _a.body;
res.status(status).end(body);
});
}
}
else {
res.status(401).end("Require 'Authorization' in header");
}
};
};
return MultiAuthorizer;
}());
exports.MultiAuthorizer = MultiAuthorizer;
var Authorizer = (function () {
function Authorizer(secret, verify, privilege, buildErr, exact, key, prefix, token) {
this.secret = secret;
this.verify = verify;
this.privilege = privilege;
this.buildError = (buildErr ? buildErr : buildError);
this.prefix = (prefix ? prefix : 'Bearer ');
this.key = (key ? key : 'userId');
this.token = (token ? token : 'token');
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 data = req.headers['authorization'];
if (data) {
if (!data.startsWith(_this.prefix)) {
res.status(401).end("Authorization must start with '" + _this.prefix.trim() + "'");
}
else {
var token = data.substr(_this.prefix.length);
_this.verify(token, _this.secret).then(function (payload) {
if (payload === undefined) {
res.status(401).end('Payload cannot be undefined');
}
else {
res.locals[_this.token] = payload;
var userId_2 = payload[_this.key];
if (!userId_2) {
res.status(403).end('Payload must contain ' + _this.key);
}
else {
_this.privilege(userId_2, privilege).then(function (p) {
if (p === exports.none) {
res.status(403).end('no permission for ' + userId_2);
}
else {
if (!action) {
next();
}
else {
if (_this.exact) {
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) {
var _a = _this.buildError(err), status = _a.status, body = _a.body;
res.status(status).end(body);
});
}
}
}).catch(function (err) {
var _a = _this.buildError(err), status = _a.status, body = _a.body;
res.status(status).end(body);
});
}
}
else {
res.status(401).end("Require 'Authorization' in header");
}
};
};
return Authorizer;
}());
exports.Authorizer = Authorizer;
exports.none = 0;
exports.read = 1;
exports.write = 2;
exports.approve = 4;
exports.all = 2147483647;
var PrivilegeLoader = (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') {
permissions = permissions | x;
ok = true;
}
}
return (ok ? permissions : exports.all);
});
};
return PrivilegeLoader;
}());
exports.PrivilegeLoader = PrivilegeLoader;
function buildError(err) {
return { status: 401, body: 'Invalid token: ' + toString(err) };
}
exports.buildError = buildError;
function toString(err) {
return (typeof err === 'string' ? err : JSON.stringify(err));
}
exports.toString = toString;