From 3f35d8f141e298d1e79e1ee64800f5d3053de6fb Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Thu, 26 Nov 2015 18:00:06 -0300 Subject: [PATCH] return upgrade_needed for legacy clients --- lib/server.js | 24 ++++++++++++++++++++++-- test/integration/helpers.js | 6 ++++-- test/integration/server.js | 35 +++++++++++++++++++++++++++++++++-- 3 files changed, 59 insertions(+), 6 deletions(-) diff --git a/lib/server.js b/lib/server.js index 2fd19c8..b27a29f 100644 --- a/lib/server.js +++ b/lib/server.js @@ -136,7 +136,7 @@ WalletService.shutDown = function(cb) { WalletService.getInstance = function(opts) { opts = opts || {}; var server = new WalletService(); - server.clientVersion = opts.clientVersion; + server._setClientVersion(opts.clientVersion); return server; }; @@ -163,7 +163,7 @@ WalletService.getInstanceWithAuth = function(opts, cb) { server.copayerId = opts.copayerId; server.walletId = copayer.walletId; - server.clientVersion = opts.clientVersion; + server._setClientVersion(opts.clientVersion); return cb(null, server); }); }; @@ -509,6 +509,11 @@ WalletService.prototype.addAccess = function(opts, cb) { }); }; +WalletService.prototype._setClientVersion = function(version) { + delete this.parsedClientVersion; + this.clientVersion = version; +}; + WalletService.prototype._parseClientVersion = function() { function parse(version) { var v = {}; @@ -543,6 +548,14 @@ WalletService.prototype._clientSupportsTXPv2 = function() { return true; }; +WalletService.prototype._clientSupportsTXPv3 = function() { + var version = this._parseClientVersion(); + if (!version) return false; + if (version.agent != 'bwc') return true; // Asume 3rd party clients are up-to-date + if (version.major < 2) return false; + return true; +}; + WalletService._getCopayerHash = function(name, xPubKey, requestPubKey) { return [name, xPubKey, requestPubKey].join('|'); }; @@ -1833,6 +1846,13 @@ WalletService.prototype.getPendingTxs = function(opts, cb) { self.storage.fetchPendingTxs(self.walletId, function(err, txps) { if (err) return cb(err); + var v3Txps = _.any(txps, function(txp) { + return txp.version >= 3; + }); + if (v3Txps && !self._clientSupportsTXPv3()) { + return cb(new ClientError(Errors.codes.UPGRADE_NEEDED, 'To view some of the pending proposals you need to upgrade your client app.')); + } + _.each(txps, function(txp) { txp.deleteLockTime = self.getRemainingDeleteLockTime(txp); }); diff --git a/test/integration/helpers.js b/test/integration/helpers.js index c717e5f..7e57cd1 100644 --- a/test/integration/helpers.js +++ b/test/integration/helpers.js @@ -26,9 +26,11 @@ var TestData = require('../testdata'); var storage, blockchainExplorer; +var useMongoDb = !!process.env.USE_MONGO_DB; + var helpers = {}; -var useMongoDb = !!process.env.USE_MONGO_DB; +helpers.CLIENT_VERSION = 'bwc-2.0.0'; helpers.before = function(cb) { function getDb(cb) { @@ -96,7 +98,7 @@ helpers.getAuthServer = function(copayerId, cb) { copayerId: copayerId, message: 'dummy', signature: 'dummy', - clientVersion: 'bwc-0.1.0', + clientVersion: helpers.CLIENT_VERSION, }, function(err, server) { verifyStub.restore(); if (err || !server) throw new Error('Could not login as copayerId ' + copayerId); diff --git a/test/integration/server.js b/test/integration/server.js index 6acc36d..946210e 100644 --- a/test/integration/server.js +++ b/test/integration/server.js @@ -25,7 +25,6 @@ var TestData = require('../testdata'); var helpers = require('./helpers'); var storage, blockchainExplorer; -var CLIENT_VERSION = 'bwc-0.1.1'; describe('Wallet service', function() { before(function(done) { @@ -1260,7 +1259,7 @@ describe('Wallet service', function() { copayerId: copayerId, message: msg, signature: sig, - clientVersion: CLIENT_VERSION, + clientVersion: helpers.CLIENT_VERSION, }, function(err, server) { return cb(err, server); }); @@ -2579,6 +2578,38 @@ describe('Wallet service', function() { done(); }); }); + + it('should fail to list pending proposals from legacy client', function(done) { + helpers.stubUtxos(server, wallet, [1, 2], function() { + var txOpts = helpers.createProposalOpts2([{ + toAddress: '18PzpUFkFZE8zKWUPvfykkTxmB9oMR8qP7', + amount: 0.8 + }], { + message: 'some message', + customData: 'some custom data', + }); + server.createTx(txOpts, function(err, txp) { + should.not.exist(err); + should.exist(txp); + var sendOpts = helpers.getProposalSignatureOpts(txp, TestData.copayers[0].privKey_1H_0); + server.sendTx(sendOpts, function(err) { + should.not.exist(err); + server.getPendingTxs({}, function(err, txs) { + should.not.exist(err); + txs.length.should.equal(1); + + server._setClientVersion('bwc-1.1.8'); + server.getPendingTxs({}, function(err, txs) { + should.exist(err); + err.code.should.equal('UPGRADE_NEEDED'); + done(); + }); + }); + }); + }); + }); + }); + }); });