diff --git a/lib/hdprivatekey.js b/lib/hdprivatekey.js index 230dc03..989a723 100644 --- a/lib/hdprivatekey.js +++ b/lib/hdprivatekey.js @@ -4,6 +4,7 @@ var assert = require('assert'); var buffer = require('buffer'); var _ = require('lodash'); +var $ = require('./util/preconditions'); var BN = require('./crypto/bn'); var Base58 = require('./encoding/base58'); @@ -277,7 +278,18 @@ HDPrivateKey._validateNetwork = function(data, networkArg) { return null; }; -HDPrivateKey.fromJSON = HDPrivateKey.fromObject = HDPrivateKey.fromString = function(arg) { +HDPrivateKey.fromJSON = function(arg) { + $.checkArgument(JSUtil.isValidJSON(arg), 'No valid JSON string was provided'); + return new HDPrivateKey(arg); +}; + +HDPrivateKey.fromString = function(arg) { + $.checkArgument(_.isString(arg), 'No valid string was provided'); + return new HDPrivateKey(arg); +}; + +HDPrivateKey.fromObject = function(arg) { + $.checkArgument(_.isObject(arg), 'No valid argument was provided'); return new HDPrivateKey(arg); }; diff --git a/lib/util/js.js b/lib/util/js.js index 9366510..be6f366 100644 --- a/lib/util/js.js +++ b/lib/util/js.js @@ -29,6 +29,9 @@ module.exports = { */ isValidJSON: function isValidJSON(arg) { var parsed; + if (!_.isString(arg)) { + return false; + } try { parsed = JSON.parse(arg); } catch (e) { diff --git a/test/hdprivatekey.js b/test/hdprivatekey.js index 665eb37..3c47898 100644 --- a/test/hdprivatekey.js +++ b/test/hdprivatekey.js @@ -78,14 +78,39 @@ describe('HDPrivate key interface', function() { )); }); - describe('should error with a nonsensical argument', function() { - it('like a number', function() { + describe('instantiation', function() { + it('invalid argument: can not instantiate from a number', function() { expectFailBuilding(1, hdErrors.UnrecognizedArgument); }); - }); - - it('allows no-new calling', function() { - HDPrivateKey(xprivkey).toString().should.equal(xprivkey); + it('allows no-new calling', function() { + HDPrivateKey(xprivkey).toString().should.equal(xprivkey); + }); + var expectStaticMethodFail = function(staticMethod, argument, message) { + expect(HDPrivateKey[staticMethod].bind(null, argument)).to.throw(message); + }; + it('fromJSON checks that a valid JSON is provided', function() { + var errorMessage = 'No valid JSON string was provided'; + var method = 'fromJSON'; + expectStaticMethodFail(method, undefined, errorMessage); + expectStaticMethodFail(method, null, errorMessage); + expectStaticMethodFail(method, 'invalid JSON', errorMessage); + expectStaticMethodFail(method, '{\'singlequotes\': true}', errorMessage); + expectStaticMethodFail(method, {}, errorMessage); + }); + it('fromString checks that a string is provided', function() { + var errorMessage = 'No valid string was provided'; + var method = 'fromString'; + expectStaticMethodFail(method, undefined, errorMessage); + expectStaticMethodFail(method, null, errorMessage); + expectStaticMethodFail(method, {}, errorMessage); + }); + it('fromObject checks that an object is provided', function() { + var errorMessage = 'No valid argument was provided'; + var method = 'fromObject'; + expectStaticMethodFail(method, undefined, errorMessage); + expectStaticMethodFail(method, null, errorMessage); + expectStaticMethodFail(method, '', errorMessage); + }); }); it('inspect() displays correctly', function() {