2016-12-10 07:47:58 +07:00
|
|
|
|
|
|
|
var assert = require('assert');
|
2016-12-17 08:06:40 +07:00
|
|
|
var authentication = require('../src/lib/authentication');
|
2016-12-10 07:47:58 +07:00
|
|
|
var create_res_mock = require('./res_mock');
|
|
|
|
var sinon = require('sinon');
|
|
|
|
var sinonPromise = require('sinon-promise');
|
|
|
|
sinonPromise(sinon);
|
|
|
|
|
|
|
|
var autoResolving = sinon.promise().resolves();
|
|
|
|
|
|
|
|
function create_req_mock(token) {
|
|
|
|
return {
|
|
|
|
body: {
|
|
|
|
username: 'username',
|
|
|
|
password: 'password',
|
|
|
|
token: token
|
|
|
|
},
|
|
|
|
cookies: {
|
|
|
|
'access_token': 'cookie_token'
|
2016-12-17 08:06:40 +07:00
|
|
|
},
|
|
|
|
app: {
|
|
|
|
get: sinon.stub()
|
2016-12-10 07:47:58 +07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function create_mocks() {
|
|
|
|
var totp_token = 'totp_token';
|
|
|
|
var jwt_token = 'jwt_token';
|
|
|
|
|
|
|
|
var res_mock = create_res_mock();
|
|
|
|
var req_mock = create_req_mock(totp_token);
|
|
|
|
var bind_mock = sinon.mock();
|
|
|
|
var totp_mock = sinon.mock();
|
|
|
|
var sign_mock = sinon.mock();
|
|
|
|
var verify_mock = sinon.promise();
|
|
|
|
var jwt = {
|
|
|
|
sign: sign_mock,
|
|
|
|
verify: verify_mock
|
|
|
|
};
|
|
|
|
var ldap_interface_mock = {
|
|
|
|
bind: bind_mock
|
|
|
|
};
|
|
|
|
var totp_interface_mock = {
|
|
|
|
totp: totp_mock
|
|
|
|
};
|
|
|
|
|
|
|
|
bind_mock.yields();
|
|
|
|
totp_mock.returns(totp_token);
|
|
|
|
sign_mock.returns(jwt_token);
|
|
|
|
|
|
|
|
var args = {
|
|
|
|
totp_secret: 'totp_secret',
|
|
|
|
jwt: jwt,
|
|
|
|
jwt_expiration_time: '1h',
|
|
|
|
users_dn: 'dc=example,dc=com',
|
|
|
|
ldap_interface: ldap_interface_mock,
|
|
|
|
totp_interface: totp_interface_mock
|
|
|
|
}
|
|
|
|
|
2016-12-17 08:06:40 +07:00
|
|
|
req_mock.app.get.withArgs('ldap client').returns(args.ldap_interface);
|
|
|
|
req_mock.app.get.withArgs('jwt engine').returns(args.jwt);
|
|
|
|
req_mock.app.get.withArgs('totp engine').returns(args.totp_interface);
|
|
|
|
req_mock.app.get.withArgs('config').returns({
|
|
|
|
totp_secret: 'totp_secret',
|
|
|
|
ldap_users_dn: 'ou=users,dc=example,dc=com'
|
|
|
|
});
|
|
|
|
|
2016-12-10 07:47:58 +07:00
|
|
|
return {
|
|
|
|
req: req_mock,
|
|
|
|
res: res_mock,
|
|
|
|
args: args,
|
|
|
|
totp: totp_mock,
|
|
|
|
jwt: jwt
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
describe('test jwt', function() {
|
|
|
|
describe('test authentication', function() {
|
|
|
|
it('should authenticate user successfuly', function(done) {
|
|
|
|
var jwt_token = 'jwt_token';
|
|
|
|
var clock = sinon.useFakeTimers();
|
|
|
|
var mocks = create_mocks();
|
2016-12-17 08:06:40 +07:00
|
|
|
authentication.authenticate(mocks.req, mocks.res)
|
2016-12-10 07:47:58 +07:00
|
|
|
.then(function() {
|
|
|
|
clock.restore();
|
2016-12-17 08:06:40 +07:00
|
|
|
assert(mocks.res.status.calledWith(200));
|
|
|
|
assert(mocks.res.send.calledWith(jwt_token));
|
2016-12-10 07:47:58 +07:00
|
|
|
done();
|
|
|
|
})
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should fail authentication', function(done) {
|
|
|
|
var clock = sinon.useFakeTimers();
|
|
|
|
var mocks = create_mocks();
|
|
|
|
mocks.totp.returns('wrong token');
|
2016-12-17 08:06:40 +07:00
|
|
|
authentication.authenticate(mocks.req, mocks.res)
|
2016-12-10 07:47:58 +07:00
|
|
|
.fail(function(err) {
|
|
|
|
clock.restore();
|
|
|
|
done();
|
|
|
|
})
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
describe('test verify authentication', function() {
|
|
|
|
it('should be already authenticated', function(done) {
|
|
|
|
var mocks = create_mocks();
|
|
|
|
var data = { user: 'username' };
|
2016-12-17 08:06:40 +07:00
|
|
|
mocks.req.app.get.withArgs('jwt engine').returns({
|
|
|
|
verify: sinon.promise().resolves(data)
|
|
|
|
});
|
|
|
|
|
|
|
|
authentication.verify(mocks.req, mocks.res)
|
2016-12-10 07:47:58 +07:00
|
|
|
.then(function(actual_data) {
|
|
|
|
assert.equal(actual_data, data);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should not be already authenticated', function(done) {
|
|
|
|
var mocks = create_mocks();
|
|
|
|
var data = { user: 'username' };
|
2016-12-17 08:06:40 +07:00
|
|
|
mocks.req.app.get.withArgs('jwt engine').returns({
|
|
|
|
verify: sinon.promise().rejects('Error with JWT token')
|
|
|
|
});
|
|
|
|
return authentication.verify(mocks.req, mocks.res, mocks.args)
|
2016-12-10 07:47:58 +07:00
|
|
|
.fail(function() {
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|