From 63a7e4754367b7a77e79a98bcf530cade1ee11a8 Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Fri, 11 Sep 2015 11:15:38 -0300 Subject: [PATCH 1/2] test --- test/integration/server.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/integration/server.js b/test/integration/server.js index 3f1a0b7..096cc6e 100644 --- a/test/integration/server.js +++ b/test/integration/server.js @@ -1476,6 +1476,22 @@ describe('Wallet service', function() { }); }); + it('should protect against storing same address multiple times', function(done) { + server.createAddress({}, function(err, address) { + should.not.exist(err); + should.exist(address); + delete address._id; + server.storage.storeAddressAndWallet(wallet, address, function(err) { + should.not.exist(err); + server.getMainAddresses({}, function(err, addresses) { + should.not.exist(err); + addresses.length.should.equal(1); + done(); + }); + }); + }); + }); + it('should create many addresses on simultaneous requests', function(done) { var N = 5; async.map(_.range(N), function(i, cb) { From 45752625134cb388650c770c156c825c80ff4550 Mon Sep 17 00:00:00 2001 From: Ivan Socolsky Date: Fri, 11 Sep 2015 11:15:46 -0300 Subject: [PATCH 2/2] implement check --- lib/storage.js | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/lib/storage.js b/lib/storage.js index 836af12..61dd719 100644 --- a/lib/storage.js +++ b/lib/storage.js @@ -385,13 +385,32 @@ Storage.prototype.fetchAddresses = function(walletId, cb) { Storage.prototype.storeAddressAndWallet = function(wallet, addresses, cb) { var self = this; + var addresses = [].concat(addresses); if (addresses.length == 0) return cb(); - this.db.collection(collections.ADDRESSES).insert(addresses, { - w: 1 - }, function(err) { - if (err) return cb(err); - self.storeWallet(wallet, cb); + + async.filter(addresses, function(address, next) { + self.db.collection(collections.ADDRESSES).findOne({ + address: address.address, + }, { + walletId: true, + }, function(err, result) { + if (err || !result) return next(true); + if (result.walletId != wallet.id) { + log.warn('Address ' + address.address + ' exists in more than one wallet.'); + return next(true); + } + // Ignore if address was already in wallet + return next(false); + }); + }, function(newAddresses) { + if (newAddresses.length == 0) return cb(); + self.db.collection(collections.ADDRESSES).insert(newAddresses, { + w: 1 + }, function(err) { + if (err) return cb(err); + self.storeWallet(wallet, cb); + }); }); };