From 907031544eb80ef5e664c6bfda4cf2b05e9a8ee5 Mon Sep 17 00:00:00 2001 From: Cayman Date: Fri, 10 Jul 2020 19:42:07 -0500 Subject: [PATCH 1/2] feat: refactor validate BREAKING CHANGE: validate no longer returns a boolean, but throws an error on invalid input. --- package.json | 1 + src/index.js | 12 +++++------- test/pubsub.spec.js | 16 +++++++--------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 29b41fd..bdb64ba 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "aegir": "^22.0.0", "benchmark": "^2.1.4", "chai": "^4.2.0", + "chai-as-promised": "^7.1.1", "chai-spies": "^1.0.0", "dirty-chai": "^2.0.1", "it-pair": "^1.0.0", diff --git a/src/index.js b/src/index.js index 5289413..f2e461c 100644 --- a/src/index.js +++ b/src/index.js @@ -267,21 +267,19 @@ class PubsubBaseProtocol extends EventEmitter { /** * Validates the given message. The signature will be checked for authenticity. + * Throws an error on invalid messages * @param {InMessage} message - * @returns {Promise} + * @returns {Promise} */ async validate (message) { // eslint-disable-line require-await // If strict signing is on and we have no signature, abort if (this.strictSigning && !message.signature) { - this.log('Signing required and no signature was present, dropping message:', message) - return false + throw errcode(new Error('Signing required and no signature was present'), 'ERR_MISSING_SIGNATURE') } // Check the message signature if present - if (message.signature) { - return verifySignature(message) - } else { - return true + if (message.signature && !verifySignature(message)) { + throw errcode(new Error('Invalid message signature'), 'ERR_INVALID_SIGNATURE') } } diff --git a/test/pubsub.spec.js b/test/pubsub.spec.js index 2f40dd4..d2eb86f 100644 --- a/test/pubsub.spec.js +++ b/test/pubsub.spec.js @@ -4,6 +4,7 @@ const chai = require('chai') chai.use(require('dirty-chai')) chai.use(require('chai-spies')) +chai.use(require('chai-as-promised')) const expect = chai.expect const sinon = require('sinon') @@ -91,6 +92,7 @@ describe('pubsub base protocol', () => { it('_buildMessage normalizes and signs messages', async () => { const message = { + receivedFrom: peerId.id, from: peerId.id, data: 'hello', seqno: randomSeqno(), @@ -98,13 +100,12 @@ describe('pubsub base protocol', () => { } const signedMessage = await pubsub._buildMessage(message) - const verified = await pubsub.validate(signedMessage) - - expect(verified).to.eql(true) + expect(pubsub.validate(signedMessage)).to.not.be.rejected() }) it('validate with strict signing off will validate a present signature', async () => { const message = { + receivedFrom: peerId.id, from: peerId.id, data: 'hello', seqno: randomSeqno(), @@ -114,22 +115,19 @@ describe('pubsub base protocol', () => { sinon.stub(pubsub, 'strictSigning').value(false) const signedMessage = await pubsub._buildMessage(message) - const verified = await pubsub.validate(signedMessage) - - expect(verified).to.eql(true) + expect(pubsub.validate(signedMessage)).to.not.be.rejected() }) it('validate with strict signing requires a signature', async () => { const message = { + receivedFrom: peerId.id, from: peerId.id, data: 'hello', seqno: randomSeqno(), topicIDs: ['test-topic'] } - const verified = await pubsub.validate(message) - - expect(verified).to.eql(false) + await expect(pubsub.validate(message)).to.be.rejectedWith(Error, 'Signing required and no signature was present') }) }) From cbf4a7c15618a1da73cf0408b0269ee9715f4042 Mon Sep 17 00:00:00 2001 From: Cayman Date: Thu, 16 Jul 2020 11:36:33 -0500 Subject: [PATCH 2/2] chore: add exported errors --- src/errors.js | 6 ++++++ src/index.js | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 src/errors.js diff --git a/src/errors.js b/src/errors.js new file mode 100644 index 0000000..24f0bbf --- /dev/null +++ b/src/errors.js @@ -0,0 +1,6 @@ +'use strict' + +exports.codes = { + ERR_MISSING_SIGNATURE: 'ERR_MISSING_SIGNATURE', + ERR_INVALID_SIGNATURE: 'ERR_INVALID_SIGNATURE' +} diff --git a/src/index.js b/src/index.js index f2e461c..c7b3c8f 100644 --- a/src/index.js +++ b/src/index.js @@ -7,6 +7,7 @@ const errcode = require('err-code') const PeerId = require('peer-id') const MulticodecTopology = require('libp2p-interfaces/src/topology/multicodec-topology') +const { codes } = require('./errors') const message = require('./message') const Peer = require('./peer') const utils = require('./utils') @@ -274,12 +275,12 @@ class PubsubBaseProtocol extends EventEmitter { async validate (message) { // eslint-disable-line require-await // If strict signing is on and we have no signature, abort if (this.strictSigning && !message.signature) { - throw errcode(new Error('Signing required and no signature was present'), 'ERR_MISSING_SIGNATURE') + throw errcode(new Error('Signing required and no signature was present'), codes.ERR_MISSING_SIGNATURE) } // Check the message signature if present if (message.signature && !verifySignature(message)) { - throw errcode(new Error('Invalid message signature'), 'ERR_INVALID_SIGNATURE') + throw errcode(new Error('Invalid message signature'), codes.ERR_INVALID_SIGNATURE) } }