move updateKey to cipher service for re-use
This commit is contained in:
parent
1dd9e459c6
commit
2106e48e0e
|
@ -1,7 +1,7 @@
|
||||||
angular
|
angular
|
||||||
.module('bit.services')
|
.module('bit.services')
|
||||||
|
|
||||||
.factory('cipherService', function (cryptoService, apiService) {
|
.factory('cipherService', function (cryptoService, apiService, $q) {
|
||||||
var _service = {};
|
var _service = {};
|
||||||
|
|
||||||
_service.decryptLogins = function (encryptedLogins) {
|
_service.decryptLogins = function (encryptedLogins) {
|
||||||
|
@ -204,5 +204,56 @@ angular
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
_service.updateKey = function (masterPassword, success, error) {
|
||||||
|
var madeEncKey = cryptoService.makeEncKey(null);
|
||||||
|
encKey = madeEncKey.encKey;
|
||||||
|
var encKeyEnc = madeEncKey.encKeyEnc;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
filteredEncryptedLogins.push(encryptedLogins.Data[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
var unencryptedLogins = _service.decryptLogins(filteredEncryptedLogins);
|
||||||
|
reencryptedLogins = _service.encryptLogins(unencryptedLogins, encKey);
|
||||||
|
}).$promise;
|
||||||
|
|
||||||
|
var reencryptedFolders = [];
|
||||||
|
var foldersPromise = apiService.folders.list({}, function (encryptedFolders) {
|
||||||
|
var unencryptedFolders = _service.decryptFolders(encryptedFolders.Data);
|
||||||
|
reencryptedFolders = _service.encryptFolders(unencryptedFolders, encKey);
|
||||||
|
}).$promise;
|
||||||
|
|
||||||
|
var privateKey = cryptoService.getPrivateKey('raw'),
|
||||||
|
reencryptedPrivateKey = null;
|
||||||
|
if (privateKey) {
|
||||||
|
reencryptedPrivateKey = cryptoService.encrypt(privateKey, encKey, 'raw');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $q.all([loginsPromise, foldersPromise]).then(function () {
|
||||||
|
var request = {
|
||||||
|
masterPasswordHash: cryptoService.hashPassword(masterPassword),
|
||||||
|
ciphers: reencryptedLogins,
|
||||||
|
folders: reencryptedFolders,
|
||||||
|
privateKey: reencryptedPrivateKey,
|
||||||
|
key: encKeyEnc
|
||||||
|
};
|
||||||
|
|
||||||
|
return apiService.accounts.putKey(request).$promise;
|
||||||
|
}, error).then(function () {
|
||||||
|
cryptoService.setEncKey(encKey, null, true);
|
||||||
|
return success();
|
||||||
|
}, function () {
|
||||||
|
cryptoService.clearEncKey();
|
||||||
|
error();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
return _service;
|
return _service;
|
||||||
});
|
});
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
.module('bit.settings')
|
.module('bit.settings')
|
||||||
|
|
||||||
.controller('settingsChangePasswordController', function ($scope, $state, apiService, $uibModalInstance,
|
.controller('settingsChangePasswordController', function ($scope, $state, apiService, $uibModalInstance,
|
||||||
cryptoService, authService, cipherService, validationService, $q, toastr, $analytics) {
|
cryptoService, authService, cipherService, validationService, toastr, $analytics) {
|
||||||
$analytics.eventTrack('settingsChangePasswordController', { category: 'Modal' });
|
$analytics.eventTrack('settingsChangePasswordController', { category: 'Modal' });
|
||||||
|
|
||||||
$scope.save = function (model, form) {
|
$scope.save = function (model, form) {
|
||||||
|
@ -31,61 +31,12 @@
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// User is not using an enc key, let's make them one
|
// User is not using an enc key, let's make them one
|
||||||
$scope.savePromise = updateKey(model);
|
$scope.savePromise = cipherService.updateKey(model.masterPassword, function () {
|
||||||
|
return changePassword(model);
|
||||||
|
}, processError);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function updateKey(model) {
|
|
||||||
var madeEncKey = cryptoService.makeEncKey(null);
|
|
||||||
encKey = madeEncKey.encKey;
|
|
||||||
var encKeyEnc = madeEncKey.encKeyEnc;
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
filteredEncryptedLogins.push(encryptedLogins.Data[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
var unencryptedLogins = cipherService.decryptLogins(filteredEncryptedLogins);
|
|
||||||
reencryptedLogins = cipherService.encryptLogins(unencryptedLogins, encKey);
|
|
||||||
}).$promise;
|
|
||||||
|
|
||||||
var reencryptedFolders = [];
|
|
||||||
var foldersPromise = apiService.folders.list({}, function (encryptedFolders) {
|
|
||||||
var unencryptedFolders = cipherService.decryptFolders(encryptedFolders.Data);
|
|
||||||
reencryptedFolders = cipherService.encryptFolders(unencryptedFolders, encKey);
|
|
||||||
}).$promise;
|
|
||||||
|
|
||||||
var privateKey = cryptoService.getPrivateKey('raw'),
|
|
||||||
reencryptedPrivateKey = null;
|
|
||||||
if (privateKey) {
|
|
||||||
reencryptedPrivateKey = cryptoService.encrypt(privateKey, encKey, 'raw');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $q.all([loginsPromise, foldersPromise]).then(function () {
|
|
||||||
var request = {
|
|
||||||
masterPasswordHash: cryptoService.hashPassword(model.masterPassword),
|
|
||||||
ciphers: reencryptedLogins,
|
|
||||||
folders: reencryptedFolders,
|
|
||||||
privateKey: reencryptedPrivateKey,
|
|
||||||
key: encKeyEnc
|
|
||||||
};
|
|
||||||
|
|
||||||
return apiService.accounts.putKey(request).$promise;
|
|
||||||
}, error).then(function () {
|
|
||||||
cryptoService.setEncKey(encKey, null, true);
|
|
||||||
return changePassword(model);
|
|
||||||
}, function () {
|
|
||||||
cryptoService.clearEncKey();
|
|
||||||
error();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function changePassword(model) {
|
function changePassword(model) {
|
||||||
return authService.getUserProfile().then(function (profile) {
|
return authService.getUserProfile().then(function (profile) {
|
||||||
var newKey = cryptoService.makeKey(model.newMasterPassword, profile.email.toLowerCase());
|
var newKey = cryptoService.makeKey(model.newMasterPassword, profile.email.toLowerCase());
|
||||||
|
@ -99,17 +50,17 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
return apiService.accounts.putPassword(request).$promise;
|
return apiService.accounts.putPassword(request).$promise;
|
||||||
}, error).then(function () {
|
}, processError).then(function () {
|
||||||
$uibModalInstance.dismiss('cancel');
|
$uibModalInstance.dismiss('cancel');
|
||||||
authService.logOut();
|
authService.logOut();
|
||||||
$analytics.eventTrack('Changed Password');
|
$analytics.eventTrack('Changed Password');
|
||||||
$state.go('frontend.login.info').then(function () {
|
$state.go('frontend.login.info').then(function () {
|
||||||
toastr.success('Please log back in.', 'Master Password Changed');
|
toastr.success('Please log back in.', 'Master Password Changed');
|
||||||
});
|
});
|
||||||
}, error);
|
}, processError);
|
||||||
}
|
}
|
||||||
|
|
||||||
function error() {
|
function processError() {
|
||||||
$uibModalInstance.dismiss('cancel');
|
$uibModalInstance.dismiss('cancel');
|
||||||
toastr.error('Something went wrong.', 'Oh No!');
|
toastr.error('Something went wrong.', 'Oh No!');
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue