Merge pull request #372 from braydonf/message-verification

Added message verification endpoint.
This commit is contained in:
Patrick Nagurny 2015-09-18 13:52:44 -04:00
commit d869be5208
6 changed files with 161 additions and 10 deletions

View File

@ -1,4 +1,5 @@
language: node_js
node_js:
- '0.10'
install: npm install
- 'v0.12.7'
install:
- npm install

View File

@ -4,6 +4,18 @@ A Bitcoin blockchain REST and web socket API service for [Bitcore Node](https://
This is a backend-only service. If you're looking for the web frontend application, take a look at https://github.com/bitpay/insight.
## Getting Started
```bash
npm install -g bitcore-node@latest
bitcore-node create mynode
cd mynode
bitcore-node add insight-api
bitcore-node start
```
The API endpoints will be available by default at: 'http://localhost:3001/insight-api/`
## Prerequisites
- [Bitcore Node 0.2.x](https://github.com/bitpay/bitcore-node)

View File

@ -6,6 +6,7 @@ var BlockController = require('./blocks');
var TxController = require('./transactions');
var AddressController = require('./addresses');
var StatusController = require('./status');
var MessagesController = require('./messages');
var bitcore = require('bitcore');
var $ = bitcore.util.preconditions;
var Transaction = bitcore.Transaction;
@ -77,6 +78,10 @@ InsightAPI.prototype.setupRoutes = function(app) {
app.get('/peer', status.peer.bind(status));
app.get('/version', status.version.bind(status));
// Address routes
var messages = new MessagesController(this.node);
app.get('/messages/verify', messages.verify.bind(messages));
app.post('/messages/verify', messages.verify.bind(messages));
// Utils route
/*var utils = require('../app/controllers/utils');
@ -98,11 +103,6 @@ InsightAPI.prototype.setupRoutes = function(app) {
app.get(apiPrefix + '/rates/:code', currencyRatesPlugin.getRate);
}
// Address routes
var messages = require('../app/controllers/messages');
app.get(apiPrefix + '/messages/verify', messages.verify);
app.post(apiPrefix + '/messages/verify', messages.verify);
//Home route
var index = require('../app/controllers/index');
app.get('*', index.render);*/
@ -162,4 +162,4 @@ InsightAPI.prototype.unsubscribe = function(emitter) {
}
};
module.exports = InsightAPI;
module.exports = InsightAPI;

34
lib/messages.js Normal file
View File

@ -0,0 +1,34 @@
'use strict';
var bitcore = require('bitcore');
var _ = bitcore.deps._;
var Message = require('bitcore-message');
var common = require('./common');
function MessagesController(node) {
this.node = node;
}
MessagesController.prototype.verify = function(req, res) {
var address = req.body.address || req.query.address;
var signature = req.body.signature || req.query.signature;
var message = req.body.message || req.query.message;
if(_.isUndefined(address) || _.isUndefined(signature) || _.isUndefined(message)) {
return common.handleErrors({
message: 'Missing parameters (expected "address", "signature" and "message")',
code: 1
}, res);
}
var valid;
try {
valid = new Message(message).verify(address, signature);
} catch(err) {
return common.handleErrors({
message: 'Unexpected error: ' + err.message,
code: 1
}, res);
}
res.json({'result': valid});
};
module.exports = MessagesController;

View File

@ -31,6 +31,10 @@
{
"name": "Patrick Nagurny",
"email": "patrick@bitpay.com"
},
{
"name": "Braydon Fuller",
"email": "braydon@bitpay.com"
}
],
"bugs": {
@ -48,7 +52,7 @@
"bitcore"
],
"engines": {
"node": "*"
"node": ">=0.12.0"
},
"scripts": {
"test": "NODE_ENV=test mocha -R spec --recursive"
@ -57,8 +61,9 @@
"bitcoreNode": "lib",
"dependencies": {
"async": "*",
"lodash": "^2.4.1",
"bitcore": "^0.13.3",
"lodash": "^2.4.1"
"bitcore-message": "^0.12.0"
},
"devDependencies": {
"mocha": "~1.16.2",

99
test/messages.js Normal file
View File

@ -0,0 +1,99 @@
'use strict';
var should = require('should');
var sinon = require('sinon');
var MessagesController = require('../lib/messages');
var bitcore = require('bitcore');
var _ = require('lodash');
describe('Messages', function() {
var privateKey = bitcore.PrivateKey.fromWIF('cQwApHAg8hw9AZuxiU4a7g9kFWdaemhPxVZXWiAKgJTx6dPP32fN');
var address = 'mswTKCE2tYSFvUNnNPBKZfeNmugYL1rZMx';
var badAddress = 'mswTKCE2tYSFvUNnNPBKZfeNmuhYL1rZMm';
var signature = 'IA4sIwhcLMPPsYtB8tN0PI+aQuwDyl+/4Ksa89llNSAeVaRdMyyIxpo1H5N3GHbPl9LQqZ7CvaokeQgsOkK9fn4=';
var message = 'cellar door';
it('will verify a message (true)', function(done) {
var controller = new MessagesController({node: {}});
var req = {
body: {
'address': address,
'signature': signature,
'message': message
},
query: {}
};
var res = {
json: function(data) {
data.result.should.equal(true);
done();
}
};
controller.verify(req, res);
});
it('will verify a message (false)', function(done) {
var controller = new MessagesController({node: {}});
var req = {
body: {
'address': address,
'signature': signature,
'message': 'wrong message'
},
query: {}
};
var res = {
json: function(data) {
data.result.should.equal(false);
done();
}
};
controller.verify(req, res);
});
it('handle an error from message verification', function(done) {
var controller = new MessagesController({node: {}});
var req = {
body: {
'address': badAddress,
'signature': signature,
'message': message
},
query: {}
};
var send = sinon.stub();
var status = sinon.stub().returns({send: send});
var res = {
status: status,
};
controller.verify(req, res);
status.args[0][0].should.equal(400);
send.args[0][0].should.equal('Unexpected error: Checksum mismatch. Code:1');
done();
});
it('handle error with missing parameters', function(done) {
var controller = new MessagesController({node: {}});
var req = {
body: {},
query: {}
};
var send = sinon.stub();
var status = sinon.stub().returns({send: send});
var res = {
status: status
};
controller.verify(req, res);
status.args[0][0].should.equal(400);
send.args[0][0].should.match(/^Missing parameters/);
done();
});
});