role-acl
Version:
Role, Attribute and Condition based Access Control for Node.js
123 lines (122 loc) • 5.47 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var jsonpath_plus_1 = require("jsonpath-plus");
var lodash_flattendeep_1 = __importDefault(require("lodash.flattendeep"));
var TrueCondition_1 = require("./TrueCondition");
var EqualsCondition_1 = require("./EqualsCondition");
var NotEqualsCondition_1 = require("./NotEqualsCondition");
var NotCondition_1 = require("./NotCondition");
var ListContainsCondition_1 = require("./ListContainsCondition");
var OrCondition_1 = require("./OrCondition");
var AndCondition_1 = require("./AndCondition");
var StartsWithCondition_1 = require("./StartsWithCondition");
var core_1 = require("../core");
var ConditionUtil = /** @class */ (function () {
function ConditionUtil() {
}
ConditionUtil.registerCustomConditionFunction = function (functionName, fn) {
if (!functionName) {
throw new core_1.AccessControlError("Condition function name:" + functionName + " is not valid");
}
if (!functionName.startsWith("custom:")) {
functionName = "custom:" + functionName;
}
if (ConditionUtil._customConditionFunctions[functionName]) {
console.warn("Replacing existing function: ", functionName, "with:", fn);
}
ConditionUtil._customConditionFunctions[functionName] = fn;
};
ConditionUtil.resetCustomConditionFunctions = function () {
ConditionUtil._customConditionFunctions = {};
};
ConditionUtil.getCustomConditionFunctions = function () {
return ConditionUtil._customConditionFunctions;
};
ConditionUtil.setCustomConditionFunctions = function (customConditionFunctions) {
if (customConditionFunctions === void 0) { customConditionFunctions = {}; }
for (var conditionFnName in customConditionFunctions) {
ConditionUtil.registerCustomConditionFunction(conditionFnName, customConditionFunctions[conditionFnName]);
}
};
ConditionUtil.validateCondition = function (condition) {
if (!condition) {
return;
}
if (typeof condition === "function") {
return;
}
if (typeof condition === "string") {
if (!ConditionUtil._customConditionFunctions[condition]) {
throw new core_1.AccessControlError("Condition function: " + condition + " not found");
}
return;
}
if (typeof condition === "object") {
if (!condition.Fn || !(ConditionUtil[condition.Fn] ||
ConditionUtil._customConditionFunctions[condition.Fn])) {
throw new core_1.AccessControlError("Condition function:" + condition.Fn + " is not valid");
}
return;
}
};
ConditionUtil.evaluate = function (condition, context) {
if (!condition) {
return true;
}
if (typeof condition === "function") {
return condition(context);
}
if (typeof condition === "string") {
if (!ConditionUtil._customConditionFunctions[condition]) {
throw new core_1.AccessControlError("Condition function: " + condition + " not found");
}
return ConditionUtil._customConditionFunctions[condition](context);
}
if (typeof condition === "object") {
if (!condition.Fn) {
throw new core_1.AccessControlError("Condition function:" + condition.Fn + " is not valid");
}
if (ConditionUtil[condition.Fn]) {
return ConditionUtil[condition.Fn].evaluate(condition.args, context);
}
else if (ConditionUtil._customConditionFunctions[condition.Fn]) {
return ConditionUtil._customConditionFunctions[condition.Fn](context, condition.args);
}
else {
throw new core_1.AccessControlError("Condition function:" + condition.Fn + " is not found");
}
}
return false;
};
ConditionUtil.getValueByPath = function (context, valuePathOrValue) {
// Check if the value is JSONPath
if (valuePathOrValue &&
typeof valuePathOrValue === "string" &&
valuePathOrValue.startsWith("$.")) {
var jsonPathVal = jsonpath_plus_1.JSONPath({
path: valuePathOrValue,
json: context,
wrap: false,
});
if (Array.isArray(jsonPathVal)) {
jsonPathVal = lodash_flattendeep_1.default(jsonPathVal);
}
return jsonPathVal;
}
return valuePathOrValue;
};
ConditionUtil.AND = new AndCondition_1.AndCondition();
ConditionUtil.TRUE = new TrueCondition_1.TrueCondition();
ConditionUtil.EQUALS = new EqualsCondition_1.EqualsCondition();
ConditionUtil.LIST_CONTAINS = new ListContainsCondition_1.ListContainsCondition();
ConditionUtil.NOT_EQUALS = new NotEqualsCondition_1.NotEqualsCondition();
ConditionUtil.NOT = new NotCondition_1.NotCondition();
ConditionUtil.OR = new OrCondition_1.OrCondition();
ConditionUtil.STARTS_WITH = new StartsWithCondition_1.StartsWithCondition();
ConditionUtil._customConditionFunctions = {};
return ConditionUtil;
}());
exports.ConditionUtil = ConditionUtil;