diff --git a/index.html b/index.html index 972943ea6..9994794a6 100644 --- a/index.html +++ b/index.html @@ -187,7 +187,12 @@

{{title}}

- + +
Select a backup file
+ +
Or just paste the backup text here
+ +
diff --git a/js/controllers/backup.js b/js/controllers/backup.js index 5c468fe24..5ea246b3a 100644 --- a/js/controllers/backup.js +++ b/js/controllers/backup.js @@ -8,7 +8,7 @@ angular.module('copay.backup').controller('BackupController', // TODO: get the real encrypted wallet. var _getEncryptedWallet = function() { - var wallet = JSON.stringify($rootScope.wallet.toObj()); + var wallet = $rootScope.wallet.toEncryptedObj(); return wallet; }; @@ -40,11 +40,10 @@ angular.module('copay.backup').controller('BackupController', } else { if (email && email !== '') { var body = _getEncryptedWallet(); - console.log(body); var subject = 'Copay Backup'; var href = 'mailto:' + email + '?' + 'subject=' + subject + '&' - + 'body=' + 'body'; // TODO: Uncomment this when get the real encrypted wallet. + + 'body=' + body; var newWin = $window.open(href, '_blank', 'scrollbars=yes,resizable=yes,width=10,height=10'); diff --git a/js/controllers/import.js b/js/controllers/import.js index 43c3376c2..d04fd54fc 100644 --- a/js/controllers/import.js +++ b/js/controllers/import.js @@ -1,22 +1,33 @@ 'use strict'; angular.module('copay.import').controller('ImportController', - function($scope, $rootScope, walletFactory, controllerUtils) { + function($scope, $rootScope, walletFactory, controllerUtils, Passphrase) { $scope.title = 'Import a backup'; - $scope.getFile = function() { - var reader = new FileReader(); + var reader = new FileReader(); + var _importBackup = function(encryptedObj) { + var passphrase = Passphrase.getBase64($scope.password); + $rootScope.wallet = walletFactory.fromEncryptedObj(encryptedObj, passphrase); + controllerUtils.startNetwork($rootScope.wallet); + }; + $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 obj = JSON.parse(evt.target.result); - $rootScope.wallet = walletFactory.fromObj(obj); - - controllerUtils.startNetwork($rootScope.wallet); + var encryptedObj = evt.target.result; + _importBackup(encryptedObj); } }; + }; - reader.readAsBinaryString($scope.file); + $scope.import = function() { + if ($scope.password) { + if ($scope.backupText) { + _importBackup($scope.backupText); + } else { + reader.readAsBinaryString($scope.file); + } + } }; }); diff --git a/js/models/core/Wallet.js b/js/models/core/Wallet.js index 7cfc6033d..cec091c8c 100644 --- a/js/models/core/Wallet.js +++ b/js/models/core/Wallet.js @@ -268,6 +268,11 @@ Wallet.fromObj = function(o, storage, network, blockchain) { return w; }; +Wallet.prototype.toEncryptedObj = function() { + var walletObj = this.toObj(); + return this.storage.export(walletObj); +}; + Wallet.prototype.sendTxProposals = function(recipients) { this.log('### SENDING txProposals TO:', recipients || 'All', this.txProposals); diff --git a/js/models/core/WalletFactory.js b/js/models/core/WalletFactory.js index a757c340a..8ffbc8403 100644 --- a/js/models/core/WalletFactory.js +++ b/js/models/core/WalletFactory.js @@ -68,6 +68,12 @@ WalletFactory.prototype.fromObj = function(obj) { return w; }; +WalletFactory.prototype.fromEncryptedObj = function(base64, password) { + this.storage._setPassphrase(password); + var walletObj = this.storage.import(base64); + return this.fromObj(walletObj); +}; + WalletFactory.prototype.read = function(walletId) { if (! this._checkRead(walletId)) return false; diff --git a/js/models/storage/LocalEncrypted.js b/js/models/storage/LocalEncrypted.js index 14a05ad12..cfeb1d2c5 100644 --- a/js/models/storage/LocalEncrypted.js +++ b/js/models/storage/LocalEncrypted.js @@ -157,4 +157,14 @@ Storage.prototype.clearAll = function() { localStorage.clear(); }; +Storage.prototype.export = function(obj) { + var encryptedObj = this._encryptObj(obj); + return encryptedObj; +}; + +Storage.prototype.import = function(base64) { + var decryptedObj = this._decryptObj(base64); + return decryptedObj; +}; + module.exports = require('soop')(Storage);