Apply fixes from review

This commit is contained in:
crobibero 2020-08-06 17:59:48 -06:00
parent fffa94fc33
commit 05f9473544
12 changed files with 38 additions and 32 deletions

View file

@ -6,23 +6,23 @@ using MediaBrowser.Controller.Library;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
namespace Jellyfin.Api.Auth.IgnoreParentalControlOrFirstTimeSetupPolicy namespace Jellyfin.Api.Auth.FirstTimeOrIgnoreParentalControlSetupPolicy
{ {
/// <summary> /// <summary>
/// Escape schedule controls handler. /// Ignore parental control schedule and allow before startup wizard has been completed.
/// </summary> /// </summary>
public class IgnoreParentalControlOrFirstTimeSetupHandler : BaseAuthorizationHandler<IgnoreParentalControlRequirement> public class FirstTimeOrIgnoreParentalControlSetupHandler : BaseAuthorizationHandler<IgnoreParentalControlRequirement>
{ {
private readonly IConfigurationManager _configurationManager; private readonly IConfigurationManager _configurationManager;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="IgnoreParentalControlOrFirstTimeSetupHandler"/> class. /// Initializes a new instance of the <see cref="FirstTimeOrIgnoreParentalControlSetupHandler"/> class.
/// </summary> /// </summary>
/// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param> /// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>
/// <param name="networkManager">Instance of the <see cref="INetworkManager"/> interface.</param> /// <param name="networkManager">Instance of the <see cref="INetworkManager"/> interface.</param>
/// <param name="httpContextAccessor">Instance of the <see cref="IHttpContextAccessor"/> interface.</param> /// <param name="httpContextAccessor">Instance of the <see cref="IHttpContextAccessor"/> interface.</param>
/// <param name="configurationManager">Instance of the <see cref="IConfigurationManager"/> interface.</param> /// <param name="configurationManager">Instance of the <see cref="IConfigurationManager"/> interface.</param>
public IgnoreParentalControlOrFirstTimeSetupHandler( public FirstTimeOrIgnoreParentalControlSetupHandler(
IUserManager userManager, IUserManager userManager,
INetworkManager networkManager, INetworkManager networkManager,
IHttpContextAccessor httpContextAccessor, IHttpContextAccessor httpContextAccessor,
@ -35,8 +35,14 @@ namespace Jellyfin.Api.Auth.IgnoreParentalControlOrFirstTimeSetupPolicy
/// <inheritdoc /> /// <inheritdoc />
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, IgnoreParentalControlRequirement requirement) protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, IgnoreParentalControlRequirement requirement)
{ {
if (!_configurationManager.CommonConfiguration.IsStartupWizardCompleted)
{
context.Succeed(requirement);
return Task.CompletedTask;
}
var validated = ValidateClaims(context.User, ignoreSchedule: true); var validated = ValidateClaims(context.User, ignoreSchedule: true);
if (validated || !_configurationManager.CommonConfiguration.IsStartupWizardCompleted) if (validated)
{ {
context.Succeed(requirement); context.Succeed(requirement);
} }

View file

@ -0,0 +1,11 @@
using Microsoft.AspNetCore.Authorization;
namespace Jellyfin.Api.Auth.FirstTimeOrIgnoreParentalControlSetupPolicy
{
/// <summary>
/// First time setup or ignore parental controls requirement.
/// </summary>
public class FirstTimeOrIgnoreParentalControlSetupRequirement : IAuthorizationRequirement
{
}
}

View file

@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Http;
namespace Jellyfin.Api.Auth.FirstTimeSetupOrDefaultPolicy namespace Jellyfin.Api.Auth.FirstTimeSetupOrDefaultPolicy
{ {
/// <summary> /// <summary>
/// Authorization handler for requiring first time setup or elevated privileges. /// Authorization handler for requiring first time setup or default privileges.
/// </summary> /// </summary>
public class FirstTimeSetupOrDefaultHandler : BaseAuthorizationHandler<FirstTimeSetupOrDefaultRequirement> public class FirstTimeSetupOrDefaultHandler : BaseAuthorizationHandler<FirstTimeSetupOrDefaultRequirement>
{ {
@ -32,18 +32,18 @@ namespace Jellyfin.Api.Auth.FirstTimeSetupOrDefaultPolicy
} }
/// <inheritdoc /> /// <inheritdoc />
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, FirstTimeSetupOrDefaultRequirement firstTimeSetupOrElevatedRequirement) protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, FirstTimeSetupOrDefaultRequirement firstTimeSetupOrDefaultRequirement)
{ {
if (!_configurationManager.CommonConfiguration.IsStartupWizardCompleted) if (!_configurationManager.CommonConfiguration.IsStartupWizardCompleted)
{ {
context.Succeed(firstTimeSetupOrElevatedRequirement); context.Succeed(firstTimeSetupOrDefaultRequirement);
return Task.CompletedTask; return Task.CompletedTask;
} }
var validated = ValidateClaims(context.User); var validated = ValidateClaims(context.User);
if (validated) if (validated)
{ {
context.Succeed(firstTimeSetupOrElevatedRequirement); context.Succeed(firstTimeSetupOrDefaultRequirement);
} }
else else
{ {

View file

@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Authorization;
namespace Jellyfin.Api.Auth.FirstTimeSetupOrDefaultPolicy namespace Jellyfin.Api.Auth.FirstTimeSetupOrDefaultPolicy
{ {
/// <summary> /// <summary>
/// The authorization requirement, requiring incomplete first time setup or elevated privileges, for the authorization handler. /// The authorization requirement, requiring incomplete first time setup or default privileges, for the authorization handler.
/// </summary> /// </summary>
public class FirstTimeSetupOrDefaultRequirement : IAuthorizationRequirement public class FirstTimeSetupOrDefaultRequirement : IAuthorizationRequirement
{ {

View file

@ -1,11 +0,0 @@
using Microsoft.AspNetCore.Authorization;
namespace Jellyfin.Api.Auth.IgnoreParentalControlOrFirstTimeSetupPolicy
{
/// <summary>
/// Escape schedule controls requirement.
/// </summary>
public class IgnoreParentalControlOrFirstTimeSetupRequirement : IAuthorizationRequirement
{
}
}

View file

@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Http;
namespace Jellyfin.Api.Auth.LocalAccessOrRequiresElevationPolicy namespace Jellyfin.Api.Auth.LocalAccessOrRequiresElevationPolicy
{ {
/// <summary> /// <summary>
/// Local access handler. /// Local access or require elevated privileges handler.
/// </summary> /// </summary>
public class LocalAccessOrRequiresElevationHandler : BaseAuthorizationHandler<LocalAccessOrRequiresElevationRequirement> public class LocalAccessOrRequiresElevationHandler : BaseAuthorizationHandler<LocalAccessOrRequiresElevationRequirement>
{ {
@ -30,7 +30,6 @@ namespace Jellyfin.Api.Auth.LocalAccessOrRequiresElevationPolicy
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, LocalAccessOrRequiresElevationRequirement requirement) protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, LocalAccessOrRequiresElevationRequirement requirement)
{ {
var validated = ValidateClaims(context.User, localAccessOnly: true); var validated = ValidateClaims(context.User, localAccessOnly: true);
if (validated || context.User.IsInRole(UserRoles.Administrator)) if (validated || context.User.IsInRole(UserRoles.Administrator))
{ {
context.Succeed(requirement); context.Succeed(requirement);

View file

@ -3,7 +3,7 @@
namespace Jellyfin.Api.Auth.LocalAccessOrRequiresElevationPolicy namespace Jellyfin.Api.Auth.LocalAccessOrRequiresElevationPolicy
{ {
/// <summary> /// <summary>
/// The local access authorization requirement. /// The local access or elevated privileges authorization requirement.
/// </summary> /// </summary>
public class LocalAccessOrRequiresElevationRequirement : IAuthorizationRequirement public class LocalAccessOrRequiresElevationRequirement : IAuthorizationRequirement
{ {

View file

@ -48,6 +48,6 @@ namespace Jellyfin.Api.Constants
/// <summary> /// <summary>
/// Policy name for escaping schedule controls or requiring first time setup. /// Policy name for escaping schedule controls or requiring first time setup.
/// </summary> /// </summary>
public const string IgnoreParentalControlOrFirstTimeSetup = "IgnoreParentalControlOrFirstTimeSetup"; public const string FirstTimeSetupOrIgnoreParentalControl = "FirstTimeSetupOrIgnoreParentalControl";
} }
} }

View file

@ -131,6 +131,7 @@ namespace Jellyfin.Api.Controllers
/// <returns>A <see cref="NoContentResult"/>.</returns> /// <returns>A <see cref="NoContentResult"/>.</returns>
[HttpDelete("Users/{userId}/Images/{itemType}")] [HttpDelete("Users/{userId}/Images/{itemType}")]
[HttpDelete("Users/{userId}/Images/{itemType}/{index?}", Name = "DeleteUserImage_2")] [HttpDelete("Users/{userId}/Images/{itemType}/{index?}", Name = "DeleteUserImage_2")]
[Authorize(Policy = Policies.DefaultAuthorization)]
[SuppressMessage("Microsoft.Performance", "CA1801:ReviewUnusedParameters", MessageId = "imageType", Justification = "Imported from ServiceStack")] [SuppressMessage("Microsoft.Performance", "CA1801:ReviewUnusedParameters", MessageId = "imageType", Justification = "Imported from ServiceStack")]
[SuppressMessage("Microsoft.Performance", "CA1801:ReviewUnusedParameters", MessageId = "index", Justification = "Imported from ServiceStack")] [SuppressMessage("Microsoft.Performance", "CA1801:ReviewUnusedParameters", MessageId = "index", Justification = "Imported from ServiceStack")]
[ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status204NoContent)]

View file

@ -59,7 +59,7 @@ namespace Jellyfin.Api.Controllers
/// <response code="200">Information retrieved.</response> /// <response code="200">Information retrieved.</response>
/// <returns>A <see cref="SystemInfo"/> with info about the system.</returns> /// <returns>A <see cref="SystemInfo"/> with info about the system.</returns>
[HttpGet("Info")] [HttpGet("Info")]
[Authorize(Policy = Policies.IgnoreParentalControlOrFirstTimeSetup)] [Authorize(Policy = Policies.FirstTimeSetupOrIgnoreParentalControl)]
[ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status200OK)]
public async Task<ActionResult<SystemInfo>> GetSystemInfo() public async Task<ActionResult<SystemInfo>> GetSystemInfo()
{ {

View file

@ -8,7 +8,7 @@ namespace Jellyfin.Api.Models.StartupDtos
/// <summary> /// <summary>
/// Gets or sets UI language culture. /// Gets or sets UI language culture.
/// </summary> /// </summary>
public string UICulture { get; set; } = null!; public string? UICulture { get; set; }
/// <summary> /// <summary>
/// Gets or sets the metadata country code. /// Gets or sets the metadata country code.

View file

@ -7,9 +7,9 @@ using Jellyfin.Api;
using Jellyfin.Api.Auth; using Jellyfin.Api.Auth;
using Jellyfin.Api.Auth.DefaultAuthorizationPolicy; using Jellyfin.Api.Auth.DefaultAuthorizationPolicy;
using Jellyfin.Api.Auth.DownloadPolicy; using Jellyfin.Api.Auth.DownloadPolicy;
using Jellyfin.Api.Auth.FirstTimeOrIgnoreParentalControlSetupPolicy;
using Jellyfin.Api.Auth.FirstTimeSetupOrDefaultPolicy; using Jellyfin.Api.Auth.FirstTimeSetupOrDefaultPolicy;
using Jellyfin.Api.Auth.FirstTimeSetupOrElevatedPolicy; using Jellyfin.Api.Auth.FirstTimeSetupOrElevatedPolicy;
using Jellyfin.Api.Auth.IgnoreParentalControlOrFirstTimeSetupPolicy;
using Jellyfin.Api.Auth.IgnoreParentalControlPolicy; using Jellyfin.Api.Auth.IgnoreParentalControlPolicy;
using Jellyfin.Api.Auth.LocalAccessOrRequiresElevationPolicy; using Jellyfin.Api.Auth.LocalAccessOrRequiresElevationPolicy;
using Jellyfin.Api.Auth.LocalAccessPolicy; using Jellyfin.Api.Auth.LocalAccessPolicy;
@ -47,7 +47,7 @@ namespace Jellyfin.Server.Extensions
serviceCollection.AddSingleton<IAuthorizationHandler, FirstTimeSetupOrDefaultHandler>(); serviceCollection.AddSingleton<IAuthorizationHandler, FirstTimeSetupOrDefaultHandler>();
serviceCollection.AddSingleton<IAuthorizationHandler, FirstTimeSetupOrElevatedHandler>(); serviceCollection.AddSingleton<IAuthorizationHandler, FirstTimeSetupOrElevatedHandler>();
serviceCollection.AddSingleton<IAuthorizationHandler, IgnoreParentalControlHandler>(); serviceCollection.AddSingleton<IAuthorizationHandler, IgnoreParentalControlHandler>();
serviceCollection.AddSingleton<IAuthorizationHandler, IgnoreParentalControlOrFirstTimeSetupHandler>(); serviceCollection.AddSingleton<IAuthorizationHandler, FirstTimeOrIgnoreParentalControlSetupHandler>();
serviceCollection.AddSingleton<IAuthorizationHandler, LocalAccessHandler>(); serviceCollection.AddSingleton<IAuthorizationHandler, LocalAccessHandler>();
serviceCollection.AddSingleton<IAuthorizationHandler, LocalAccessOrRequiresElevationHandler>(); serviceCollection.AddSingleton<IAuthorizationHandler, LocalAccessOrRequiresElevationHandler>();
serviceCollection.AddSingleton<IAuthorizationHandler, RequiresElevationHandler>(); serviceCollection.AddSingleton<IAuthorizationHandler, RequiresElevationHandler>();
@ -89,11 +89,11 @@ namespace Jellyfin.Server.Extensions
policy.AddRequirements(new IgnoreParentalControlRequirement()); policy.AddRequirements(new IgnoreParentalControlRequirement());
}); });
options.AddPolicy( options.AddPolicy(
Policies.IgnoreParentalControlOrFirstTimeSetup, Policies.FirstTimeSetupOrIgnoreParentalControl,
policy => policy =>
{ {
policy.AddAuthenticationSchemes(AuthenticationSchemes.CustomAuthentication); policy.AddAuthenticationSchemes(AuthenticationSchemes.CustomAuthentication);
policy.AddRequirements(new IgnoreParentalControlOrFirstTimeSetupRequirement()); policy.AddRequirements(new FirstTimeOrIgnoreParentalControlSetupRequirement());
}); });
options.AddPolicy( options.AddPolicy(
Policies.LocalAccessOnly, Policies.LocalAccessOnly,