From bd9977a43e8d541fa5756a4541ad38762601ccd8 Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Sun, 22 Feb 2015 13:04:23 -0300 Subject: [PATCH] add getMainAddress --- bit-wallet/bit-addresses | 8 ++++--- lib/client/api.js | 26 +++++++++++++++++++++++ lib/expressapp.js | 2 +- lib/hdpath.js | 7 +++--- lib/server.js | 10 ++++++--- test/integration/clientApi.js | 40 +++++++++++++++++++++++++++++++++-- test/integration/server.js | 2 +- 7 files changed, 82 insertions(+), 13 deletions(-) diff --git a/bit-wallet/bit-addresses b/bit-wallet/bit-addresses index 6d385f4..5987e6b 100755 --- a/bit-wallet/bit-addresses +++ b/bit-wallet/bit-addresses @@ -2,7 +2,7 @@ var _ = require('lodash'); var program = require('commander'); -var utils = require('./cli-utils'); +var utils = require('./cli-utils'); var Client = require('../lib/client'); program = utils.configureCommander(program); @@ -11,11 +11,13 @@ program var args = program.args; var client = utils.getClient(program); -client.getAddresses(function(err, x) { +client.getMainAddresses({ + doNotVerify: true +}, function(err, x) { utils.die(err); console.log('* Addresses:'); - _.each(x, function(a){ + _.each(x, function(a) { console.log(' ', a.address); }); }); diff --git a/lib/client/api.js b/lib/client/api.js index ac4c282..da9d3df 100644 --- a/lib/client/api.js +++ b/lib/client/api.js @@ -389,6 +389,32 @@ API.prototype.createAddress = function(cb) { }); }; +/* + * opts.doNotVerify + */ + +API.prototype.getMainAddresses = function(opts, cb) { + var self = this; + + this._loadAndCheck(function(err, data) { + if (err) return cb(err); + + var url = '/v1/addresses/'; + self._doGetRequest(url, data, function(err, addresses) { + if (err) return cb(err); + + if (!opts.doNotVerify) { + var fake = _.any(addresses, function(address) { + return !Verifier.checkAddress(data, address); + }); + if (fake) + return cb(new ServerCompromisedError('Server sent fake address')); + } + return cb(null, addresses); + }); + }); +}; + API.prototype.history = function(limit, cb) { }; diff --git a/lib/expressapp.js b/lib/expressapp.js index 8f8c641..e253af5 100644 --- a/lib/expressapp.js +++ b/lib/expressapp.js @@ -203,7 +203,7 @@ ExpressApp.start = function(opts) { router.get('/v1/addresses/', function(req, res) { getServerWithAuth(req, res, function(server) { - server.getAddresses({}, function(err, addresses) { + server.getMainAddresses({}, function(err, addresses) { if (err) return returnError(err, res, req); res.json(addresses); }); diff --git a/lib/hdpath.js b/lib/hdpath.js index 7a03fa8..ce0617a 100644 --- a/lib/hdpath.js +++ b/lib/hdpath.js @@ -97,10 +97,11 @@ HDPath.indexesForPath = function(path) { preconditions.checkArgument(_.isString(path)); var s = path.split('/'); + var l = s.length; return { - isChange: s[3] === '1', - addressIndex: parseInt(s[4], 10), - copayerIndex: parseInt(s[2], 10) + isChange: s[l - 2] === '1', + addressIndex: parseInt(s[l - 1], 10), + copayerIndex: parseInt(s[l - 3], 10) }; }; diff --git a/lib/server.js b/lib/server.js index de67f34..3d62dc3 100644 --- a/lib/server.js +++ b/lib/server.js @@ -17,6 +17,7 @@ var Explorers = require('bitcore-explorers'); var ClientError = require('./clienterror'); var Utils = require('./utils'); var Storage = require('./storage'); +var HDPath = require('./hdpath'); var WalletUtils = require('./walletutils'); var Wallet = require('./model/wallet'); @@ -284,13 +285,16 @@ WalletService.prototype.createAddress = function(opts, cb) { * @param {Object} opts * @returns {Address[]} */ -WalletService.prototype.getAddresses = function(opts, cb) { +WalletService.prototype.getMainAddresses = function(opts, cb) { var self = this; self.storage.fetchAddresses(self.walletId, function(err, addresses) { if (err) return cb(err); + var mainAddresses = _.filter(addresses, function(x) { + return !HDPath.indexesForPath(x.path).isChange; + }); - return cb(null, addresses); + return cb(null, mainAddresses); }); }; @@ -520,7 +524,7 @@ WalletService.prototype.createTx = function(opts, cb) { try { self._selectUtxos(txp, utxos); } catch (ex) { -console.log('[server.js.523:ex:]',ex); //TODO + console.log('[server.js.523:ex:]', ex); //TODO return cb(new ClientError(ex)); } diff --git a/test/integration/clientApi.js b/test/integration/clientApi.js index 3ad9e67..7de8172 100644 --- a/test/integration/clientApi.js +++ b/test/integration/clientApi.js @@ -858,8 +858,44 @@ describe('client API ', function() { }); }); }); - - + it('Should return only main addresses (case 1)', function(done) { + helpers.createAndJoinWallet(clients, 1, 1, function(err, w) { + should.not.exist(err); + clients[0].createAddress(function(err, x0) { + should.not.exist(err); + blockExplorerMock.setUtxo(x0, 1, 1); + var opts = { + amount: 10000000, + toAddress: 'n2TBMPzPECGUfcT2EByiTJ12TPZkhN2mN5', + message: 'hello 1-1', + }; + clients[0].sendTxProposal(opts, function(err, x) { + should.not.exist(err); + clients[0].getMainAddresses({}, function(err, addr) { + should.not.exist(err); + addr.length.should.equal(1); + done(); + }); + }); + }); + }); + }); + it('Should return only main addresses (case 2)', function(done) { + helpers.createAndJoinWallet(clients, 1, 1, function(err, w) { + should.not.exist(err); + clients[0].createAddress(function(err, x0) { + should.not.exist(err); + clients[0].createAddress(function(err, x0) { + should.not.exist(err); + clients[0].getMainAddresses({doNotVerify: true}, function(err, addr) { + should.not.exist(err); + addr.length.should.equal(2); + done(); + }); + }); + }); + }); + }); }); describe('Transactions Signatures and Rejection', function() { diff --git a/test/integration/server.js b/test/integration/server.js index c334a2e..4706984 100644 --- a/test/integration/server.js +++ b/test/integration/server.js @@ -560,7 +560,7 @@ describe('Copay server', function() { err.should.exist; should.not.exist(address); - server.getAddresses({}, function(err, addresses) { + server.getMainAddresses({}, function(err, addresses) { addresses.length.should.equal(0); server.storage.storeAddressAndWallet.restore();