From 5215b1ba8d73b38f789f9ab59da56169657c92ea Mon Sep 17 00:00:00 2001 From: Bernd Schoolmann Date: Thu, 5 Jun 2025 16:18:44 +0200 Subject: [PATCH] Cleanup --- src/Core/Entities/User.cs | 7 +------ .../Entities/UserSignatureKeyPair.cs | 6 ++++++ .../Data/PublicKeyEncryptionKeyPairData.cs | 13 ++++++++++++- .../Models/Data/SignatureKeyPairData.cs | 10 ++++++++++ .../Repositories/UserSigningKeysRepository.cs | 7 +------ .../Controllers/UsersControllerTests.cs | 7 +------ .../Vault/Controllers/SyncControllerTests.cs | 16 +++++++++++++++- 7 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/Core/Entities/User.cs b/src/Core/Entities/User.cs index 5fbee6c6f7..8df4765ecf 100644 --- a/src/Core/Entities/User.cs +++ b/src/Core/Entities/User.cs @@ -263,11 +263,6 @@ public class User : ITableObject, IStorableSubscriber, IRevisable, ITwoFac throw new InvalidOperationException("User public key encryption key pair is not fully initialized."); } - return new PublicKeyEncryptionKeyPairData - { - WrappedPrivateKey = PrivateKey, - SignedPublicKey = SignedPublicKey, - PublicKey = PublicKey - }; + return new PublicKeyEncryptionKeyPairData(PrivateKey, PublicKey, SignedPublicKey); } } diff --git a/src/Core/KeyManagement/Entities/UserSignatureKeyPair.cs b/src/Core/KeyManagement/Entities/UserSignatureKeyPair.cs index fbc4a288f8..2e68325e1d 100644 --- a/src/Core/KeyManagement/Entities/UserSignatureKeyPair.cs +++ b/src/Core/KeyManagement/Entities/UserSignatureKeyPair.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using Bit.Core.Entities; using Bit.Core.Enums; +using Bit.Core.KeyManagement.Models.Data; using Bit.Core.Utilities; #nullable enable @@ -25,4 +26,9 @@ public class UserSignatureKeyPair : ITableObject, IRevisable { Id = CoreHelpers.GenerateComb(); } + + public SignatureKeyPairData ToSignatureKeyPairData() + { + return new SignatureKeyPairData(SignatureAlgorithm, SigningKey, VerifyingKey); + } } diff --git a/src/Core/KeyManagement/Models/Data/PublicKeyEncryptionKeyPairData.cs b/src/Core/KeyManagement/Models/Data/PublicKeyEncryptionKeyPairData.cs index 741288f65b..76c43c666e 100644 --- a/src/Core/KeyManagement/Models/Data/PublicKeyEncryptionKeyPairData.cs +++ b/src/Core/KeyManagement/Models/Data/PublicKeyEncryptionKeyPairData.cs @@ -1,4 +1,6 @@ -namespace Bit.Core.KeyManagement.Models.Data; +using System.Text.Json.Serialization; + +namespace Bit.Core.KeyManagement.Models.Data; #nullable enable @@ -7,4 +9,13 @@ public class PublicKeyEncryptionKeyPairData public required string WrappedPrivateKey { get; set; } public string? SignedPublicKey { get; set; } public required string PublicKey { get; set; } + + [JsonConstructor] + [System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute] + public PublicKeyEncryptionKeyPairData(string wrappedPrivateKey, string publicKey, string? signedPublicKey = null) + { + WrappedPrivateKey = wrappedPrivateKey ?? throw new ArgumentNullException(nameof(wrappedPrivateKey)); + PublicKey = publicKey ?? throw new ArgumentNullException(nameof(publicKey)); + SignedPublicKey = signedPublicKey; + } } diff --git a/src/Core/KeyManagement/Models/Data/SignatureKeyPairData.cs b/src/Core/KeyManagement/Models/Data/SignatureKeyPairData.cs index d36809a017..af66468b1f 100644 --- a/src/Core/KeyManagement/Models/Data/SignatureKeyPairData.cs +++ b/src/Core/KeyManagement/Models/Data/SignatureKeyPairData.cs @@ -1,5 +1,6 @@ #nullable enable +using System.Text.Json.Serialization; using Bit.Core.Enums; namespace Bit.Core.KeyManagement.Models.Data; @@ -9,4 +10,13 @@ public class SignatureKeyPairData public required SignatureAlgorithm SignatureAlgorithm { get; set; } public required string WrappedSigningKey { get; set; } public required string VerifyingKey { get; set; } + + [JsonConstructor] + [System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute] + public SignatureKeyPairData(SignatureAlgorithm signatureAlgorithm, string wrappedSigningKey, string verifyingKey) + { + SignatureAlgorithm = signatureAlgorithm; + WrappedSigningKey = wrappedSigningKey ?? throw new ArgumentNullException(nameof(wrappedSigningKey)); + VerifyingKey = verifyingKey ?? throw new ArgumentNullException(nameof(verifyingKey)); + } } diff --git a/src/Infrastructure.EntityFramework/KeyManagement/Repositories/UserSigningKeysRepository.cs b/src/Infrastructure.EntityFramework/KeyManagement/Repositories/UserSigningKeysRepository.cs index 6be6f688fc..b5aa1aaad2 100644 --- a/src/Infrastructure.EntityFramework/KeyManagement/Repositories/UserSigningKeysRepository.cs +++ b/src/Infrastructure.EntityFramework/KeyManagement/Repositories/UserSigningKeysRepository.cs @@ -25,12 +25,7 @@ public class UserSignatureKeyPairRepository : Repository().GetByIdAsync(userId).Returns(user); - sutProvider.GetDependency().GetByUserIdAsync(userId).Returns(new SignatureKeyPairData - { - WrappedSigningKey = "signingKey", - VerifyingKey = "verifyingKey", - SignatureAlgorithm = SignatureAlgorithm.Ed25519 - }); + sutProvider.GetDependency().GetByUserIdAsync(userId).Returns(new SignatureKeyPairData(SignatureAlgorithm.Ed25519, "wrappedSigningKey", "verifyingKey")); var result = await sutProvider.Sut.GetAccountKeys(userId.ToString()); Assert.NotNull(result); diff --git a/test/Api.Test/Vault/Controllers/SyncControllerTests.cs b/test/Api.Test/Vault/Controllers/SyncControllerTests.cs index ebbfc2a2ba..f8007ec850 100644 --- a/test/Api.Test/Vault/Controllers/SyncControllerTests.cs +++ b/test/Api.Test/Vault/Controllers/SyncControllerTests.cs @@ -1,6 +1,7 @@ using System.Security.Claims; using System.Text.Json; using AutoFixture; +using Bit.Api.KeyManagement.Queries; using Bit.Api.Vault.Controllers; using Bit.Api.Vault.Models.Response; using Bit.Core.AdminConsole.Entities; @@ -12,6 +13,7 @@ using Bit.Core.Auth.UserFeatures.TwoFactorAuth.Interfaces; using Bit.Core.Entities; using Bit.Core.Enums; using Bit.Core.Exceptions; +using Bit.Core.KeyManagement.Models.Data; using Bit.Core.Models.Data; using Bit.Core.Models.Data.Organizations.OrganizationUsers; using Bit.Core.Repositories; @@ -74,6 +76,7 @@ public class SyncControllerTests var policyRepository = sutProvider.GetDependency(); var collectionRepository = sutProvider.GetDependency(); var collectionCipherRepository = sutProvider.GetDependency(); + var userAccountKeysQuery = sutProvider.GetDependency(); // Adjust random data to match required formats / test intentions user.EquivalentDomains = JsonSerializer.Serialize(userEquivalentDomains); @@ -98,6 +101,11 @@ public class SyncControllerTests // Setup returns userService.GetUserByPrincipalAsync(Arg.Any()).ReturnsForAnyArgs(user); + userAccountKeysQuery.Run(user).Returns(new UserAccountKeysData + { + PublicKeyEncryptionKeyPairData = user.GetPublicKeyEncryptionKeyPair(), + SignatureKeyPairData = null, + }); organizationUserRepository .GetManyDetailsByUserAsync(user.Id, OrganizationUserStatusType.Confirmed).Returns(organizationUserDetails); @@ -127,7 +135,6 @@ public class SyncControllerTests // Execute GET var result = await sutProvider.Sut.Get(); - // Asserts // Assert that methods are called var hasEnabledOrgs = organizationUserDetails.Any(o => o.Enabled); @@ -166,6 +173,7 @@ public class SyncControllerTests var policyRepository = sutProvider.GetDependency(); var collectionRepository = sutProvider.GetDependency(); var collectionCipherRepository = sutProvider.GetDependency(); + var userAccountKeysQuery = sutProvider.GetDependency(); // Adjust random data to match required formats / test intentions user.EquivalentDomains = JsonSerializer.Serialize(userEquivalentDomains); @@ -189,6 +197,11 @@ public class SyncControllerTests // Setup returns userService.GetUserByPrincipalAsync(Arg.Any()).ReturnsForAnyArgs(user); + userAccountKeysQuery.Run(user).Returns(new UserAccountKeysData + { + PublicKeyEncryptionKeyPairData = user.GetPublicKeyEncryptionKeyPair(), + SignatureKeyPairData = null, + }); organizationUserRepository .GetManyDetailsByUserAsync(user.Id, OrganizationUserStatusType.Confirmed).Returns(organizationUserDetails); @@ -256,6 +269,7 @@ public class SyncControllerTests var policyRepository = sutProvider.GetDependency(); var collectionRepository = sutProvider.GetDependency(); var collectionCipherRepository = sutProvider.GetDependency(); + var userAccountKeysQuery = sutProvider.GetDependency(); // Adjust random data to match required formats / test intentions user.EquivalentDomains = JsonSerializer.Serialize(userEquivalentDomains);