diff --git a/package.json b/package.json index 5429ce936..243be9a41 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "url": "https://github.com/bitpay/copay/issues" }, "dependencies": { - "bitcore-wallet-client": "2.6.0", + "bitcore-wallet-client": "2.7.0", "express": "^4.11.2", "fs": "0.0.2", "grunt": "^0.4.5", diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js index cce4b547f..bc1daeaa4 100644 --- a/src/js/controllers/index.js +++ b/src/js/controllers/index.js @@ -135,7 +135,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r self.isPrivKeyEncrypted = fc.isPrivKeyEncrypted(); self.externalSource = fc.getPrivKeyExternalSourceName(); self.account = fc.credentials.account; - self.incorrectDerivation = fc.incorrectDerivation; + self.incorrectDerivation = fc.keyDerivationOk === false; if (self.externalSource == 'trezor') self.account++; @@ -1388,6 +1388,11 @@ angular.module('copayApp.controllers').controller('indexController', function($r }); }; + self.isInFocus = function(walletId) { + var fc = profileService.focusedClient; + return fc && fc.credentials.walletId == walletId; + }; + self.setAddressbook = function(ab) { if (ab) { self.addressbook = ab; @@ -1408,12 +1413,17 @@ angular.module('copayApp.controllers').controller('indexController', function($r self.tab = 'walletHome'; }); - $rootScope.$on('Local/ValidatingWallet', function() { - ongoingProcess.set('validatingWallet', true); + $rootScope.$on('Local/ValidatingWallet', function(ev, walletId) { + if (self.isInFocus(walletId)) { + ongoingProcess.set('validatingWallet', true); + } }); - $rootScope.$on('Local/ProfileBound', function() { - ongoingProcess.set('validatingWallet', false); + $rootScope.$on('Local/ValidatingWalletEnded', function(ev, walletId, isOK) { + if (self.isInFocus(walletId)) { + ongoingProcess.set('validatingWallet', false); + self.incorrectDerivation = isOK === false; + } }); $rootScope.$on('Local/ClearHistory', function(event) { @@ -1475,8 +1485,7 @@ angular.module('copayApp.controllers').controller('indexController', function($r }); $rootScope.$on('Local/WalletCompleted', function(event, walletId) { - var fc = profileService.focusedClient; - if (fc && fc.credentials.walletId == walletId) { + if (self.isInFocus(walletId)) { // reset main wallet variables self.setFocusedWallet(); go.walletHome(); diff --git a/src/js/models/profile.js b/src/js/models/profile.js index aaa5f4a4c..aea506864 100644 --- a/src/js/models/profile.js +++ b/src/js/models/profile.js @@ -57,6 +57,12 @@ Profile.prototype.isChecked = function(ua, walletId) { return !!(this.checkedUA == ua && this.checked[walletId]); }; + +Profile.prototype.isDeviceChecked = function(ua) { + return this.checkedUA == ua; +}; + + Profile.prototype.setChecked = function(ua, walletId) { if (this.checkedUA != ua) { this.checkedUA = ua; diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index 6daf48900..25f4a42cd 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -75,11 +75,6 @@ angular.module('copayApp.services') root.walletClients[walletId].started = true; root.walletClients[walletId].doNotVerifyPayPro = isChromeApp; - if (client.incorrectDerivation) { - $log.warn('Key Derivation failed for wallet:' + walletId); - storageService.clearLastAddress(walletId, function() {}); - } - client.removeAllListeners(); client.on('report', function(n) { $log.info('BWC Report:' + n); @@ -121,6 +116,29 @@ angular.module('copayApp.services') return true; }; + root.runValidation = function(client) { + var skipDeviceValidation = root.profile.isDeviceChecked(platformInfo.ua); + var walletId = client.credentials.walletId; + + $timeout(function() { + + $log.debug('ValidatingWallet: ' + walletId + ' device validation:' + skipDeviceValidation); + $rootScope.$emit('Local/ValidatingWallet', walletId); + + client.validateKeyDerivation({ + skipDeviceValidation: skipDeviceValidation, + }, function(err, isOK) { + $rootScope.$emit('Local/ValidatingWalletEnded', walletId, isOK); + + if (isOK) { + root.profile.setChecked(platformInfo.ua, walletId); + } else { + $log.warn('Key Derivation failed for wallet:' + walletId); + storageService.clearLastAddress(walletId, function() {}); + } + }); + }, 10); + }; // Used when reading wallets from the profile root.bindWallet = function(credentials, cb) { @@ -135,22 +153,18 @@ angular.module('copayApp.services') return ((config.bwsFor && config.bwsFor[walletId]) || defaults.bws.url); }; + + var client = bwcService.getClient(JSON.stringify(credentials), { + bwsurl: getBWSURL(credentials.walletId), + }); + var skipKeyValidation = root.profile.isChecked(platformInfo.ua, credentials.walletId); - if (!skipKeyValidation) { - $rootScope.$emit('Local/ValidatingWallet'); - } - $timeout(function() { - $log.info('Binding wallet:' + credentials.walletId + ' Validating?:' + !skipKeyValidation); - var client = bwcService.getClient(JSON.stringify(credentials), { - bwsurl: getBWSURL(credentials.walletId), - skipKeyValidation: skipKeyValidation, - }); - if (!skipKeyValidation && !client.incorrectDerivation) - root.profile.setChecked(platformInfo.ua, credentials.walletId); + if (!skipKeyValidation) + root.runValidation(client); - return cb(null, root.bindWalletClient(client)); - }, skipKeyValidation ? 50 : 0); + $log.info('Binding wallet:' + credentials.walletId + ' Validating?:' + !skipKeyValidation); + return cb(null, root.bindWalletClient(client)); }; root.bindProfile = function(profile, cb) {