From 4d94121ec624c5138a70b052f8812c45af8c5e17 Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 18 Nov 2015 18:37:42 -0300 Subject: [PATCH] WIP passphrase confirm - add passphrase view and separate controllers --- public/views/backup.html | 28 ++++---- public/views/backupConfirm.html | 7 +- public/views/backupPassphrase.html | 57 ++++++++++++++++ public/views/backupWords.html | 26 +++---- public/views/export.html | 32 ++++----- src/js/controllers/bachupWords.js | 56 ++++++++++++++++ src/js/controllers/backup.js | 93 ++------------------------ src/js/controllers/backupConfirm.js | 22 ++++++ src/js/controllers/backupPassphrase.js | 34 ++++++++++ src/js/controllers/export.js | 2 +- src/js/routes.js | 11 +++ 11 files changed, 234 insertions(+), 134 deletions(-) create mode 100644 public/views/backupPassphrase.html create mode 100644 src/js/controllers/bachupWords.js create mode 100644 src/js/controllers/backupConfirm.js create mode 100644 src/js/controllers/backupPassphrase.js diff --git a/public/views/backup.html b/public/views/backup.html index ed223c1a0..66fc58114 100644 --- a/public/views/backup.html +++ b/public/views/backup.html @@ -4,18 +4,14 @@ ng-init="titleSection='Backup'; goBackToState = 'preferences'"> - -
+

-
{{wordsC.error|translate}}
- -
@@ -75,23 +71,23 @@ -
+
Your Wallet Seed
-
+
-
- {{word}}  -
+
+ {{word}}  +
-
+
@@ -120,8 +116,12 @@
-->
-
@@ -136,8 +136,6 @@
-
-
diff --git a/public/views/backupConfirm.html b/public/views/backupConfirm.html index a603360c2..e1f7aa4b6 100644 --- a/public/views/backupConfirm.html +++ b/public/views/backupConfirm.html @@ -4,10 +4,9 @@ ng-init="titleSection='Backup'; goBackToState = 'backupWords'">
- -
+

-
+
@@ -19,7 +18,7 @@
diff --git a/public/views/backupPassphrase.html b/public/views/backupPassphrase.html new file mode 100644 index 000000000..aa837fcb7 --- /dev/null +++ b/public/views/backupPassphrase.html @@ -0,0 +1,57 @@ +
+
+ +
+

+
+ + {{backupPassphraseC.error|translate}} + +
+ +
+
+
+ Passphrase needed +
+
+ +
+
+ +
+ + +
+ +
+
+
+ You can safely install your wallet on another device and use it from multiple devices at the same time. + + Learn more about Copay backups + +
+
+
+ +
+
+
diff --git a/public/views/backupWords.html b/public/views/backupWords.html index b8560609a..95aa7b660 100644 --- a/public/views/backupWords.html +++ b/public/views/backupWords.html @@ -4,17 +4,10 @@ ng-init="titleSection='Backup'; goBackToState = 'backup'">
- -
+

- -
- - {{wordsC.error|translate}} - -
-
+
@@ -28,8 +21,8 @@
- - + +
@@ -37,12 +30,21 @@
+
diff --git a/public/views/export.html b/public/views/export.html index 2d5a2a558..4b3f24b67 100644 --- a/public/views/export.html +++ b/public/views/export.html @@ -6,17 +6,17 @@ -
+

-
-
+
+
Failed to export
-
+
The private key for this wallet is encrypted. Exporting keep the private key encrypted in the export archive. @@ -31,14 +31,14 @@
+ name="password" ng-model="exportC.password">
+ name="password" ng-model="exportC.repeatpassword">
@@ -83,25 +83,25 @@
- -

Export options

- -
@@ -109,11 +109,11 @@
-
+

Wallet Export

- +
diff --git a/src/js/controllers/bachupWords.js b/src/js/controllers/bachupWords.js new file mode 100644 index 000000000..672f95682 --- /dev/null +++ b/src/js/controllers/bachupWords.js @@ -0,0 +1,56 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('backupWordsController', + function($rootScope, $scope, $timeout, $log, $compile, lodash, profileService, go, gettext, confirmDialog, notification, bwsError) { + + var self = this; + var fc = profileService.focusedClient; + var customSortWords = []; + self.sorted = false; + + setWords(fc.getMnemonic()); + + function setWords(words) { + if (words) { + self.mnemonicWords = words.split(/[\u3000\s]+/); + self.mnemonicHasPassphrase = fc.mnemonicHasPassphrase(); + self.useIdeograms = words.indexOf("\u3000") >= 0; + } + }; + + self.enableButton = function(word) { + document.getElementById(word).disabled = false; + lodash.remove(customSortWords, function(v) { + return v == word; + }); + } + + self.disableButton = function(word) { + document.getElementById(word).disabled = true; + customSortWords.push(word); + self.addButton(word); + } + + self.addButton = function(word) { + var btnhtml = ''; + var temp = $compile(btnhtml)($scope); + angular.element(document.getElementById('addWord')).append(temp); + self.shouldContinue(customSortWords); + } + + self.removeButton = function(event) { + var id = (event.target.id); + var element = document.getElementById(id); + element.remove(); + self.enableButton(id.substring(1)); + self.shouldContinue(customSortWords); + } + + self.shouldContinue = function(customSortWords) { + if (lodash.isEqual(self.mnemonicWords, customSortWords)) + self.sorted = true; + else + self.sorted = false; + } + }); diff --git a/src/js/controllers/backup.js b/src/js/controllers/backup.js index f0c3c0bc8..dbc37814d 100644 --- a/src/js/controllers/backup.js +++ b/src/js/controllers/backup.js @@ -1,57 +1,17 @@ 'use strict'; -angular.module('copayApp.controllers').controller('wordsController', +angular.module('copayApp.controllers').controller('backupController', function($rootScope, $scope, $timeout, $log, $compile, lodash, profileService, go, gettext, confirmDialog, notification, bwsError) { - var msg = gettext('Are you sure you want to delete the backup words?'); - var successMsg = gettext('Backup words deleted'); var self = this; - var customSortWords = []; var fc = profileService.focusedClient; - self.show = false; - self.sorted = false; - if (fc.isPrivKeyEncrypted()) + if (fc.isPrivKeyEncrypted()) { self.credentialsEncrypted = true; - else + passwordRequest(); + } else setWords(fc.getMnemonic()); - if (fc.credentials && !fc.credentials.mnemonicEncrypted && !fc.credentials.mnemonic) - self.deleted = true; - - self.toggle = function() { - self.error = ""; - if (!self.credentialsEncrypted) { - if (!self.show) - $rootScope.$emit('Local/BackupDone'); - self.show = !self.show; - } - - if (self.credentialsEncrypted) - self.passwordRequest(); - - $timeout(function() { - $scope.$apply(); - }, 1); - }; - - self.delete = function() { - confirmDialog.show(msg, function(ok) { - if (ok) { - fc.clearMnemonic(); - profileService.updateCredentialsFC(function() { - self.deleted = true; - notification.success(successMsg); - go.walletHome(); - }); - } - }); - }; - - $scope.$on('$destroy', function() { - profileService.lockFC(); - }); - function setWords(words) { if (words) { self.mnemonicWords = words.split(/[\u3000\s]+/); @@ -60,12 +20,11 @@ angular.module('copayApp.controllers').controller('wordsController', } }; - self.passwordRequest = function() { + function passwordRequest() { try { setWords(fc.getMnemonic()); } catch (e) { if (e.message && e.message.match(/encrypted/) && fc.isPrivKeyEncrypted()) { - self.credentialsEncrypted = true; $timeout(function() { $scope.$apply(); @@ -77,50 +36,12 @@ angular.module('copayApp.controllers').controller('wordsController', $log.warn('Error decrypting credentials:', self.error); //TODO return; } - if (!self.show && self.credentialsEncrypted) - self.show = !self.show; + self.credentialsEncrypted = false; setWords(fc.getMnemonic()); - $rootScope.$emit('Local/BackupDone'); + // $rootScope.$emit('Local/BackupDone'); }); } } } - - self.enableButton = function(word) { - document.getElementById(word).disabled = false; - lodash.remove(customSortWords, function(v) { - return v == word; - }); - } - - self.disableButton = function(word) { - document.getElementById(word).disabled = true; - customSortWords.push(word); - self.addButton(word); - } - - self.addButton = function(word) { - var asd = 'apospodk'; - var btnhtml = ''; - var temp = $compile(btnhtml)($scope); - angular.element(document.getElementById('addWord')).append(temp); - self.shouldContinue(customSortWords); - } - - self.removeButton = function(event) { - var id = (event.target.id); - var element = document.getElementById(id); - element.remove(); - self.enableButton(id.substring(1)); - self.shouldContinue(customSortWords); - } - - self.shouldContinue = function(customSortWords) { - if (lodash.isEqual(self.mnemonicWords, customSortWords)) - self.sorted = true; - else - self.sorted = false; - } }); diff --git a/src/js/controllers/backupConfirm.js b/src/js/controllers/backupConfirm.js new file mode 100644 index 000000000..609186249 --- /dev/null +++ b/src/js/controllers/backupConfirm.js @@ -0,0 +1,22 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('backupConfirmController', + function($rootScope, $scope, $timeout, $log, $compile, lodash, profileService, go, gettext, confirmDialog, notification, bwsError) { + + var self = this; + var fc = profileService.focusedClient; + + setWords(fc.getMnemonic()); + + function setWords(words) { + if (words) { + self.mnemonicWords = words.split(/[\u3000\s]+/); + self.mnemonicHasPassphrase = fc.mnemonicHasPassphrase(); + self.useIdeograms = words.indexOf("\u3000") >= 0; + } + }; + + self.confirm = function() { + $rootScope.$emit('Local/BackupDone'); + } + }); diff --git a/src/js/controllers/backupPassphrase.js b/src/js/controllers/backupPassphrase.js new file mode 100644 index 000000000..bcfdd7885 --- /dev/null +++ b/src/js/controllers/backupPassphrase.js @@ -0,0 +1,34 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('backupPassphraseController', + function($rootScope, $scope, $timeout, $log, $compile, bwcService, lodash, profileService, go, gettext, confirmDialog, notification, bwsError) { + + var self = this; + var fc = profileService.focusedClient; + self.passphraseSuccess = false; + self.error = ""; + + setWords(fc.getMnemonic()); + var words = fc.getMnemonic(); + + function setWords(words) { + if (words) { + self.mnemonicWords = words.split(/[\u3000\s]+/); + self.mnemonicHasPassphrase = fc.mnemonicHasPassphrase(); + self.useIdeograms = words.indexOf("\u3000") >= 0; + } + }; + + self.confirm = function() { + var walletClient = bwcService.getClient(); + + walletClient.importFromMnemonic(words, { + network: 'livenet', + passphrase: $scope.passphrase, + account: 0, + }, function(err) { + if (err) + self.error = err.message; + }); + } + }); diff --git a/src/js/controllers/export.js b/src/js/controllers/export.js index b25150550..af2f9ba4c 100644 --- a/src/js/controllers/export.js +++ b/src/js/controllers/export.js @@ -1,6 +1,6 @@ 'use strict'; -angular.module('copayApp.controllers').controller('backupController', +angular.module('copayApp.controllers').controller('exportController', function($rootScope, $scope, $timeout, $log, backupService, storageService, profileService, isMobile, notification, go, gettext, gettextCatalog) { var self = this; diff --git a/src/js/routes.js b/src/js/routes.js index 500fb70aa..eaea05692 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -456,6 +456,17 @@ angular }, } }) + .state('backupPassphrase', { + url: '/backupPassphrase', + templateUrl: 'views/backupPassphrase.html', + walletShouldBeComplete: true, + needProfile: true, + views: { + 'main': { + templateUrl: 'views/backupPassphrase.html' + }, + } + }) .state('preferencesGlobal', { url: '/preferencesGlobal', needProfile: true,