diff options
author | vnugent <public@vaughnnugent.com> | 2023-06-22 21:13:35 -0400 |
---|---|---|
committer | vnugent <public@vaughnnugent.com> | 2023-06-22 21:13:35 -0400 |
commit | e1c1c679abdf482733ba601ee54f01bdfa79ddda (patch) | |
tree | 183a06af17e598b9ada1c138e468b1e74ac346d4 /plugins | |
parent | 765d3d328af49f92f1d0b296bfba2d7791e0cdf5 (diff) |
Extensions async updates
Diffstat (limited to 'plugins')
6 files changed, 31 insertions, 39 deletions
diff --git a/plugins/VNLib.Plugins.Essentials.Accounts.Admin/src/Model/UserStore.cs b/plugins/VNLib.Plugins.Essentials.Accounts.Admin/src/Model/UserStore.cs index 3dc64ec..2f44108 100644 --- a/plugins/VNLib.Plugins.Essentials.Accounts.Admin/src/Model/UserStore.cs +++ b/plugins/VNLib.Plugins.Essentials.Accounts.Admin/src/Model/UserStore.cs @@ -1,5 +1,5 @@ /* -* Copyright (c) 2022 Vaughn Nugent +* Copyright (c) 2023 Vaughn Nugent * * Library: VNLib * Package: VNLib.Plugins.Essentials.Accounts.Admin @@ -23,10 +23,6 @@ */ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; @@ -41,7 +37,7 @@ namespace VNLib.Plugins.Essentials.Accounts.Admin.Model public UserStore(DbContextOptions options) { - this.Options = options; + Options = options; } //Item id's are not used diff --git a/plugins/VNLib.Plugins.Essentials.Accounts.Registration/src/Endpoints/RegistrationEntpoint.cs b/plugins/VNLib.Plugins.Essentials.Accounts.Registration/src/Endpoints/RegistrationEntpoint.cs index 83c1528..c1f8589 100644 --- a/plugins/VNLib.Plugins.Essentials.Accounts.Registration/src/Endpoints/RegistrationEntpoint.cs +++ b/plugins/VNLib.Plugins.Essentials.Accounts.Registration/src/Endpoints/RegistrationEntpoint.cs @@ -69,7 +69,7 @@ namespace VNLib.Plugins.Essentials.Accounts.Registration.Endpoints private readonly IPasswordHashingProvider Passwords; private readonly RevokedTokenStore RevokedTokens; private readonly TransactionalEmailConfig Emails; - private readonly Task<ReadOnlyJsonWebKey> RegSignatureKey; + private readonly IAsyncLazy<ReadOnlyJsonWebKey> RegSignatureKey; private readonly TimeSpan RegExpiresSec; /// <summary> @@ -94,7 +94,8 @@ namespace VNLib.Plugins.Essentials.Accounts.Registration.Endpoints Emails = plugin.GetOrCreateSingleton<TEmailConfig>(); //Begin the async op to get the signature key from the vault - RegSignatureKey = plugin.TryGetSecretAsync("reg_sig_key").ToJsonWebKey(true); + RegSignatureKey = plugin.GetSecretAsync("reg_sig_key") + .ToLazy(static sr => sr.GetJsonWebKey()); } private static IValidator<string> GetJwtValidator() @@ -169,7 +170,7 @@ namespace VNLib.Plugins.Essentials.Accounts.Registration.Endpoints //get jwt using JsonWebToken jwt = JsonWebToken.Parse(regJwt); //verify signature - bool verified = jwt.VerifyFromJwk(RegSignatureKey.Result); + bool verified = jwt.VerifyFromJwk(RegSignatureKey.Value); if (webm.Assert(verified, FAILED_AUTH_ERR)) { @@ -279,7 +280,7 @@ namespace VNLib.Plugins.Essentials.Accounts.Registration.Endpoints string jwtData; using (JsonWebToken emailJwt = new()) { - emailJwt.WriteHeader(RegSignatureKey.Result.JwtHeader); + emailJwt.WriteHeader(RegSignatureKey.Value.JwtHeader); //Init new claim stack, include the same iat time, nonce for entropy, and descriptor storage id emailJwt.InitPayloadClaim(3) @@ -289,7 +290,7 @@ namespace VNLib.Plugins.Essentials.Accounts.Registration.Endpoints .CommitClaims(); //sign the jwt - emailJwt.SignFromJwk(RegSignatureKey.Result); + emailJwt.SignFromJwk(RegSignatureKey.Value); //Compile to encoded string jwtData = emailJwt.Compile(); } diff --git a/plugins/VNLib.Plugins.Essentials.Accounts.Registration/src/TokenRevocation/RevokedTokenStore.cs b/plugins/VNLib.Plugins.Essentials.Accounts.Registration/src/TokenRevocation/RevokedTokenStore.cs index 89f4bd6..4383a85 100644 --- a/plugins/VNLib.Plugins.Essentials.Accounts.Registration/src/TokenRevocation/RevokedTokenStore.cs +++ b/plugins/VNLib.Plugins.Essentials.Accounts.Registration/src/TokenRevocation/RevokedTokenStore.cs @@ -1,5 +1,5 @@ /* -* Copyright (c) 2022 Vaughn Nugent +* Copyright (c) 2023 Vaughn Nugent * * Library: VNLib * Package: VNLib.Plugins.Essentials.Accounts.Registration @@ -22,8 +22,6 @@ * along with this program. If not, see https://www.gnu.org/licenses/. */ -using System.Collections; - using Microsoft.EntityFrameworkCore; using VNLib.Utils; diff --git a/plugins/VNLib.Plugins.Essentials.SocialOauth/src/Endpoints/Auth0.cs b/plugins/VNLib.Plugins.Essentials.SocialOauth/src/Endpoints/Auth0.cs index 2f99693..3166610 100644 --- a/plugins/VNLib.Plugins.Essentials.SocialOauth/src/Endpoints/Auth0.cs +++ b/plugins/VNLib.Plugins.Essentials.SocialOauth/src/Endpoints/Auth0.cs @@ -45,7 +45,7 @@ namespace VNLib.Plugins.Essentials.SocialOauth.Endpoints [ConfigurationName("auth0")] internal sealed class Auth0 : SocialOauthBase { - private readonly Task<ReadOnlyJsonWebKey[]> Auth0VerificationJwk; + private readonly IAsyncLazy<ReadOnlyJsonWebKey[]> Auth0VerificationJwk; public Auth0(PluginBase plugin, IConfigScope config) : base(plugin, config) { @@ -54,7 +54,7 @@ namespace VNLib.Plugins.Essentials.SocialOauth.Endpoints Uri keyUri = new(keyUrl); //Get certificate on background thread - Auth0VerificationJwk = Task.Run(() => GetRsaCertificate(keyUri)); + Auth0VerificationJwk = Task.Run(() => GetRsaCertificate(keyUri)).AsLazy(); } @@ -143,7 +143,7 @@ namespace VNLib.Plugins.Essentials.SocialOauth.Endpoints using JsonWebToken jwt = JsonWebToken.Parse(clientAccess.IdToken); //Verify the token against the first signing key - if (!jwt.VerifyFromJwk(Auth0VerificationJwk.Result[0])) + if (!jwt.VerifyFromJwk(Auth0VerificationJwk.Value[0])) { return EmptyLoginData; } @@ -164,7 +164,7 @@ namespace VNLib.Plugins.Essentials.SocialOauth.Endpoints } //Verify audience matches client id - if (!Config.ClientID.Equals(audience, StringComparison.Ordinal)) + if (!Config.ClientID.Value.Equals(audience, StringComparison.Ordinal)) { //Invalid audience return EmptyLoginData; diff --git a/plugins/VNLib.Plugins.Essentials.SocialOauth/src/OauthClientConfig.cs b/plugins/VNLib.Plugins.Essentials.SocialOauth/src/OauthClientConfig.cs index b7e94a2..e7e81d6 100644 --- a/plugins/VNLib.Plugins.Essentials.SocialOauth/src/OauthClientConfig.cs +++ b/plugins/VNLib.Plugins.Essentials.SocialOauth/src/OauthClientConfig.cs @@ -23,7 +23,6 @@ */ using System; -using System.Threading.Tasks; using System.Collections.Generic; using VNLib.Utils.Extensions; @@ -35,7 +34,7 @@ using VNLib.Plugins.Extensions.Loading.Users; namespace VNLib.Plugins.Essentials.SocialOauth { - public sealed class OauthClientConfig : IAsyncConfigurable + public sealed class OauthClientConfig { private readonly string ConfigName; @@ -67,27 +66,24 @@ namespace VNLib.Plugins.Essentials.SocialOauth Users = plugin.GetOrCreateSingleton<UserManager>(); Passwords = plugin.GetOrCreateSingleton<ManagedPasswordHashing>(); - } - - public async Task ConfigureServiceAsync(PluginBase plugin) - { - //Get id/secret - Task<SecretResult?> clientIdTask = plugin.TryGetSecretAsync($"{ConfigName}_client_id"); - Task<SecretResult?> secretTask = plugin.TryGetSecretAsync($"{ConfigName}_client_secret"); - await Task.WhenAll(secretTask, clientIdTask); + //Setup async lazy loaders for secrets + ClientID = plugin.GetSecretAsync($"{ConfigName}_client_id") + .ToLazy(static r => r.Result.ToString()); - using SecretResult? secret = await secretTask; - using SecretResult? clientId = await clientIdTask; - - ClientID = clientId?.Result.ToString() ?? throw new KeyNotFoundException($"Missing {ConfigName} client id from config or vault"); - ClientSecret = secret?.Result.ToString() ?? throw new KeyNotFoundException($"Missing the {ConfigName} client secret from config or vault"); + ClientSecret = plugin.GetSecretAsync($"{ConfigName}_client_secret") + .ToLazy(static r => r.Result.ToString()); } - - public string ClientID { get; private set; } = string.Empty; + /// <summary> + /// The client ID for the OAuth2 service + /// </summary> + public IAsyncLazy<string> ClientID { get; } - public string ClientSecret { get; private set; } = string.Empty; + /// <summary> + /// The client secret for the OAuth2 service + /// </summary> + public IAsyncLazy<string> ClientSecret { get; } /// <summary> @@ -113,6 +109,7 @@ namespace VNLib.Plugins.Essentials.SocialOauth public Uri UserDataUrl { get; } public TimeSpan LoginNonceLifetime { get; } + /// <summary> /// The user store to create/get users from /// </summary> diff --git a/plugins/VNLib.Plugins.Essentials.SocialOauth/src/SocialOauthBase.cs b/plugins/VNLib.Plugins.Essentials.SocialOauth/src/SocialOauthBase.cs index 9d6232c..e594462 100644 --- a/plugins/VNLib.Plugins.Essentials.SocialOauth/src/SocialOauthBase.cs +++ b/plugins/VNLib.Plugins.Essentials.SocialOauth/src/SocialOauthBase.cs @@ -188,8 +188,8 @@ namespace VNLib.Plugins.Essentials.SocialOauth RestRequest request = new(Config.AccessTokenUrl, Method.Post); //Add required params url-encoded - request.AddParameter("client_id", Config.ClientID, ParameterType.GetOrPost); - request.AddParameter("client_secret", Config.ClientSecret, ParameterType.GetOrPost); + request.AddParameter("client_id", Config.ClientID.Value, ParameterType.GetOrPost); + request.AddParameter("client_secret", Config.ClientSecret.Value, ParameterType.GetOrPost); request.AddParameter("grant_type", "authorization_code", ParameterType.GetOrPost); request.AddParameter("code", code, ParameterType.GetOrPost); request.AddParameter("redirect_uri", $"{ev.Server.RequestUri.Scheme}://{ev.Server.RequestUri.Authority}{Path}", ParameterType.GetOrPost); @@ -653,7 +653,7 @@ namespace VNLib.Plugins.Essentials.SocialOauth writer.Append(config.AccessCodeUrl.OriginalString); //begin query arguments writer.Append("&client_id="); - writer.Append(config.ClientID); + writer.Append(config.ClientID.Value); //add the redirect url writer.Append("&redirect_uri="); writer.Append(redirectUrl); |