return upgrade_needed for legacy clients

This commit is contained in:
Ivan Socolsky 2015-11-26 18:00:06 -03:00
parent 0bb043d034
commit 3f35d8f141
3 changed files with 59 additions and 6 deletions

View File

@ -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);
});

View File

@ -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);

View File

@ -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();
});
});
});
});
});
});
});
});