namespace HyperBooru.Services; public interface IPrincipalProvider { public Principal? GetPrincipal(string name); public User? GetUser(string name); public Group? GetGroup(string name); public Group[] GetGroups(Principal principal); public Group[] GetGroups(Principal principal, bool recurse); public bool ValidatePassword(User user, string password); } public abstract class PrincipalProvider : IPrincipalProvider { public abstract Principal? GetPrincipal(string name); public abstract User? GetUser(string name); public abstract Group? GetGroup(string name); public Group[] GetGroups(Principal principal) => GetGroups(principal, false); public abstract Group[] GetGroups(Principal principal, bool recurse); public abstract bool ValidatePassword(User user, string password); }