Skip to content

Commit

Permalink
any application point for any policy
Browse files Browse the repository at this point in the history
  • Loading branch information
PavelPolyakov committed May 19, 2015
1 parent 1da8ed6 commit 3de1c35
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 65 deletions.
88 changes: 46 additions & 42 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,24 @@ var fs = require('fs');
var hoek = require('hoek');
var path = require('path');

var _applyPoints = ['onRequest',
'onPreAuth',
'onPostAuth',
'onPreHandler',
'onPostHandler',
'onPreResponse'];

var data = {
names: [],
pre: [],
post: []
names : [],
setHandlers: {}
};

var runPolicies = function(policies, request, reply) {
/* adding arrays, to hold the policies */
_applyPoints.forEach(function (applyPoint) {
data[applyPoint] = [];
});

var runPolicies = function (policies, request, reply) {

var policyNames = hoek.reach(request, 'route.settings.plugins.policies');
if (!policyNames) {
Expand All @@ -25,9 +36,9 @@ var runPolicies = function(policies, request, reply) {
.values() // We want the values (the functions), not the keys
.value(); // Convert to an array

var checkPolicy = function(policy, next) {
var checkPolicy = function (policy, next) {

policy(request, reply, function(err, canContinue, message) {
policy(request, reply, function (err, canContinue, message) {

if (err) {
// You can provide a custom hapi error object here
Expand All @@ -41,7 +52,7 @@ var runPolicies = function(policies, request, reply) {
};

// Use eachSeries to get quick fails and ordering
async.eachSeries(policiesToRun, checkPolicy, function(err, result) {
async.eachSeries(policiesToRun, checkPolicy, function (err, result) {
if (!reply._replied) {
if (err) {
return reply(err);
Expand All @@ -52,22 +63,20 @@ var runPolicies = function(policies, request, reply) {
});
};

var preHandler = function(request, reply) {

runPolicies(data.pre, request, reply);
};

var postHandler = function(request, reply) {

runPolicies(data.post, request, reply);
};
/* generate handlers, one handler for each application point */
var handlers = {};
_applyPoints.forEach(function (applyPoint) {
handlers[applyPoint] = function (request, reply) {
runPolicies(data[applyPoint], request, reply);
}
});

var loadPolicies = function(server, options, next) {
var loadPolicies = function (server, options, next) {

var match = null;
var re = /(.+)\.js$/;

var addPolicy = function(filename, addPolicyNext) {
var addPolicy = function (filename, addPolicyNext) {

// Only looking for .js files in the policies folder
match = filename.match(re);
Expand All @@ -82,24 +91,16 @@ var loadPolicies = function(server, options, next) {

// Add this policy function to the data object
var policy = require(path.join(options.policyDirectory, filename));
if (policy.pre === undefined || policy.pre) {
if (policy.applyPoint === undefined || _applyPoints.indexOf(policy.applyPoint) !== -1) {
var applyPoint = policy.applyPoint || options.applyPoint;

server.log(['info'], 'Adding a new PRE policy called ' + match[1]);
data.pre[match[1]] = policy;
data[applyPoint][match[1]] = policy;

// connect the prehandler if this is the first pre policy
if (!data.setPreHandler) {
server.ext(options.preHandler, preHandler);
data.setPreHandler = true;
}
}
if (policy.post) {
server.log(['info'], 'Adding a new POST policy called ' + match[1]);
data.post[match[1]] = policy;

// connect the posthandler if this is the first post policy
if (!data.setPostHandler) {
server.ext(options.postHandler, postHandler);
data.setPostHandler = true;
// connect the handler if this is the first pre policy
if (!data.setHandlers[applyPoint]) {
server.ext(applyPoint, handlers[applyPoint]);
data.setHandlers[applyPoint] = true;
}
}
}
Expand All @@ -111,19 +112,23 @@ var loadPolicies = function(server, options, next) {
if (policyFiles.length === 0) {
return next();
}
async.eachSeries(policyFiles, addPolicy, function(err) {
async.eachSeries(policyFiles, addPolicy, function (err) {

next(err);
});
};

var reset = function() {
var reset = function () {

data = {
names: [],
pre: [],
post: []
names : [],
setHandlers: {}
};

/* adding arrays to hold the policies */
_applyPoints.forEach(function (applyPoint) {
data[applyPoint] = [];
});
};

exports.register = function register(server, options, next) {
Expand All @@ -133,11 +138,10 @@ exports.register = function register(server, options, next) {
server.expose('reset', reset);


options.preHandler = options.preHandler || 'onPreHandler';
options.postHandler = options.postHandler || 'onPostHandler';
options.applyPoint = options.applyPoint || 'onPreHandler' /* default application point */;

if (options.policyDirectory !== undefined) {
loadPolicies(server, options, function(err) {
loadPolicies(server, options, function (err) {
next(err);
});
} else {
Expand Down
10 changes: 4 additions & 6 deletions test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ lab.experiment('Non standard setups', function (done) {

try {
fs.mkdirSync(__dirname + '/emptypolicies');

} catch (err) {
console.log(err);
}
Expand All @@ -72,6 +73,8 @@ lab.experiment('Non standard setups', function (done) {
}

done();


});
});
});
Expand All @@ -89,7 +92,6 @@ lab.experiment('Normal setup', function (done) {
method : 'GET',
path : '/none',
handler: function (request, reply) {

reply('none');
}
});
Expand Down Expand Up @@ -202,8 +204,7 @@ lab.experiment('Normal setup', function (done) {
register: require('..'),
options : {
policyDirectory: __dirname + '/policies',
preHandler: 'onPreHandler',
postHandler: 'onPostHandler'
applyPoint: 'onPreHandler'
}
}, function (err) {

Expand Down Expand Up @@ -245,7 +246,6 @@ lab.experiment('Normal setup', function (done) {
lab.test('routes do not have to have a policy', function (done) {

server.inject('/none', function (res) {

Code.expect(res.result).to.equal('none');
done();
});
Expand Down Expand Up @@ -300,9 +300,7 @@ lab.experiment('Normal setup', function (done) {
});

lab.test('runs all policies', function (done) {

server.inject('/twopolicies', function (res) {

Code.expect(res.statusCode).to.equal(200);
Code.expect(res.result.ranSecondPasses).to.equal(true);
done();
Expand Down
1 change: 0 additions & 1 deletion test/policies/fails.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var fails = function(request, reply, callback) {

callback(null, false);
};

Expand Down
1 change: 0 additions & 1 deletion test/policies/passes.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
var passes = function(request, reply, callback) {

callback(null, true);
};

Expand Down
5 changes: 3 additions & 2 deletions test/policies/postHandler.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
var postHandler = function(request, reply, callback) {

//console.log("repsonse", require('util').inspect(request.response));
//process.exit();
request.response.source.added = 'this';
callback(null, true);
};

postHandler.pre = false;
postHandler.post = true;
postHandler.applyPoint = 'onPostHandler';

module.exports = postHandler;
4 changes: 1 addition & 3 deletions test/policies/secondPasses.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
var secondPasses = function(request, reply, callback) {

request.response.source.ranSecondPasses = true;
callback(null, true);
};

secondPasses.pre = false;
secondPasses.post = true;
secondPasses.applyPoint = 'onPostHandler';

module.exports = secondPasses;
10 changes: 0 additions & 10 deletions test/policies/second_post_handler.js

This file was deleted.

0 comments on commit 3de1c35

Please sign in to comment.