From 823814817d38423bd73d468d93146e6c7efa857d Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Fri, 8 Sep 2017 16:55:04 -0300 Subject: [PATCH 1/5] Adds bitcoincash URL support --- app-template/config-template.xml | 1 + src/js/controllers/addressbookAdd.js | 2 +- src/js/controllers/customAmount.js | 8 +++- src/js/controllers/tab-receive.js | 4 +- src/js/services/incomingData.js | 55 +++++++++++++++++----------- src/js/services/openURL.js | 5 ++- www/views/customAmount.html | 2 +- www/views/tab-receive.html | 2 +- 8 files changed, 49 insertions(+), 30 deletions(-) diff --git a/app-template/config-template.xml b/app-template/config-template.xml index 86117d6d3..023aa88ec 100644 --- a/app-template/config-template.xml +++ b/app-template/config-template.xml @@ -66,6 +66,7 @@ + diff --git a/src/js/controllers/addressbookAdd.js b/src/js/controllers/addressbookAdd.js index 7cd72b2f7..92a5a4287 100644 --- a/src/js/controllers/addressbookAdd.js +++ b/src/js/controllers/addressbookAdd.js @@ -14,7 +14,7 @@ angular.module('copayApp.controllers').controller('addressbookAddController', fu $timeout(function() { var form = addressbookForm; if (data && form) { - data = data.replace('bitcoin:', ''); + data = data.replace(/^bitcoin[cash]*:/, ''); form.address.$setViewValue(data); form.address.$isValid = true; form.address.$render(); diff --git a/src/js/controllers/customAmount.js b/src/js/controllers/customAmount.js index a57ea8c3b..4d31f5ea6 100644 --- a/src/js/controllers/customAmount.js +++ b/src/js/controllers/customAmount.js @@ -63,12 +63,16 @@ angular.module('copayApp.controllers').controller('customAmountController', func $scope.shareAddress = function() { if (!platformInfo.isCordova) return; - var data = 'bitcoin:' + $scope.address + '?amount=' + $scope.amountBtc + '&coin=' + $scope.wallet.coin; + var protocol = 'bitcoin'; + if ($scope.wallet.coin == 'bch') protocol += 'cash'; + var data = protocol + ':' + $scope.address + '?amount=' + $scope.amountBtc; window.plugins.socialsharing.share(data, null, null, null); } $scope.copyToClipboard = function() { - return 'bitcoin:' + $scope.address + '?amount=' + $scope.amountBtc + '&coin=' + $scope.wallet.coin; + var protocol = 'bitcoin'; + if ($scope.wallet.coin == 'bch') protocol += 'cash'; + return protocol + ':' + $scope.address + '?amount=' + $scope.amountBtc; }; }); diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 43785ab8b..97303c4ff 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -137,6 +137,8 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi $scope.shareAddress = function() { if (!$scope.isCordova) return; - window.plugins.socialsharing.share('bitcoin:' + $scope.addr, null, null, null); + var protocol = 'bitcoin'; + if ($scope.wallet.coin == 'bch') protocol += 'cash'; + window.plugins.socialsharing.share(protocol + ':' + $scope.addr, null, null, null); } }); diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index 8e384b051..aa6a264ad 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -69,8 +69,8 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat }, 100); } // data extensions for Payment Protocol with non-backwards-compatible request - if ((/^bitcoin:\?r=[\w+]/).exec(data)) { - data = decodeURIComponent(data.replace('bitcoin:?r=', '')); + if ((/^bitcoin[cash]*:\?r=[\w+]/).exec(data)) { + data = decodeURIComponent(data.replace(/bitcoin[cash]*:?r=/, '')); $state.go('tabs.send', {}, { 'reload': true, 'notify': $state.current.name == 'tabs.send' ? false : true @@ -84,27 +84,38 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat data = sanitizeUri(data); - // BIP21 - if (bitcore.URI.isValid(data)) { - var parsed = new bitcore.URI(data); - - var addr = parsed.address ? parsed.address.toString() : ''; - var message = parsed.message; - - var amount = parsed.amount ? parsed.amount : ''; - var coin = parsed.extras && parsed.extras.coin ? parsed.extras.coin : ''; - - if (parsed.r) { - payproService.getPayProDetails(parsed.r, function(err, details) { - if (err) { - if (addr && amount) goSend(addr, amount, message, coin); - else popupService.showAlert(gettextCatalog.getString('Error'), err); - } else handlePayPro(details); - }); - } else { - goSend(addr, amount, message, coin); + // Bitcoin or Bitcoin Cash URL + if ((/^bitcoin[cash]*:/).exec(data)) { + var coin = 'btc'; + if ((/^bitcoincash*:/).exec(data)) { + coin = 'bch'; + data = data.replace(/bitcoincash*:/, 'bitcoin:'); + } +console.log('[incomingData.js:93]', coin, data); //TODO/ + if (bitcore.URI.isValid(data)) { + var parsed = new bitcore.URI(data); + + var addr = parsed.address ? parsed.address.toString() : ''; + var message = parsed.message; + + var amount = parsed.amount ? parsed.amount : ''; + + if (parsed.r) { + payproService.getPayProDetails(parsed.r, function(err, details) { + if (err) { + if (addr && amount) goSend(addr, amount, message, coin); + else popupService.showAlert(gettextCatalog.getString('Error'), err); + } else handlePayPro(details); + }); + } else { + goSend(addr, amount, message, coin); + } + return true; + + } else { + $log.error('Invalid Bitcoin URL'); + return false; } - return true; // Plain URL } else if (/^https?:\/\//.test(data)) { diff --git a/src/js/services/openURL.js b/src/js/services/openURL.js index 29bdb248d..120070e5f 100644 --- a/src/js/services/openURL.js +++ b/src/js/services/openURL.js @@ -57,10 +57,10 @@ angular.module('copayApp.services').factory('openURLService', function($rootScop // This event is sent to an existent instance of Copay (only for standalone apps) gui.App.on('open', function(pathData) { - if (pathData.indexOf('bitcoin:') != -1) { + if (pathData.indexOf(/^bitcoin[cash]*:/) != -1) { $log.debug('Bitcoin URL found'); handleOpenURL({ - url: pathData.substring(pathData.indexOf('bitcoin:')) + url: pathData.substring(pathData.indexOf(/^bitcoin[cash]*:/)) }); } else if (pathData.indexOf(appConfigService.name + '://') != -1) { $log.debug(appConfigService.name + ' URL found'); @@ -84,6 +84,7 @@ angular.module('copayApp.services').factory('openURLService', function($rootScop if (navigator.registerProtocolHandler) { $log.debug('Registering Browser handlers base:' + base); navigator.registerProtocolHandler('bitcoin', url, 'Copay Bitcoin Handler'); + navigator.registerProtocolHandler('web+bitcoincash', url, 'Copay Bitcoin Cash Handler'); navigator.registerProtocolHandler('web+copay', url, 'Copay Wallet Handler'); navigator.registerProtocolHandler('web+bitpay', url, 'BitPay Wallet Handler'); } diff --git a/www/views/customAmount.html b/www/views/customAmount.html index c05c8d704..1c8bf647f 100644 --- a/www/views/customAmount.html +++ b/www/views/customAmount.html @@ -21,7 +21,7 @@
- +
diff --git a/www/views/tab-receive.html b/www/views/tab-receive.html index 95c35b8de..1e0b203e4 100644 --- a/www/views/tab-receive.html +++ b/www/views/tab-receive.html @@ -34,7 +34,7 @@ Show address - +
{{addr}} From e8145756a7d0172bcc8abdea2737bdda55f0b68c Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Fri, 8 Sep 2017 17:03:51 -0300 Subject: [PATCH 2/5] Removes console log --- src/js/services/incomingData.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index aa6a264ad..817d42da4 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -91,7 +91,6 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat coin = 'bch'; data = data.replace(/bitcoincash*:/, 'bitcoin:'); } -console.log('[incomingData.js:93]', coin, data); //TODO/ if (bitcore.URI.isValid(data)) { var parsed = new bitcore.URI(data); From 0c67f02754ffe0a1c2a47b460a15b35471d1225a Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Sat, 9 Sep 2017 19:23:46 -0300 Subject: [PATCH 3/5] Fix regex --- src/js/controllers/addressbookAdd.js | 2 +- src/js/services/incomingData.js | 8 ++++---- src/js/services/openURL.js | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/js/controllers/addressbookAdd.js b/src/js/controllers/addressbookAdd.js index 92a5a4287..267acc154 100644 --- a/src/js/controllers/addressbookAdd.js +++ b/src/js/controllers/addressbookAdd.js @@ -14,7 +14,7 @@ angular.module('copayApp.controllers').controller('addressbookAddController', fu $timeout(function() { var form = addressbookForm; if (data && form) { - data = data.replace(/^bitcoin[cash]*:/, ''); + data = data.replace(/^bitcoin(cash)?:/, ''); form.address.$setViewValue(data); form.address.$isValid = true; form.address.$render(); diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index 817d42da4..6afbef5d3 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -69,8 +69,8 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat }, 100); } // data extensions for Payment Protocol with non-backwards-compatible request - if ((/^bitcoin[cash]*:\?r=[\w+]/).exec(data)) { - data = decodeURIComponent(data.replace(/bitcoin[cash]*:?r=/, '')); + if ((/^bitcoin(cash)?:\?r=[\w+]/).exec(data)) { + data = decodeURIComponent(data.replace(/bitcoin(cash)?:\?r=/, '')); $state.go('tabs.send', {}, { 'reload': true, 'notify': $state.current.name == 'tabs.send' ? false : true @@ -85,9 +85,9 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat data = sanitizeUri(data); // Bitcoin or Bitcoin Cash URL - if ((/^bitcoin[cash]*:/).exec(data)) { + if ((/^bitcoin(cash)?:/).exec(data)) { var coin = 'btc'; - if ((/^bitcoincash*:/).exec(data)) { + if ((/^bitcoincash:/).exec(data)) { coin = 'bch'; data = data.replace(/bitcoincash*:/, 'bitcoin:'); } diff --git a/src/js/services/openURL.js b/src/js/services/openURL.js index 120070e5f..b03f4b16a 100644 --- a/src/js/services/openURL.js +++ b/src/js/services/openURL.js @@ -57,10 +57,10 @@ angular.module('copayApp.services').factory('openURLService', function($rootScop // This event is sent to an existent instance of Copay (only for standalone apps) gui.App.on('open', function(pathData) { - if (pathData.indexOf(/^bitcoin[cash]*:/) != -1) { + if (pathData.indexOf(/^bitcoin(cash)?:/) != -1) { $log.debug('Bitcoin URL found'); handleOpenURL({ - url: pathData.substring(pathData.indexOf(/^bitcoin[cash]*:/)) + url: pathData.substring(pathData.indexOf(/^bitcoin(cash)?:/)) }); } else if (pathData.indexOf(appConfigService.name + '://') != -1) { $log.debug(appConfigService.name + ' URL found'); From 34fb28d389a05e96df27155b7ef031fc9224710f Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Sat, 9 Sep 2017 19:25:22 -0300 Subject: [PATCH 4/5] Fix regex 2 --- src/js/services/incomingData.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/services/incomingData.js b/src/js/services/incomingData.js index 6afbef5d3..a805fac29 100644 --- a/src/js/services/incomingData.js +++ b/src/js/services/incomingData.js @@ -89,7 +89,7 @@ angular.module('copayApp.services').factory('incomingData', function($log, $stat var coin = 'btc'; if ((/^bitcoincash:/).exec(data)) { coin = 'bch'; - data = data.replace(/bitcoincash*:/, 'bitcoin:'); + data = data.replace(/bitcoincash:/, 'bitcoin:'); } if (bitcore.URI.isValid(data)) { var parsed = new bitcore.URI(data); From 779d21e9e9a15ab034df7efe871b670630ef91fa Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Sat, 9 Sep 2017 19:42:48 -0300 Subject: [PATCH 5/5] Get protocol handler from walletService --- src/js/controllers/customAmount.js | 6 ++++++ src/js/controllers/tab-receive.js | 5 +++++ src/js/services/walletService.js | 5 +++++ www/views/customAmount.html | 2 +- www/views/tab-receive.html | 2 +- 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/js/controllers/customAmount.js b/src/js/controllers/customAmount.js index 4d31f5ea6..a58f9767b 100644 --- a/src/js/controllers/customAmount.js +++ b/src/js/controllers/customAmount.js @@ -8,6 +8,10 @@ angular.module('copayApp.controllers').controller('customAmountController', func }); }; + var setProtocolHandler = function() { + $scope.protocolHandler = walletService.getProtocolHandler($scope.wallet); + } + $scope.$on("$ionicView.beforeEnter", function(event, data) { var walletId = data.stateParams.id; @@ -20,6 +24,8 @@ angular.module('copayApp.controllers').controller('customAmountController', func $scope.wallet = profileService.getWallet(walletId); + setProtocolHandler(); + walletService.getAddress($scope.wallet, false, function(err, addr) { if (!addr) { showErrorAndBack('Error', 'Could not get the address'); diff --git a/src/js/controllers/tab-receive.js b/src/js/controllers/tab-receive.js index 97303c4ff..6677aa26d 100644 --- a/src/js/controllers/tab-receive.js +++ b/src/js/controllers/tab-receive.js @@ -124,8 +124,13 @@ angular.module('copayApp.controllers').controller('tabReceiveController', functi return wallet; } + var setProtocolHandler = function() { + $scope.protocolHandler = walletService.getProtocolHandler($scope.wallet); + } + $scope.onWalletSelect = function(wallet) { $scope.wallet = wallet; + setProtocolHandler(); $scope.setAddress(); }; diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 1e7eb6dc8..3768cecaa 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -1232,5 +1232,10 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim }); }; + root.getProtocolHandler = function(wallet) { + if (wallet.coin== 'bch') return 'bitcoincash'; + else return 'bitcoin'; + } + return root; }); diff --git a/www/views/customAmount.html b/www/views/customAmount.html index 1c8bf647f..cd3d9da15 100644 --- a/www/views/customAmount.html +++ b/www/views/customAmount.html @@ -21,7 +21,7 @@
- +
diff --git a/www/views/tab-receive.html b/www/views/tab-receive.html index 1e0b203e4..5074da2c0 100644 --- a/www/views/tab-receive.html +++ b/www/views/tab-receive.html @@ -34,7 +34,7 @@ Show address - +
{{addr}}