From ec99d0c948733ea379065e0ae37ab7702a1e4727 Mon Sep 17 00:00:00 2001 From: vnugent Date: Thu, 9 Mar 2023 01:48:39 -0500 Subject: Omega cache, session, and account provider complete overhaul --- .../src/UserManager.cs | 138 +++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 lib/VNLib.Plugins.Extensions.Loading/src/UserManager.cs (limited to 'lib/VNLib.Plugins.Extensions.Loading/src/UserManager.cs') diff --git a/lib/VNLib.Plugins.Extensions.Loading/src/UserManager.cs b/lib/VNLib.Plugins.Extensions.Loading/src/UserManager.cs new file mode 100644 index 0000000..a3d667d --- /dev/null +++ b/lib/VNLib.Plugins.Extensions.Loading/src/UserManager.cs @@ -0,0 +1,138 @@ +/* +* 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 System.Runtime.CompilerServices; + +using VNLib.Utils; +using VNLib.Utils.Memory; +using VNLib.Utils.Logging; +using VNLib.Plugins.Essentials.Users; + +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"; + public const string ONLOAD_METHOD_NAME = "OnPluginLoading"; + + private readonly IUserManager _dynamicLoader; + + public UserManager(PluginBase plugin) + { + _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 + AssemblyLoader loader = plugin.LoadAssembly(customAsm); + try + { + //Try to get the onload method + Action? onLoadMethod = loader.TryGetMethod>(ONLOAD_METHOD_NAME); + + //Call the onplugin load method + onLoadMethod?.Invoke(plugin); + + if (plugin.IsDebug()) + { + plugin.Log.Debug("Loading user manager from assembly {name}", loader.Resource.GetType().AssemblyQualifiedName); + } + + //Return the loaded instance (may raise exception) + return loader.Resource; + } + catch + { + loader.Dispose(); + throw; + } + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Task CreateUserAsync(string userid, string emailAddress, ulong privilages, PrivateString passHash, CancellationToken cancellation = default) + { + return _dynamicLoader.CreateUserAsync(userid, emailAddress, privilages, passHash, cancellation); + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Task GetUserAndPassFromEmailAsync(string emailAddress, CancellationToken cancellationToken = default) + { + return _dynamicLoader.GetUserAndPassFromEmailAsync(emailAddress, cancellationToken); + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Task GetUserAndPassFromIDAsync(string userid, CancellationToken cancellation = default) + { + return _dynamicLoader.GetUserAndPassFromIDAsync(userid, cancellation); + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Task GetUserCountAsync(CancellationToken cancellation = default) + { + return _dynamicLoader.GetUserCountAsync(cancellation); + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Task GetUserFromEmailAsync(string emailAddress, CancellationToken cancellationToken = default) + { + return _dynamicLoader.GetUserFromEmailAsync(emailAddress, cancellationToken); + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Task GetUserFromIDAsync(string userId, CancellationToken cancellationToken = default) + { + return _dynamicLoader.GetUserFromIDAsync(userId, cancellationToken); + } + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Task UpdatePassAsync(IUser user, PrivateString newPass, CancellationToken cancellation = default) + { + return _dynamicLoader.UpdatePassAsync(user, newPass, cancellation); + } + } +} \ No newline at end of file -- cgit