using CryptoProvider;
using DataProviders.Collections;
using DomainObjects.Documents;
using DomainObjects.Enumerations;
using Microsoft.AspNetCore.Authorization;
using WeatherForecast.Policies.Abstractions;
using WeatherForecast.Services;
namespace WeatherForecast.Policies;
///
///
///
public class PasswordChangeAuthorizationHandler : AuthorizationHandlerBase> {
///
///
///
///
///
///
public PasswordChangeAuthorizationHandler(
IHttpContextAccessor contextAccessor,
IUserDataProvider userDataProvider,
IAccountPolicyService accountService
) : base(contextAccessor, userDataProvider, accountService) { }
///
///
///
///
///
///
///
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, PasswordChangeRequirement requirement, List resource) {
// User from token
var user = GetUser(context);
if (user == null)
return Task.CompletedTask;
if(user.Role != Roles.Admin && resource.Any(x => x.Id != user.Id))
return Task.CompletedTask;
if (resource.Count() > 0 && resource.Any(x => x.Id == user.Id))
return Task.CompletedTask;
if (resource.All(x => x.Id == user.Id)) {
if (user.Passwords.Password == null)
return Task.CompletedTask;
if (!HashService.ValidateHash(requirement.OldPassword, user.Passwords.Password.Salt, user.Passwords.Password.Hash))
return Task.CompletedTask;
}
context.Succeed(requirement);
return Task.CompletedTask;
}
}
public class PasswordChangeRequirement : AuthorizationRequirementBase {
public string OldPassword { get; init; }
}