Add support for verifymessage

/api/messages/verify accepts three parameters either via JSON POST data
or GET query parameters, pipes them to the bitcoin RPCs verifymessage
command, and returns the result for the user.
This commit is contained in:
Rainer Koirikivi 2014-11-02 16:39:40 +02:00
parent 7cc2dcd6fc
commit a10e2b4a43
4 changed files with 134 additions and 0 deletions

View File

@ -0,0 +1,27 @@
'use strict';
var common = require('./common');
var Rpc = require('../../lib/Rpc');
exports.verify = function(req, res) {
var address = req.param('address'),
signature = req.param('signature'),
message = req.param('message');
if(typeof(address) == 'undefined'
|| typeof(signature) == 'undefined'
|| typeof(message) == 'undefined') {
return common.handleErrors({
message: 'Missing parameters (expected "address", "signature" and "message")',
code: 1
}, res);
}
Rpc.verifyMessage(address, signature, message, function(err, result) {
if (err) {
return common.handleErrors(err, res);
}
res.json({'result' : result});
});
};

View File

@ -60,6 +60,11 @@ module.exports = function(app) {
app.get(apiPrefix + '/email/validate', emailPlugin.validate);
}
// 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(apiPrefix + '/version', index.version);

View File

@ -106,6 +106,18 @@ Rpc.sendRawTransaction = function(rawtx, cb) {
});
};
Rpc.verifyMessage = function(address, signature, message, cb) {
var self = this;
bitcoreRpc.verifyMessage(address, signature, message, function(err, message) {
if (err && (err.code === -3 || err.code === -5))
return cb(err); // -3 = invalid address, -5 = malformed base64 / etc.
if (err)
return cb(self.errMsg(err));
return cb(err, message.result);
});
};
module.exports = require('soop')(Rpc);

View File

@ -0,0 +1,90 @@
#!/usr/bin/env node
'use strict';
process.env.NODE_ENV = process.env.NODE_ENV || 'development';
var assert = require('assert'),
config = require('../../config/config'),
messages = require('../../app/controllers/messages'),
correctMessage = 'test2',
correctAddress,
correctSignature;
if(config.network === 'livenet') {
correctAddress = '16Q7eRty2LrpAWvP3VTtaXXCMZj2v4xm57',
correctSignature = 'HERpcxkyOezkBPPwvUUAaxYXR/9X/8eyVjp8WKGYl7Aw8'
+ 'pMsiMXDWXf8G1t/SOUEWy94I+KA/SrBKYs2LfIHA0Q=';
} else {
correctAddress = 'mhtJo5nZLcreM5Arrf8EDABpCevp2MfmCW',
correctSignature = 'G/y2UhjZ4qBPLQGmOhl/4p/EIwTHIO1iq95kPxDk9RjYr'
+ '1JKL6dsCSuhXat7VLTGwAM3PdgRh/jwGxi6x6dNeSE=';
}
function createMockReq(body) {
// create a simplified mock of express' request object, suitable for the
// needs of test cases in this file
return {
body: body,
param: function(name) {
return this.body[name];
}
};
}
describe('messages.verify', function() {
it('should return true with correct message', function(done) {
var mockReq = createMockReq({
address: correctAddress,
signature: correctSignature,
message: correctMessage
});
var mockRes = {
json: function(data) {
assert.deepEqual(data, {
result: true,
});
done();
}
};
messages.verify(mockReq, mockRes);
});
it('should return false with incorrect message', function(done) {
var mockReq = createMockReq({
address: correctAddress,
signature: correctSignature,
message: 'NOPE'
});
var mockRes = {
json: function(data) {
assert.deepEqual(data, {
result: false,
});
done();
}
};
messages.verify(mockReq, mockRes);
});
it('should return error with incorrect parameters', function(done) {
var mockReq = createMockReq({
address: correctAddress,
message: correctMessage
});
var mockRes = {
status: function(code) {
assert.equal(code, 400);
return this;
},
send: function(data) {
assert.ok(data.match(/^Missing parameters/),
"Match not found, got '" + data + "' instead")
done();
}
};
messages.verify(mockReq, mockRes);
});
});