From 16c3d66f33fd6b229f2c5b204bb3bf480657f473 Mon Sep 17 00:00:00 2001 From: Matias Pando Date: Fri, 31 Oct 2014 19:39:01 -0300 Subject: [PATCH] Import profile --- js/controllers/importProfile.js | 91 +++++++++++++++++++++++++++++++++ js/models/Identity.js | 26 ++++++++-- js/routes.js | 3 ++ views/home.html | 8 ++- views/importProfile.html | 62 ++++++++++++++++++++++ 5 files changed, 184 insertions(+), 6 deletions(-) create mode 100644 js/controllers/importProfile.js create mode 100644 views/importProfile.html diff --git a/js/controllers/importProfile.js b/js/controllers/importProfile.js new file mode 100644 index 000000000..6b32229a9 --- /dev/null +++ b/js/controllers/importProfile.js @@ -0,0 +1,91 @@ +'use strict'; + +angular.module('copayApp.controllers').controller('ImportProfileController', + function($scope, $rootScope, $location, controllerUtils, notification, isMobile, pluginManager) { + controllerUtils.redirIfLogged(); + + $scope.title = 'Import a backup'; + $scope.importStatus = 'Importing wallet - Reading backup...'; + $scope.hideAdv = true; + $scope.is_iOS = isMobile.iOS(); + + var reader = new FileReader(); + + var updateStatus = function(status) { + $scope.importStatus = status; + $scope.$digest(); + } + + var _importBackup = function(str) { + var password = $scope.password; + updateStatus('Importing profile - Setting things up...'); + // var skipFields = []; + // if ($scope.skipPublicKeyRing) + // skipFields.push('publicKeyRing'); + // + // if ($scope.skipTxProposals) + // skipFields.push('txProposals'); + + copay.Identity.importFromEncryptedFullJson(str, password, { + pluginManager: pluginManager, + network: config.network, + networkName: config.networkName, + walletDefaults: config.wallet, + passphraseConfig: config.passphraseConfig, + }, function(err, iden) { + if (err && !iden) { + console.log('Error:' + err) + controllerUtils.onErrorDigest( + $scope, (err.toString() || '').match('BADSTR') ? 'Bad password or corrupt profile file' : 'Unknown error'); + } else { + console.log('Success.....Profile imported successfully'); + notification.info('Success', 'Profile imported successfully'); + $location.path('/'); + } + }); + }; + + $scope.openFileDialog = function() { + if (window.cshell) { + return cshell.send('backup:import'); + } + $scope.choosefile = !$scope.choosefile; + }; + + $scope.getFile = function() { + // If we use onloadend, we need to check the readyState. + reader.onloadend = function(evt) { + if (evt.target.readyState == FileReader.DONE) { // DONE == 2 + var encryptedObj = evt.target.result; + _importBackup(encryptedObj); + } + }; + }; + + $scope.import = function(form) { + $scope.loading = true; + + if (form.$invalid) { + $scope.loading = false; + notification.error('Error', 'There is an error in the form.'); + return; + } + + var backupFile = $scope.file; + var backupText = form.backupText.$modelValue; + var password = form.password.$modelValue; + + if (!backupFile && !backupText) { + $scope.loading = false; + notification.error('Error', 'Please, select your backup file'); + $scope.loading = false; + return; + } + + if (backupFile) { + reader.readAsBinaryString(backupFile); + } else { + _importBackup(backupText); + } + }; + }); diff --git a/js/models/Identity.js b/js/models/Identity.js index bf1985258..b7ee01a17 100644 --- a/js/models/Identity.js +++ b/js/models/Identity.js @@ -287,6 +287,16 @@ Identity.prototype.close = function(cb) { * @return {Wallet} */ Identity.prototype.importEncryptedWallet = function(cypherText, password, opts, cb) { + console.log('importEncryptedWallet------'); + + console.log('opts'); + console.log(opts); + + console.log('password'); + console.log(password); + + console.log('cypherText'); + console.log(cypherText); var crypto = opts.cryptoUtil || cryptoUtil; // TODO set iter and salt using config.js @@ -345,7 +355,7 @@ Identity.prototype.closeWallet = function(wallet, cb) { Identity.importFromEncryptedFullJson = function(str, password, opts, cb) { var crypto = opts.cryptoUtil || cryptoUtil; var key = crypto.kdf(password); - return Identity.importFromFullJson(crypto.decript(key, str)); + return Identity.importFromFullJson(crypto.decrypt(key, str), password, opts, cb); }; Identity.importFromFullJson = function(str, password, opts, cb) { @@ -357,15 +367,21 @@ Identity.importFromFullJson = function(str, password, opts, cb) { return cb('Unable to retrieve json from string', str); } - if (!_.isNumber(json.iterations)) - return cb('BADSTR: Missing iterations'); + // if (!_.isNumber(json.iterations)) + // return cb('BADSTR: Missing iterations'); var email = json.email; - var iden = new Identity(email, password, opts); + + opts.email = email; + opts.password = password; + + var iden = new Identity(opts); json.wallets = json.wallets || {}; + async.map(json.wallets, function(walletData, callback) { - iden.importEncryptedWallet(wstr, password, opts, function(err, w) { + + iden.importWalletFromObj(walletData, opts, function(err, w) { if (err) return callback(err); log.debug('Wallet ' + w.getId() + ' imported'); callback(); diff --git a/js/routes.js b/js/routes.js index a4ab4f01e..f9fa74cb1 100644 --- a/js/routes.js +++ b/js/routes.js @@ -34,6 +34,9 @@ angular templateUrl: 'views/import.html', logged: true }) + .when('/importProfile', { + templateUrl: 'views/importProfile.html', + }) .when('/create', { templateUrl: 'views/create.html', logged: true diff --git a/views/home.html b/views/home.html index d4b0be4bd..63361759f 100644 --- a/views/home.html +++ b/views/home.html @@ -63,12 +63,18 @@