yavsc/src/Yavsc/Extensions/PermissionHandler.cs

78 lines
2.2 KiB
C#
Raw Normal View History

2024-11-10 23:12:02 +00:00
using System.Security.Claims;
using Microsoft.AspNetCore.Authorization;
2025-02-18 20:17:06 +00:00
using Microsoft.EntityFrameworkCore;
using Yavsc.Helpers;
using Yavsc.Models;
using Yavsc.Models.Blog;
2024-11-10 23:12:02 +00:00
using Yavsc.ViewModels.Auth;
namespace Yavsc.Extensions;
public class PermissionHandler : IAuthorizationHandler
{
2025-02-18 20:17:06 +00:00
ApplicationDbContext applicationDbContext;
public PermissionHandler(ApplicationDbContext applicationDbContext)
{
this.applicationDbContext = applicationDbContext;
}
2024-11-10 23:12:02 +00:00
public Task HandleAsync(AuthorizationHandlerContext context)
{
var pendingRequirements = context.PendingRequirements.ToList();
foreach (var requirement in pendingRequirements)
{
if (requirement is ReadPermission)
{
2025-02-23 20:23:23 +00:00
if (IsPublic(context.Resource))
{
context.Succeed(requirement);
}
else if (IsOwner(context.User, context.Resource)
2024-11-10 23:12:02 +00:00
|| IsSponsor(context.User, context.Resource))
{
context.Succeed(requirement);
}
}
else if (requirement is EditPermission || requirement is DeletePermission)
{
if (IsOwner(context.User, context.Resource))
{
context.Succeed(requirement);
}
}
}
return Task.CompletedTask;
}
2025-02-23 20:23:23 +00:00
private bool IsPublic(object? resource)
{
if (resource is BlogPost blogPost)
{
if (blogPost.ACL.Count==0)
return true;
}
return false;
}
2024-11-10 23:12:02 +00:00
private static bool IsOwner(ClaimsPrincipal user, object? resource)
{
2025-02-18 20:17:06 +00:00
if (resource is BlogPost blogPost)
{
return blogPost.AuthorId == user.GetUserId();
}
return false;
2024-11-10 23:12:02 +00:00
}
2025-02-18 20:17:06 +00:00
private bool IsSponsor(ClaimsPrincipal user, object? resource)
2024-11-10 23:12:02 +00:00
{
2025-02-18 20:17:06 +00:00
if (resource is BlogPost blogPost)
{
return applicationDbContext.CircleMembers
.Include(c => c.Circle)
.Where(m=>m.MemberId==user.GetUserId() && m.Circle.OwnerId == blogPost.OwnerId)
.Any();
}
2024-11-10 23:12:02 +00:00
return true;
}
}