From f5720cf20e3cf5d0a87072661d0f78aa09bf6150 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Wed, 31 May 2017 16:16:21 -0400 Subject: [PATCH] new change email api with enc key --- src/app/services/cipherService.js | 4 +- .../settings/settingsChangeEmailController.js | 105 ++++++++---------- .../settingsChangePasswordController.js | 9 +- 3 files changed, 52 insertions(+), 66 deletions(-) diff --git a/src/app/services/cipherService.js b/src/app/services/cipherService.js index df46ab9b4f..a50294df7a 100644 --- a/src/app/services/cipherService.js +++ b/src/app/services/cipherService.js @@ -204,7 +204,7 @@ angular }; }; - _service.updateKey = function (masterPassword, success, error) { + _service.updateKey = function (masterPasswordHash, success, error) { var madeEncKey = cryptoService.makeEncKey(null); encKey = madeEncKey.encKey; var encKeyEnc = madeEncKey.encKeyEnc; @@ -238,7 +238,7 @@ angular return $q.all([loginsPromise, foldersPromise]).then(function () { var request = { - masterPasswordHash: cryptoService.hashPassword(masterPassword), + masterPasswordHash: masterPasswordHash, ciphers: reencryptedLogins, folders: reencryptedFolders, privateKey: reencryptedPrivateKey, diff --git a/src/app/settings/settingsChangeEmailController.js b/src/app/settings/settingsChangeEmailController.js index 61db736b00..a0bb5e7458 100644 --- a/src/app/settings/settingsChangeEmailController.js +++ b/src/app/settings/settingsChangeEmailController.js @@ -4,84 +4,69 @@ .controller('settingsChangeEmailController', function ($scope, $state, apiService, $uibModalInstance, cryptoService, cipherService, authService, $q, toastr, $analytics) { $analytics.eventTrack('settingsChangeEmailController', { category: 'Modal' }); + var _masterPasswordHash, - _newMasterPasswordHash, - _newKey; + _masterPassword, + _newEmail; $scope.token = function (model) { - _masterPasswordHash = cryptoService.hashPassword(model.masterPassword); - var newEmail = model.newEmail.toLowerCase(); + _masterPassword = model.masterPassword; + _masterPasswordHash = cryptoService.hashPassword(_masterPassword); + _newEmail = model.newEmail.toLowerCase(); + var encKey = cryptoService.getEncKey(); + if (encKey) { + $scope.tokenPromise = requestToken(model); + } + else { + // User is not using an enc key, let's make them one + $scope.tokenPromise = cipherService.updateKey(_masterPasswordHash, function () { + return requestToken(model); + }, processError); + } + }; + + function requestToken(model) { var request = { - newEmail: newEmail, + newEmail: _newEmail, masterPasswordHash: _masterPasswordHash }; - $scope.tokenPromise = apiService.accounts.emailToken(request, function () { - _newKey = cryptoService.makeKey(model.masterPassword, newEmail); - _newMasterPasswordHash = cryptoService.hashPassword(model.masterPassword, _newKey); - + return apiService.accounts.emailToken(request, function () { $scope.tokenSent = true; }).$promise; - }; + } $scope.confirm = function (model) { $scope.processing = true; - var reencryptedLogins = []; - var loginsPromise = apiService.logins.list({}, function (encryptedLogins) { - var filteredEncryptedLogins = []; - for (var i = 0; i < encryptedLogins.Data.length; i++) { - if (encryptedLogins.Data[i].OrganizationId) { - continue; - } + var newKey = cryptoService.makeKey(_masterPassword, _newEmail); + var encKey = cryptoService.getEncKey(); + var newEncKey = cryptoService.encrypt(encKey.key, newKey, 'raw'); - filteredEncryptedLogins.push(encryptedLogins.Data[i]); - } + var request = { + token: model.token, + newEmail: _newEmail, + masterPasswordHash: _masterPasswordHash, + newMasterPasswordHash: cryptoService.hashPassword(_masterPassword, newKey), + key: newEncKey + }; - var unencryptedLogins = cipherService.decryptLogins(filteredEncryptedLogins); - reencryptedLogins = cipherService.encryptLogins(unencryptedLogins, _newKey); - }).$promise; - - var reencryptedFolders = []; - var foldersPromise = apiService.folders.list({}, function (encryptedFolders) { - var unencryptedFolders = cipherService.decryptFolders(encryptedFolders.Data); - reencryptedFolders = cipherService.encryptFolders(unencryptedFolders, _newKey); - }).$promise; - - var privateKey = cryptoService.getPrivateKey('raw'), - reencryptedPrivateKey = null; - if (privateKey) { - reencryptedPrivateKey = cryptoService.encrypt(privateKey, _newKey, 'raw'); - } - - $q.all([loginsPromise, foldersPromise]).then(function () { - var request = { - token: model.token, - newEmail: model.newEmail.toLowerCase(), - masterPasswordHash: _masterPasswordHash, - newMasterPasswordHash: _newMasterPasswordHash, - data: { - ciphers: reencryptedLogins, - folders: reencryptedFolders, - privateKey: reencryptedPrivateKey - } - }; - - $scope.confirmPromise = apiService.accounts.email(request, function () { - $uibModalInstance.dismiss('cancel'); - $analytics.eventTrack('Changed Email'); - authService.logOut(); - $state.go('frontend.login.info').then(function () { - toastr.success('Please log back in.', 'Email Changed'); - }); - }, function () { - $uibModalInstance.dismiss('cancel'); - toastr.error('Something went wrong.', 'Oh No!'); - }).$promise; - }); + $scope.confirmPromise = apiService.accounts.email(request).$promise.then(function () { + $uibModalInstance.dismiss('cancel'); + authService.logOut(); + $analytics.eventTrack('Changed Email'); + return $state.go('frontend.login.info'); + }, processError).then(function () { + toastr.success('Please log back in.', 'Email Changed'); + }, processError); }; + function processError() { + $uibModalInstance.dismiss('cancel'); + toastr.error('Something went wrong.', 'Oh No!'); + } + $scope.close = function () { $uibModalInstance.dismiss('cancel'); }; diff --git a/src/app/settings/settingsChangePasswordController.js b/src/app/settings/settingsChangePasswordController.js index 06d10653bf..d0bd3ec789 100644 --- a/src/app/settings/settingsChangePasswordController.js +++ b/src/app/settings/settingsChangePasswordController.js @@ -31,7 +31,8 @@ } else { // User is not using an enc key, let's make them one - $scope.savePromise = cipherService.updateKey(model.masterPassword, function () { + var mpHash = cryptoService.hashPassword(model.masterPassword); + $scope.savePromise = cipherService.updateKey(mpHash, function () { return changePassword(model); }, processError); } @@ -54,9 +55,9 @@ $uibModalInstance.dismiss('cancel'); authService.logOut(); $analytics.eventTrack('Changed Password'); - $state.go('frontend.login.info').then(function () { - toastr.success('Please log back in.', 'Master Password Changed'); - }); + return $state.go('frontend.login.info'); + }, processError).then(function () { + toastr.success('Please log back in.', 'Master Password Changed'); }, processError); }