From 3a7c1af834b5cf86f56227dbd2d249049370a099 Mon Sep 17 00:00:00 2001 From: Apoorva Korde Date: Thu, 4 Feb 2016 15:35:22 +0530 Subject: [PATCH 1/3] Basic Authentication --- .eslintrc | 8 ---- .gitignore | 1 + .travis.yml | 6 +-- Makefile | 8 ---- lib/index.js | 16 ++++---- lib/private.js | 57 +++++++++++++++++++++++++++ lib/start.js | 11 +++--- lib/users.json | 8 ++++ lib/version.js | 8 ++-- package.json | 24 +++++------ test/index.js | 33 ++++++++-------- test/private.js | 103 ++++++++++++++++++++++++++++++++++++++++++++++++ test/version.js | 28 +++++++------ 13 files changed, 237 insertions(+), 74 deletions(-) delete mode 100644 .eslintrc delete mode 100644 Makefile create mode 100644 lib/private.js create mode 100644 lib/users.json mode change 100755 => 100644 package.json create mode 100644 test/private.js diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 7046893..0000000 --- a/.eslintrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "./node_modules/lab/lib/linters/eslint/.eslintrc", - "rules": { - // Override any settings from the "parent" configuration - "hapi/no-shadow-relaxed": [1, { "ignore": ["err", "done", "server", "next", "res"] }], - } -} - diff --git a/.gitignore b/.gitignore index 12db069..c67999d 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ config.json */._* */*/._* coverage.* +.settings diff --git a/.travis.yml b/.travis.yml index f502178..f8f7d5c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - - 0.10 - - 0.12 - - iojs + - 4.0 + - 4 + - 5 diff --git a/Makefile b/Makefile deleted file mode 100644 index 83aaf0c..0000000 --- a/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -test: - @node node_modules/lab/bin/lab -a code -test-cov: - @node node_modules/lab/bin/lab -a code -t 100 -L -test-cov-html: - @node node_modules/lab/bin/lab -a code -r html -o coverage.html - -.PHONY: test test-cov test-cov-html diff --git a/lib/index.js b/lib/index.js index 74a77b4..fc68d50 100755 --- a/lib/index.js +++ b/lib/index.js @@ -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); }); diff --git a/lib/private.js b/lib/private.js new file mode 100644 index 0000000..e3902b5 --- /dev/null +++ b/lib/private.js @@ -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 = '
Hello ' + request.auth.credentials.username + '
'; + return reply(html); + } + } + }); + + return next(); + }); +}; + + +exports.register.attributes = { + name: 'Private' +}; diff --git a/lib/start.js b/lib/start.js index 15cefb4..b883bc7 100755 --- a/lib/start.js +++ b/lib/start.js @@ -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); }); - diff --git a/lib/users.json b/lib/users.json new file mode 100644 index 0000000..ac4476c --- /dev/null +++ b/lib/users.json @@ -0,0 +1,8 @@ +{ + "foo": { + "password": "foo" + }, + "bar": { + "password": "bar" + } +} diff --git a/lib/version.js b/lib/version.js index 47aa99c..18be841 100755 --- a/lib/version.js +++ b/lib/version.js @@ -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 } }; diff --git a/package.json b/package.json old mode 100755 new mode 100644 index e45972e..37f2e0f --- a/package.json +++ b/package.json @@ -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" } } diff --git a/test/index.js b/test/index.js index 2d7900f..f9ca0f1 100755 --- a/test/index.js +++ b/test/index.js @@ -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); @@ -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); @@ -37,9 +38,9 @@ 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) => { - var orig = Version.register; + const orig = Version.register; Version.register = function (server, options, next) { Version.register = orig; @@ -50,7 +51,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'); diff --git a/test/private.js b/test/private.js new file mode 100644 index 0000000..73c9569 --- /dev/null +++ b/test/private.js @@ -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('
Hello foo
'); + + 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'); +}; diff --git a/test/version.js b/test/version.js index dfd2601..c75a196 100755 --- a/test/version.js +++ b/test/version.js @@ -1,31 +1,33 @@ +'use strict'; + // Load modules -var Code = require('code'); -var Lab = require('lab'); -var Pkg = require('../package.json'); -var Server = require('../lib'); +const Code = require('code'); +const Lab = require('lab'); +const Package = require('../package.json'); +const University = require('../lib'); // 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 describe = lab.experiment; +const expect = Code.expect; +const it = lab.test; -describe('/version', function () { +describe('/version', () => { - it('returns the version from package.json', function (done) { + it('returns the version from package.json', (done) => { - Server.init(0, function (err, server) { + University.init(0, (err, server) => { expect(err).to.not.exist(); - server.inject('/version', function (res) { + server.inject('/version', (res) => { expect(res.statusCode).to.equal(200); - expect(res.result).to.deep.equal({ version: Pkg.version }); + expect(res.result).to.deep.equal({ version: Package.version }); server.stop(done); }); From 99f9be137d0dcee88c2e66471a19573e9bff78a6 Mon Sep 17 00:00:00 2001 From: Apoorva Korde Date: Thu, 4 Feb 2016 16:13:33 +0530 Subject: [PATCH 2/3] Cleanup --- lib/index.js | 0 lib/start.js | 0 lib/version.js | 0 test/index.js | 1 + test/version.js | 0 5 files changed, 1 insertion(+) mode change 100755 => 100644 lib/index.js mode change 100755 => 100644 lib/start.js mode change 100755 => 100644 lib/version.js mode change 100755 => 100644 test/index.js mode change 100755 => 100644 test/version.js diff --git a/lib/index.js b/lib/index.js old mode 100755 new mode 100644 diff --git a/lib/start.js b/lib/start.js old mode 100755 new mode 100644 diff --git a/lib/version.js b/lib/version.js old mode 100755 new mode 100644 diff --git a/test/index.js b/test/index.js old mode 100755 new mode 100644 index f9ca0f1..8651004 --- a/test/index.js +++ b/test/index.js @@ -41,6 +41,7 @@ it('starts server on provided port', (done) => { it('handles register plugin errors', { parallel: false }, (done) => { const orig = Version.register; + Version.register = function (server, options, next) { Version.register = orig; diff --git a/test/version.js b/test/version.js old mode 100755 new mode 100644 From 0dc85d0ce0b29f02e9cb7cc2f106d68740a6487f Mon Sep 17 00:00:00 2001 From: Apoorva Korde Date: Thu, 4 Feb 2016 16:20:46 +0530 Subject: [PATCH 3/3] Cleanup for #182 --- test/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/index.js b/test/index.js index 8651004..2dfdab2 100644 --- a/test/index.js +++ b/test/index.js @@ -41,7 +41,7 @@ it('starts server on provided port', (done) => { it('handles register plugin errors', { parallel: false }, (done) => { const orig = Version.register; - + Version.register = function (server, options, next) { Version.register = orig;