using Core.Enumerations; using DataProviders.Buckets; using DataProviders.Collections; using DomainObjects.Documents.Users; using FileSecurityService; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Options; using WeatherForecast.Policies.Abstractions; namespace WeatherForecast.Policies; /// /// /// public class ImageAuthorisationHandler : AuthorizationHandlerBase> { private readonly IFileSecurityService _fileSecurityService; /// /// /// /// /// /// /// /// public ImageAuthorisationHandler( IOptions configuration, IHttpContextAccessor contextAccessor, ISiteDataProvider siteDataProvider, IUserDataProvider userDataProvider, IFileSecurityService fileSecurityService ) : base(configuration, contextAccessor, siteDataProvider, userDataProvider) { _fileSecurityService = fileSecurityService; } /// /// /// /// /// /// /// /// protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ImageAuthorisationRequirement requirement, List resource) { var (site, user) = GetUser(context); if (site == null || user == null) return Task.CompletedTask; var userRole = GetRole(site, user); var req = requirement.Roles.SingleOrDefault(x => x.Role == userRole); if (req == null) return Task.CompletedTask; foreach (var res in resource) { var (fileCategory, signatureResult) = _fileSecurityService.CheckFileSignature(res.Name, res.Bytes, res.ContentType); if (!signatureResult.IsSuccess || fileCategory == null) return Task.CompletedTask; if (req.OwnOnly && res.UserId != user.Id) return Task.CompletedTask; if (req.DenyPublished && res.Published != null) return Task.CompletedTask; } context.Succeed(requirement); return Task.CompletedTask; } } /// /// /// public class ImageRole { /// /// /// public Roles Role { get; private set; } /// /// /// public bool DenyPublished { get; init; } = false; /// /// /// public bool OwnOnly { get; init; } = false; /// /// /// /// public ImageRole(Roles role) { Role = role; } } /// /// /// public class ImageAuthorisationRequirement : AuthorizationRequirementBase { /// /// /// public List Roles { get; private set; } /// /// /// /// /// public ImageAuthorisationRequirement(CrudActions action, List roles) : base(action) { Roles = roles; } }