diff --git a/src/Core/Auth/UserFeatures/SendAccess/SendAccessClaimsPrincipalExtensions.cs b/src/Core/Auth/UserFeatures/SendAccess/SendAccessClaimsPrincipalExtensions.cs new file mode 100644 index 0000000000..1feadaf081 --- /dev/null +++ b/src/Core/Auth/UserFeatures/SendAccess/SendAccessClaimsPrincipalExtensions.cs @@ -0,0 +1,22 @@ +using System.Security.Claims; +using Bit.Core.Identity; + +namespace Bit.Core.Auth.UserFeatures.SendAccess; + +public static class SendAccessClaimsPrincipalExtensions +{ + public static Guid GetSendId(this ClaimsPrincipal user) + { + ArgumentNullException.ThrowIfNull(user); + + var sendIdClaim = user.FindFirst(Claims.SendId) + ?? throw new InvalidOperationException("Send ID claim not found."); + + if (!Guid.TryParse(sendIdClaim.Value, out var sendGuid)) + { + throw new InvalidOperationException("Invalid Send ID claim value."); + } + + return sendGuid; + } +} diff --git a/test/Core.Test/Auth/UserFeatures/SendAccess/SendAccessClaimsPrincipalExtensionsTests.cs b/test/Core.Test/Auth/UserFeatures/SendAccess/SendAccessClaimsPrincipalExtensionsTests.cs new file mode 100644 index 0000000000..27a0bc1bbc --- /dev/null +++ b/test/Core.Test/Auth/UserFeatures/SendAccess/SendAccessClaimsPrincipalExtensionsTests.cs @@ -0,0 +1,54 @@ +using System.Security.Claims; +using Bit.Core.Auth.UserFeatures.SendAccess; +using Bit.Core.Identity; +using Xunit; + +namespace Bit.Core.Test.Auth.UserFeatures.SendAccess; + +public class SendAccessClaimsPrincipalExtensionsTests +{ + [Fact] + public void GetSendId_ReturnsGuid_WhenClaimIsPresentAndValid() + { + // Arrange + var guid = Guid.NewGuid(); + var claims = new[] { new Claim(Claims.SendId, guid.ToString()) }; + var principal = new ClaimsPrincipal(new ClaimsIdentity(claims)); + + // Act + var result = principal.GetSendId(); + + // Assert + Assert.Equal(guid, result); + } + + [Fact] + public void GetSendId_ThrowsInvalidOperationException_WhenClaimIsMissing() + { + // Arrange + var principal = new ClaimsPrincipal(new ClaimsIdentity()); + + // Act & Assert + var ex = Assert.Throws(() => principal.GetSendId()); + Assert.Equal("Send ID claim not found.", ex.Message); + } + + [Fact] + public void GetSendId_ThrowsInvalidOperationException_WhenClaimValueIsInvalid() + { + // Arrange + var claims = new[] { new Claim(Claims.SendId, "not-a-guid") }; + var principal = new ClaimsPrincipal(new ClaimsIdentity(claims)); + + // Act & Assert + var ex = Assert.Throws(() => principal.GetSendId()); + Assert.Equal("Invalid Send ID claim value.", ex.Message); + } + + [Fact] + public void GetSendId_ThrowsArgumentNullException_WhenPrincipalIsNull() + { + // Act & Assert + Assert.Throws(() => SendAccessClaimsPrincipalExtensions.GetSendId(null)); + } +}