From 68237d0b6de2042f37171b2cfdc010ce38c9e3b2 Mon Sep 17 00:00:00 2001 From: Bernd Schoolmann Date: Fri, 6 Jun 2025 18:39:58 +0200 Subject: [PATCH] Cleanup --- .../RotateUserAccountkeysCommand.cs | 94 +++++++------------ 1 file changed, 34 insertions(+), 60 deletions(-) diff --git a/src/Core/KeyManagement/UserKey/Implementations/RotateUserAccountkeysCommand.cs b/src/Core/KeyManagement/UserKey/Implementations/RotateUserAccountkeysCommand.cs index 6967c9bf85..57aa8e02d4 100644 --- a/src/Core/KeyManagement/UserKey/Implementations/RotateUserAccountkeysCommand.cs +++ b/src/Core/KeyManagement/UserKey/Implementations/RotateUserAccountkeysCommand.cs @@ -11,56 +11,36 @@ using Microsoft.AspNetCore.Identity; namespace Bit.Core.KeyManagement.UserKey.Implementations; /// -public class RotateUserAccountKeysCommand : IRotateUserAccountKeysCommand +/// +/// Instantiates a new +/// +/// Master password hash validation +/// Updates user keys and re-encrypted data if needed +/// Provides a method to update re-encrypted cipher data +/// Provides a method to update re-encrypted folder data +/// Provides a method to update re-encrypted send data +/// Provides a method to update re-encrypted emergency access data +/// Provides a method to update re-encrypted organization user data +/// Provides a method to update re-encrypted device data +/// Hashes the new master password +/// Logs out user from other devices after successful rotation +/// Provides a password mismatch error if master password hash validation fails +/// Provides a method to update re-encrypted WebAuthn keys +public class RotateUserAccountKeysCommand( + IUserService _userService, + IUserRepository _userRepository, + ICipherRepository _cipherRepository, + IFolderRepository _folderRepository, + ISendRepository _sendRepository, + IEmergencyAccessRepository _emergencyAccessRepository, + IOrganizationUserRepository _organizationUserRepository, + IDeviceRepository _deviceRepository, + IPasswordHasher _passwordHasher, + IPushNotificationService _pushService, + IdentityErrorDescriber _identityErrorDescriber, + IWebAuthnCredentialRepository _credentialRepository +) : IRotateUserAccountKeysCommand { - private readonly IUserService _userService; - private readonly IUserRepository _userRepository; - private readonly ICipherRepository _cipherRepository; - private readonly IFolderRepository _folderRepository; - private readonly ISendRepository _sendRepository; - private readonly IEmergencyAccessRepository _emergencyAccessRepository; - private readonly IOrganizationUserRepository _organizationUserRepository; - private readonly IDeviceRepository _deviceRepository; - private readonly IPushNotificationService _pushService; - private readonly IdentityErrorDescriber _identityErrorDescriber; - private readonly IWebAuthnCredentialRepository _credentialRepository; - private readonly IPasswordHasher _passwordHasher; - - /// - /// Instantiates a new - /// - /// Master password hash validation - /// Updates user keys and re-encrypted data if needed - /// Provides a method to update re-encrypted cipher data - /// Provides a method to update re-encrypted folder data - /// Provides a method to update re-encrypted send data - /// Provides a method to update re-encrypted emergency access data - /// Provides a method to update re-encrypted organization user data - /// Hashes the new master password - /// Logs out user from other devices after successful rotation - /// Provides a password mismatch error if master password hash validation fails - /// Provides a method to update re-encrypted WebAuthn keys - public RotateUserAccountKeysCommand(IUserService userService, IUserRepository userRepository, - ICipherRepository cipherRepository, IFolderRepository folderRepository, ISendRepository sendRepository, - IEmergencyAccessRepository emergencyAccessRepository, IOrganizationUserRepository organizationUserRepository, - IDeviceRepository deviceRepository, - IPasswordHasher passwordHasher, - IPushNotificationService pushService, IdentityErrorDescriber errors, IWebAuthnCredentialRepository credentialRepository) - { - _userService = userService; - _userRepository = userRepository; - _cipherRepository = cipherRepository; - _folderRepository = folderRepository; - _sendRepository = sendRepository; - _emergencyAccessRepository = emergencyAccessRepository; - _organizationUserRepository = organizationUserRepository; - _deviceRepository = deviceRepository; - _pushService = pushService; - _identityErrorDescriber = errors; - _credentialRepository = credentialRepository; - _passwordHasher = passwordHasher; - } - /// public async Task RotateUserAccountKeysAsync(User user, RotateUserAccountKeysData model) { @@ -78,16 +58,13 @@ public class RotateUserAccountKeysCommand : IRotateUserAccountKeysCommand user.RevisionDate = user.AccountRevisionDate = now; user.LastKeyRotationDate = now; user.SecurityStamp = Guid.NewGuid().ToString(); + List saveEncryptedDataActions = new(); - if ( - !model.MasterPasswordUnlockData.ValidateForUser(user) - ) + if (!model.MasterPasswordUnlockData.ValidateForUser(user)) { throw new InvalidOperationException("The provided master password unlock data is not valid for this user."); } - if ( - model.AccountPublicKey != user.PublicKey - ) + if (model.AccountPublicKey != user.PublicKey) { throw new InvalidOperationException("The provided account public key does not match the user's current public key, and changing the account asymmetric keypair is currently not supported during key rotation."); } @@ -97,7 +74,6 @@ public class RotateUserAccountKeysCommand : IRotateUserAccountKeysCommand user.MasterPassword = _passwordHasher.HashPassword(user, model.MasterPasswordUnlockData.MasterKeyAuthenticationHash); user.MasterPasswordHint = model.MasterPasswordUnlockData.MasterPasswordHint; - List saveEncryptedDataActions = new(); if (model.Ciphers.Any()) { saveEncryptedDataActions.Add(_cipherRepository.UpdateForKeyRotation(user.Id, model.Ciphers)); @@ -115,14 +91,12 @@ public class RotateUserAccountKeysCommand : IRotateUserAccountKeysCommand if (model.EmergencyAccesses.Any()) { - saveEncryptedDataActions.Add( - _emergencyAccessRepository.UpdateForKeyRotation(user.Id, model.EmergencyAccesses)); + saveEncryptedDataActions.Add(_emergencyAccessRepository.UpdateForKeyRotation(user.Id, model.EmergencyAccesses)); } if (model.OrganizationUsers.Any()) { - saveEncryptedDataActions.Add( - _organizationUserRepository.UpdateForKeyRotation(user.Id, model.OrganizationUsers)); + saveEncryptedDataActions.Add(_organizationUserRepository.UpdateForKeyRotation(user.Id, model.OrganizationUsers)); } if (model.WebAuthnKeys.Any())