From 3a35e8905cee2501cf66ecb38be983e27f578af7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Silveira?= Date: Wed, 22 May 2024 15:20:31 +0200 Subject: [PATCH] plugin configuration methods are now public. added base classes for authN and authZ. removed Log dependency from authN provider factory. --- .../AuthenticationProviderBase.cs | 29 +++++++++++++++++++ .../IAuthenticationProviderFactory.cs | 5 +--- .../AuthorizationProviderBase.cs | 21 ++++++++++++++ src/EventStore.Plugins/IPlugableComponent.cs | 5 ++++ src/EventStore.Plugins/Plugin.cs | 12 ++++---- .../Diagnostics/PluginMetricsTests.cs | 2 +- 6 files changed, 62 insertions(+), 12 deletions(-) create mode 100644 src/EventStore.Plugins/Authentication/AuthenticationProviderBase.cs create mode 100644 src/EventStore.Plugins/Authorization/AuthorizationProviderBase.cs diff --git a/src/EventStore.Plugins/Authentication/AuthenticationProviderBase.cs b/src/EventStore.Plugins/Authentication/AuthenticationProviderBase.cs new file mode 100644 index 0000000..c4a651f --- /dev/null +++ b/src/EventStore.Plugins/Authentication/AuthenticationProviderBase.cs @@ -0,0 +1,29 @@ +using Microsoft.AspNetCore.Routing; + +namespace EventStore.Plugins.Authentication; + +public abstract class AuthenticationProviderBase(PluginOptions options) : Plugin(options), IAuthenticationProvider { + protected AuthenticationProviderBase( + string? name = null, + string? version = null, + string? licensePublicKey = null, + string? diagnosticsName = null, + params KeyValuePair[] diagnosticsTags + ) : this(new() { + Name = name, + Version = version, + LicensePublicKey = licensePublicKey, + DiagnosticsName = diagnosticsName, + DiagnosticsTags = diagnosticsTags + }) { } + + public virtual Task Initialize() => Task.CompletedTask; + + public abstract void Authenticate(AuthenticationRequest authenticationRequest); + + public virtual IEnumerable> GetPublicProperties() => []; + + public virtual void ConfigureEndpoints(IEndpointRouteBuilder endpointRouteBuilder) { } + + public virtual IReadOnlyList GetSupportedAuthenticationSchemes() => []; +} \ No newline at end of file diff --git a/src/EventStore.Plugins/Authentication/IAuthenticationProviderFactory.cs b/src/EventStore.Plugins/Authentication/IAuthenticationProviderFactory.cs index ea4c78d..ddabcde 100644 --- a/src/EventStore.Plugins/Authentication/IAuthenticationProviderFactory.cs +++ b/src/EventStore.Plugins/Authentication/IAuthenticationProviderFactory.cs @@ -1,5 +1,3 @@ -using Microsoft.Extensions.Logging; - namespace EventStore.Plugins.Authentication; public interface IAuthenticationProviderFactory { @@ -9,6 +7,5 @@ public interface IAuthenticationProviderFactory { /// /// Whether the Authentication Provider should log failed authentication attempts /// - /// The to use when logging in the plugin - IAuthenticationProvider Build(bool logFailedAuthenticationAttempts, ILogger logger); + IAuthenticationProvider Build(bool logFailedAuthenticationAttempts); } \ No newline at end of file diff --git a/src/EventStore.Plugins/Authorization/AuthorizationProviderBase.cs b/src/EventStore.Plugins/Authorization/AuthorizationProviderBase.cs new file mode 100644 index 0000000..915485a --- /dev/null +++ b/src/EventStore.Plugins/Authorization/AuthorizationProviderBase.cs @@ -0,0 +1,21 @@ +using System.Security.Claims; + +namespace EventStore.Plugins.Authorization; + +public abstract class AuthorizationProviderBase(PluginOptions options) : Plugin(options), IAuthorizationProvider { + protected AuthorizationProviderBase( + string? name = null, + string? version = null, + string? licensePublicKey = null, + string? diagnosticsName = null, + params KeyValuePair[] diagnosticsTags + ) : this(new() { + Name = name, + Version = version, + LicensePublicKey = licensePublicKey, + DiagnosticsName = diagnosticsName, + DiagnosticsTags = diagnosticsTags + }) { } + + public abstract ValueTask CheckAccessAsync(ClaimsPrincipal principal, Operation operation, CancellationToken cancellationToken); +} \ No newline at end of file diff --git a/src/EventStore.Plugins/IPlugableComponent.cs b/src/EventStore.Plugins/IPlugableComponent.cs index c27f16f..baf9347 100644 --- a/src/EventStore.Plugins/IPlugableComponent.cs +++ b/src/EventStore.Plugins/IPlugableComponent.cs @@ -33,6 +33,11 @@ public interface IPlugableComponent { /// bool Enabled { get; } + /// + /// The public key used for licensing. + /// + string? LicensePublicKey { get; } + /// /// Configures the services using the provided IServiceCollection and IConfiguration. /// diff --git a/src/EventStore.Plugins/Plugin.cs b/src/EventStore.Plugins/Plugin.cs index f3dab70..0b2aabe 100644 --- a/src/EventStore.Plugins/Plugin.cs +++ b/src/EventStore.Plugins/Plugin.cs @@ -55,7 +55,7 @@ protected Plugin(PluginOptions options) : this( options.DiagnosticsName, options.DiagnosticsTags) { } - string? LicensePublicKey { get; } + public string? LicensePublicKey { get; } DiagnosticListener DiagnosticListener { get; } @@ -78,11 +78,11 @@ protected Plugin(PluginOptions options) : this( /// public bool Enabled => IsEnabledResult.Enabled; - protected virtual void ConfigureServices(IServiceCollection services, IConfiguration configuration) { } + public virtual void ConfigureServices(IServiceCollection services, IConfiguration configuration) { } - protected virtual void ConfigureApplication(IApplicationBuilder app, IConfiguration configuration) { } + public virtual void ConfigureApplication(IApplicationBuilder app, IConfiguration configuration) { } - protected virtual (bool Enabled, string EnableInstructions) IsEnabled(IConfiguration configuration) => (true, ""); + public virtual (bool Enabled, string EnableInstructions) IsEnabled(IConfiguration configuration) => (true, ""); IServiceCollection IPlugableComponent.ConfigureServices(IServiceCollection services, IConfiguration configuration) { Configuration = configuration; @@ -140,7 +140,5 @@ protected internal void PublishDiagnosticsEvent(T pluginEvent) => DiagnosticListener.Write(typeof(T).Name, pluginEvent); /// - public void Dispose() { - DiagnosticListener.Dispose(); - } + public void Dispose() => DiagnosticListener.Dispose(); } \ No newline at end of file diff --git a/test/EventStore.Plugins.Tests/Diagnostics/PluginMetricsTests.cs b/test/EventStore.Plugins.Tests/Diagnostics/PluginMetricsTests.cs index b3c7288..0cc0ac2 100644 --- a/test/EventStore.Plugins.Tests/Diagnostics/PluginMetricsTests.cs +++ b/test/EventStore.Plugins.Tests/Diagnostics/PluginMetricsTests.cs @@ -40,7 +40,7 @@ public void can_receive_metrics_from_plugin() { class AdamSmasherPlugin(params KeyValuePair[] diagnosticsTags) : Plugin(diagnosticsTags: diagnosticsTags) { public Counter TestCounter { get; private set; } = null!; - protected override void ConfigureApplication(IApplicationBuilder app, IConfiguration configuration) { + public override void ConfigureApplication(IApplicationBuilder app, IConfiguration configuration) { var meterFactory = app.ApplicationServices.GetRequiredService(); var meter = meterFactory.Create(DiagnosticsName, Version, DiagnosticsTags);