ocbesbn-bouncer
Advanced tools
Comparing version 0.2.10 to 0.2.11
110
index.js
@@ -44,3 +44,3 @@ /** | ||
*/ | ||
var _isAuthorized = function(permissions, url, method, userClaims) | ||
var _findResource = function(permissions, url, method, userClaims) | ||
{ | ||
@@ -71,3 +71,5 @@ var action = actionLookUp[method]; | ||
}); | ||
if (endpoints.length > 0) return true; | ||
if(endpoints.length > 0) | ||
return endpoints[0]; | ||
} | ||
@@ -81,2 +83,7 @@ } | ||
var _isAuthorized = function(permissions, url, method, userClaims) | ||
{ | ||
return _findResource(permissions, url, method, userClaims) !== false; | ||
} | ||
/** | ||
@@ -112,7 +119,13 @@ * middleware to take care of the acl rules and permission | ||
{ | ||
var permissions = response[0].results; | ||
var isAuthorized = this.isAuthorized(permissions, url, method, userData); | ||
var resource = _findResource(permissions, url, method, userData); | ||
var isAuthorized = resource !== false; | ||
if (!isAuthorized) | ||
if(isAuthorized) | ||
{ | ||
resolve(resource); | ||
} | ||
else | ||
{ | ||
if (response[0].meta.next) | ||
@@ -128,6 +141,2 @@ { | ||
} | ||
else | ||
{ | ||
resolve() | ||
} | ||
}) | ||
@@ -160,6 +169,83 @@ .catch((err) => | ||
/** | ||
* function to apply filters on the nested object | ||
* | ||
* @param {Array} Keys - whitefiled keys | ||
* @param {Object} values - response result object | ||
* | ||
* @return {Object} | ||
*/ | ||
var buildRecusiveResult = function(keys, values) | ||
{ | ||
if(keys.length > 0) | ||
{ | ||
let key = keys.shift(); | ||
if(typeof values[key] !== 'undefined') | ||
return { [key]: buildRecusiveResult(keys, values[key]) }; | ||
return { }; | ||
} | ||
return values; | ||
} | ||
/** | ||
* function to apply filter on nested Object | ||
* @param {Array} keyList | ||
* @param {Object} values | ||
* | ||
* @return {Object} | ||
*/ | ||
var applyStructureFilter = function(keyList, values) | ||
{ | ||
var result = {}; | ||
keyList.forEach(key => result = extend(true, result, buildRecusiveResult(key.split('.'), values))); | ||
return result; | ||
} | ||
/** | ||
* function to filter the object or array by | ||
* given whiltelist | ||
* | ||
* @param {Object} obj | ||
* @param {Array} whiteKeys | ||
* | ||
* @return {Object} | ||
*/ | ||
var filterObject = function(obj, whiteKeys) | ||
{ | ||
if(Array.isArray(obj)) | ||
return obj.map(o => filterObject(o, whiteKeys)).filter(o => Object.keys(o).length > 0); | ||
if (Array.isArray(whiteKeys) && typeof obj === 'object') | ||
return applyStructureFilter(whiteKeys, obj); | ||
return obj; | ||
} | ||
/** | ||
* function to wrap or filter the response | ||
* object to the restricted fields | ||
* | ||
* @param {Function} callback - callback function to bind the response object | ||
* @param {Array} keys - fields defined in the acl.json | ||
*/ | ||
var wrapCallback = function(callback, keys) | ||
{ | ||
return (obj) => callback(filterObject(obj, keys)); | ||
} | ||
checkIsPermitted(req.originalUrl.split('?')[0], req.method, req.opuscapita.userData()) | ||
.then((response) => | ||
.then((resource) => | ||
{ | ||
next(); | ||
if(typeof resource === 'object' && resource.fields) | ||
{ | ||
res.json = wrapCallback(res.json.bind(res), resource.fields); | ||
res.jsonp = wrapCallback(res.jsonp.bind(res), resource.fields); | ||
} | ||
next(); | ||
}) | ||
@@ -192,3 +278,5 @@ .catch((err) => | ||
'PUT': 'edit', | ||
'DELETE': 'delete' | ||
'DELETE': 'delete', | ||
'HEAD': 'head', | ||
'OPTIONS': 'options' | ||
} | ||
@@ -195,0 +283,0 @@ |
{ | ||
"name": "ocbesbn-bouncer", | ||
"version": "0.2.10", | ||
"version": "0.2.11", | ||
"description": "Express middleware for ACl service and validation", | ||
@@ -12,5 +12,6 @@ "main": "index.js", | ||
"dependencies": { | ||
"extend": "^3.0.0", | ||
"lodash.filter": "^4.6.0", | ||
"extend": "^3.0.0" | ||
"ocbesbn-cache": "^1.0.4" | ||
} | ||
} |
@@ -66,3 +66,4 @@ # BOUNCER | ||
"resourceId": "/api/health/check", `// Regular expression/complete endpoint (route of API endpoint)` | ||
"actions": ["edit", "read"] `// Actions allowed edit=PUT, read=GET, delete=DELETE, create=POST` | ||
"actions": ["edit", "read"], `// Actions allowed edit=PUT, read=GET, delete=DELETE, create=POST` | ||
"fields": ['result', 'more.somefield'] `// defines what are all the fields can be sent to the user/requestor, nested fields can be added like OBJECT.SOMEKEY..` | ||
} | ||
@@ -69,0 +70,0 @@ ] |
13427
6
293
96
3
+ Addedocbesbn-cache@^1.0.4
+ Addedbluebird@3.7.2(transitive)
+ Addedbluebird-retry@0.10.1(transitive)
+ Addedclone@2.1.2(transitive)
+ Addedconsul@0.27.0(transitive)
+ Addeddouble-ended-queue@2.1.0-0(transitive)
+ Addedlodash@4.17.21(transitive)
+ Addednode-cache@4.2.1(transitive)
+ Addedocbesbn-cache@1.0.9(transitive)
+ Addedocbesbn-config@2.3.3(transitive)
+ Addedocbesbn-logger@1.0.11(transitive)
+ Addedpapi@0.27.0(transitive)
+ Addedredis@2.8.0(transitive)
+ Addedredis-commands@1.7.0(transitive)
+ Addedredis-parser@2.6.0(transitive)