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 TemplateAuthorizationHandler : AuthorizationHandlerBase> { private readonly IFileSecurityService _fileSecurityService; /// /// /// /// /// /// /// /// public TemplateAuthorizationHandler( IOptions configuration, IHttpContextAccessor contextAccessor, ISiteDataProvider siteDataProvider, IUserDataProvider userDataProvider, IFileSecurityService fileSecurityService ) : base(configuration, contextAccessor, siteDataProvider, userDataProvider) { _fileSecurityService = fileSecurityService; } /// /// /// /// /// /// /// protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TemplateAuthorisationRequirement 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; } context.Succeed(requirement); return Task.CompletedTask; } } /// /// /// public class TemplateRole { /// /// /// public Roles Role { get; private set; } /// /// /// /// public TemplateRole(Roles role) { Role = role; } } /// /// /// public class TemplateAuthorisationRequirement : AuthorizationRequirementBase { /// /// /// public List Roles { get; private set; } /// /// /// /// /// public TemplateAuthorisationRequirement(CrudActions action, List roles) : base(action) { Roles = roles; } } }