openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
207 lines (184 loc) • 6.79 kB
text/coffeescript
should = require "should"
sinon = require "sinon"
rewire = require "rewire"
authorisation = rewire "../../lib/middleware/authorisation"
Channel = require("../../lib/model/channels").Channel
truthy = -> return true
falsey = -> return false
describe "Authorisation middleware", ->
describe ".authorise(ctx, done)", ->
it "should allow a request if the client is authorised to use the channel by role", (done) ->
# Setup a channel for the mock endpoint
channel = new Channel
name: "Authorisation mock channel 1"
urlPattern: "test/authorisation"
allow: [ "PoC", "Test1", "Test2" ]
routes: [
name: "test route"
host: "localhost"
port: 9876
primary: true
]
# Setup test data, will need authentication mechanisms to set ctx.authenticated
ctx = {}
ctx.authenticated =
clientID: "Musha_OpenMRS"
domain: "poc1.jembi.org"
name: "OpenMRS Musha instance"
roles: [ "OpenMRS_PoC", "PoC" ]
passwordHash: ""
cert: ""
ctx.matchingChannel = channel
ctx.request = {}
ctx.request.url = "test/authorisation"
ctx.request.path = "test/authorisation"
ctx.response = {}
authorisation.authorise ctx, ->
ctx.authorisedChannel.should.exist
done()
it "should deny a request if the client is NOT authorised to use the channel by role", (done) ->
# Setup a channel for the mock endpoint
channel = new Channel
name: "Authorisation mock channel 2"
urlPattern: "test/authorisation"
allow: [ "Something-else" ]
routes: [
name: "test route"
host: "localhost"
port: 9876
primary: true
]
# Setup test data, will need authentication mechanisms to set ctx.authenticated
ctx = {}
ctx.authenticated =
clientID: "Musha_OpenMRS"
domain: "poc1.jembi.org"
name: "OpenMRS Musha instance"
roles: [ "OpenMRS_PoC", "PoC" ]
passwordHash: ""
cert: ""
ctx.matchingChannel = channel
ctx.request = {}
ctx.request.url = "test/authorisation"
ctx.request.path = "test/authorisation"
ctx.response = {}
ctx.set = ->
authorisation.authorise ctx, ->
(ctx.authorisedChannel == undefined).should.be.true
ctx.response.status.should.be.exactly 401
done()
it "should allow a request if the client is authorised to use the channel by clientID", (done) ->
# Setup a channel for the mock endpoint
channel = new Channel
name: "Authorisation mock channel 3"
urlPattern: "test/authorisation"
allow: [ "Test1", "Musha_OpenMRS", "Test2" ]
routes: [
name: "test route"
host: "localhost"
port: 9876
primary: true
]
# Setup test data, will need authentication mechanisms to set ctx.authenticated
ctx = {}
ctx.authenticated =
clientID: "Musha_OpenMRS"
domain: "poc1.jembi.org"
name: "OpenMRS Musha instance"
roles: [ "OpenMRS_PoC", "PoC" ]
passwordHash: ""
cert: ""
ctx.matchingChannel = channel
ctx.request = {}
ctx.request.url = "test/authorisation"
ctx.request.path = "test/authorisation"
ctx.response = {}
authorisation.authorise ctx, ->
ctx.authorisedChannel.should.exist
done()
describe '.genAuthAudit', ->
it 'should generate an audit with the remoteAddress included', ->
audit = authorisation.genAuthAudit '1.2.3.4'
audit.should.be.ok()
audit.should.match /ParticipantObjectID="1\.2\.3\.4"/
describe '.authoriseClient', ->
it 'should return true for a valid client, authorised client by role', ->
ctx =
authenticated:
roles: [ 'admin', 'test' ]
channel =
allow: [ 'something', 'admin' ]
authoriseClient = authorisation.__get__ 'authoriseClient'
actual = authoriseClient channel, ctx
actual.should.be.true()
it 'should return false for a invalid client, authorised client by role', ->
ctx =
authenticated:
roles: [ 'admin', 'test' ]
channel =
allow: [ 'another', 'notme' ]
authoriseClient = authorisation.__get__ 'authoriseClient'
actual = authoriseClient channel, ctx
actual.should.be.false()
it 'should return true for a valid client, authorised client by role', ->
ctx =
authenticated:
roles: [ 'test1', 'test2' ]
clientID: 'client1'
channel =
allow: [ 'something', 'admin', 'client1' ]
authoriseClient = authorisation.__get__ 'authoriseClient'
actual = authoriseClient channel, ctx
actual.should.be.true()
it 'should return false for a invalid client, authorised client by role', ->
ctx =
authenticated:
roles: [ 'test1', 'test2' ]
clientID: 'client2'
channel =
allow: [ 'something', 'admin', 'client1' ]
authoriseClient = authorisation.__get__ 'authoriseClient'
actual = authoriseClient channel, ctx
actual.should.be.false()
it 'should return false for if there is no authenticated client', ->
ctx = {}
channel =
allow: [ 'something', 'admin', 'client1' ]
authoriseClient = authorisation.__get__ 'authoriseClient'
actual = authoriseClient channel, ctx
actual.should.be.false()
it 'should return false if allows is null', ->
ctx =
authenticated:
roles: [ 'test1', 'test2' ]
clientID: 'client2'
channel =
allow: null
authoriseClient = authorisation.__get__ 'authoriseClient'
actual = authoriseClient channel, ctx
actual.should.be.false()
describe 'authoriseIP', ->
it 'should return true if the client IP is in the whitelist', ->
ctx =
ip: '192.168.0.11'
channel =
whitelist: [ '192.168.0.11' ]
authoriseIP = authorisation.__get__ 'authoriseIP'
actual = authoriseIP channel, ctx
actual.should.be.true()
it 'should return false if the client IP isnt in the whitelist', ->
ctx =
ip: '192.168.0.11'
channel =
whitelist: [ '192.168.0.15' ]
authoriseIP = authorisation.__get__ 'authoriseIP'
actual = authoriseIP channel, ctx
actual.should.be.false()
it 'should return true if there are no whitelist entires', ->
ctx =
ip: '192.168.0.11'
channel =
whitelist: null
authoriseIP = authorisation.__get__ 'authoriseIP'
actual = authoriseIP channel, ctx
actual.should.be.true()