webapi-eca/js/dynamic-modules.js

202 lines
6 KiB
JavaScript

// Generated by CoffeeScript 1.7.1
/*
Dynamic Modules
===============
> Compiles CoffeeScript modules and loads JS modules in a VM, together
> with only a few allowed node.js modules.
*/
(function() {
var cryptico, cryptoJS, cs, db, exports, fTryToLoadModule, getFunctionParamNames, importio, logFunction, needle, regexpComments, request, vm;
db = require('./persistence');
vm = require('vm');
needle = require('needle');
request = require('request');
cs = require('coffee-script');
cryptico = require('my-cryptico');
cryptoJS = require('crypto-js');
importio = require('import-io').client;
/*
Module call
-----------
Initializes the dynamic module handler.
@param {Object} args
*/
exports = module.exports = (function(_this) {
return function(args) {
var numBits, passPhrase;
_this.log = args.logger;
if (!_this.strPublicKey && args['keygen']) {
db(args);
passPhrase = args['keygen'];
numBits = 1024;
_this.oPrivateRSAkey = cryptico.generateRSAKey(passPhrase, numBits);
_this.strPublicKey = cryptico.publicKeyString(_this.oPrivateRSAkey);
_this.log.info("DM | Public Key generated: " + _this.strPublicKey);
}
return module.exports;
};
})(this);
exports.getPublicKey = (function(_this) {
return function() {
return _this.strPublicKey;
};
})(this);
logFunction = function(uId, rId, mId) {
return function(msg) {
return db.appendLog(uId, rId, mId, msg);
};
};
regexpComments = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
getFunctionParamNames = function(fName, func, oFuncs) {
var fnStr, result;
fnStr = func.toString().replace(regexpComments, '');
result = fnStr.slice(fnStr.indexOf('(') + 1, fnStr.indexOf(')')).match(/([^\s,]+)/g);
if (!result) {
result = [];
}
return oFuncs[fName] = result;
};
/*
Try to run a JS module from a string, together with the
given parameters. If it is written in CoffeeScript we
compile it first into JS.
@public compileString ( *src, id, params, lang* )
@param {String} src
@param {String} id
@param {Object} params
@param {String} lang
*/
exports.compileString = (function(_this) {
return function(src, userId, ruleId, modId, lang, dbMod, cb) {
var err;
if (lang === 'CoffeeScript') {
try {
_this.log.info("DM | Compiling module '" + modId + "' for user '" + userId + "'");
src = cs.compile(src);
} catch (_error) {
err = _error;
cb({
answ: {
code: 400,
message: 'Compilation of CoffeeScript failed at line ' + err.location.first_line
}
});
return;
}
}
_this.log.info("DM | Trying to fetch user specific module '" + modId + "' paramters for user '" + userId + "'");
if (dbMod) {
return dbMod.getUserParams(modId, userId, function(err, obj) {
var oDecrypted;
try {
oDecrypted = cryptico.decrypt(obj, _this.oPrivateRSAkey);
obj = JSON.parse(oDecrypted.plaintext);
_this.log.info("DM | Loaded user defined params for " + userId + ", " + ruleId + ", " + modId);
} catch (_error) {
err = _error;
_this.log.warn("DM | Error during parsing of user defined params for " + userId + ", " + ruleId + ", " + modId);
_this.log.warn(err);
}
return fTryToLoadModule(userId, ruleId, modId, src, dbMod, obj, cb);
});
} else {
return fTryToLoadModule(userId, ruleId, modId, src, dbMod, null, cb);
}
};
})(this);
fTryToLoadModule = (function(_this) {
return function(userId, ruleId, modId, src, dbMod, params, cb) {
var answ, err, fName, func, logFunc, msg, oFuncArgs, oFuncParams, sandbox, _ref;
if (!params) {
params = {};
}
answ = {
code: 200,
message: 'Successfully compiled'
};
_this.log.info("DM | Running module '" + modId + "' for user '" + userId + "'");
logFunc = logFunction(userId, ruleId, modId);
sandbox = {
id: "" + userId + "." + ruleId + "." + modId + ".vm",
params: params,
needle: needle,
importio: importio,
request: request,
cryptoJS: cryptoJS,
log: logFunc,
debug: console.log,
exports: {}
};
try {
vm.runInNewContext(src, sandbox, sandbox.id);
} catch (_error) {
err = _error;
answ.code = 400;
msg = err.message;
if (!msg) {
msg = 'Try to run the script locally to track the error! Sadly we cannot provide the line number';
}
answ.message = 'Loading Module failed: ' + msg;
}
_this.log.info("DM | Module '" + modId + "' ran successfully for user '" + userId + "' in rule '" + ruleId + "'");
oFuncParams = {};
oFuncArgs = {};
_ref = sandbox.exports;
for (fName in _ref) {
func = _ref[fName];
getFunctionParamNames(fName, func, oFuncParams);
}
if (dbMod) {
oFuncArgs = {};
for (func in oFuncParams) {
dbMod.getUserArguments(userId, ruleId, modId, func, function(err, obj) {
var oDecrypted;
if (obj) {
try {
oDecrypted = cryptico.decrypt(obj, _this.oPrivateRSAkey);
oFuncArgs[func] = JSON.parse(oDecrypted.plaintext);
return _this.log.info("DM | Found and attached user-specific arguments to " + userId + ", " + ruleId + ", " + modId);
} catch (_error) {
err = _error;
_this.log.warn("DM | Error during parsing of user-specific arguments for " + userId + ", " + ruleId + ", " + modId);
return _this.log.warn(err);
}
}
});
}
}
return cb({
answ: answ,
module: sandbox.exports,
funcParams: oFuncParams,
funcArgs: oFuncArgs,
logger: sandbox.log
});
};
})(this);
}).call(this);