DefaultAuthorizationHandlerTests.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Net;
  4. using System.Security.Claims;
  5. using System.Threading.Tasks;
  6. using AutoFixture;
  7. using AutoFixture.AutoMoq;
  8. using Jellyfin.Api.Auth.DefaultAuthorizationPolicy;
  9. using Jellyfin.Api.Constants;
  10. using Jellyfin.Data.Entities;
  11. using Jellyfin.Server.Implementations.Security;
  12. using MediaBrowser.Common.Configuration;
  13. using MediaBrowser.Controller.Library;
  14. using Microsoft.AspNetCore.Authorization;
  15. using Microsoft.AspNetCore.Http;
  16. using Moq;
  17. using Xunit;
  18. namespace Jellyfin.Api.Tests.Auth.DefaultAuthorizationPolicy
  19. {
  20. public class DefaultAuthorizationHandlerTests
  21. {
  22. private readonly Mock<IConfigurationManager> _configurationManagerMock;
  23. private readonly List<IAuthorizationRequirement> _requirements;
  24. private readonly DefaultAuthorizationHandler _sut;
  25. private readonly Mock<IUserManager> _userManagerMock;
  26. private readonly Mock<IHttpContextAccessor> _httpContextAccessor;
  27. public DefaultAuthorizationHandlerTests()
  28. {
  29. var fixture = new Fixture().Customize(new AutoMoqCustomization());
  30. _configurationManagerMock = fixture.Freeze<Mock<IConfigurationManager>>();
  31. _requirements = new List<IAuthorizationRequirement> { new DefaultAuthorizationRequirement() };
  32. _userManagerMock = fixture.Freeze<Mock<IUserManager>>();
  33. _httpContextAccessor = fixture.Freeze<Mock<IHttpContextAccessor>>();
  34. _sut = fixture.Create<DefaultAuthorizationHandler>();
  35. }
  36. [Theory]
  37. [InlineData(UserRoles.Administrator)]
  38. [InlineData(UserRoles.Guest)]
  39. [InlineData(UserRoles.User)]
  40. public async Task ShouldSucceedOnUser(string userRole)
  41. {
  42. TestHelpers.SetupConfigurationManager(_configurationManagerMock, true);
  43. var claims = TestHelpers.SetupUser(
  44. _userManagerMock,
  45. _httpContextAccessor,
  46. userRole);
  47. var context = new AuthorizationHandlerContext(_requirements, claims, null);
  48. await _sut.HandleAsync(context);
  49. Assert.True(context.HasSucceeded);
  50. }
  51. [Fact]
  52. public async Task ShouldSucceedOnApiKey()
  53. {
  54. TestHelpers.SetupConfigurationManager(_configurationManagerMock, true);
  55. _httpContextAccessor
  56. .Setup(h => h.HttpContext!.Connection.RemoteIpAddress)
  57. .Returns(new IPAddress(0));
  58. _userManagerMock
  59. .Setup(u => u.GetUserById(It.IsAny<Guid>()))
  60. .Returns<User?>(null);
  61. var claims = new[]
  62. {
  63. new Claim(InternalClaimTypes.IsApiKey, bool.TrueString)
  64. };
  65. var identity = new ClaimsIdentity(claims, string.Empty);
  66. var principal = new ClaimsPrincipal(identity);
  67. var context = new AuthorizationHandlerContext(_requirements, principal, null);
  68. await _sut.HandleAsync(context);
  69. Assert.True(context.HasSucceeded);
  70. }
  71. [Theory]
  72. [MemberData(nameof(GetParts_ValidAuthHeader_Success_Data))]
  73. public void GetParts_ValidAuthHeader_Success(string input, Dictionary<string, string> parts)
  74. {
  75. var dict = AuthorizationContext.GetParts(input);
  76. foreach (var (key, value) in parts)
  77. {
  78. Assert.Equal(dict[key], value);
  79. }
  80. }
  81. public static TheoryData<string, Dictionary<string, string>> GetParts_ValidAuthHeader_Success_Data()
  82. {
  83. var data = new TheoryData<string, Dictionary<string, string>>();
  84. data.Add(
  85. "x=\"123,123\",y=\"123\"",
  86. new Dictionary<string, string>
  87. {
  88. { "x", "123,123" },
  89. { "y", "123" }
  90. });
  91. data.Add(
  92. "x=\"123,123\", y=\"123\",z=\"'hi'\"",
  93. new Dictionary<string, string>
  94. {
  95. { "x", "123,123" },
  96. { "y", "123" },
  97. { "z", "'hi'" }
  98. });
  99. data.Add(
  100. "x=\"ab\"",
  101. new Dictionary<string, string>
  102. {
  103. { "x", "ab" }
  104. });
  105. data.Add(
  106. "param=Hörbücher",
  107. new Dictionary<string, string>
  108. {
  109. { "param", "Hörbücher" }
  110. });
  111. data.Add(
  112. "param=%22%Hörbücher",
  113. new Dictionary<string, string>
  114. {
  115. { "param", "\"%Hörbücher" }
  116. });
  117. return data;
  118. }
  119. }
  120. }