diff --git a/bcrypt.js b/bcrypt.js index 2d27fddcd1..5e591c839f 100644 --- a/bcrypt.js +++ b/bcrypt.js @@ -2,28 +2,40 @@ 'use strict'; var bcrypt = require('bcryptjs'), - async = require('async'), - action = process.argv[2]; + async = require('async'); -switch(action) { - case 'compare': - bcrypt.compare(process.argv[3], process.argv[4], function(err, res) { - process.stdout.write(res ? 'true' : 'false'); - }); - break; - case 'hash': - async.waterfall([ - async.apply(bcrypt.genSalt, parseInt(process.argv[3], 10)), - function(salt, next) { - bcrypt.hash(process.argv[4], salt, next); - } - ], function(err, hash) { - if (!err) { - process.stdout.write(hash); - } else { - process.stderr.write(err.message); - } - }); - break; +process.on('message', function(msg) { + if (msg.type === 'hash') { + hashPassword(msg.password, msg.rounds); + } else if (msg.type === 'compare') { + compare(msg.password, msg.hash); + } +}); + +function hashPassword(password, rounds) { + async.waterfall([ + function(next) { + bcrypt.genSalt(parseInt(rounds, 10), next); + }, + function(salt, next) { + bcrypt.hash(password, salt, next); + } + ], function(err, hash) { + if (err) { + return process.send({err: err.message}); + } + process.send({result: hash}); + process.disconnect(); + }); +} + +function compare(password, hash) { + bcrypt.compare(password, hash, function(err, res) { + if (err) { + return process.send({err: err.message}); + } + process.send({result: res}); + process.disconnect(); + }); } \ No newline at end of file diff --git a/src/password.js b/src/password.js index 1b20b8dd2a..13f8c11f72 100644 --- a/src/password.js +++ b/src/password.js @@ -4,34 +4,28 @@ var fork = require('child_process').fork; module.hash = function(rounds, password, callback) { - var child = fork('./bcrypt', ['hash', rounds, password], { - silent: true - }), - response = ''; - - child.stdout.on('data', function(chunk) { - response += chunk.toString(); - }); - - child.stdout.on('end', function() { - callback(null, response); - }); + forkChild({type: 'hash', rounds: rounds, password: password}, callback); }; module.compare = function(password, hash, callback) { - var child = fork('./bcrypt', ['compare', password, hash], { + forkChild({type: 'compare', password: password, hash: hash}, callback); + }; + + function forkChild(message, callback) { + var child = fork('./bcrypt', { silent: true - }), - response = ''; + }); - child.stdout.on('data', function(chunk) { - response += chunk.toString(); - }); + child.on('message', function(msg) { + if (msg.err) { + return callback(new Error(msg.err)); + } - child.stdout.on('end', function() { - callback(null, response === 'true'); + callback(null, msg.result); }); - }; + + child.send(message); + } return module; })(exports); \ No newline at end of file