All files SimplePolicyEngine.js

100% Statements 20/20
100% Branches 12/12
100% Functions 9/9
100% Lines 19/19
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54  1x 1x       9x 45x         9x   9x 1x   8x           45x 44x 52x 52x 44x   45x   45x       27x                     27x 39x     1x      
 
const _ = require("lodash");
const {combineDecisionsDenyOverrides} = require("./SimplePolicyDecisionCombinerEngine");
 
 
function evaluate(claims, policy) {
    const policyDecisions = Object.keys(policy.content.rules).map((ruleId) => (
        matchesRule(claims, policy.content.rules[ruleId])
        ? policy.content.rules[ruleId].decision
        : {authorization: "NotApplicable", obligations: []}
    ));
 
    const finalDecision = combineDecisionsDenyOverrides(policyDecisions);
 
    if (finalDecision.authorization === "NotApplicable") {
        return policy.content.default;
    } else {
        return finalDecision;
    }
}
 
function matchesRule(claims, rule) {
    const matchesRuleSignature =
        (rule.matchAnyOf.map((rule) => (
                Object.keys(rule)
                    .map((key) => (_.isEqual(claims[key], rule[key])))
                    .reduce((acc, current) => (acc && current), true))
        ).reduce((acc, current) => (acc || current), false));
 
    const matchesCondition = (!rule.condition) || evaluateCondition(claims, rule.condition);
 
    return matchesRuleSignature && matchesCondition;
}
 
function evaluateCondition(claims, condition) {
    const functionText = `
        'use strict';
            try {
            if (${condition})
                return true;
            else
                return false;
            } catch (e) {
                return false;
            }
        `;
    const func = new Function(Object.keys(claims).join(","), functionText);
    return func.apply(null, Object.keys(claims).map((key) => (claims[key])));
}
 
module.exports = {
    evaluate
}