From 6bd316424adf295a7ec61e12e549c9d10e42380d Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Wed, 1 Jun 2016 15:49:20 -0300 Subject: [PATCH 1/5] refactor baseUrl in angular-bwc --- angular-bitcore-wallet-client/index.js | 35 ++++++-------------------- src/js/services/profileService.js | 11 ++------ src/js/services/storageService.js | 8 ++++++ test/helpers.js | 10 +++----- 4 files changed, 21 insertions(+), 43 deletions(-) diff --git a/angular-bitcore-wallet-client/index.js b/angular-bitcore-wallet-client/index.js index 9ad530e0e..417566863 100644 --- a/angular-bitcore-wallet-client/index.js +++ b/angular-bitcore-wallet-client/index.js @@ -6,31 +6,9 @@ bwcModule.constant('MODULE_VERSION', '1.0.0'); bwcModule.provider("bwcService", function() { var provider = {}; - var config = { - baseUrl: 'https://bws.bitpay.com/bws/api', - verbose: null, - transports: null - }; - - provider.setBaseUrl = function(url) { - config.baseUrl = url; - }; - - provider.setVerbose = function(v) { - config.verbose = v ? true : false; - }; - provider.$get = function() { var service = {}; - service.setBaseUrl = function(url) { - config.baseUrl = url; - }; - - service.setTransports = function(transports) { - config.transports = transports; - }; - service.getBitcore = function() { return Client.Bitcore; }; @@ -46,20 +24,21 @@ bwcModule.provider("bwcService", function() { service.buildTx = Client.buildTx; service.parseSecret = Client.parseSecret; service.Client = Client; - service.config = config; service.getUtils = function() { return Client.Utils; }; - service.getClient = function(walletData) { + service.getClient = function(walletData, opts) { + + //note opts use `baseurl` all lowercase; var bwc = new Client({ - baseUrl: config.baseUrl, - verbose: config.verbose, - transports: config.transports + baseUrl: opts.baseurl || 'https://bws.bitpay.com/bws/api', + verbose: opts.verbose, + transports: ['polling'], }); if (walletData) - bwc.import(walletData); + bwc.import(walletData, opts); return bwc; }; return service; diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index ecea8c747..c03891c3e 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -67,7 +67,6 @@ angular.module('copayApp.services') var defaults = configService.getDefaults(); bwcService.setBaseUrl((config.bwsFor && config.bwsFor[walletId]) || defaults.bws.url); - bwcService.setTransports(['polling']); } root.setWalletClient = function(credentials) { @@ -219,10 +218,7 @@ angular.module('copayApp.services') root._seedWallet = function(opts, cb) { opts = opts || {}; - if (opts.bwsurl) - bwcService.setBaseUrl(opts.bwsurl); - - var walletClient = bwcService.getClient(); + var walletClient = bwcService.getClient(null, opts); var network = opts.networkName || 'livenet'; @@ -471,10 +467,8 @@ angular.module('copayApp.services') }; root.importWallet = function(str, opts, cb) { - if (opts.bwsurl) - bwcService.setBaseUrl(opts.bwsurl); - var walletClient = bwcService.getClient(); + var walletClient = bwcService.getClient(null, opts); $log.debug('Importing Wallet:', opts); try { @@ -573,7 +567,6 @@ angular.module('copayApp.services') configService.get(function(err) { bwcService.setBaseUrl(defaults.bws.url); - bwcService.setTransports(['polling']); root._createNewProfile(opts, function(err, p) { if (err) return cb(err); diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index 96176d3e5..877933351 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -173,6 +173,14 @@ angular.module('copayApp.services') storage.remove('backup-' + walletId, cb); }; + root.setDerivationTestFlag = function(walletId, ua, cb) { + storage.set('DerivationTest-'+walletId+ua.replace(' ', ''), true, cb); + }; + + root.getDerivationTestFlag = function(walletId, ua, cb) { + storage.get('DerivationTest-'+walletId+ua.replace(' ', ''), cb); + }; + root.setCleanAndScanAddresses = function(walletId, cb) { storage.set('CleanAndScanAddresses', walletId, cb); }; diff --git a/test/helpers.js b/test/helpers.js index 1709270a0..95f4a4eb8 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -93,13 +93,11 @@ mocks.init = function(fixtures, controllerName, opts, done) { $delegate.getClient = function(walletData) { - var bwc = new $delegate.Client({ - baseUrl: config.baseUrl, - verbose: config.verbose, - transports: config.transports - }); + var bwc = new $delegate.Client(); if (walletData) - bwc.import(walletData); + bwc.import(walletData, { + baseUrl: config.baseUrl + }); function createHash(method, url, args) { var headers = JSON.stringify(bwc._getHeaders(method, url, args)); From 02861992e6967b132c1bfb0fa745a51b4e24f0e1 Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Wed, 1 Jun 2016 16:44:07 -0300 Subject: [PATCH 2/5] refactor baseurl in getClient --- src/js/services/profileService.js | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index c03891c3e..a8f44ad7e 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -62,7 +62,7 @@ angular.module('copayApp.services') }); }; - root.setBaseURL = function(walletId) { + root._getBaseURL = function(walletId) { var config = configService.getSync(); var defaults = configService.getDefaults(); @@ -75,10 +75,12 @@ angular.module('copayApp.services') return; } - root.setBaseURL(credentials.walletId); + $log.debug('Importing wallet:' + credentials.walletId); - var client = bwcService.getClient(JSON.stringify(credentials)); + var client = bwcService.getClient(JSON.stringify(credentials), { + baseurl: root._getBaseURL(credentials.walletId), + }); root.walletClients[credentials.walletId] = client; if (client.incorrectDerivation) { @@ -327,8 +329,8 @@ angular.module('copayApp.services') // check if exist if (lodash.find(root.profile.credentials, { - 'walletId': walletData.walletId - })) { + 'walletId': walletData.walletId + })) { return cb(gettext('Cannot join the same wallet more that once')); } } catch (ex) { @@ -495,10 +497,7 @@ angular.module('copayApp.services') }; root.importExtendedPrivateKey = function(xPrivKey, opts, cb) { - if (opts.bwsurl) - bwcService.setBaseUrl(opts.bwsurl); - - var walletClient = bwcService.getClient(); + var walletClient = bwcService.getClient(null, opts); $log.debug('Importing Wallet xPrivKey'); walletClient.importFromExtendedPrivateKey(xPrivKey, opts, function(err) { @@ -517,10 +516,7 @@ angular.module('copayApp.services') }; root.importMnemonic = function(words, opts, cb) { - if (opts.bwsurl) - bwcService.setBaseUrl(opts.bwsurl); - - var walletClient = bwcService.getClient(); + var walletClient = bwcService.getClient(null, opts); $log.debug('Importing Wallet Mnemonic'); @@ -538,10 +534,7 @@ angular.module('copayApp.services') }; root.importExtendedPublicKey = function(opts, cb) { - if (opts.bwsurl) - bwcService.setBaseUrl(opts.bwsurl); - - var walletClient = bwcService.getClient(); + var walletClient = bwcService.getClient(null, opts); $log.debug('Importing Wallet XPubKey'); walletClient.importFromExtendedPublicKey(opts.extendedPublicKey, opts.externalSource, opts.entropySource, { @@ -566,7 +559,6 @@ angular.module('copayApp.services') var defaults = configService.getDefaults(); configService.get(function(err) { - bwcService.setBaseUrl(defaults.bws.url); root._createNewProfile(opts, function(err, p) { if (err) return cb(err); From d08d4e365013b485cd82a6153c742e1248957a5a Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Wed, 1 Jun 2016 19:56:47 -0300 Subject: [PATCH 3/5] implement cache for key derivation, using user-agent --- package.json | 2 +- src/js/models/profile.js | 2 ++ src/js/services/profileService.js | 13 ++++++++----- src/js/services/storageService.js | 11 +++-------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 57b20330b..3630ea293 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "url": "https://github.com/bitpay/copay/issues" }, "dependencies": { - "bitcore-wallet-client": "https://github.com/bitpay/bitcore-wallet-client#baf7b8e50f53d3a62d0f5804919f0f0218872daf", + "bitcore-wallet-client": "2.5.0", "express": "^4.11.2", "fs": "0.0.2", "grunt": "^0.4.5", diff --git a/src/js/models/profile.js b/src/js/models/profile.js index 4b57a0f66..4e808fdee 100644 --- a/src/js/models/profile.js +++ b/src/js/models/profile.js @@ -16,6 +16,7 @@ Profile.create = function(opts) { x.createdOn = Date.now(); x.credentials = opts.credentials || []; x.disclaimerAccepted = false; + x.checked = {}; return x; }; @@ -25,6 +26,7 @@ Profile.fromObj = function(obj) { x.createdOn = obj.createdOn; x.credentials = obj.credentials; x.disclaimerAccepted = obj.disclaimerAccepted; + x.checked = obj.checked || {}; if (x.credentials[0] && typeof x.credentials[0] != 'object') throw ("credentials should be an object"); diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index a8f44ad7e..e3238db97 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -66,7 +66,7 @@ angular.module('copayApp.services') var config = configService.getSync(); var defaults = configService.getDefaults(); - bwcService.setBaseUrl((config.bwsFor && config.bwsFor[walletId]) || defaults.bws.url); + return ((config.bwsFor && config.bwsFor[walletId]) || defaults.bws.url); } root.setWalletClient = function(credentials) { @@ -75,17 +75,20 @@ angular.module('copayApp.services') return; } - - $log.debug('Importing wallet:' + credentials.walletId); + var skipKeyValidation = root.profile.checked[credentials.walletId] == platformInfo.ua; var client = bwcService.getClient(JSON.stringify(credentials), { baseurl: root._getBaseURL(credentials.walletId), + skipKeyValidation: skipKeyValidation, }); root.walletClients[credentials.walletId] = client; if (client.incorrectDerivation) { $log.warn('Key Derivation failed for wallet:' + credentials.walletId); storageService.clearLastAddress(credentials.walletId, function() {}); + } else if (!skipKeyValidation) { + root.profile.checked[credentials.walletId] = platformInfo.ua; + storageService.storeProfileThrottled(root.profile, function() {}); } client.removeAllListeners(); @@ -574,7 +577,7 @@ angular.module('copayApp.services') root.setDisclaimerAccepted = function(cb) { root.profile.disclaimerAccepted = true; - storageService.storeProfile(root.profile, function(err) { + storageService.storeProfileThrottled(root.profile, function(err) { return cb(err); }); }; @@ -626,7 +629,7 @@ angular.module('copayApp.services') newCredentials.push(JSON.parse(fc.export())); root.profile.credentials = newCredentials; - storageService.storeProfile(root.profile, cb); + storageService.storeProfileThrottled(root.profile, cb); }; diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index 877933351..4b9b91b33 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -113,11 +113,14 @@ angular.module('copayApp.services') }; root.storeProfile = function(profile, cb) { +console.log('[storageService.js.115:storeProfile:]',profile); //TODO encryptOnMobile(profile.toObj(), function(err, x) { storage.set('profile', x, cb); }); }; + root.storeProfileThrottled = lodash.throttle(root.storeProfile, 5000); + root.getProfile = function(cb) { storage.get('profile', function(err, str) { if (err || !str) @@ -173,14 +176,6 @@ angular.module('copayApp.services') storage.remove('backup-' + walletId, cb); }; - root.setDerivationTestFlag = function(walletId, ua, cb) { - storage.set('DerivationTest-'+walletId+ua.replace(' ', ''), true, cb); - }; - - root.getDerivationTestFlag = function(walletId, ua, cb) { - storage.get('DerivationTest-'+walletId+ua.replace(' ', ''), cb); - }; - root.setCleanAndScanAddresses = function(walletId, cb) { storage.set('CleanAndScanAddresses', walletId, cb); }; From e0a43bd90db44270eb10f19df748b0fe06622d12 Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Thu, 2 Jun 2016 14:56:19 -0300 Subject: [PATCH 4/5] fix tests --- test/helpers.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/helpers.js b/test/helpers.js index 95f4a4eb8..0350d4dcf 100644 --- a/test/helpers.js +++ b/test/helpers.js @@ -85,18 +85,19 @@ mocks.init = function(fixtures, controllerName, opts, done) { module('bwcModule', function($provide) { $provide.decorator('bwcService', function($delegate, lodash) { var getClient = $delegate.getClient; - var config = $delegate.config; // Fix Encryption IVs var utils = $delegate.getUtils(); utils.SJCL.iv = 'BZQVWAP6d1e4G8Fq1rQKbA=='; - $delegate.getClient = function(walletData) { + $delegate.getClient = function(walletData, opts) { var bwc = new $delegate.Client(); if (walletData) bwc.import(walletData, { - baseUrl: config.baseUrl + baseUrl: opts.baseurl || 'https://bws.bitpay.com/bws/api', + verbose: opts.verbose, + transports: ['polling'], }); function createHash(method, url, args) { From 205d1e78c30d5dfb16e2113fb9f574cbe7d3fc81 Mon Sep 17 00:00:00 2001 From: Matias Alejo Garcia Date: Fri, 3 Jun 2016 09:38:57 -0300 Subject: [PATCH 5/5] rm log and refactor baseurl --- src/js/services/profileService.js | 17 +++++++++-------- src/js/services/storageService.js | 1 - 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index e3238db97..f14acff19 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -62,23 +62,24 @@ angular.module('copayApp.services') }); }; - root._getBaseURL = function(walletId) { - var config = configService.getSync(); - var defaults = configService.getDefaults(); - - return ((config.bwsFor && config.bwsFor[walletId]) || defaults.bws.url); - } - root.setWalletClient = function(credentials) { if (root.walletClients[credentials.walletId] && root.walletClients[credentials.walletId].started) { return; } + + var getBaseURL = function(walletId) { + var config = configService.getSync(); + var defaults = configService.getDefaults(); + + return ((config.bwsFor && config.bwsFor[walletId]) || defaults.bws.url); + }; + $log.debug('Importing wallet:' + credentials.walletId); var skipKeyValidation = root.profile.checked[credentials.walletId] == platformInfo.ua; var client = bwcService.getClient(JSON.stringify(credentials), { - baseurl: root._getBaseURL(credentials.walletId), + baseurl: getBaseURL(credentials.walletId), skipKeyValidation: skipKeyValidation, }); root.walletClients[credentials.walletId] = client; diff --git a/src/js/services/storageService.js b/src/js/services/storageService.js index 4b9b91b33..d80a0f78d 100644 --- a/src/js/services/storageService.js +++ b/src/js/services/storageService.js @@ -113,7 +113,6 @@ angular.module('copayApp.services') }; root.storeProfile = function(profile, cb) { -console.log('[storageService.js.115:storeProfile:]',profile); //TODO encryptOnMobile(profile.toObj(), function(err, x) { storage.set('profile', x, cb); });