Files
genieacs/common/authorizer.js
T
Zaid Abdulla c2d13e8364 Replace Filter class with expression structure
This is in order to be able to support UPPER() and LOWER() functions in
queries which are needed for case-insensitive search.
2018-12-26 00:22:07 -08:00

79 lines
1.9 KiB
JavaScript

"use strict";
const expression = require("./expression");
const validators = {
pass: require("./validators/pass"),
test: require("./validators/test")
};
class Authorizer {
constructor(permissionSets) {
this.permissionSets = permissionSets;
this.validtorCache = new WeakMap();
this.hasAccessCache = {};
}
hasAccess(resourceType, access) {
const cacheKey = `${resourceType}-${access}`;
if (cacheKey in this.hasAccessCache)
return this.hasAccessCache[cacheKey];
let has = false;
for (let permissionSet of this.permissionSets) {
for (let perm of permissionSet)
if (perm[resourceType])
if (perm[resourceType].access >= access) {
has = true;
break;
}
}
this.hasAccessCache[cacheKey] = has;
return has;
}
getValidator(resourceType, resource) {
if (this.validtorCache.has(resource))
return this.validtorCache.get(resource);
let funcs = {};
for (let permissionSet of this.permissionSets)
for (let perm of permissionSet)
if (perm[resourceType]) {
if (perm[resourceType].access >= 3) {
if (perm[resourceType].validate)
for (let [k, v] of Object.entries(perm[resourceType].validate))
funcs[k] = v;
} else {
funcs = {};
}
}
const validator = (mutationType, mutation, any) => {
let valid = false;
for (let [k, v] of Object.entries(funcs))
if (v) {
let res = validators[k](
resourceType,
resource,
mutationType,
mutation,
any
);
if (res > 0) valid = true;
else if (res < 0) return false;
}
return valid;
};
this.validtorCache.set(resource, validator);
return validator;
}
}
module.exports = Authorizer;