casbin
Version:
An authorization library that supports access control models like ACL, RBAC, ABAC in Node.JS
91 lines (90 loc) • 2.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Helper = exports.PolicyLoader = exports.BracketAwareCsvParser = exports.BasicCsvParser = void 0;
const sync_1 = require("csv-parse/sync");
class BasicCsvParser {
parse(line) {
if (!line || line.trimStart().charAt(0) === '#') {
return null;
}
return (0, sync_1.parse)(line, {
delimiter: ',',
skip_empty_lines: true,
trim: true,
relax_quotes: true,
});
}
}
exports.BasicCsvParser = BasicCsvParser;
class BracketAwareCsvParser {
constructor(baseParser = new BasicCsvParser()) {
this.baseParser = baseParser;
}
parse(line) {
const rawTokens = this.baseParser.parse(line);
if (!rawTokens || !rawTokens[0]) {
return null;
}
const tokens = rawTokens[0];
const processedTokens = [];
let currentToken = '';
let bracketCount = 0;
for (const token of tokens) {
for (const char of token) {
if (char === '(')
bracketCount++;
else if (char === ')')
bracketCount--;
}
currentToken += (currentToken ? ',' : '') + token;
if (bracketCount === 0) {
processedTokens.push(currentToken);
currentToken = '';
}
}
if (bracketCount !== 0) {
throw new Error(`Unmatched brackets in policy line: ${line}`);
}
return processedTokens.length > 0 ? [processedTokens] : null;
}
}
exports.BracketAwareCsvParser = BracketAwareCsvParser;
class PolicyLoader {
constructor(parser = new BracketAwareCsvParser()) {
this.parser = parser;
}
loadPolicyLine(line, model) {
const tokens = this.parser.parse(line);
if (!tokens || !tokens[0]) {
return;
}
let key = tokens[0][0].trim();
if (key.startsWith('"') && key.endsWith('"')) {
key = key.slice(1, -1);
}
const sec = key.substring(0, 1);
const item = model.model.get(sec);
if (!item) {
return;
}
const policy = item.get(key);
if (!policy) {
return;
}
const values = tokens[0].slice(1).map((v) => {
if (v.startsWith('"') && v.endsWith('"')) {
v = v.slice(1, -1);
}
return v.replace(/""/g, '"').trim();
});
policy.policy.push(values);
}
}
exports.PolicyLoader = PolicyLoader;
class Helper {
static loadPolicyLine(line, model) {
Helper.policyLoader.loadPolicyLine(line, model);
}
}
exports.Helper = Helper;
Helper.policyLoader = new PolicyLoader();