diff --git a/src/js/controllers/export.js b/src/js/controllers/export.js index a5a90766b..64fa8ba9d 100644 --- a/src/js/controllers/export.js +++ b/src/js/controllers/export.js @@ -15,6 +15,54 @@ angular.module('copayApp.controllers').controller('exportController', }); }; + function prepareWallet(cb) { + if ($scope.password) return cb($scope.password); + + walletService.prepare(wallet, function(err, password) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), err); + return cb(); + } + $scope.password = password; + + walletService.getEncodedWalletInfo(wallet, $scope.password, function(err, code) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Could not decrypt private key')); + return cb(password); + } + + $scope.file.value = false; + + if (!code) + $scope.formData.supported = false; + else { + $scope.formData.supported = true; + $scope.formData.exportWalletInfo = code; + } + + $timeout(function() { + $scope.$apply(); + }); + return cb(password); + }); + }); + }; + + $scope.generateQrCode = function() { + if ($scope.formData.exportWalletInfo) { + $scope.file.value = false; + $timeout(function() { + $scope.$apply(); + }); + return; + } + + prepareWallet(function(password) { + if (!password) return; + $scope.password = password; + }); + }; + var init = function() { $scope.formData = {}; $scope.isEncrypted = wallet.isPrivKeyEncrypted(); @@ -25,23 +73,6 @@ angular.module('copayApp.controllers').controller('exportController', $scope.wallet = wallet; $scope.canSign = wallet.canSign(); - walletService.getEncodedWalletInfo(wallet, function(err, code) { - if (err || !code) { - $log.warn(err); - return $ionicHistory.goBack(); - } - - if (!code) - $scope.formData.supported = false; - else { - $scope.formData.supported = true; - $scope.formData.exportWalletInfo = code; - } - - $timeout(function() { - $scope.$apply(); - }, 1); - }); }; /* @@ -67,23 +98,28 @@ angular.module('copayApp.controllers').controller('exportController', }; $scope.downloadWalletBackup = function() { - $scope.getAddressbook(function(err, localAddressBook) { - if (err) { - popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Failed to export')); - return; - } - var opts = { - noSign: $scope.formData.noSignEnabled, - addressBook: localAddressBook - }; + prepareWallet(function(password) { + if (!password) return; - backupService.walletDownload($scope.formData.password, opts, function(err) { + $scope.getAddressbook(function(err, localAddressBook) { if (err) { popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Failed to export')); return; } - $ionicHistory.removeBackView(); - $state.go('tabs.home'); + var opts = { + noSign: $scope.formData.noSignEnabled, + addressBook: localAddressBook, + password: password + }; + + backupService.walletDownload($scope.formData.password, opts, function(err) { + if (err) { + popupService.showAlert(gettextCatalog.getString('Error'), gettextCatalog.getString('Failed to export')); + return; + } + $ionicHistory.removeBackView(); + $state.go('tabs.home'); + }); }); }); }; @@ -171,6 +207,11 @@ angular.module('copayApp.controllers').controller('exportController', $scope.$on("$ionicView.beforeEnter", function(event, data) { init(); + $scope.file = { + value: true + }; + $scope.formData.exportWalletInfo = null; + $scope.password = null; }); }); diff --git a/src/js/services/walletService.js b/src/js/services/walletService.js index 748846d72..593698907 100644 --- a/src/js/services/walletService.js +++ b/src/js/services/walletService.js @@ -869,10 +869,9 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim if (!root.isEncrypted(wallet)) return cb(); askPassword(wallet.name, gettext('Enter Spending Password'), function(password) { - if (!password) return cb('no password'); - if (!wallet.checkPassword(password)) return cb('wrong password'); + if (!password) return cb('No password'); + if (!wallet.checkPassword(password)) return cb('Wrong password'); - wallet.credentials.decryptPrivateKey(password); return cb(null, password); }); }; @@ -990,8 +989,7 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim }); }; - root.getEncodedWalletInfo = function(wallet, cb) { - + root.getEncodedWalletInfo = function(wallet, password, cb) { var derivationPath = wallet.credentials.getBaseAddressDerivationPath(); var encodingType = { mnemonic: 1, @@ -1004,23 +1002,21 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim if (wallet.credentials.derivationStrategy != 'BIP44' || !wallet.canSign()) return null; - root.getKeys(wallet, function(err, keys) { - if (err || !keys) return cb(err); + var keys = root.getKeysWithPassword(wallet, password); - if (keys.mnemonic) { - info = { - type: encodingType.mnemonic, - data: keys.mnemonic, - } - } else { - info = { - type: encodingType.xpriv, - data: keys.xPrivKey - } + if (keys.mnemonic) { + info = { + type: encodingType.mnemonic, + data: keys.mnemonic, } - return cb(null, info.type + '|' + info.data + '|' + wallet.credentials.network.toLowerCase() + '|' + derivationPath + '|' + (wallet.credentials.mnemonicHasPassphrase)); + } else { + info = { + type: encodingType.xpriv, + data: keys.xPrivKey + } + } - }); + return cb(null, info.type + '|' + info.data + '|' + wallet.credentials.network.toLowerCase() + '|' + derivationPath + '|' + (wallet.credentials.mnemonicHasPassphrase)); }; root.setTouchId = function(wallet, enabled, cb) { @@ -1055,6 +1051,12 @@ angular.module('copayApp.services').factory('walletService', function($log, $tim }); }; + root.getKeysWithPassword = function(wallet, password) { + try { + return wallet.getKeys(password); + } catch (e) {} + } + root.getViewStatus = function(wallet, txp) { var status = txp.status; var type; diff --git a/www/views/export.html b/www/views/export.html index b6117ced1..805a84e1c 100644 --- a/www/views/export.html +++ b/www/views/export.html @@ -5,17 +5,17 @@ - -
-
+ +
+
File/Text
-
+
QR Code
-
-
+
+