using Microsoft.AspNetCore.Cryptography.KeyDerivation; using Microsoft.EntityFrameworkCore; namespace HyperBooru.Services; public interface IUserService { public bool ShowNsfw { get; set; } public event EventHandler ShowNsfwChanged; public User User { get; } } public class UserService : IUserService { public bool ShowNsfw { get => showNsfw; set { showNsfw = value; ShowNsfwChanged?.Invoke(this, value); } } public User User { get { if(user is not null) return user; using var db = dbFactory.CreateDbContext(); int id = int.Parse(httpContextAccessor .HttpContext!.User.Claims .First(c => c.Type == "ObjectId") .Value); return user = db.Users.Find(id)!; } } public event EventHandler ShowNsfwChanged; private bool showNsfw = false; private User? user; private IDbContextFactory dbFactory; private IHttpContextAccessor httpContextAccessor; public UserService( IDbContextFactory dbFactory, IHttpContextAccessor httpContextAccessor) { this.dbFactory = dbFactory; this.httpContextAccessor = httpContextAccessor; } public static string HashPassword(string password) => Convert.ToBase64String( KeyDerivation.Pbkdf2( password, Array.Empty(), KeyDerivationPrf.HMACSHA512, 100_000, 512 / 8)); }