Allowing the user to customize unlogged permisions

This commit is contained in:
Zoe Roux 2020-04-02 23:39:05 +02:00
parent 7d59785235
commit d43dfd4739
5 changed files with 60 additions and 7 deletions

View File

@ -0,0 +1,47 @@
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using IdentityServer4.Extensions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Extensions.Configuration;
namespace Kyoo.Controllers
{
public class AuthorizationValidatorHandler : AuthorizationHandler<AuthorizationValidator>
{
private readonly IConfiguration _configuration;
public AuthorizationValidatorHandler(IConfiguration configuration)
{
_configuration = configuration;
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AuthorizationValidator requirement)
{
if (!context.User.IsAuthenticated())
{
string defaultPerms = _configuration.GetValue<string>("defaultPermissions");
if (defaultPerms.Split(',').Contains(requirement.Permission.ToLower()))
context.Succeed(requirement);
}
else
{
Claim perms = context.User.Claims.FirstOrDefault(x => x.Type == "permissions");
if (perms != null && perms.Value.Split(",").Contains(requirement.Permission.ToLower()))
context.Succeed(requirement);
}
return Task.CompletedTask;
}
}
public class AuthorizationValidator : IAuthorizationRequirement
{
public string Permission;
public AuthorizationValidator(string permission)
{
Permission = permission;
}
}
}

View File

@ -2,6 +2,7 @@ using System.Linq;
using System.Reflection; using System.Reflection;
using System.Security.Claims; using System.Security.Claims;
using System.Threading.Tasks; using System.Threading.Tasks;
using IdentityServer4.Extensions;
using Kyoo.Api; using Kyoo.Api;
using Kyoo.Controllers; using Kyoo.Controllers;
using Kyoo.Models; using Kyoo.Models;
@ -99,16 +100,12 @@ namespace Kyoo
{ {
policy.AuthenticationSchemes.Add(IdentityConstants.ApplicationScheme); policy.AuthenticationSchemes.Add(IdentityConstants.ApplicationScheme);
policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme); policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
policy.RequireAuthenticatedUser(); policy.AddRequirements(new AuthorizationValidator(permission));
policy.RequireAssertion(context =>
{
Claim perms = context.User.Claims.FirstOrDefault(x => x.Type == "permissions");
return perms != null && perms.Value.Split(",").Contains(permission.ToLower());
});
// policy.RequireScope($"kyoo.{permission.ToLower()}"); // policy.RequireScope($"kyoo.{permission.ToLower()}");
}); });
} }
}); });
services.AddSingleton<IAuthorizationHandler, AuthorizationValidatorHandler>();
services.AddScoped<ILibraryManager, LibraryManager>(); services.AddScoped<ILibraryManager, LibraryManager>();
services.AddScoped<ICrawler, Crawler>(); services.AddScoped<ICrawler, Crawler>();

View File

@ -51,6 +51,7 @@ namespace Kyoo.Api
{ {
private readonly UserManager<User> _userManager; private readonly UserManager<User> _userManager;
private readonly SignInManager<User> _signInManager; private readonly SignInManager<User> _signInManager;
private readonly IConfiguration _configuration;
private readonly string _picturePath; private readonly string _picturePath;
public Claim[] defaultClaims = public Claim[] defaultClaims =
@ -63,6 +64,7 @@ namespace Kyoo.Api
_userManager = userManager; _userManager = userManager;
_signInManager = siginInManager; _signInManager = siginInManager;
_picturePath = configuration.GetValue<string>("profilePicturePath"); _picturePath = configuration.GetValue<string>("profilePicturePath");
_configuration = configuration;
if (!Path.IsPathRooted(_picturePath)) if (!Path.IsPathRooted(_picturePath))
_picturePath = Path.GetFullPath(_picturePath); _picturePath = Path.GetFullPath(_picturePath);
} }
@ -172,5 +174,11 @@ namespace Kyoo.Api
await _userManager.UpdateAsync(user); await _userManager.UpdateAsync(user);
return Ok(); return Ok();
} }
[HttpGet("default-permissions")]
public ActionResult<IEnumerable<string>> GetDefaultPermissions()
{
return _configuration.GetValue<string>("defaultPermissions").Split(",");
}
} }
} }

@ -1 +1 @@
Subproject commit e975a4f055f45cc48fd0ceedfe73fb6616bd1dbe Subproject commit 9f44094b2df56acceb3b6ef8abe7504efae50c98

View File

@ -26,5 +26,6 @@
"peoplePath": "people", "peoplePath": "people",
"profilePicturePath": "users/", "profilePicturePath": "users/",
"plugins": "plugins/", "plugins": "plugins/",
"defaultPermissions": "read,play",
"regex": "(\\/(?<Collection>.*)\\/)?.*\\/(?<ShowTitle>.+?)(( S(?<Season>\\d+)E(?<Episode>\\d+)| (?<Absolute>\\d+)))?\\.", "regex": "(\\/(?<Collection>.*)\\/)?.*\\/(?<ShowTitle>.+?)(( S(?<Season>\\d+)E(?<Episode>\\d+)| (?<Absolute>\\d+)))?\\.",
} }