- Sorry this roles is missing for you.
- You only have these privileges: {{user.roles}}
+ {{message}}
diff --git a/coffee/db_interface.coffee b/coffee/db_interface.coffee index 3643cbf..da3e061 100644 --- a/coffee/db_interface.coffee +++ b/coffee/db_interface.coffee @@ -193,8 +193,8 @@ getSetRecords = ( set, fSingle, cb ) => log.error 'DB', new Error 'Empty key in DB: ' + prop else objReplies[prop] = data - if semaphore == 0 - cb null, objReplies + if semaphore == 0 + cb null, objReplies fSingle reply, fCallback(reply) for reply in arrReply ### @@ -212,7 +212,7 @@ Store a string representation of an action module in the DB. exports.storeActionModule = ( id, data ) => log.print 'DB', 'storeActionModule: ' + id @db.sadd 'action-modules', id, replyHandler 'storing action module key ' + id - @db.set 'action-module:' + id, data, replyHandler 'storing action module ' + id + @db.hmset 'action-module:' + id, data, replyHandler 'storing action module ' + id ### Query the DB for an action module and pass it to the callback(err, obj) function. @@ -223,7 +223,7 @@ Query the DB for an action module and pass it to the callback(err, obj) function ### exports.getActionModule = ( id, cb ) => log.print 'DB', 'getActionModule: ' + id - @db.get 'action-module:' + id, cb + @db.hgetall 'action-module:' + id, cb ### Fetch all action modules and hand them to the callback(err, obj) function. @@ -276,7 +276,7 @@ Store a string representation of an event module in the DB. exports.storeEventModule = ( id, data ) => log.print 'DB', 'storeEventModule: ' + id @db.sadd 'event-modules', id, replyHandler 'storing event module key ' + id - @db.set 'event-module:' + id, data, replyHandler 'storing event module ' + id + @db.hmset 'event-module:' + id, data, replyHandler 'storing event module ' + id ### Query the DB for an event module and pass it to the callback(err, obj) function. @@ -287,7 +287,7 @@ Query the DB for an event module and pass it to the callback(err, obj) function. ### exports.getEventModule = ( id, cb ) => log.print 'DB', 'getEventModule: ' + id - @db.get 'event_module:' + id, cb + @db.hgetall 'event-module:' + id, cb ### Fetch all event modules and pass them to the callback(err, obj) function. @@ -296,7 +296,7 @@ Fetch all event modules and pass them to the callback(err, obj) function. @param {function} cb ### exports.getEventModules = ( cb ) -> - getSetRecords 'event_modules', exports.getEventModule, cb + getSetRecords 'event-modules', exports.getEventModule, cb ### Store a string representation of he authentication parameters for an event module. diff --git a/coffee/http_listener.coffee b/coffee/http_listener.coffee index d209794..c34e36c 100644 --- a/coffee/http_listener.coffee +++ b/coffee/http_listener.coffee @@ -68,8 +68,10 @@ exports.addHandlers = ( fShutDown ) -> app.use '/', express.static path.resolve __dirname, '..', 'webpages', 'public' # - **`GET` to _"/admin"_:** Only admins can issue requests to this handler app.get '/admin', requestHandler.handleAdmin - # - **`GET` to _"/forge\_modules"_:** Webpages that lets the user to create modules + # - **`GET` to _"/forge\_modules"_:** Webpage that lets the user create modules app.get '/forge_modules', requestHandler.handleForgeModules + # - **`GET` to _"/forge\_rules"_:** Webpage that lets the user create rules + app.get '/forge_rules', requestHandler.handleForgeRules # - **`GET` to _"/invoke\_event"_:** Webpage that lets the user invoke events app.get '/invoke_event', requestHandler.handleInvokeEvent diff --git a/coffee/request_handler.coffee b/coffee/request_handler.coffee index 12e2b0d..a9788ed 100644 --- a/coffee/request_handler.coffee +++ b/coffee/request_handler.coffee @@ -31,16 +31,18 @@ crypto = require 'crypto-js' # Prepare the admin command handlers which are invoked via HTTP requests. objAdminCmds = - 'loadrules': mm.loadRulesFromFS, - 'loadaction': mm.loadActionModuleFromFS, - 'loadactions': mm.loadActionModulesFromFS, - 'loadevent': mm.loadEventModuleFromFS, + 'loadrules': mm.loadRulesFromFS + 'loadaction': mm.loadActionModuleFromFS + 'loadactions': mm.loadActionModulesFromFS + 'loadevent': mm.loadEventModuleFromFS 'loadevents': mm.loadEventModulesFromFS # Prepare the user command handlers which are invoked via HTTP requests. objUserCmds = 'store_action': mm.storeActionModule + 'get_actionmodules': mm.getAllActionModules 'store_event': mm.storeEventModule + 'get_eventmodules': mm.getAllEventModules 'store_rule': mm.storeRule @@ -63,7 +65,9 @@ admin command shutdown is issued. @param {function} fShutdown ### exports.addHandlers = ( fShutdown ) => - objAdminCmds.shutdown = fShutdown + objAdminCmds.shutdown = ( args, answerHandler ) -> + answerHandler.answerSuccess 'Shutting down... BYE!' + setTimeout fShutdown, 500 ### @@ -164,12 +168,15 @@ Renders a page depending on the user session and returns it. @param {String} name @param {Object} sess ### -renderPage = ( name, sess ) -> +renderPage = ( name, sess, msg ) -> template = getHandlerFileAsString name - menubar = getHandlerFileAsString 'menubar' + menubar = getHandlerFileAsString 'part_menubar' + requires = getHandlerFileAsString 'part_requires' view = user: sess.user, - div_menubar: menubar + head_requires: requires, + div_menubar: menubar, + message: msg mustache.render template, view ### @@ -189,6 +196,45 @@ sendLoginOrPage = ( pagename, req, resp ) -> else resp.sendfile getHandlerPath 'login' +### +Present the module forge to the user. + +*Requires +the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest) +and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse) +objects.* + +@public handleForgeModules( *req, resp* ) +### +exports.handleForgeModules = ( req, resp ) -> + sendLoginOrPage 'forge_modules', req, resp + +### +Present the rules forge to the user. + +*Requires +the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest) +and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse) +objects.* + +@public handleForgeRules( *req, resp* ) +### +exports.handleForgeRules = ( req, resp ) -> + sendLoginOrPage 'forge_rules', req, resp + +### +Present the event invoke page to the user. + +*Requires +the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest) +and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse) +objects.* + +@public handleInvokeEvent( *req, resp* ) +### +exports.handleInvokeEvent = ( req, resp ) -> + sendLoginOrPage 'push_event', req, resp + ### Handles the user command requests. @@ -209,39 +255,11 @@ exports.handleUserCommand = ( req, resp ) -> body += data req.on 'end', -> obj = qs.parse body - if objUserCmds[obj.command] is 'function' - resp.send 'Command accepted!' - objUserCmds[obj.command] req.session.user, obj + if typeof objUserCmds[obj.command] is 'function' + objUserCmds[obj.command] req.session.user, obj, answerHandler req, resp else resp.send 404, 'Command unknown!' -### -Present the module forge to the user. - -*Requires -the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest) -and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse) -objects.* - -@public handleForgeModules( *req, resp* ) -### -exports.handleForgeModules = ( req, resp ) -> - sendLoginOrPage 'forge_modules', req, resp - -### -Present the event invoke page to the user. - -*Requires -the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest) -and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse) -objects.* - -@public handleInvokeEvent( *req, resp* ) -### -exports.handleInvokeEvent = ( req, resp ) -> - sendLoginOrPage 'push_event', req, resp - - ### Handles the admin command requests. @@ -255,48 +273,44 @@ objects.* exports.handleAdmin = ( req, resp ) -> if req.session and req.session.user if req.session.user.isAdmin is "true" - resp.send renderPage 'welcome', req.session + q = req.query + log.print 'RH', 'Received admin request: ' + req.originalUrl + if q.cmd + objAdminCmds[q.cmd]? q, answerHandler req, resp, true + else + resp.send 404, 'Command unknown!' else resp.send renderPage 'unauthorized', req.session else resp.sendfile getHandlerPath 'login' -onAdminCommand = ( req, response ) -> - q = req.query - log.print 'RH', 'Received admin request: ' + q - if q.cmd - fAdminCommands q, answerHandler response - #answerSuccess(response, 'Thank you, we try our best!'); - else answerError response, 'I\'m not sure about what you want from me...' + +answerHandler = (req, resp, ntbr) -> + request = req + response = resp + needsToBeRendered = ntbr + hasBeenAnswered = false + ret = + answerSuccess: (msg) -> + if not hasBeenAnswered + if needsToBeRendered + response.send renderPage 'command_answer', request.session, msg + else + response.send msg + hasBeenAnswered = true + , + answerError: (msg) -> + if not hasBeenAnswered + if needsToBeRendered + response.send 400, renderPage 'error', request.session, msg + else + response.send 400, msg + hasBeenAnswered = true + , + isAnswered: -> hasBeenAnswered + setTimeout(() -> + ret.answerError 'Strange... maybe try again?' + , 5000) + ret - -### -admin commands handler receives all command arguments and an answerHandler -object that eases response handling to the HTTP request issuer. - -@private fAdminCommands( *args, answHandler* ) -### -fAdminCommands = ( args, answHandler ) -> - if args and args.cmd - adminCmds[args.cmd]? args, answHandler - else - log.print 'RH', 'No command in request' - - ### - The fAnsw function receives an answerHandler object as an argument when called - and returns an anonymous function - ### - fAnsw = ( ah ) -> - ### - The anonymous function checks whether the answerHandler was already used to - issue an answer, if no answer was provided we answer with an error message - ### - () -> - if not ah.isAnswered() - ah.answerError 'Not handled...' - - ### - Delayed function call of the anonymous function that checks the answer handler - ### - setTimeout fAnsw(answHandler), 2000 diff --git a/js-coffee/db_interface.js b/js-coffee/db_interface.js index 6472961..0aadeb8 100644 --- a/js-coffee/db_interface.js +++ b/js-coffee/db_interface.js @@ -240,14 +240,14 @@ DB Interface --semaphore; if (err) { err.addInfo = 'fetching single element: ' + prop; - return log.error('DB', err); + log.error('DB', err); } else if (!data) { - return log.error('DB', new Error('Empty key in DB: ' + prop)); + log.error('DB', new Error('Empty key in DB: ' + prop)); } else { objReplies[prop] = data; - if (semaphore === 0) { - return cb(null, objReplies); - } + } + if (semaphore === 0) { + return cb(null, objReplies); } }; }; @@ -278,7 +278,7 @@ DB Interface exports.storeActionModule = function(id, data) { log.print('DB', 'storeActionModule: ' + id); _this.db.sadd('action-modules', id, replyHandler('storing action module key ' + id)); - return _this.db.set('action-module:' + id, data, replyHandler('storing action module ' + id)); + return _this.db.hmset('action-module:' + id, data, replyHandler('storing action module ' + id)); }; /* @@ -292,7 +292,7 @@ DB Interface exports.getActionModule = function(id, cb) { log.print('DB', 'getActionModule: ' + id); - return _this.db.get('action-module:' + id, cb); + return _this.db.hgetall('action-module:' + id, cb); }; /* @@ -357,7 +357,7 @@ DB Interface exports.storeEventModule = function(id, data) { log.print('DB', 'storeEventModule: ' + id); _this.db.sadd('event-modules', id, replyHandler('storing event module key ' + id)); - return _this.db.set('event-module:' + id, data, replyHandler('storing event module ' + id)); + return _this.db.hmset('event-module:' + id, data, replyHandler('storing event module ' + id)); }; /* @@ -371,7 +371,7 @@ DB Interface exports.getEventModule = function(id, cb) { log.print('DB', 'getEventModule: ' + id); - return _this.db.get('event_module:' + id, cb); + return _this.db.hgetall('event-module:' + id, cb); }; /* @@ -383,7 +383,7 @@ DB Interface exports.getEventModules = function(cb) { - return getSetRecords('event_modules', exports.getEventModule, cb); + return getSetRecords('event-modules', exports.getEventModule, cb); }; /* diff --git a/js-coffee/eventpoller.js b/js-coffee/eventpoller.js index 7198bc1..19c00d5 100644 --- a/js-coffee/eventpoller.js +++ b/js-coffee/eventpoller.js @@ -20,8 +20,8 @@ var fs = require('fs'), function init() { if(process.argv.length > 2) log({ logType: parseInt(process.argv[2]) || 0 }); var args = { logType: log.getLogType() }; - ml = require('./module_loader')(args); - db = require('./db_interface')(args); + (ml = require('./module_loader'))(args); + (db = require('./db_interface'))(args); initAdminCommands(); initMessageActions(); pollLoop(); diff --git a/js-coffee/http_listener.js b/js-coffee/http_listener.js index 3399afa..4a41537 100644 --- a/js-coffee/http_listener.js +++ b/js-coffee/http_listener.js @@ -59,6 +59,7 @@ HTTP Listener app.use('/', express["static"](path.resolve(__dirname, '..', 'webpages', 'public'))); app.get('/admin', requestHandler.handleAdmin); app.get('/forge_modules', requestHandler.handleForgeModules); + app.get('/forge_rules', requestHandler.handleForgeRules); app.get('/invoke_event', requestHandler.handleInvokeEvent); app.post('/event', requestHandler.handleEvent); app.post('/login', requestHandler.handleLogin); diff --git a/js-coffee/logging.js b/js-coffee/logging.js index 336d081..cda375c 100644 --- a/js-coffee/logging.js +++ b/js-coffee/logging.js @@ -93,3 +93,9 @@ exports.error = function(module, err) { exports.severe = function(module, err) { printError(module, err, true); }; + +exports.obj = function (varname, obj) { + var arrS = (new Error).stack.split('\n'); + console.log('Dumping object "' + varname + '"' + arrS[2]); + console.log(obj); +}; diff --git a/js-coffee/module_debugger.js b/js-coffee/module_debugger.js new file mode 100644 index 0000000..d70b917 --- /dev/null +++ b/js-coffee/module_debugger.js @@ -0,0 +1 @@ +// Store debug information on first compilation and return it to the user \ No newline at end of file diff --git a/js-coffee/module_loader.js b/js-coffee/module_loader.js index d2cb0d8..e7164c7 100644 --- a/js-coffee/module_loader.js +++ b/js-coffee/module_loader.js @@ -13,25 +13,20 @@ exports = module.exports = function(args) { exports.requireFromString = function(src, name, dir) { if(!dir) dir = __dirname; var id = path.resolve(dir, name, name + '.vm'); - //FIXME load modules only into a safe environment with given modules, no access to whole application, var vm = require('vm'), + // FIXME not log but debug module is required to provide information to the user sandbox = { + id: id, // use this to gather kill info + needle: require('needle'), log: log, - needle: require('needle') + exports: {} }; - - var mod = vm.runInNewContext(src, sandbox, 'myfile.vm'); - console.log(mod); - var m = new module.constructor(id, module); - m.paths = module.paths; - try { - m._compile(src); - } catch(err) { - err.addInfo = 'during compilation of module ' + name; - log.error('LM', err); - // log.error('LM', ' during compilation of ' + name + ': ' + err); - } - return m.exports; + //TODO child_process to run module! + // Define max runtime per loop as 10 seconds, after that the child will be killed + // it can still be active after that if there was a timing function or a callback used... + // kill the child each time? how to determine whether there's still a token in the module? + var mod = vm.runInNewContext(src, sandbox, id + '.vm'); + return sandbox.exports; }; exports.loadModule = function(directory, name, callback) { diff --git a/js-coffee/module_manager.js b/js-coffee/module_manager.js index bf46969..41f885c 100644 --- a/js-coffee/module_manager.js +++ b/js-coffee/module_manager.js @@ -23,20 +23,47 @@ exports = module.exports = function(args) { exports.addDBLink = function(db_link) { db = db_link; - // funcLoadAction = fLoadAction; - // funcLoadRule = fLoadRule; }; -exports.storeEventModule = function (user, obj) { - log.print('MM', 'implement storeEventModule'); +exports.storeEventModule = function (user, obj, answHandler) { + try { + // TODO in the future we might want to link the modules close to the user + // and allow for e.g. private modules + // we need a child process to run this code and kill it after invocation + var m = ml.requireFromString(obj.data, obj.id); + obj.methods = Object.keys(m); + answHandler.answerSuccess('Thank you for the event module!'); + db.storeEventModule(obj.id, obj); + } catch (err) { + answHandler.answerError(err.message); + console.error(err); + } }; -exports.storeActionModule = function (user, obj) { - log.print('MM', 'implement storeActionModule'); +exports.getAllEventModules = function ( user, obj, answHandler ) { + db.getEventModules(function(err, obj) { + if(err) answHandler.answerError('Failed fetching event modules: ' + err.message); + else answHandler.answerSuccess(obj); + }); }; -exports.storeRule = function (user, obj) { +exports.storeActionModule = function (user, obj, answHandler) { + var m = ml.requireFromString(obj.data, obj.id); + obj.methods = Object.keys(m); + answHandler.answerSuccess('Thank you for the action module!'); + db.storeActionModule(obj.id, obj); +}; + +exports.getAllActionModules = function ( user, obj, answHandler ) { + db.getActionModules(function(err, obj) { + if(err) answHandler.answerError('Failed fetching action modules: ' + err.message); + else answHandler.answerSuccess(obj); + }); +}; + +exports.storeRule = function (user, obj, answHandler) { log.print('MM', 'implement storeRule'); + answHandler.answerSuccess('Thank you for the rule!'); }; diff --git a/js-coffee/request_handler.js b/js-coffee/request_handler.js index 6d542f5..8d0fe2d 100644 --- a/js-coffee/request_handler.js +++ b/js-coffee/request_handler.js @@ -8,7 +8,7 @@ Request Handler (function() { - var crypto, db, exports, fAdminCommands, fs, getHandlerFileAsString, getHandlerPath, log, mm, mustache, objAdminCmds, objUserCmds, onAdminCommand, path, qs, renderPage, sendLoginOrPage, + var answerHandler, crypto, db, exports, fs, getHandlerFileAsString, getHandlerPath, log, mm, mustache, objAdminCmds, objUserCmds, path, qs, renderPage, sendLoginOrPage, _this = this; log = require('./logging'); @@ -37,7 +37,9 @@ Request Handler objUserCmds = { 'store_action': mm.storeActionModule, + 'get_actionmodules': mm.getAllActionModules, 'store_event': mm.storeEventModule, + 'get_eventmodules': mm.getAllEventModules, 'store_rule': mm.storeRule }; @@ -67,7 +69,10 @@ Request Handler exports.addHandlers = function(fShutdown) { - return objAdminCmds.shutdown = fShutdown; + return objAdminCmds.shutdown = function(args, answerHandler) { + answerHandler.answerSuccess('Shutting down... BYE!'); + return setTimeout(fShutdown, 500); + }; }; /* @@ -196,13 +201,16 @@ Request Handler */ - renderPage = function(name, sess) { - var menubar, template, view; + renderPage = function(name, sess, msg) { + var menubar, requires, template, view; template = getHandlerFileAsString(name); - menubar = getHandlerFileAsString('menubar'); + menubar = getHandlerFileAsString('part_menubar'); + requires = getHandlerFileAsString('part_requires'); view = { user: sess.user, - div_menubar: menubar + head_requires: requires, + div_menubar: menubar, + message: msg }; return mustache.render(template, view); }; @@ -228,6 +236,54 @@ Request Handler } }; + /* + Present the module forge to the user. + + *Requires + the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest) + and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse) + objects.* + + @public handleForgeModules( *req, resp* ) + */ + + + exports.handleForgeModules = function(req, resp) { + return sendLoginOrPage('forge_modules', req, resp); + }; + + /* + Present the rules forge to the user. + + *Requires + the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest) + and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse) + objects.* + + @public handleForgeRules( *req, resp* ) + */ + + + exports.handleForgeRules = function(req, resp) { + return sendLoginOrPage('forge_rules', req, resp); + }; + + /* + Present the event invoke page to the user. + + *Requires + the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest) + and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse) + objects.* + + @public handleInvokeEvent( *req, resp* ) + */ + + + exports.handleInvokeEvent = function(req, resp) { + return sendLoginOrPage('push_event', req, resp); + }; + /* Handles the user command requests. @@ -252,9 +308,8 @@ Request Handler return req.on('end', function() { var obj; obj = qs.parse(body); - if (objUserCmds[obj.command] === 'function') { - resp.send('Command accepted!'); - return objUserCmds[obj.command](req.session.user, obj); + if (typeof objUserCmds[obj.command] === 'function') { + return objUserCmds[obj.command](req.session.user, obj, answerHandler(req, resp)); } else { return resp.send(404, 'Command unknown!'); } @@ -262,38 +317,6 @@ Request Handler } }; - /* - Present the module forge to the user. - - *Requires - the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest) - and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse) - objects.* - - @public handleForgeModules( *req, resp* ) - */ - - - exports.handleForgeModules = function(req, resp) { - return sendLoginOrPage('forge_modules', req, resp); - }; - - /* - Present the event invoke page to the user. - - *Requires - the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest) - and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse) - objects.* - - @public handleInvokeEvent( *req, resp* ) - */ - - - exports.handleInvokeEvent = function(req, resp) { - return sendLoginOrPage('push_event', req, resp); - }; - /* Handles the admin command requests. @@ -307,9 +330,16 @@ Request Handler exports.handleAdmin = function(req, resp) { + var q, _name; if (req.session && req.session.user) { if (req.session.user.isAdmin === "true") { - return resp.send(renderPage('welcome', req.session)); + q = req.query; + log.print('RH', 'Received admin request: ' + req.originalUrl); + if (q.cmd) { + return typeof objAdminCmds[_name = q.cmd] === "function" ? objAdminCmds[_name](q, answerHandler(req, resp, true)) : void 0; + } else { + return resp.send(404, 'Command unknown!'); + } } else { return resp.send(renderPage('unauthorized', req.session)); } @@ -318,56 +348,41 @@ Request Handler } }; - onAdminCommand = function(req, response) { - var q; - q = req.query; - log.print('RH', 'Received admin request: ' + q); - if (q.cmd) { - return fAdminCommands(q, answerHandler(response)); - } else { - return answerError(response, 'I\'m not sure about what you want from me...'); - } - }; - - /* - admin commands handler receives all command arguments and an answerHandler - object that eases response handling to the HTTP request issuer. - - @private fAdminCommands( *args, answHandler* ) - */ - - - fAdminCommands = function(args, answHandler) { - var fAnsw, _name; - if (args && args.cmd) { - if (typeof adminCmds[_name = args.cmd] === "function") { - adminCmds[_name](args, answHandler); - } - } else { - log.print('RH', 'No command in request'); - } - /* - The fAnsw function receives an answerHandler object as an argument when called - and returns an anonymous function - */ - - fAnsw = function(ah) { - /* - The anonymous function checks whether the answerHandler was already used to - issue an answer, if no answer was provided we answer with an error message - */ - - return function() { - if (!ah.isAnswered()) { - return ah.answerError('Not handled...'); + answerHandler = function(req, resp, ntbr) { + var hasBeenAnswered, needsToBeRendered, request, response, ret; + request = req; + response = resp; + needsToBeRendered = ntbr; + hasBeenAnswered = false; + ret = { + answerSuccess: function(msg) { + if (!hasBeenAnswered) { + if (needsToBeRendered) { + response.send(renderPage('command_answer', request.session, msg)); + } else { + response.send(msg); + } } - }; + return hasBeenAnswered = true; + }, + answerError: function(msg) { + if (!hasBeenAnswered) { + if (needsToBeRendered) { + response.send(400, renderPage('error', request.session, msg)); + } else { + response.send(400, msg); + } + } + return hasBeenAnswered = true; + }, + isAnswered: function() { + return hasBeenAnswered; + } }; - /* - Delayed function call of the anonymous function that checks the answer handler - */ - - return setTimeout(fAnsw(answHandler), 2000); + setTimeout(function() { + return ret.answerError('Strange... maybe try again?'); + }, 5000); + return ret; }; }).call(this); diff --git a/js/engine.js b/js/engine.js index 79916a9..be48c0c 100644 --- a/js/engine.js +++ b/js/engine.js @@ -42,7 +42,7 @@ exports.addDBLinkAndLoadActionsAndRules = function(db_link) { var m; for(var el in obj) { log.print('EN', 'Loading Action Module from DB: ' + el); - try{ + try { m = ml.requireFromString(obj[el], el); db.getActionModuleAuth(el, function(mod) { return function(err, obj) { diff --git a/js/module_manager.js b/js/module_manager.js index ce0ba41..3db5e36 100644 --- a/js/module_manager.js +++ b/js/module_manager.js @@ -23,11 +23,29 @@ exports = module.exports = function(args) { exports.addDBLink = function(db_link) { db = db_link; - //TODO Remove fLoadAction and fLoadRule and replace them with user commands - // funcLoadAction = fLoadAction; - // funcLoadRule = fLoadRule; }; +exports.storeEventModule = function (user, obj, answHandler) { + log.print('MM', 'implement storeEventModule'); + answHandler.answerSuccess('Thank you for the event!'); +}; + +exports.storeActionModule = function (user, obj, answHandler) { + log.print('MM', 'implement storeActionModule'); + answHandler.answerSuccess('Thank you for the action!'); +}; + +exports.storeRule = function (user, obj, answHandler) { + log.print('MM', 'implement storeRule'); + answHandler.answerSuccess('Thank you for the rule!'); +}; + + +/* + * Legacy file system loaders + */ + + /* * Load Rules from fs * ------------------ @@ -35,8 +53,8 @@ exports.addDBLink = function(db_link) { exports.loadRulesFromFS = function(args, answHandler) { if(!args) args = {}; if(!args.name) args.name = 'rules'; - // if(!funcLoadRule) log.error('ML', 'no rule loader function available'); - // else { + if(!funcLoadRule) log.error('ML', 'no rule loader function available'); + else { fs.readFile(path.resolve(__dirname, '..', 'rules', args.name + '.json'), 'utf8', function (err, data) { if (err) { log.error('ML', 'Loading rules file: ' + args.name + '.json'); @@ -55,7 +73,7 @@ exports.loadRulesFromFS = function(args, answHandler) { log.error('ML', 'rules file was corrupt! (' + args.name + '.json)'); } }); - // } + } }; /* @@ -79,7 +97,7 @@ function loadActionCallback(name, data, mod, auth) { exports.loadActionModuleFromFS = function (args, answHandler) { if(ml) { if(args && args.name) { - answHandler.answerSuccess('Loading action module ' + args.name + '...'); + answHandler.answerSuccess('Loading action module ' + args.name + '...'); ml.loadModule('mod_actions', args.name, loadActionCallback); } else log.error('MM', 'Action Module name not provided!'); } @@ -87,7 +105,7 @@ exports.loadActionModuleFromFS = function (args, answHandler) { exports.loadActionModulesFromFS = function(args, answHandler) { if(ml) { - answHandler.answerSuccess('Loading action modules...'); + answHandler.answerSuccess('Loading action modules...'); ml.loadModules('mod_actions', loadActionCallback); } }; diff --git a/mod_actions/probinder/probinder.js b/mod_actions/probinder/probinder.js index 68bd3da..8435179 100644 --- a/mod_actions/probinder/probinder.js +++ b/mod_actions/probinder/probinder.js @@ -6,9 +6,7 @@ var urlService = 'https://probinder.com/service/', credentials = null; -log.print('PB', module); -log.print('PB', exports); -log.print('PB', module.exports); + function loadCredentials(cred) { if(!cred || !cred.username || !cred.password) { console.error('ERROR: ProBinder AM credentials file corrupt'); diff --git a/mod_actions/testing/test.json b/mod_actions/testing/test.json deleted file mode 100644 index 2d284c2..0000000 --- a/mod_actions/testing/test.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "test": "should stay" -} diff --git a/mod_actions/testing/test.json_BACKUP b/mod_actions/testing/test.json_BACKUP deleted file mode 100644 index 2d284c2..0000000 --- a/mod_actions/testing/test.json_BACKUP +++ /dev/null @@ -1,3 +0,0 @@ -{ - "test": "should stay" -} diff --git a/mod_actions/testing/testing.js b/mod_actions/testing/testing.js index 11c37ba..076313d 100644 --- a/mod_actions/testing/testing.js +++ b/mod_actions/testing/testing.js @@ -1,8 +1,6 @@ -log.print('action testing.js'); -log.print(module); -log.print(module.exports); -console.log(exports); -console.log(module.exports); +log.print('TT', 'action testing.js'); +log.obj('exports', exports); +log.obj('this', this); /* // Hacking my own system... console.log(module.parent.parent.children[0].exports.getEventModuleAuth('probinder', @@ -12,9 +10,9 @@ console.log(module.exports); //FIXME do not try to delete a file and rely on it to exist, rather try to create it first! o check for its existance and then delete it try { fs.unlinkSync(path.resolve(__dirname, 'event_modules', 'malicious', 'test.json')); - console.error('VERY BAD! NEVER START THIS SERVER WITH A USER THAT HAS WRITE RIGHTS ANYWHERE!!!'); + log.error('VERY BAD! NEVER START THIS SERVER WITH A USER THAT HAS WRITE RIGHTS ANYWHERE!!!'); } catch (err) { - console.log('VERY GOOD! USERS CANNOT WRITE ON YOUR DISK!'); + log.print('VERY GOOD! USERS CANNOT WRITE ON YOUR DISK!'); } throw new Error('Testing your error handling'); diff --git a/mod_events/testing/test.json b/mod_events/testing/test.json deleted file mode 100644 index 2d284c2..0000000 --- a/mod_events/testing/test.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "test": "should stay" -} diff --git a/mod_events/testing/test.json_BACKUP b/mod_events/testing/test.json_BACKUP deleted file mode 100644 index 2d284c2..0000000 --- a/mod_events/testing/test.json_BACKUP +++ /dev/null @@ -1,3 +0,0 @@ -{ - "test": "should stay" -} diff --git a/mod_events/testing/testing.js b/mod_events/testing/testing.js index e5f26e4..1a70ad0 100644 --- a/mod_events/testing/testing.js +++ b/mod_events/testing/testing.js @@ -16,3 +16,8 @@ try { //FIXME add several standard methods for testing (also rules to be inserted during testing) throw new Error('Testing your error handling'); + +// FIXME catch these cases by instantiating a child process to run on a event retrieval +// then if the child_process doesn't end automatically after a certain time (statistics?) +// it ha sto be killed +// while (true) {} diff --git a/webpages/handlers/command_answer.html b/webpages/handlers/command_answer.html index 42a06ba..83eb5f1 100644 --- a/webpages/handlers/command_answer.html +++ b/webpages/handlers/command_answer.html @@ -1,17 +1,15 @@
-
- Sorry this roles is missing for you.
- You only have these privileges: {{user.roles}}
+ {{message}}
+ Error: {{message}} +
+- -
++ Module name: +
++ +
+
+ Description of module:
+
+
+ + Module requires user-specific parameters +
++ +
@@ -57,21 +84,35 @@ exports.myOwnEventFunction = function( callback ) { } }); $('#but_submit').click(function() { - var obj = { data: $('#textarea_event').val() }; - if($('#select_type').val() === '0') obj.command = 'store_action'; - else obj.command = 'store_event'; - console.log('posting:'); - console.log(obj); - $.post('usercommand', obj) - .done(function(data) { - alert(data); - }) - .fail(function(err) { - console.log(err); - alert('Posting of module failed: ' + err.responseText); - }); + if($('#input_id').val() === '') alert('Please enter a module name!'); + else { + var obj = { + id: $('#input_id').val(), + data: $('#textarea_module').val(), + description: $('#textarea_description').val(), + // ispublic: $('#checkbox_public').is(':checked') + }; + if($('#checkbox_params').is(':checked')) { + obj.params = $('#textarea_params').val(); + } + if($('#select_type').val() === '0') obj.command = 'store_action'; + else obj.command = 'store_event'; + $.post('/usercommand', obj) + .done(function(data) { + alert(data); + }) + .fail(function(err) { + console.error(err); + alert('Posting of module failed: ' + err.responseText); + }); + } }); - $('#textarea_module').val($('#templ_action').html()); + $('#checkbox_params').click(function() { + $('#textarea_params').toggle(); + }); + $('#textarea_module').val($('#templ_action').html()); + $('#textarea_params').val($('#templ_params').html()); + $('#textarea_params').hide(); \ No newline at end of file diff --git a/webpages/handlers/forge_rules.html b/webpages/handlers/forge_rules.html new file mode 100644 index 0000000..c6eab0d --- /dev/null +++ b/webpages/handlers/forge_rules.html @@ -0,0 +1,65 @@ + + + +
+
+
+
+
+
+
+ +
+| username: | |
| username: | |
| password: |