mirror of
https://github.com/Hopiu/webapi-eca.git
synced 2026-03-16 22:10:31 +00:00
182 lines
5.1 KiB
JavaScript
182 lines
5.1 KiB
JavaScript
var path = require('path'),
|
|
qs = require('querystring'),
|
|
log = require('./logging'),
|
|
db = require('./db_interface'),
|
|
mm = require('./module_manager'),
|
|
// ### Prepare the admin command handlers that are issued via HTTP requests. ###
|
|
objAdminCmds = {
|
|
'loadrules': mm.loadRulesFromFS,
|
|
'loadaction': mm.loadActionModuleFromFS,
|
|
'loadactions': mm.loadActionModulesFromFS,
|
|
'loadevent': mm.loadEventModuleFromFS,
|
|
'loadevents': mm.loadEventModulesFromFS
|
|
};
|
|
|
|
exports = module.exports = function(args) {
|
|
args = args || {};
|
|
log(args);
|
|
db(args);
|
|
mm(args);
|
|
mm.addDBLink(db);
|
|
var users = JSON.parse(require('fs').readFileSync(path.resolve(__dirname, '..', 'config', 'users.json')));
|
|
for(var name in users) {
|
|
db.storeUser(users[name]);
|
|
}
|
|
log.print('RS', 'Initialzing module manager');
|
|
|
|
return module.exports;
|
|
};
|
|
|
|
exports.addHandler = function(fShutdown) {
|
|
objAdminCmds.shutdown = fShutdown;
|
|
};
|
|
|
|
exports.handleRequest = function(req, resp) {
|
|
req.on('end', function () {
|
|
resp.end();
|
|
});
|
|
if(req.session && req.session.user) {
|
|
resp.send('You\'re logged in');
|
|
} else resp.sendfile(path.resolve(__dirname, '..', 'webpages', 'handlers', 'login.html'));
|
|
// resp.end();
|
|
log.print('UH', 'last: '+ req.session.lastPage);
|
|
req.session.lastPage = req.originalUrl;
|
|
log.print('UH', 'last: '+ req.session.lastPage);
|
|
log.print('UH', 'retrieved req: '+ req.originalUrl);
|
|
// console.log(req);
|
|
};
|
|
|
|
exports.handleLogin = function(req, resp) {
|
|
var body = '';
|
|
req.on('data', function (data) { body += data; });
|
|
req.on('end', function () {
|
|
if(!req.session || !req.session.user) {
|
|
var obj = qs.parse(body);
|
|
db.loginUser(obj.username, obj.password, function(err, obj) {
|
|
if(!err) req.session.user = obj;
|
|
if(req.session.user) {
|
|
resp.write('Welcome ' + req.session.user.name + '!');
|
|
} else {
|
|
resp.writeHead(401, { "Content-Type": "text/plain" });
|
|
resp.write('Login failed!');
|
|
}
|
|
resp.end();
|
|
});
|
|
}
|
|
});
|
|
};
|
|
|
|
function answerHandler(r) {
|
|
var response = r, hasBeenAnswered = false;
|
|
function postAnswer(msg) {
|
|
if(!hasBeenAnswered) {
|
|
response.write(msg);
|
|
response.end();
|
|
hasBeenAnswered = true;
|
|
}
|
|
}
|
|
return {
|
|
answerSuccess: function(msg) {
|
|
if(!hasBeenAnswered) response.writeHead(200, { "Content-Type": "text/plain" });
|
|
postAnswer(msg);
|
|
},
|
|
answerError: function(msg) {
|
|
if(!hasBeenAnswered) response.writeHead(400, { "Content-Type": "text/plain" });
|
|
postAnswer(msg);
|
|
},
|
|
isAnswered: function() { return hasBeenAnswered; }
|
|
};
|
|
};
|
|
|
|
//TODO add loadUsers as directive to admin commands
|
|
exports.loadUsers = function () {
|
|
var users = JSON.parse(fs.readFileSync(path.resolve(__dirname, '..', 'users.json')));
|
|
for(var name in users) {
|
|
db.storeUser(users[name]);
|
|
}
|
|
};
|
|
|
|
function onAdminCommand(request, response) {
|
|
var q = request.query;
|
|
log.print('HL', 'Received admin request: ' + request.originalUrl);
|
|
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...');
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
admin commands handler receives all command arguments and an answerHandler
|
|
object that eases response handling to the HTTP request issuer.
|
|
|
|
@private fAdminCommands( *args, answHandler* )
|
|
*/
|
|
|
|
|
|
function fAdminCommands(args, answHandler) {
|
|
var fAnsw, _name;
|
|
if (args && args.cmd) {
|
|
if (typeof objAdminCmds[_name = args.cmd] === "function") {
|
|
objAdminCmds[_name](args, answHandler);
|
|
}
|
|
} else {
|
|
log.print('RS', '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...');
|
|
}
|
|
};
|
|
};
|
|
/*
|
|
Delayed function call of the anonymous function that checks the answer handler
|
|
*/
|
|
|
|
return setTimeout(fAnsw(answHandler), 2000);
|
|
};
|
|
|
|
|
|
/*
|
|
###
|
|
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 'RS', '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
|
|
*/
|