108 lines
3.0 KiB
C#
108 lines
3.0 KiB
C#
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 {
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public class TemplateAuthorizationHandler : AuthorizationHandlerBase<TemplateAuthorisationRequirement, List<BucketFile>> {
|
|
|
|
private readonly IFileSecurityService _fileSecurityService;
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="configuration"></param>
|
|
/// <param name="contextAccessor"></param>
|
|
/// <param name="siteDataProvider"></param>
|
|
/// <param name="userDataProvider"></param>
|
|
/// <param name="fileSecurityService"></param>
|
|
public TemplateAuthorizationHandler(
|
|
IOptions<Configuration> configuration,
|
|
IHttpContextAccessor contextAccessor,
|
|
ISiteDataProvider siteDataProvider,
|
|
IUserDataProvider userDataProvider,
|
|
IFileSecurityService fileSecurityService
|
|
) : base(configuration, contextAccessor, siteDataProvider, userDataProvider) {
|
|
_fileSecurityService = fileSecurityService;
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="context"></param>
|
|
/// <param name="requirement"></param>
|
|
/// <param name="resource"></param>
|
|
/// <returns></returns>
|
|
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TemplateAuthorisationRequirement requirement, List<BucketFile> 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;
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public class TemplateRole {
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public Roles Role { get; private set; }
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="role"></param>
|
|
public TemplateRole(Roles role) {
|
|
Role = role;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public class TemplateAuthorisationRequirement : AuthorizationRequirementBase {
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public List<TemplateRole> Roles { get; private set; }
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="action"></param>
|
|
/// <param name="roles"></param>
|
|
public TemplateAuthorisationRequirement(CrudActions action, List<TemplateRole> roles) : base(action) {
|
|
Roles = roles;
|
|
}
|
|
}
|
|
}
|