From 1387e7e691d6b1abdfd31fec385395999bb2aed8 Mon Sep 17 00:00:00 2001 From: Egil Hansen Date: Sat, 27 Jan 2024 23:19:19 +0000 Subject: [PATCH] refactor: antifactory types internal with public extension for registration --- samples/HtmxBlazorSSR/Program.cs | 2 +- .../Antiforgery/HtmxAntiforgeryMiddleware.cs | 2 +- .../Antiforgery/HtmxAntiforgeryOptions.cs | 16 ++++++++++++-- src/Htmxor/WebApplicationBuilderExtensions.cs | 21 ++++++++++++++++--- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/samples/HtmxBlazorSSR/Program.cs b/samples/HtmxBlazorSSR/Program.cs index ea9d7b5..b096387 100644 --- a/samples/HtmxBlazorSSR/Program.cs +++ b/samples/HtmxBlazorSSR/Program.cs @@ -32,7 +32,7 @@ app.UseStaticFiles(); app.UseAntiforgery(); -app.UseMiddleware(); +app.UseHtmxorAntiforgery(); app.MapGet("/contacts/count", async (ContactsRepository repo) => { diff --git a/src/Htmxor/Antiforgery/HtmxAntiforgeryMiddleware.cs b/src/Htmxor/Antiforgery/HtmxAntiforgeryMiddleware.cs index a8e534d..a637c72 100644 --- a/src/Htmxor/Antiforgery/HtmxAntiforgeryMiddleware.cs +++ b/src/Htmxor/Antiforgery/HtmxAntiforgeryMiddleware.cs @@ -7,7 +7,7 @@ namespace Htmxor.Antiforgery; /// /// This will add a HX-XSRF-TOKEN to each response, no matter if it was initiated by HTMX or not. /// -public sealed class HtmxAntiforgeryMiddleware(IAntiforgery antiforgery, HtmxConfig htmxConfig, RequestDelegate next) +internal sealed class HtmxAntiforgeryMiddleware(IAntiforgery antiforgery, HtmxConfig htmxConfig, RequestDelegate next) { private static readonly CookieOptions cookieOptions = new CookieOptions { diff --git a/src/Htmxor/Antiforgery/HtmxAntiforgeryOptions.cs b/src/Htmxor/Antiforgery/HtmxAntiforgeryOptions.cs index e281039..9dcd7ba 100644 --- a/src/Htmxor/Antiforgery/HtmxAntiforgeryOptions.cs +++ b/src/Htmxor/Antiforgery/HtmxAntiforgeryOptions.cs @@ -3,11 +3,23 @@ namespace Htmxor.Antiforgery; -public class HtmxAntiforgeryOptions(IOptions antiforgeryOptions) +/// +/// Represents the options for Htmxor's antiforgery support. +/// +internal class HtmxAntiforgeryOptions(IOptions antiforgeryOptions) { + /// + /// Gets the name of the form field used for antiforgery token. + /// public string FormFieldName { get; } = antiforgeryOptions.Value.FormFieldName; + /// + /// Gets the name of the header used for antiforgery token. + /// public string? HeaderName { get; } = antiforgeryOptions.Value.HeaderName; + /// + /// Gets the name of the cookie used for antiforgery token. + /// public string CookieName { get; } = "HX-XSRF-TOKEN"; -} \ No newline at end of file +} diff --git a/src/Htmxor/WebApplicationBuilderExtensions.cs b/src/Htmxor/WebApplicationBuilderExtensions.cs index 39afc0d..9c73786 100644 --- a/src/Htmxor/WebApplicationBuilderExtensions.cs +++ b/src/Htmxor/WebApplicationBuilderExtensions.cs @@ -2,6 +2,7 @@ using Htmxor.Configuration; using Htmxor.Http; using Microsoft.AspNetCore.Antiforgery; +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -10,16 +11,17 @@ namespace Htmxor; /// -/// This class has extension methods for that enable configuration of Htmx in the application. +/// This class has extension methods for and +/// that enable configuration of Htmx in the application. /// -public static class WebApplicationBuilderExtensions +public static class HtmxorApplicationBuilderExtensions { /// /// Add and configure Htmx. /// /// /// - public static void AddHtmx(this IHostApplicationBuilder builder, Action? configBuilder = null) + public static IHostApplicationBuilder AddHtmx(this IHostApplicationBuilder builder, Action? configBuilder = null) { builder.Services.AddSingleton(x => { @@ -32,5 +34,18 @@ public static void AddHtmx(this IHostApplicationBuilder builder, Action srv.GetRequiredService().HttpContext!.GetHtmxContext()); + + return builder; + } + + /// + /// Enable Htmx to use antiforgery tokens to secure requests. + /// + /// + /// + public static IApplicationBuilder UseHtmxorAntiforgery(this IApplicationBuilder builder) + { + builder.UseMiddleware(); + return builder; } }