openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
166 lines (143 loc) • 5.39 kB
text/coffeescript
should = require "should"
request = require "supertest"
server = require "../../lib/server"
User = require('../../lib/model/users').User
crypto = require "crypto"
describe "API Integration Tests", ->
describe 'General API tests', ->
user = new User
firstname: 'Bill'
surname: 'Murray'
email: 'bfm@crazy.net'
passwordAlgorithm: 'sha512'
passwordHash: '669c981d4edccb5ed61f4d77f9fcc4bf594443e2740feb1a23f133bdaf80aae41804d10aa2ce254cfb6aca7c497d1a717f2dd9a794134217219d8755a84b6b4e'
passwordSalt: '22a61686-66f6-483c-a524-185aac251fb0'
groups: [ 'HISP', 'admin' ]
before (done) ->
server.start apiPort: 8080, ->
user.save ->
done()
after (done) ->
User.remove {}, ->
server.stop ->
done();
it 'should set the cross-origin resource sharing headers', (done) ->
request("https://localhost:8080")
.get("/authenticate/bfm@crazy.net")
.expect(200)
.expect('Access-Control-Allow-Origin', '*')
.expect('Access-Control-Allow-Methods', 'GET,HEAD,PUT,POST,DELETE')
.end (err, res) ->
if err
done err
else
done()
it 'should disallow access if no API authentication details are provided', (done) ->
request("https://localhost:8080")
.get("/channels")
.expect(401)
.end (err, res) ->
if err
done err
else
done()
it 'should disallow access if token does not match', (done) ->
request("https://localhost:8080")
.get("/authenticate/bfm@crazy.net")
.expect(200)
.end (err, res) ->
if err
done err
else
passwordsalt = res.body.salt
passwordhash = crypto.createHash('sha512');
passwordhash.update(passwordsalt);
passwordhash.update('password');
authTS = new Date().toISOString()
requestsalt = '842cd4a0-1a91-45a7-bf76-c292cb36b2e8'
tokenhash = crypto.createHash('sha512');
tokenhash.update(passwordhash.digest('hex'));
tokenhash.update(requestsalt);
tokenhash.update(authTS);
request("https://localhost:8080")
.get("/channels")
.set("auth-username", "bfm@crazy.net")
.set("auth-ts", authTS)
.set("auth-salt", requestsalt + 'incorrect')
.set("auth-token", tokenhash.digest('hex'))
.expect(401)
.end (err, res) ->
if err
done err
else
done()
it 'should allow access if correct API authentication details are provided', (done) ->
request("https://localhost:8080")
.get("/authenticate/bfm@crazy.net")
.expect(200)
.end (err, res) ->
if err
done err
else
passwordsalt = res.body.salt
passwordhash = crypto.createHash('sha512');
passwordhash.update(passwordsalt);
passwordhash.update('password');
authTS = new Date().toISOString()
requestsalt = '842cd4a0-1a91-45a7-bf76-c292cb36b2e8'
tokenhash = crypto.createHash('sha512');
hashStr = passwordhash.digest('hex')
tokenhash.update(hashStr);
tokenhash.update(requestsalt);
tokenhash.update(authTS);
request("https://localhost:8080")
.get("/channels")
.set("auth-username", "bfm@crazy.net")
.set("auth-ts", authTS)
.set("auth-salt", requestsalt)
.set("auth-token", tokenhash.digest('hex'))
.expect(200)
.end (err, res) ->
if err
done err
else
done()
it 'should disallow access if the request is too old', (done) ->
request("https://localhost:8080")
.get("/authenticate/bfm@crazy.net")
.expect(200)
.end (err, res) ->
if err
done err
else
passwordsalt = res.body.salt
passwordhash = crypto.createHash('sha512');
passwordhash.update(passwordsalt);
passwordhash.update('password');
authTS = new Date()
authTS.setSeconds(authTS.getSeconds() - 13);
authTS = authTS.toISOString()
requestsalt = '842cd4a0-1a91-45a7-bf76-c292cb36b2e8'
tokenhash = crypto.createHash('sha512');
tokenhash.update(passwordhash.digest('hex'));
tokenhash.update(requestsalt);
tokenhash.update(authTS);
request("https://localhost:8080")
.get("/channels")
.set("auth-username", "bfm@crazy.net")
.set("auth-ts", authTS)
.set("auth-salt", requestsalt)
.set("auth-token", tokenhash.digest('hex'))
.expect(401)
.end (err, res) ->
if err
done err
else
done()