FirstTimeSetupHandlerTests.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Security.Claims;
  4. using System.Threading.Tasks;
  5. using AutoFixture;
  6. using AutoFixture.AutoMoq;
  7. using Jellyfin.Api.Auth.DefaultAuthorizationPolicy;
  8. using Jellyfin.Api.Auth.FirstTimeSetupPolicy;
  9. using Jellyfin.Api.Constants;
  10. using Jellyfin.Data.Entities;
  11. using Jellyfin.Data.Enums;
  12. using MediaBrowser.Common.Configuration;
  13. using MediaBrowser.Controller.Library;
  14. using Microsoft.AspNetCore.Authorization;
  15. using Microsoft.AspNetCore.Http;
  16. using Microsoft.Extensions.DependencyInjection;
  17. using Moq;
  18. using Xunit;
  19. namespace Jellyfin.Api.Tests.Auth.FirstTimeSetupPolicy
  20. {
  21. public class FirstTimeSetupHandlerTests
  22. {
  23. private readonly Mock<IConfigurationManager> _configurationManagerMock;
  24. private readonly List<IAuthorizationRequirement> _requirements;
  25. private readonly DefaultAuthorizationHandler _defaultAuthorizationHandler;
  26. private readonly FirstTimeSetupHandler _firstTimeSetupHandler;
  27. private readonly IAuthorizationService _authorizationService;
  28. private readonly Mock<IUserManager> _userManagerMock;
  29. private readonly Mock<IHttpContextAccessor> _httpContextAccessor;
  30. public FirstTimeSetupHandlerTests()
  31. {
  32. var fixture = new Fixture().Customize(new AutoMoqCustomization());
  33. _configurationManagerMock = fixture.Freeze<Mock<IConfigurationManager>>();
  34. _requirements = new List<IAuthorizationRequirement> { new FirstTimeSetupRequirement() };
  35. _userManagerMock = fixture.Freeze<Mock<IUserManager>>();
  36. _httpContextAccessor = fixture.Freeze<Mock<IHttpContextAccessor>>();
  37. _firstTimeSetupHandler = fixture.Create<FirstTimeSetupHandler>();
  38. _defaultAuthorizationHandler = fixture.Create<DefaultAuthorizationHandler>();
  39. var services = new ServiceCollection();
  40. services.AddAuthorizationCore();
  41. services.AddLogging();
  42. services.AddOptions();
  43. services.AddSingleton<IAuthorizationHandler>(_defaultAuthorizationHandler);
  44. services.AddSingleton<IAuthorizationHandler>(_firstTimeSetupHandler);
  45. services.AddAuthorization(options =>
  46. {
  47. options.AddPolicy("FirstTime", policy => policy.Requirements.Add(new FirstTimeSetupRequirement()));
  48. options.AddPolicy("FirstTimeNoAdmin", policy => policy.Requirements.Add(new FirstTimeSetupRequirement(false, false)));
  49. options.AddPolicy("FirstTimeSchedule", policy => policy.Requirements.Add(new FirstTimeSetupRequirement(true, false)));
  50. });
  51. _authorizationService = services.BuildServiceProvider().GetRequiredService<IAuthorizationService>();
  52. }
  53. [Theory]
  54. [InlineData(UserRoles.Administrator)]
  55. [InlineData(UserRoles.Guest)]
  56. [InlineData(UserRoles.User)]
  57. public async Task ShouldSucceedIfStartupWizardIncomplete(string userRole)
  58. {
  59. TestHelpers.SetupConfigurationManager(_configurationManagerMock, false);
  60. var claims = TestHelpers.SetupUser(
  61. _userManagerMock,
  62. _httpContextAccessor,
  63. userRole);
  64. var allowed = await _authorizationService.AuthorizeAsync(claims, "FirstTime");
  65. Assert.True(allowed.Succeeded);
  66. }
  67. [Theory]
  68. [InlineData(UserRoles.Administrator, true)]
  69. [InlineData(UserRoles.Guest, false)]
  70. [InlineData(UserRoles.User, false)]
  71. public async Task ShouldRequireAdministratorIfStartupWizardComplete(string userRole, bool shouldSucceed)
  72. {
  73. TestHelpers.SetupConfigurationManager(_configurationManagerMock, true);
  74. var claims = TestHelpers.SetupUser(
  75. _userManagerMock,
  76. _httpContextAccessor,
  77. userRole);
  78. var allowed = await _authorizationService.AuthorizeAsync(claims, "FirstTime");
  79. Assert.Equal(shouldSucceed, allowed.Succeeded);
  80. }
  81. [Theory]
  82. [InlineData(UserRoles.Administrator, true)]
  83. [InlineData(UserRoles.Guest, false)]
  84. [InlineData(UserRoles.User, true)]
  85. public async Task ShouldRequireUserIfNotAdministrator(string userRole, bool shouldSucceed)
  86. {
  87. TestHelpers.SetupConfigurationManager(_configurationManagerMock, true);
  88. var claims = TestHelpers.SetupUser(
  89. _userManagerMock,
  90. _httpContextAccessor,
  91. userRole);
  92. var allowed = await _authorizationService.AuthorizeAsync(claims, "FirstTimeNoAdmin");
  93. Assert.Equal(shouldSucceed, allowed.Succeeded);
  94. }
  95. [Fact]
  96. public async Task ShouldDisallowUserIfOutsideSchedule()
  97. {
  98. AccessSchedule[] accessSchedules = { new AccessSchedule(DynamicDayOfWeek.Everyday, 0, 0, Guid.Empty) };
  99. TestHelpers.SetupConfigurationManager(_configurationManagerMock, true);
  100. var claims = TestHelpers.SetupUser(
  101. _userManagerMock,
  102. _httpContextAccessor,
  103. UserRoles.User,
  104. accessSchedules);
  105. var allowed = await _authorizationService.AuthorizeAsync(claims, "FirstTimeSchedule");
  106. Assert.False(allowed.Succeeded);
  107. }
  108. }
  109. }