/* * Copyright (c) 2023 Vaughn Nugent * * Library: VNLib * Package: VNLib.Plugins.Extensions.Loading * File: UserManager.cs * * UserManager.cs is part of VNLib.Plugins.Extensions.Loading which is part of the larger * VNLib collection of libraries and utilities. * * VNLib.Plugins.Extensions.Loading is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * VNLib.Plugins.Extensions.Loading is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. */ using System; using System.Threading; using System.Threading.Tasks; using VNLib.Utils; using VNLib.Utils.Memory; using VNLib.Utils.Logging; using VNLib.Plugins.Essentials.Users; using VNLib.Plugins.Essentials.Accounts; namespace VNLib.Plugins.Extensions.Loading.Users { /// /// Provides a singleton service that dynamically loads /// a user manager for the plugin. /// [ConfigurationName("users", Required = false)] public class UserManager : IUserManager { public const string USER_CUSTOM_ASSEMBLY = "custom_assembly"; public const string DEFAULT_USER_ASM = "VNLib.Plugins.Essentials.Users.dll"; private readonly IUserManager _dynamicLoader; public UserManager(PluginBase plugin) { //Load the default user assembly _dynamicLoader = LoadUserAssembly(plugin, DEFAULT_USER_ASM); } public UserManager(PluginBase plugin, IConfigScope config) { //Get the service configuration string customAsm = config[USER_CUSTOM_ASSEMBLY].GetString() ?? DEFAULT_USER_ASM; //Load the assembly _dynamicLoader = LoadUserAssembly(plugin, customAsm); } private static IUserManager LoadUserAssembly(PluginBase plugin, string customAsm) { //Try to load a custom assembly IUserManager externManager = plugin.CreateServiceExternal(customAsm); if (plugin.IsDebug()) { plugin.Log.Debug("Loading user manager from assembly {name}", externManager.GetType().AssemblyQualifiedName); } return externManager; } /// /// Gets the underlying that was dynamically loaded. /// /// The user manager instance public IUserManager InternalManager => _dynamicLoader; /// public Task CreateUserAsync(IUserCreationRequest creation, string? userId, CancellationToken cancellation = default) { return _dynamicLoader.CreateUserAsync(creation, userId, cancellation); } /// public IPasswordHashingProvider? GetHashProvider() { return _dynamicLoader.GetHashProvider(); } /// public Task GetUserCountAsync(CancellationToken cancellation = default) { return _dynamicLoader.GetUserCountAsync(cancellation); } /// public Task GetUserFromUsernameAsync(string emailAddress, CancellationToken cancellationToken = default) { return _dynamicLoader.GetUserFromUsernameAsync(emailAddress, cancellationToken); } /// public Task GetUserFromIDAsync(string userId, CancellationToken cancellationToken = default) { return _dynamicLoader.GetUserFromIDAsync(userId, cancellationToken); } /// public Task RecoverPasswordAsync(IUser user, CancellationToken cancellation = default) { return _dynamicLoader.RecoverPasswordAsync(user, cancellation); } /// public Task UpdatePasswordAsync(IUser user, PrivateString newPass, CancellationToken cancellation = default) { return _dynamicLoader.UpdatePasswordAsync(user, newPass, cancellation); } /// public Task ValidatePasswordAsync(IUser user, PrivateString password, PassValidateFlags flags, CancellationToken cancellation = default) { return _dynamicLoader.ValidatePasswordAsync(user, password, flags, cancellation); } /// public string ComputeSafeUserId(string input) { return _dynamicLoader.ComputeSafeUserId(input); } } }