policyline
Version:
Attributes Based Access Control library for Node.JS
1 lines • 14.9 kB
JavaScript
module.exports=function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=7)}([function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.prepareCollection=t.extract=void 0;var n=function(e){return e&&e.__esModule?e:{default:e}}(r(1));function o(e,t,r){var o=t.value;return t.isDIObj&&(o=function(e,t){var r=t.split("."),n=e,o=!0,i=!1,a=void 0;try{for(var u,s=r[Symbol.iterator]();!(o=(u=s.next()).done);o=!0){var f=u.value;try{n=n[f]}catch(e){n=null;break}}}catch(e){i=!0,a=e}finally{try{!o&&s.return&&s.return()}finally{if(i)throw a}}return n}(e,o)),t.mutators.forEach(function(e){var i=void 0,a=void 0;t.isDIObj&&(r[t.value]=r[t.value]||{},i=r[t.value]),(a=n.default.list[e])&&"function"!=typeof a&&(a=a[n.default.prefix]),o=a?a(o,i):o}),o}t.extract=o,t.prepareCollection=function(e,t,r,n){var i=o(e,t.left,r),a=o(e,t.right,r);return{attribute:(null===i?t.left.value:i).replace(n,""),value:null===a?t.right.value:a,operator:t.operator,mutators:t.left.mutators}}},function(e,t,r){"use strict";function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e){return e instanceof Date?e:new Date(e)}Object.defineProperty(t,"__esModule",{value:!0});var i=Symbol(),a=Symbol(),u={radius:n({},a,function(e,t,r){return e.leftIsData?t.radius=e.leftValue:t.radius=e.rightValue,!0}),inArea:n({},a,function(e,t,r){function n(e){return e*(Math.PI/180)}var o=function(e,t,r,o){var i=n(r-e),a=n(o-t),u=Math.sin(i/2)*Math.sin(i/2)+Math.cos(n(e))*Math.cos(n(r))*Math.sin(a/2)*Math.sin(a/2);return 2*Math.atan2(Math.sqrt(u),Math.sqrt(1-u))*6371}(e.rightValue[0],e.rightValue[1],e.leftValue[0],e.leftValue[1]);return t.radius>=o}),or:n({},a,function(e,t,r){if(t.container=t.container||{},t.container[r]=e.result,e.result)for(var n in t.container)t.container[n]=!0;return t.container}),toInt:function(e){return parseInt(e,10)},toString:function(e){return e+""},trim:function(e){return e.trim()},uppercase:function(e){return e.toUpperCase()},lowercase:function(e){return e.toLowerCase()},minute:function(e){return o(e).getMinutes()},day:function(e){return o(e).getDate()},hour:function(e){return o(e).getHours()},weekday:function(e){return o(e).getDay()},month:function(e){return o(e).getMonth()},year:function(e){return o(e).getFullYear()},regExp:function(e){var t=e.lastIndexOf("/");-1===t&&(t=e.length);var r=e.substring(0,t),n=e.substring(t+1,e.length);return n&&n.length?new RegExp(r,n):new RegExp(r)}};var s={prefix:i,postfix:a,register:function(e,t,r){var o;u[e]=(n(o={},i,t),n(o,a,r),o)},unregister:function(e){delete u[e]},get list(){return u}};t.default=s},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function o(e){return e&&"object"===(void 0===e?"undefined":n(e))&&!Array.isArray(e)&&!(e instanceof RegExp)}t.mergeDeep=function e(t,r){if(o(t)&&o(r))for(var n in r)o(r[n])?(t[n]||(t[n]={}),e(t[n],r[n])):t[n]=r[n];return t||r}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=["AND","OR","(",")"],o={op:"OP",val:"VAL"};function i(e){return{val:e,type:n.includes(e)?o.op:o.val}}t.processRPN=function(e,t){for(var r=[];e.length;){var n=e.shift();if(n.type!==o.val){var i=r.pop(),a=r.pop();switch(n.val){case"OR":i&&a&&i.res&&a.res?r.push({type:o.val,res:t.or(i.res,a.res)}):(i&&i.res&&r.push(i),a&&a.res&&r.push(a));break;case"AND":i&&a&&i.res&&a.res&&r.push({type:o.val,res:t.and(i.res,a.res)})}}else r.push(n)}return r.pop()},t.createTokens=function(e){return e.split(/\s+|(?=\(|\))|\b/).map(i)},t.infixToRPN=function(e){for(var t=[],r=[],n={"(":10,AND:30,OR:20};e.length;){var i=e.shift(),a=n[i.val]||0,u=r.length?n[r[r.length-1].val]:0;if(i.type===o.op&&")"===i.val)for(var s=null;"("!==(s=r.pop()).val;)t.push(s);else if(i.type===o.val)t.push(i);else if(i.type===o.op&&(!r.length||"("===i.val||a>u))r.push(i);else{for(;a<=u;)t.push(r.pop()),u=r.length?n[r[r.length-1].val]:0;r.push(i)}}for(;r.length;)t.push(r.pop());return t},t.fillTokens=function(e,t){var r=[];return e.forEach(function(e){var n={type:e.type,res:e.res,val:e.val};e.type===o.val&&(n.res=t[e.val],n.val=[e.val]),r.push(n)}),r},t.evaluateRPN=function(e){for(var t=[],r=void 0;e.length;){var n=e.shift();if(n.type!==o.val){var i=t.pop(),a=t.pop();switch(n.val){case"AND":t.push({type:o.val,val:i.res&&a.res?a.val.concat(i.val):[],res:i.res&&a.res});break;case"OR":r=[],a.res?r=a.val:i.res&&(r=i.val),t.push({type:o.val,val:r,res:i.res||a.res})}}else t.push(n)}return t.pop()},t.wrapToToken=i,t.TYPE=o},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};var o={MongoJSONb:{and:function(e,t){return Object.assign(e,t)},or:function(e,t){return{$or:[e,t]}},optimize:function e(t){var r=void 0;do{r=!1,Object.keys(t).forEach(function(o){if("$or"===o)for(var i=t[o].length-1;i>=0;i--){var a=t[o][i];if(a.$or){for(var u=a.$or.length-1;u>=0;u--)t[o].push(a.$or[u]);t[o].splice(i,1),r=!0}}else"object"===n(t[o])&&(t[o]=e(t[o]))})}while(r);return t},proceed:function(e){var t={"=":"$eq","==":"$eq","!=":"$ne",">=":"$gte",">":"$gt","<=":"$lte","<":"$lt","~=":"$in","^=":"$nin"},r={or:function(e,t,r){t[e.attribute]=t[e.attribute]||{$or:[]},t[e.attribute].$or.push(e.value)},radius:function(e,t,r){r.radius=e.value},inArea:function(e,t,r){t[e.attribute]={$near:{$geometry:{type:"Point",coordinates:e.value},$maxDistance:1e3*r.radius}}}},n={},o={},i=void 0;return e.forEach(function(e){i=e.attribute,e.mutators.length?e.mutators.forEach(function(t){r[t]&&(o[e.attribute]=o[e.attribute]||{},r[t](e,n,o[e.attribute]))}):n[i]?n[i][t[e.operator]]=e.value:"="===e.operator?n[i]=e.value:n[i]=function(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}({},t[e.operator],e.value)}),n}}};t.default=o},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n={"==":{"*":function(e,t){return e===t}},"!=":{"*":function(e,t){return e!==t}},">=":{"*":function(e,t){return e>=t},reverse:"<="},"<=":{"*":function(e,t){return e<=t},reverse:">="},"~=":{"*":function(e,t){return!!Array.isArray(t)&&t.includes(e)},reverse:"~!"},"~!":{"*":function(e,t){return!!Array.isArray(e)&&e.includes(t)},reverse:"~="},"^=":{"*":function(e,t){return!!Array.isArray(t)&&!t.includes(e)},reverse:"^!"},"^!":{"*":function(e,t){return!!Array.isArray(e)&&!e.includes(t)},reverse:"^="},"?=":{"*":function(e,t){return!e||e===t},reverse:"?!"},"?!":{"*":function(e,t){return!t||t===e},reverse:"?="},"=":{"*":function(e,t){return e===t}},">":{"*":function(e,t){return e>t},reverse:"<"},"<":{"*":function(e,t){return e<t},reverse:">"}};var o={register:function(e){var t=e.name,r=e.namespace,o=e.implement,i=e.reverse;n[t]=n[t]||{},n[t][r]=o,"*"===r&&i&&(n[t][r].reverse=i);var a={};Object.entries(n).sort(function(e,t){return e[0].length<t[0].length?1:e[0].length>t[0].length?-1:0}).forEach(function(e){a[e[0]]=e[1]}),n=a},unregister:function(e){var t=e.name,r=e.namespace,o=n[t];delete o[r],0===Object.keys(o).length&&delete n[t]},get list(){return n}};t.default=o},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Mutator=t.Operator=t.executeExp=t.parseExp=void 0;var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=u(r(5)),i=u(r(1)),a=r(0);function u(e){return e&&e.__esModule?e:{default:e}}var s=/^[a-zA-Z]+\.[a-zA-Z]+(?:\.\.[a-zA-Z]+)*/,f=/[^\n]+/,l="'";function c(e){var t=e.split(".."),r=t.slice(1,t.length),n=function(e){return e.includes(".")&&(0===e.indexOf("user.")||0===e.indexOf("env.")||0===e.indexOf("action.")||0===e.indexOf("resource."))}(t[0]),o=void 0;try{o=n?t[0]:JSON.parse(function(e){return e[0]===l&&e[e.length-1]===l&&(e='"'+e.substr(1,e.length-2)+'"'),e}(t[0]))}catch(e){var i="Parsing Error: \n\t JSON.parse( "+t[0]+" ) in expression";throw new Error(i)}return{isDIObj:n,value:o,mutators:r}}function p(e,t,r,o){e.mutators.forEach(function(a){var u=i.default.list[a];e.isDIObj&&"object"===(void 0===u?"undefined":n(u))&&u[i.default.postfix]&&(t.result=u[i.default.postfix](t,r[e.value],o))})}t.parseExp=function(e){var t=o.default.list,r=void 0,n=void 0;for(r in t)if(2===(n=e.split(r)).length)break;return 2===n.length&&s.test(n[0])&&f.test(n[1])||function(e){throw new Error("Semantic Error in "+e+": \n Expression should be obj.attr[..mutator](operator)value or object.attribute\n (user.role~=['admin','user'] , resource.location..radius=100)")}(e),{origin:e,left:c(n[0]),operator:r,right:c(n[1])}},t.executeExp=function(e,t,r,n,i){var u=o.default.list,s=(0,a.extract)(e,t.left,r),f=(0,a.extract)(e,t.right,r),l="*";t.left.isDIObj&&"function"==typeof u[t.operator][t.left.value]?l=t.left.value:t.right.isDIObj&&"function"==typeof u[t.operator][t.right.value]&&(l=t.right.value);var c=u[t.operator][l](s,f),v={leftIsData:!t.left.isDIObj,rightIsData:!t.right.isDIObj,leftValue:s,rightValue:f,result:c};return i&&(t.left.isDIObj&&0===t.left.value.indexOf(i)||t.right.isDIObj&&0===t.right.value.indexOf(i))?{flag:!0}:(p(t.left,v,r,n),p(t.right,v,r,n),v.result)},t.Operator=o.default,t.Mutator=i.default},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Adapter=t.Mutator=t.Operator=t.Policy=void 0;var n=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=r(6),a=r(0),u=function(e){return e&&e.__esModule?e:{default:e}}(r(4)),s=r(3),f=r(2);function l(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var c=Symbol(),p=Symbol(),v="user.",h="resource.",y="env.",d="action.",b="condition",g="watcher",m="deny";function O(e,t){return e.isDIObj&&e.value.indexOf&&0===e.value.indexOf(t)}function x(e,t,r){var n={},i=t===b?h:v;return Object.keys(e[c].filterTarget).forEach(function(t){try{n[t]=function(e,t,r,n){var o={},i=[];return e[c].filterTarget[r].forEach(function(e){i.push((0,a.prepareCollection)(t,e,o,n))}),e.adapter.proceed(i)}(e,r,t,i),function e(t){var r=!1;Object.keys(t).forEach(function(n){"string"!=typeof t[n]||0!==t[n].indexOf(v)&&0!==t[n].indexOf(h)&&0!==t[n].indexOf(y)&&0!==t[n].indexOf(d)?"object"===o(t[n])&&(r=e(t[n])):r=!0});return r}(n[t])&&(n[t]=void 0)}catch(e){}}),n}function j(e,t,r){e.target.map(function(e){return(0,i.parseExp)(e)}).forEach(function(e){r[c].target[t].push(e)})}var S=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.rules=JSON.stringify(t,null,2),this.adapter=u.default.MongoJSONb,t.hasOwnProperty("target")?function(e){var t=Math.random().toString(36).substr(2,9);this[c]={expression:[(0,s.wrapToToken)(t)],target:l({},t,[]),filterTarget:l({},t,[])},j(e,t,this)}.call(this,t):function(e){var t=this;this[c]={expression:(0,s.infixToRPN)((0,s.createTokens)(e.expression)),target:{},filterTarget:{}},Object.keys(e.policies).forEach(function(r){var n=e.policies[r];t[c].target[r]=[],t[c].filterTarget[r]=[],j(n,r,t)})}.call(this,t),this[c].effect=t.effect!==m,this[c].lastData=null}return n(e,[{key:"toString",value:function(){return this.rules}}]),n(e,[{key:"check",value:function(e){var t=this,r=function(e){var t=["user","resource","action","env"];return"object"===(void 0===e?"undefined":o(e))&&Object.keys(e).forEach(function(e){var r=t.indexOf(e);r>-1&&t.splice(r,1)}),t}(e);if(r.length>1)throw new Error(e?e.toString():'empty object should contain any more than two attributes from: "user", "action", "resource" or "env"');this[p]={},this[c].lastData=void 0;var n=r[0];this[c].filterType="user"===n?g:b,Object.keys(this[c].target).forEach(function(e){t[c].filterTarget[e]=[]});var a={};Object.keys(this[c].target).forEach(function(r){var u={},s={};a[r]=!0,t[c].target[r].forEach(function(a){var f=Math.floor(65536*(1+Math.random())).toString(16).substring(1),l=(0,i.executeExp)(e,a,u,f,n);"boolean"===(void 0===l?"undefined":o(l))?s[f]=l:"object"===(void 0===l?"undefined":o(l))&&l.flag?function(e,t,r,n){var o=i.Operator.list,a=JSON.parse(JSON.stringify(n)),u=e===g?v:h;if(O(a.left,u))r[c].filterTarget[t].push(a);else if(O(a.right,u)){var s=a.right;a.right=a.left,a.left=s,o[a.operator].reverse&&(a.operator=o[a.operator].reverse),r[c].filterTarget[t].push(a)}}(t[c].filterType,r,t,a):Object.assign(s,l)}),Object.values(s).forEach(function(e){a[r]=a[r]&&e})});var u=(0,s.fillTokens)(this[c].expression,a);this[c].tokens=JSON.parse(JSON.stringify(u)),this[p]=(0,s.evaluateRPN)(u);var f=this[c].effect?this[p].res:!this[p].res;return this[c].lastData=f?e:void 0,f}},{key:"setAdapter",value:function(e){this.adapter=e}},{key:"getConditions",value:function(e){var t=this;if(!1!==(this[c].effect?this[p].res:!this[p].res)){var r=x(this,this[c].filterType,this[c].lastData),n=void 0;return this[c].filterType===g?(this[c].tokens.forEach(function(e){e.type===s.TYPE.val&&!1===e.res&&(r[e.val[0]]=void 0)}),n=(n=(0,s.processRPN)((0,s.fillTokens)(this[c].expression,r),this.adapter))?this.adapter.optimize(n.res):void 0):(n={},Object.entries(r).forEach(function(e){t[p].val.includes(e[0])&&(0,f.mergeDeep)(n,e[1])})),(0,f.mergeDeep)(n,e)}}}]),e}();t.Policy=S,t.Operator=i.Operator,t.Mutator=i.Mutator,t.Adapter=u.default}]);