webapi-eca/coffee/request_handler.coffee
Dominic Bosch 8192eee64d Login functionality successfully implemented,
switched crypto to crypto-js from google. login.html form loads cryptojs directly from google codebase in order to hash passwords before sending them to the server
2013-11-28 16:04:03 +01:00

138 lines
3.7 KiB
CoffeeScript

###
User Handler
============
> TODO Add documentation
###
fs = require 'fs'
path = require 'path'
qs = require 'querystring'
# Requires:
# - The [Logging](logging.html) module
log = require './logging'
# - The [DB Interface](db_interface.html) module
db = require './db_interface'
# - The [Module Manager](module_manager.html) module
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 = ( args ) ->
args = args ? {}
log args
db args
mm args
mm.addDBLink db
users = JSON.parse fs.readFileSync path.resolve __dirname, '..', 'config', 'users.json'
db.storeUser user for user in users
module.exports
exports.addShutdownHandler = ( fShutdown ) ->
objAdminCmds.shutdown = fShutdown
exports.handleRequest = ( req, resp ) ->
req.on 'end', -> resp.end()
if req.session and req.session.user
resp.send 'You\'re logged in'
else
resp.sendfile path.resolve __dirname, '..', 'webpages', 'handlers', 'login.html'
req.session.lastPage = req.originalUrl
exports.handleLogin = ( req, resp ) ->
body = ''
req.on 'data', ( data ) -> body += data
req.on 'end', ->
if not req.session or not req.session.user
obj = qs.parse body
db.loginUser obj.username, obj.password, ( err, obj ) ->
if not 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()
else
resp.write 'Welcome ' + req.session.user.name + '!'
resp.end()
answerHandler = ( resp ) ->
hasBeenAnswered = false
postAnswer( msg ) ->
if not hasBeenAnswered
resp.write msg
resp.end()
hasBeenAnswered = true
{
answerSuccess: ( msg ) ->
if not hasBeenAnswered
postAnswer msg,
answerError: ( msg ) ->
if not hasBeenAnswered
resp.writeHead 400, { "Content-Type": "text/plain" }
postAnswer msg,
isAnswered: -> hasBeenAnswered
}
# TODO add loadUsers as directive to admin commands
# exports.loadUsers = ->
# var users = JSON.parse(fs.readFileSync(path.resolve(__dirname, '..', 'users.json')));
# for(var name in users) {
# db.storeUser(users[name]);
# }
# };
onAdminCommand = ( req, response ) ->
q = req.query;
log.print 'HL', 'Received admin request: ' + req.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* )
###
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