Skip to content
This repository was archived by the owner on Apr 8, 2019. It is now read-only.

[Assignment 4] Basic Authentication #182

Merged
merged 3 commits into from
Feb 11, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions .eslintrc

This file was deleted.

1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ config.json
*/._*
*/*/._*
coverage.*
.settings
6 changes: 3 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
language: node_js

node_js:
- 0.10
- 0.12
- iojs
- 4.0
- 4
- 5
8 changes: 0 additions & 8 deletions Makefile

This file was deleted.

16 changes: 9 additions & 7 deletions lib/index.js
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,26 +1,28 @@
'use strict';

// Load modules

var Hapi = require('hapi');
var Version = require('./version');
const Hapi = require('hapi');
const Version = require('./version');
const Private = require('./private');


// Declare internals

var internals = {};
const internals = {};


exports.init = function (port, next) {

var server = new Hapi.Server();
const server = new Hapi.Server();
server.connection({ port: port });

server.register(Version, function (err) {
server.register([Version, Private], (err) => {

if (err) {
return next(err);
}

server.start(function (err) {
server.start((err) => {

return next(err, server);
});
Expand Down
57 changes: 57 additions & 0 deletions lib/private.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
'use strict';

// Load modules

const Basic = require('hapi-auth-basic');
const Users = require('./users.json');


// Declare internals

const internals = {};


internals.validateFunc = function (request, username, password, callback) {

const user = Users[username];
if (!user || user.password !== password) {
return callback(null, false);
}

user.username = username;

return callback(null, true, user);
};


exports.register = function (server, options, next) {

server.register(Basic, (err) => {

if (err) {
return next(err);
}

server.auth.strategy('basic', 'basic', { validateFunc: internals.validateFunc });
server.route({
method: 'GET',
path: '/private',
config: {
auth: 'basic',
description: 'Returns a greeting message to the authenticated user',
handler: function (request, reply) {

const html = '<div>Hello ' + request.auth.credentials.username + '</div>';
return reply(html);
}
}
});

return next();
});
};


exports.register.attributes = {
name: 'Private'
};
11 changes: 6 additions & 5 deletions lib/start.js
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
'use strict';

// Load modules

var Hoek = require('hoek');
var Server = require('./index');
const Hoek = require('hoek');
const Server = require('./index');


// Declare internals

var internals = {};
const internals = {};


Server.init(8000, function (err, server) {
Server.init(8000, (err, server) => {

Hoek.assert(!err, err);
console.log('Server started at: ' + server.info.uri);
});

8 changes: 8 additions & 0 deletions lib/users.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"foo": {
"password": "foo"
},
"bar": {
"password": "bar"
}
}
8 changes: 5 additions & 3 deletions lib/version.js
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
'use strict';

// Load modules

var Pkg = require('../package.json');
const Package = require('../package.json');


// Declare internals

var internals = {
const internals = {
response: {
version: Pkg.version
version: Package.version
}
};

Expand Down
24 changes: 13 additions & 11 deletions package.json
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,32 +1,34 @@
{
"name": "hueniversity",
"version": "0.0.3",
"name": "hapi-university",
"version": "0.0.4",
"description": "Community learning experiment",
"main": "lib/index.js",
"repository": {
"type": "git",
"url": "https://github.com/hueniverse/hueniversity.git"
"url": "https://github.com/hapijs/university.git"
},
"keywords": [
"hapi",
"learn",
"community"
],
"license": "BSD",
"license": "BSD-3-Clause",
"bugs": {
"url": "https://github.com/hueniverse/hueniversity/issues"
"url": "https://github.com/hapijs/university/issues"
},
"homepage": "https://github.com/hueniverse/hueniversity",
"homepage": "https://github.com/hapijs/university",
"dependencies": {
"hapi": "8.x.x",
"hoek": "2.x.x"
"hapi": "12.x.x",
"hapi-auth-basic": "4.x.x",
"hoek": "3.x.x"
},
"scripts": {
"test": "node node_modules/lab/bin/lab -a code -t 100 -L",
"test": "lab -a code -t 100 -L -v",
"test-cov-html": "lab -a code -L -r html -o coverage.html",
"start": "node lib/start.js"
},
"devDependencies": {
"code": "1.x.x",
"lab": "5.x.x"
"code": "2.x.x",
"lab": "8.x.x"
}
}
34 changes: 18 additions & 16 deletions test/index.js
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,23 +1,24 @@
'use strict';

// Load modules

var Hapi = require('hapi');
var Code = require('code');
var Lab = require('lab');
var Hueniversity = require('../lib');
var Version = require('../lib/version');
const Hapi = require('hapi');
const Code = require('code');
const Lab = require('lab');
const University = require('../lib');
const Version = require('../lib/version');


// Test shortcuts

var lab = exports.lab = Lab.script();
var describe = lab.experiment;
var expect = Code.expect;
var it = lab.test;
const lab = exports.lab = Lab.script();
const expect = Code.expect;
const it = lab.test;


it('starts server and returns hapi server object', function (done) {
it('starts server and returns hapi server object', (done) => {

Hueniversity.init(0, function (err, server) {
University.init(0, (err, server) => {

expect(err).to.not.exist();
expect(server).to.be.instanceof(Hapi.Server);
Expand All @@ -26,9 +27,9 @@ it('starts server and returns hapi server object', function (done) {
});
});

it('starts server on provided port', function (done) {
it('starts server on provided port', (done) => {

Hueniversity.init(5000, function (err, server) {
University.init(5000, (err, server) => {

expect(err).to.not.exist();
expect(server.info.port).to.equal(5000);
Expand All @@ -37,9 +38,10 @@ it('starts server on provided port', function (done) {
});
});

it('handles register plugin errors', { parallel: false }, function (done) {
it('handles register plugin errors', { parallel: false }, (done) => {

const orig = Version.register;

var orig = Version.register;
Version.register = function (server, options, next) {

Version.register = orig;
Expand All @@ -50,7 +52,7 @@ it('handles register plugin errors', { parallel: false }, function (done) {
name: 'fake version'
};

Hueniversity.init(0, function (err, server) {
University.init(0, (err, server) => {

expect(err).to.exist();
expect(err.message).to.equal('register version failed');
Expand Down
103 changes: 103 additions & 0 deletions test/private.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
'use strict';

// Load modules

const Code = require('code');
const Lab = require('lab');
const University = require('../lib');
const Users = require('../lib/users.json');
const Basic = require('hapi-auth-basic');


// Declare internals

const internals = {};


// Test shortcuts

const lab = exports.lab = Lab.script();
const describe = lab.experiment;
const expect = Code.expect;
const it = lab.test;


describe('/private', () => {

it('returns a greeting for the authenticated user', (done) => {

University.init(0, (err, server) => {

expect(err).to.not.exist();

const request = { method: 'GET', url: '/private', headers: { authorization: internals.header('foo', Users.foo.password) } };
server.inject(request, (res) => {

expect(res.statusCode, 'Status Code').to.equal(200);
expect(res.result, 'result').to.equal('<div>Hello foo</div>');

server.stop(done);
});
});
});

it('errors on wrong password', (done) => {

University.init(0, (err, server) => {

expect(err).to.not.exist();

const request = { method: 'GET', url: '/private', headers: { authorization: internals.header('foo', '') } };
server.inject(request, (res) => {

expect(res.statusCode, 'Status code').to.equal(401);

server.stop(done);
});
});
});

it('errors on failed auth', (done) => {

University.init(0, (err, server) => {

expect(err).to.not.exist();

const request = { method: 'GET', url: '/private', headers: { authorization: internals.header('I do not exist', '') } };
server.inject(request, (res) => {

expect(res.statusCode, 'Status code').to.equal(401);

server.stop(done);
});
});
});

it('errors on failed registering of auth', { parallel: false }, (done) => {

const orig = Basic.register;

Basic.register = function (plugin, options, next) {

Basic.register = orig;
return next(new Error('fail'));
};

Basic.register.attributes = {
name: 'fake hapi-auth-basic'
};

University.init(0, (err) => {

expect(err).to.exist();

done();
});
});
});


internals.header = function (username, password) {

return 'Basic ' + (new Buffer(username + ':' + password, 'utf8')).toString('base64');
};
Loading