enigma-bbs/core/acs.js

125 lines
3.3 KiB
JavaScript

/* jslint node: true */
'use strict';
// ENiGMA½
const checkAcs = require('./acs_parser.js').parse;
const Log = require('./logger.js').log;
// deps
const assert = require('assert');
const _ = require('lodash');
class ACS {
constructor(subject) {
this.subject = subject;
}
static get Defaults() {
return {
MessageConfRead: 'GM[users]', // list/read
MessageConfWrite: 'GM[users]', // post/write
MessageAreaRead: 'GM[users]', // list/read; requires parent conf read
MessageAreaWrite: 'GM[users]', // post/write; requires parent conf write
FileAreaRead: 'GM[users]', // list
FileAreaWrite: 'GM[sysops]', // upload
FileAreaDownload: 'GM[users]', // download
};
}
check(acs, scope, defaultAcs) {
acs = acs ? acs[scope] : defaultAcs;
acs = acs || defaultAcs;
try {
return checkAcs(acs, { subject: this.subject });
} catch (e) {
Log.warn({ exception: e, acs: acs }, 'Exception caught checking ACS');
return false;
}
}
//
// Message Conferences & Areas
//
hasMessageConfRead(conf) {
return this.check(conf.acs, 'read', ACS.Defaults.MessageConfRead);
}
hasMessageConfWrite(conf) {
return this.check(conf.acs, 'write', ACS.Defaults.MessageConfWrite);
}
hasMessageAreaRead(area) {
return this.check(area.acs, 'read', ACS.Defaults.MessageAreaRead);
}
hasMessageAreaWrite(area) {
return this.check(area.acs, 'write', ACS.Defaults.MessageAreaWrite);
}
//
// File Base / Areas
//
hasFileAreaRead(area) {
return this.check(area.acs, 'read', ACS.Defaults.FileAreaRead);
}
hasFileAreaWrite(area) {
// :TODO: create 'upload' alias?
return this.check(area.acs, 'write', ACS.Defaults.FileAreaWrite);
}
hasFileAreaDownload(area) {
return this.check(area.acs, 'download', ACS.Defaults.FileAreaDownload);
}
hasMenuModuleAccess(modInst) {
const acs = _.get(modInst, 'menuConfig.config.acs');
if (!_.isString(acs)) {
return true; // no ACS check req.
}
try {
return checkAcs(acs, { subject: this.subject });
} catch (e) {
Log.warn({ exception: e, acs: acs }, 'Exception caught checking ACS');
return false;
}
}
matches(acs) {
return checkAcs(acs, {subject: this.subject});
}
getConditionalValue(condArray, memberName) {
if (!Array.isArray(condArray)) {
// no cond array, just use the value
return condArray;
}
assert(_.isString(memberName));
const matchCond = condArray.find(cond => {
if (_.has(cond, 'acs')) {
try {
return checkAcs(cond.acs, { subject: this.subject });
} catch (e) {
Log.warn(
{ exception: e, acs: cond },
'Exception caught checking ACS'
);
return false;
}
} else {
return true; // no ACS check req.
}
});
if (matchCond) {
return matchCond[memberName];
}
}
}
module.exports = ACS;