Added message verification endpoint.
This commit is contained in:
parent
83c8f9c5ac
commit
cf58b69bbf
@ -1,4 +1,5 @@
|
|||||||
language: node_js
|
language: node_js
|
||||||
node_js:
|
node_js:
|
||||||
- '0.10'
|
- 'v0.12.7'
|
||||||
install: npm install
|
install:
|
||||||
|
- npm install
|
||||||
|
|||||||
12
README.md
12
README.md
@ -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.
|
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
|
## Prerequisites
|
||||||
|
|
||||||
- [Bitcore Node 0.2.x](https://github.com/bitpay/bitcore-node)
|
- [Bitcore Node 0.2.x](https://github.com/bitpay/bitcore-node)
|
||||||
|
|||||||
12
lib/index.js
12
lib/index.js
@ -6,6 +6,7 @@ var BlockController = require('./blocks');
|
|||||||
var TxController = require('./transactions');
|
var TxController = require('./transactions');
|
||||||
var AddressController = require('./addresses');
|
var AddressController = require('./addresses');
|
||||||
var StatusController = require('./status');
|
var StatusController = require('./status');
|
||||||
|
var MessagesController = require('./messages');
|
||||||
var bitcore = require('bitcore');
|
var bitcore = require('bitcore');
|
||||||
var $ = bitcore.util.preconditions;
|
var $ = bitcore.util.preconditions;
|
||||||
var Transaction = bitcore.Transaction;
|
var Transaction = bitcore.Transaction;
|
||||||
@ -77,6 +78,10 @@ InsightAPI.prototype.setupRoutes = function(app) {
|
|||||||
app.get('/peer', status.peer.bind(status));
|
app.get('/peer', status.peer.bind(status));
|
||||||
app.get('/version', status.version.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
|
// Utils route
|
||||||
/*var utils = require('../app/controllers/utils');
|
/*var utils = require('../app/controllers/utils');
|
||||||
@ -98,11 +103,6 @@ InsightAPI.prototype.setupRoutes = function(app) {
|
|||||||
app.get(apiPrefix + '/rates/:code', currencyRatesPlugin.getRate);
|
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
|
//Home route
|
||||||
var index = require('../app/controllers/index');
|
var index = require('../app/controllers/index');
|
||||||
app.get('*', index.render);*/
|
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
34
lib/messages.js
Normal 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;
|
||||||
@ -31,6 +31,10 @@
|
|||||||
{
|
{
|
||||||
"name": "Patrick Nagurny",
|
"name": "Patrick Nagurny",
|
||||||
"email": "patrick@bitpay.com"
|
"email": "patrick@bitpay.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Braydon Fuller",
|
||||||
|
"email": "braydon@bitpay.com"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"bugs": {
|
"bugs": {
|
||||||
@ -48,7 +52,7 @@
|
|||||||
"bitcore"
|
"bitcore"
|
||||||
],
|
],
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "*"
|
"node": ">=0.12.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "NODE_ENV=test mocha -R spec --recursive"
|
"test": "NODE_ENV=test mocha -R spec --recursive"
|
||||||
@ -57,8 +61,9 @@
|
|||||||
"bitcoreNode": "lib",
|
"bitcoreNode": "lib",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"async": "*",
|
"async": "*",
|
||||||
|
"lodash": "^2.4.1",
|
||||||
"bitcore": "^0.13.3",
|
"bitcore": "^0.13.3",
|
||||||
"lodash": "^2.4.1"
|
"bitcore-message": "^0.12.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"mocha": "~1.16.2",
|
"mocha": "~1.16.2",
|
||||||
|
|||||||
99
test/messages.js
Normal file
99
test/messages.js
Normal 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();
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
Loading…
Reference in New Issue
Block a user