From 0a5c32b9f335e43480a9518ff6cd291cd456bd04 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Wed, 20 Jan 2016 15:25:54 -0300 Subject: [PATCH] Touchid before Unlock on iOS --- public/views/modals/txp-details.html | 6 +- src/js/controllers/index.js | 3 + src/js/controllers/walletHome.js | 186 +++++++++++++-------------- src/js/services/profileService.js | 1 + 4 files changed, 99 insertions(+), 97 deletions(-) diff --git a/public/views/modals/txp-details.html b/public/views/modals/txp-details.html index 162f1c258..fdd9cf4a1 100644 --- a/public/views/modals/txp-details.html +++ b/public/views/modals/txp-details.html @@ -170,12 +170,12 @@ -
-
+
+
* A payment proposal can be deleted if 1) you are the creator, and no other copayer has signed, or 2) 24 hours have passed since the proposal was created.
diff --git a/src/js/controllers/index.js b/src/js/controllers/index.js index 5cf078261..657ee5927 100644 --- a/src/js/controllers/index.js +++ b/src/js/controllers/index.js @@ -1485,6 +1485,9 @@ angular.module('copayApp.controllers').controller('indexController', function($r return cb(err, pass); }, }; + $timeout(function() { + $rootScope.$apply(); + }); }); lodash.each(['NewCopayer', 'CopayerUpdated'], function(eventName) { diff --git a/src/js/controllers/walletHome.js b/src/js/controllers/walletHome.js index a9b977348..8d63f80f4 100644 --- a/src/js/controllers/walletHome.js +++ b/src/js/controllers/walletHome.js @@ -335,69 +335,70 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi $scope.sign = function(txp) { var fc = profileService.focusedClient; + $scope.error = null; if (!fc.canSign() && !fc.isPrivKeyExternal()) return; - if (fc.isPrivKeyEncrypted()) { - profileService.unlockFC(function(err) { - if (err) { - $scope.error = bwsError.msg(err); - return; - } - return $scope.sign(txp); - }); - return; - }; - - self._setOngoingForSigning(); $scope.loading = true; - $scope.error = null; $timeout(function() { + requestTouchid(function(err) { if (err) { - self.setOngoingProcess(); $scope.loading = false; - profileService.lockFC(); $scope.error = err; - $scope.$digest(); + $timeout(function() { + $scope.$digest(); + }); return; } - profileService.signTxProposal(txp, function(err, txpsi) { - self.setOngoingProcess(); + profileService.unlockFC(function(err) { if (err) { - $scope.$emit('UpdateTx'); $scope.loading = false; - $scope.error = bwsError.msg(err, gettextCatalog.getString('Could not accept payment')); - $scope.$digest(); - } else { - //if txp has required signatures then broadcast it - var txpHasRequiredSignatures = txpsi.status == 'accepted'; - if (txpHasRequiredSignatures) { - self.setOngoingProcess(gettextCatalog.getString('Broadcasting transaction')); - $scope.loading = true; - fc.broadcastTxProposal(txpsi, function(err, txpsb, memo) { - self.setOngoingProcess(); - $scope.loading = false; - if (err) { - $scope.$emit('UpdateTx'); - $scope.error = bwsError.msg(err, gettextCatalog.getString('Could not broadcast payment')); - $scope.$digest(); - } else { - $log.debug('Transaction signed and broadcasted') - if (memo) - $log.info(memo); - - refreshUntilItChanges = true; - $modalInstance.close(txpsb); - } - }); - } else { - $scope.loading = false; - $modalInstance.close(txpsi); - } + $scope.error = bwsError.msg(err); + $timeout(function() { + $scope.$digest(); + }); + return; } + + self._setOngoingForSigning(); + profileService.signTxProposal(txp, function(err, txpsi) { + self.setOngoingProcess(); + if (err) { + $scope.$emit('UpdateTx'); + $scope.loading = false; + $scope.error = bwsError.msg(err, gettextCatalog.getString('Could not accept payment')); + $scope.$digest(); + } else { + //if txp has required signatures then broadcast it + var txpHasRequiredSignatures = txpsi.status == 'accepted'; + if (txpHasRequiredSignatures) { + self.setOngoingProcess(gettextCatalog.getString('Broadcasting transaction')); + $scope.loading = true; + fc.broadcastTxProposal(txpsi, function(err, txpsb, memo) { + self.setOngoingProcess(); + $scope.loading = false; + if (err) { + $scope.$emit('UpdateTx'); + $scope.error = bwsError.msg(err, gettextCatalog.getString('Could not broadcast payment')); + $scope.$digest(); + } else { + $log.debug('Transaction signed and broadcasted') + if (memo) + $log.info(memo); + + refreshUntilItChanges = true; + $modalInstance.close(txpsb); + } + }); + } else { + $scope.loading = false; + $modalInstance.close(txpsi); + } + } + }); }); }); }, 100); @@ -833,6 +834,8 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi var currentSpendUnconfirmed = configWallet.spendUnconfirmed; var currentFeeLevel = walletSettings.feeLevel || 'normal'; + this.resetError(); + if (isCordova && this.isWindowsPhoneApp) { this.hideAddress = false; this.hideAmount = false; @@ -842,15 +845,7 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi if (form.$invalid) { this.error = gettext('Unable to send transaction proposal'); return; - } - - if (fc.isPrivKeyEncrypted()) { - profileService.unlockFC(function(err) { - if (err) return self.setSendError(err); - return self.submitForm(); - }); - return; - }; + } var comment = form.comment.$modelValue; @@ -869,7 +864,6 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi } }; - self.setOngoingProcess(gettextCatalog.getString('Creating transaction')); $timeout(function() { var paypro = self._paypro; var address, amount; @@ -879,8 +873,6 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi requestTouchid(function(err) { if (err) { - profileService.lockFC(); - self.setOngoingProcess(); self.error = err; $timeout(function() { $scope.$digest(); @@ -888,42 +880,48 @@ angular.module('copayApp.controllers').controller('walletHomeController', functi return; } - getFee(function(err, feePerKb) { - if (err) $log.debug(err); - fc.sendTxProposal({ - toAddress: address, - amount: amount, - message: comment, - payProUrl: paypro ? paypro.url : null, - feePerKb: feePerKb, - excludeUnconfirmedUtxos: currentSpendUnconfirmed ? false : true - }, function(err, txp) { - if (err) { - self.setOngoingProcess(); - profileService.lockFC(); - return self.setSendError(err); - } - - if (!fc.canSign() && !fc.isPrivKeyExternal()) { - $log.info('No signing proposal: No private key') - self.setOngoingProcess(); - self.resetForm(); - txStatus.notify(txp, function() { - return $scope.$emit('Local/TxProposalAction'); - }); - return; - } - - self.signAndBroadcast(txp, function(err) { - self.setOngoingProcess(); - self.resetForm(); + profileService.unlockFC(function(err) { + if (err) { + return self.setSendError(err); + } + + self.setOngoingProcess(gettextCatalog.getString('Creating transaction')); + getFee(function(err, feePerKb) { + if (err) $log.debug(err); + fc.sendTxProposal({ + toAddress: address, + amount: amount, + message: comment, + payProUrl: paypro ? paypro.url : null, + feePerKb: feePerKb, + excludeUnconfirmedUtxos: currentSpendUnconfirmed ? false : true + }, function(err, txp) { if (err) { - self.error = err.message ? err.message : gettext('The payment was created but could not be completed. Please try again from home screen'); - $scope.$emit('Local/TxProposalAction'); - $timeout(function() { - $scope.$digest(); - }, 1); - } else go.walletHome(); + self.setOngoingProcess(); + return self.setSendError(err); + } + + if (!fc.canSign() && !fc.isPrivKeyExternal()) { + $log.info('No signing proposal: No private key') + self.setOngoingProcess(); + self.resetForm(); + txStatus.notify(txp, function() { + return $scope.$emit('Local/TxProposalAction'); + }); + return; + } + + self.signAndBroadcast(txp, function(err) { + self.setOngoingProcess(); + self.resetForm(); + if (err) { + self.error = err.message ? err.message : gettext('The payment was created but could not be completed. Please try again from home screen'); + $scope.$emit('Local/TxProposalAction'); + $timeout(function() { + $scope.$digest(); + }, 1); + } else go.walletHome(); + }); }); }); }); diff --git a/src/js/services/profileService.js b/src/js/services/profileService.js index 952882480..52e42ce57 100644 --- a/src/js/services/profileService.js +++ b/src/js/services/profileService.js @@ -630,6 +630,7 @@ angular.module('copayApp.services') root.unlockFC = function(cb) { var fc = root.focusedClient; + if (!fc.isPrivKeyEncrypted()) return cb(); $log.debug('Wallet is encrypted'); $rootScope.$emit('Local/NeedsPassword', false, function(err2, password) { if (err2 || !password) {