aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorLibravatar vnugent <public@vaughnnugent.com>2023-06-22 21:13:35 -0400
committerLibravatar vnugent <public@vaughnnugent.com>2023-06-22 21:13:35 -0400
commite1c1c679abdf482733ba601ee54f01bdfa79ddda (patch)
tree183a06af17e598b9ada1c138e468b1e74ac346d4 /plugins
parent765d3d328af49f92f1d0b296bfba2d7791e0cdf5 (diff)
Extensions async updates
Diffstat (limited to 'plugins')
-rw-r--r--plugins/VNLib.Plugins.Essentials.Accounts.Admin/src/Model/UserStore.cs8
-rw-r--r--plugins/VNLib.Plugins.Essentials.Accounts.Registration/src/Endpoints/RegistrationEntpoint.cs11
-rw-r--r--plugins/VNLib.Plugins.Essentials.Accounts.Registration/src/TokenRevocation/RevokedTokenStore.cs4
-rw-r--r--plugins/VNLib.Plugins.Essentials.SocialOauth/src/Endpoints/Auth0.cs8
-rw-r--r--plugins/VNLib.Plugins.Essentials.SocialOauth/src/OauthClientConfig.cs33
-rw-r--r--plugins/VNLib.Plugins.Essentials.SocialOauth/src/SocialOauthBase.cs6
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);