From b40d1223b99c0cca24a31c49ad178fc14456b2b6 Mon Sep 17 00:00:00 2001 From: Jan Lesage Date: Mon, 8 Jan 2024 16:23:56 +0100 Subject: [PATCH 01/11] chore: OR-2035 add package references for html sanitizer --- paket.dependencies | 3 + paket.lock | 10 +- ...eerFeitelijkeVerenigingRequestValidator.cs | 44 +++-- .../paket.references | 14 +- .../With_Html_Fields.cs | 184 ++++++++++++++++++ .../AssociationRegistry.Test/paket.references | 26 ++- 6 files changed, 240 insertions(+), 41 deletions(-) create mode 100644 test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs diff --git a/paket.dependencies b/paket.dependencies index 1ce204dd6..66d3e7548 100644 --- a/paket.dependencies +++ b/paket.dependencies @@ -54,6 +54,7 @@ nuget Be.Vlaanderen.Basisregisters.DataDog.Tracing.Sql 5.0.0 nuget Be.Vlaanderen.Basisregisters.DataDog.Tracing.SqlStreamStore 5.0.0 nuget Destructurama.JsonNet 2.0.0 +nuget HtmlSanitizer // FIX SWASHBUCKLE ASSEMBLY VERSION MISMATCH nuget Swashbuckle.AspNetCore.SwaggerGen 6.3.0 @@ -133,3 +134,5 @@ group Testing nuget Microsoft.Extensions.Configuration.Json 6.0.0 nuget Microsoft.Extensions.DependencyInjection 6.0.0 + nuget System.Collections.Immutable ~> 7.0 + diff --git a/paket.lock b/paket.lock index 9c8e67fda..0d82af3e5 100644 --- a/paket.lock +++ b/paket.lock @@ -1,6 +1,11 @@ RESTRICTION: || (== net472) (== net6.0) NUGET remote: https://api.nuget.org/v3/index.json + AngleSharp (0.16.1) + System.Buffers (>= 4.5.1) + System.Text.Encoding.CodePages (>= 5.0) + AngleSharp.Css (0.16.1) + AngleSharp (>= 0.16) AspNetCore.HealthChecks.SqlServer (6.0.2) Microsoft.Data.SqlClient (>= 3.0.1) Microsoft.Extensions.Diagnostics.HealthChecks (>= 6.0) @@ -464,6 +469,9 @@ NUGET Microsoft.Extensions.Logging.Abstractions (>= 3.0.3) Grpc.Net.Common (2.50) - restriction: || (&& (== net472) (>= netstandard2.1)) (== net6.0) Grpc.Core.Api (>= 2.50) + HtmlSanitizer (6.0.453) + AngleSharp (0.16.1) + AngleSharp.Css (0.16.1) Humanizer.Core (2.14.1) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) IdentityModel (6.0) - restriction: || (&& (== net472) (>= netcoreapp3.1)) (== net6.0) IdentityModel.AspNetCore.OAuth2Introspection (6.0) @@ -1415,7 +1423,7 @@ NUGET Microsoft.NETCore.Platforms (>= 1.1) - restriction: || (&& (== net472) (< net45)) (== net6.0) Microsoft.NETCore.Targets (>= 1.1) - restriction: || (&& (== net472) (< net45)) (== net6.0) System.Runtime (>= 4.3) - restriction: || (&& (== net472) (< net45)) (== net6.0) - System.Text.Encoding.CodePages (6.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) + System.Text.Encoding.CodePages (6.0) System.Runtime.CompilerServices.Unsafe (>= 6.0) System.Text.Encoding.Extensions (4.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Microsoft.NETCore.Platforms (>= 1.1) - restriction: || (&& (== net472) (< net45)) (== net6.0) diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RegistreerFeitelijkeVerenigingRequestValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RegistreerFeitelijkeVerenigingRequestValidator.cs index 57728c90c..8ce1c5a85 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RegistreerFeitelijkeVerenigingRequestValidator.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RegistreerFeitelijkeVerenigingRequestValidator.cs @@ -1,14 +1,14 @@ // ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract - namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer.FeitelijkeVereniging; -using System.Linq; -using Infrastructure.Validation; using Common; using FluentValidation; using Framework; +using Ganss.XSS; +using Infrastructure.Validation; using RequetsModels; using System; +using System.Linq; using Vereniging.Exceptions; public class RegistreerFeitelijkeVerenigingRequestValidator : AbstractValidator @@ -20,21 +20,25 @@ public RegistreerFeitelijkeVerenigingRequestValidator(IClock clock) _clock = clock; this.RequireNotNullOrEmpty(request => request.Naam); + RuleFor(request => request.Naam) + .Must(NotHaveHtmlMarkup) + .WithMessage("Er mogen geen HTML of JavaScript tags in de request opgenomen worden."); + RuleFor(request => request.Locaties) - .Must(ToeTeVoegenLocatieValidator.NotHaveDuplicates) - .WithMessage("Identieke locaties zijn niet toegelaten."); + .Must(ToeTeVoegenLocatieValidator.NotHaveDuplicates) + .WithMessage("Identieke locaties zijn niet toegelaten."); RuleFor(request => request.Locaties) - .Must(ToeTeVoegenLocatieValidator.NotHaveMultipleCorrespondentieLocaties) - .WithMessage("Er mag maximum één correspondentie locatie opgegeven worden."); + .Must(ToeTeVoegenLocatieValidator.NotHaveMultipleCorrespondentieLocaties) + .WithMessage("Er mag maximum één correspondentie locatie opgegeven worden."); RuleFor(request => request.Locaties) - .Must(ToeTeVoegenLocatieValidator.NotHaveMultiplePrimairelocaties) - .WithMessage("Er mag maximum één primaire locatie opgegeven worden."); + .Must(ToeTeVoegenLocatieValidator.NotHaveMultiplePrimairelocaties) + .WithMessage("Er mag maximum één primaire locatie opgegeven worden."); RuleFor(request => request.HoofdactiviteitenVerenigingsloket) - .Must(NotHaveDuplicates) - .WithMessage("Een waarde in de hoofdactiviteitenLijst mag slechts 1 maal voorkomen."); + .Must(NotHaveDuplicates) + .WithMessage("Een waarde in de hoofdactiviteitenLijst mag slechts 1 maal voorkomen."); RuleFor(request => request.Startdatum) .Must(BeTodayOrBefore) @@ -42,17 +46,25 @@ public RegistreerFeitelijkeVerenigingRequestValidator(IClock clock) .WithMessage(new StartdatumMagNietInToekomstZijn().Message); RuleFor(request => request.Doelgroep) - .SetValidator(new DoelgroepRequestValidator()!) - .When(r => r.Doelgroep is not null); + .SetValidator(new DoelgroepRequestValidator()!) + .When(r => r.Doelgroep is not null); RuleForEach(request => request.Contactgegevens) - .SetValidator(new ToeTeVoegenContactgegevenValidator()); + .SetValidator(new ToeTeVoegenContactgegevenValidator()); RuleForEach(request => request.Locaties) - .SetValidator(new ToeTeVoegenLocatieValidator()); + .SetValidator(new ToeTeVoegenLocatieValidator()); RuleForEach(request => request.Vertegenwoordigers) - .SetValidator(new ToeTeVoegenVertegenwoordigerValidator()); + .SetValidator(new ToeTeVoegenVertegenwoordigerValidator()); + } + + private bool NotHaveHtmlMarkup(string htmlCandidate) + { + var sanitizer = new HtmlSanitizer(); + var output = sanitizer.Sanitize(htmlCandidate); + + return htmlCandidate == output; } private bool BeTodayOrBefore(DateOnly? date) diff --git a/src/AssociationRegistry.Admin.Api/paket.references b/src/AssociationRegistry.Admin.Api/paket.references index d72b5981f..114262a4b 100755 --- a/src/AssociationRegistry.Admin.Api/paket.references +++ b/src/AssociationRegistry.Admin.Api/paket.references @@ -4,17 +4,13 @@ Be.Vlaanderen.Basisregisters.EventHandling.Autofac Be.Vlaanderen.Basisregisters.DataDog.Tracing.Autofac Be.Vlaanderen.Basisregisters.BlobStore +AspNetCore.HealthChecks.SqlServer +HtmlSanitizer IdentityModel.AspNetCore.OAuth2Introspection +Marten +Marten.CommandLine Microsoft.AspNetCore.Authentication.JwtBearer - -AspNetCore.HealthChecks.SqlServer - +NEST SourceLink.Embed.AllSourceFiles SourceLink.Copy.PdbFiles - -NEST - - -Marten -Marten.CommandLine WolverineFx diff --git a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs new file mode 100644 index 000000000..27c6e1828 --- /dev/null +++ b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs @@ -0,0 +1,184 @@ +namespace AssociationRegistry.Test.Admin.Api.FeitelijkeVereniging.When_RegistreerFeitelijkeVereniging; + +using AssociationRegistry.Admin.Api.Constants; +using AssociationRegistry.Admin.Api.Verenigingen.Common; +using AssociationRegistry.Admin.Api.Verenigingen.Registreer.FeitelijkeVereniging.RequetsModels; +using AutoFixture; +using Fixtures; +using FluentAssertions; +using Framework; +using Newtonsoft.Json; +using System.Net; +using Vereniging; +using Xunit; +using Xunit.Categories; +using Adres = AssociationRegistry.Admin.Api.Verenigingen.Common.Adres; +using AdresId = AssociationRegistry.Admin.Api.Verenigingen.Common.AdresId; + +public sealed class When_RegistreerFeitelijkeVereniging_WithHtmlFields +{ + private static When_RegistreerFeitelijkeVereniging_WithHtmlFields? called; + public readonly RegistreerFeitelijkeVerenigingRequest Request; + public readonly HttpResponseMessage Response; + + private When_RegistreerFeitelijkeVereniging_WithHtmlFields(AdminApiFixture fixture) + { + var autoFixture = new Fixture().CustomizeAdminApi(); + + Request = new RegistreerFeitelijkeVerenigingRequest + { + Naam = $"

{autoFixture.Create()}

", + KorteNaam = autoFixture.Create(), + KorteBeschrijving = autoFixture.Create(), + Startdatum = DateOnly.FromDateTime(DateTime.Today), + IsUitgeschrevenUitPubliekeDatastroom = true, + Doelgroep = new DoelgroepRequest + { + Minimumleeftijd = 1, + Maximumleeftijd = 149, + }, + Contactgegevens = new ToeTeVoegenContactgegeven[] + { + new() + { + Contactgegeventype = Contactgegeventype.Email, + Waarde = "random@example.org", + Beschrijving = "Algemeen", + IsPrimair = false, + }, + }, + Locaties = new[] + { + new ToeTeVoegenLocatie + { + Naam = "Kantoor", + Adres = new Adres + { + Straatnaam = "dorpstraat", + Huisnummer = "69", + Busnummer = "42", + Postcode = "0123", + Gemeente = "Nothingham", + Land = "Belgie", + }, + IsPrimair = true, + Locatietype = Locatietype.Correspondentie, + }, + new ToeTeVoegenLocatie + { + Naam = "Speeltuin", + AdresId = new AdresId + { + Broncode = "AR", + Bronwaarde = AssociationRegistry.Vereniging.AdresId.DataVlaanderenAdresPrefix + "1", + }, + Adres = new Adres + { + Straatnaam = "dorpelstraat", + Huisnummer = "169", + Busnummer = "2", + Postcode = "4567", + Gemeente = "Nothingham", + Land = "Belgie", + }, + IsPrimair = false, + Locatietype = Locatietype.Activiteiten, + }, + new ToeTeVoegenLocatie + { + Naam = "Zwembad", + AdresId = new AdresId + { + Broncode = "AR", + Bronwaarde = AssociationRegistry.Vereniging.AdresId.DataVlaanderenAdresPrefix + "5", + }, + IsPrimair = false, + Locatietype = Locatietype.Activiteiten, + }, + }, + Vertegenwoordigers = new[] + { + new ToeTeVoegenVertegenwoordiger + { + Insz = autoFixture.Create(), + Voornaam = "Jane", + Achternaam = "Doe", + Rol = "Voorzitter, Hoofdcoach", + Roepnaam = "QTPY", + IsPrimair = true, + Email = "qtpy@example.org", + Telefoon = "0123456789", + Mobiel = "987654321", + SocialMedia = "http://example.com", + }, + new ToeTeVoegenVertegenwoordiger + { + Insz = autoFixture.Create(), + Voornaam = "Kim", + Achternaam = "Possible", + Rol = "Master", + Roepnaam = "Lara", + IsPrimair = false, + Email = "master@example.org", + Telefoon = "0000000000", + Mobiel = "6666666666", + SocialMedia = "http://example.com/scrum", + }, + }, + HoofdactiviteitenVerenigingsloket = new[] { "BIAG", "BWWC" }, + }; + + Response ??= fixture.DefaultClient.RegistreerFeitelijkeVereniging(GetJsonBody(Request)).GetAwaiter().GetResult(); + } + + public static When_RegistreerFeitelijkeVereniging_WithHtmlFields Called(AdminApiFixture fixture) + => called ??= new When_RegistreerFeitelijkeVereniging_WithHtmlFields(fixture); + + private string GetJsonBody(RegistreerFeitelijkeVerenigingRequest request) + => GetType() + .GetAssociatedResourceJson("files.request.with_all_fields") + .Replace(oldValue: "{{vereniging.naam}}", request.Naam) + .Replace(oldValue: "{{vereniging.korteNaam}}", request.KorteNaam) + .Replace(oldValue: "{{vereniging.korteBeschrijving}}", request.KorteBeschrijving) + .Replace(oldValue: "{{vereniging.isUitgeschrevenUitPubliekeDatastroom}}", + request.IsUitgeschrevenUitPubliekeDatastroom.ToString().ToLower()) + .Replace(oldValue: "{{vereniging.startdatum}}", request.Startdatum!.Value.ToString(WellknownFormats.DateOnly)) + .Replace(oldValue: "{{vereniging.doelgroep.minimumleeftijd}}", request.Doelgroep!.Minimumleeftijd.ToString()) + .Replace(oldValue: "{{vereniging.doelgroep.maximumleeftijd}}", request.Doelgroep!.Maximumleeftijd.ToString()) + .Replace(oldValue: "{{vereniging.contactgegevens}}", JsonConvert.SerializeObject(request.Contactgegevens)) + .Replace(oldValue: "{{vereniging.locaties}}", JsonConvert.SerializeObject(request.Locaties)) + .Replace(oldValue: "{{vereniging.vertegenwoordigers}}", JsonConvert.SerializeObject(request.Vertegenwoordigers)) + .Replace(oldValue: "{{vereniging.hoofdactiviteitenLijst}}", + JsonConvert.SerializeObject(request.HoofdactiviteitenVerenigingsloket)); +} + +[Collection(nameof(AdminApiCollection))] +[Category("AdminApi")] +[IntegrationTest] +public class With_Html_Fields +{ + private readonly EventsInDbScenariosFixture _fixture; + + public With_Html_Fields(EventsInDbScenariosFixture fixture) + { + _fixture = fixture; + } + + private RegistreerFeitelijkeVerenigingRequest Request + => When_RegistreerFeitelijkeVereniging_WithHtmlFields.Called(_fixture).Request; + + private HttpResponseMessage Response + => When_RegistreerFeitelijkeVereniging_WithHtmlFields.Called(_fixture).Response; + + [Fact] + public void Then_it_returns_a_bad_request_response() + { + Response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + } +} + +internal static class HtmlExtensions +{ + public static string HtmlEncapsulate(this string input) + => "

" + input + "

"; +} diff --git a/test/AssociationRegistry.Test/paket.references b/test/AssociationRegistry.Test/paket.references index 7f9bde721..3865410b4 100644 --- a/test/AssociationRegistry.Test/paket.references +++ b/test/AssociationRegistry.Test/paket.references @@ -1,24 +1,20 @@ -Microsoft.NET.Test.Sdk -xunit -xunit.runner.visualstudio -xunit.categories -AutoFixture -FluentAssertions -FluentAssertions.Json -Moq - -NEST -Microsoft.AspNetCore.Mvc.Testing Be.Vlaanderen.Basisregisters.AggregateSource.Testing Be.Vlaanderen.Basisregisters.AggregateSource.Testing.SqlStreamStore.Autofac Be.Vlaanderen.Basisregisters.AggregateSource.Testing.Xunit - Be.Vlaanderen.Basisregisters.EventHandling.Autofac - - - +AutoFixture +FluentAssertions +FluentAssertions.Json +HtmlSanitizer Marten +Moq +Microsoft.AspNetCore.Mvc.Testing +Microsoft.NET.Test.Sdk +NEST +xunit +xunit.runner.visualstudio +xunit.categories group Testing Microsoft.AspNetCore.Hosting From 86be725c8e58f78828f2c401bad6b434260c6429 Mon Sep 17 00:00:00 2001 From: Koen Metsu Date: Mon, 8 Jan 2024 16:55:00 +0100 Subject: [PATCH 02/11] feat: or-2035 wip: block html --- .../Middleware/NoHtmlMiddleware.cs | 39 +++++++++++++++++++ src/AssociationRegistry.Admin.Api/Program.cs | 1 + 2 files changed, 40 insertions(+) create mode 100644 src/AssociationRegistry.Admin.Api/Infrastructure/Middleware/NoHtmlMiddleware.cs diff --git a/src/AssociationRegistry.Admin.Api/Infrastructure/Middleware/NoHtmlMiddleware.cs b/src/AssociationRegistry.Admin.Api/Infrastructure/Middleware/NoHtmlMiddleware.cs new file mode 100644 index 000000000..b4b7d1052 --- /dev/null +++ b/src/AssociationRegistry.Admin.Api/Infrastructure/Middleware/NoHtmlMiddleware.cs @@ -0,0 +1,39 @@ +namespace AssociationRegistry.Admin.Api.Infrastructure.Middleware; + +using Microsoft.AspNetCore.Http; +using System.IO; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +public class NoHtmlMiddleware +{ + private readonly RequestDelegate _next; + + public NoHtmlMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task InvokeAsync(HttpContext context) + { + context.Request.EnableBuffering(); + + var requestContent = await new StreamReader(context.Request.Body).ReadToEndAsync(); + context.Request.Body.Position = 0; // Reset the stream position for further processing + + if (ContainsHtml(requestContent)) + { + context.Response.StatusCode = 400; + await context.Response.WriteAsync("HTML content is not allowed."); + return; + } + + await _next(context); + } + + private bool ContainsHtml(string content) + { + // Simple HTML detection logic (can be improved or made more complex as needed) + return Regex.IsMatch(content, "<.*?>"); + } +} \ No newline at end of file diff --git a/src/AssociationRegistry.Admin.Api/Program.cs b/src/AssociationRegistry.Admin.Api/Program.cs index 3ab761836..d1ff61236 100755 --- a/src/AssociationRegistry.Admin.Api/Program.cs +++ b/src/AssociationRegistry.Admin.Api/Program.cs @@ -263,6 +263,7 @@ private static void LoadConfiguration(WebApplicationBuilder builder, params stri private static void ConfigureMiddleware(IApplicationBuilder app) { app + .UseMiddleware() .UseMiddleware() .UseMiddleware() .UseMiddleware() From 65e4cd34830c09f78a3cf2d92d0572127dd5e79a Mon Sep 17 00:00:00 2001 From: Koen Metsu Date: Tue, 9 Jan 2024 10:22:57 +0100 Subject: [PATCH 03/11] feat: or-2035 wip: block html through attributes --- .../Extensions/FluentValidatorExtensions.cs | 31 ++ .../HtmlValidation/NoHtmlAttribute.cs | 12 + src/AssociationRegistry.Admin.Api/Program.cs | 1 - .../RegistreerFeitelijkeVerenigingRequest.cs | 2 + .../Resources/ExceptionMessages.Designer.cs | 441 ++++++------------ .../Resources/ExceptionMessages.resx | 3 + 6 files changed, 178 insertions(+), 312 deletions(-) create mode 100644 src/AssociationRegistry.Admin.Api/Infrastructure/HtmlValidation/NoHtmlAttribute.cs diff --git a/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs b/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs index 63afbbba1..9db90e334 100644 --- a/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs +++ b/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs @@ -5,12 +5,43 @@ namespace AssociationRegistry.Admin.Api.Infrastructure.Extensions; using System.Threading; using System.Threading.Tasks; using FluentValidation; +using HtmlValidation; +using System.Linq; +using System.Text.RegularExpressions; public static class FluentValidatorExtensions { public static async Task NullValidateAndThrowAsync(this IValidator validator, [NotNull] T? instance, CancellationToken cancellationToken = default) { if (instance is null) throw new CouldNotParseRequestException(); + + await new NoHtmlValidator().ValidateAndThrowAsync(instance, cancellationToken: cancellationToken); await validator.ValidateAndThrowAsync(instance, cancellationToken); } } +public class NoHtmlValidator : AbstractValidator +{ + public NoHtmlValidator() + { + var propertiesWithNoHtml = typeof(T).GetProperties() + .Where(p => p.GetCustomAttributes(typeof(NoHtmlAttribute), false).Any()); + + foreach (var property in propertiesWithNoHtml) + { + RuleFor(model => GetPropertyValue(model, property.Name)) + .Must(BeNoHtml) + .WithMessage(ExceptionMessages.UnsupportedContent) + .When(model => property.GetValue(model) != null); + } + } + + private static string GetPropertyValue(T model, string propertyName) + { + var property = typeof(T).GetProperty(propertyName); + return property?.GetValue(model) as string; + } + + private static bool BeNoHtml(string propertyValue) + => Regex.IsMatch(propertyValue, "<.*?>"); +} + diff --git a/src/AssociationRegistry.Admin.Api/Infrastructure/HtmlValidation/NoHtmlAttribute.cs b/src/AssociationRegistry.Admin.Api/Infrastructure/HtmlValidation/NoHtmlAttribute.cs new file mode 100644 index 000000000..eef1e1031 --- /dev/null +++ b/src/AssociationRegistry.Admin.Api/Infrastructure/HtmlValidation/NoHtmlAttribute.cs @@ -0,0 +1,12 @@ + + +namespace AssociationRegistry.Admin.Api.Infrastructure.HtmlValidation +{ + using System; + using System.ComponentModel.DataAnnotations; + using System.Text.RegularExpressions; + + public class NoHtmlAttribute : Attribute + { + } +} diff --git a/src/AssociationRegistry.Admin.Api/Program.cs b/src/AssociationRegistry.Admin.Api/Program.cs index d1ff61236..3ab761836 100755 --- a/src/AssociationRegistry.Admin.Api/Program.cs +++ b/src/AssociationRegistry.Admin.Api/Program.cs @@ -263,7 +263,6 @@ private static void LoadConfiguration(WebApplicationBuilder builder, params stri private static void ConfigureMiddleware(IApplicationBuilder app) { app - .UseMiddleware() .UseMiddleware() .UseMiddleware() .UseMiddleware() diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RequetsModels/RegistreerFeitelijkeVerenigingRequest.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RequetsModels/RegistreerFeitelijkeVerenigingRequest.cs index 8d65272c4..c276b8022 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RequetsModels/RegistreerFeitelijkeVerenigingRequest.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RequetsModels/RegistreerFeitelijkeVerenigingRequest.cs @@ -2,6 +2,7 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer.FeitelijkeVereni using Acties.RegistreerFeitelijkeVereniging; using Common; +using Infrastructure.HtmlValidation; using System; using System.ComponentModel.DataAnnotations; using System.Linq; @@ -14,6 +15,7 @@ public class RegistreerFeitelijkeVerenigingRequest /// Naam van de vereniging [DataMember] [Required] + [NoHtml] public string Naam { get; set; } = null!; /// Korte naam van de vereniging diff --git a/src/AssociationRegistry/Resources/ExceptionMessages.Designer.cs b/src/AssociationRegistry/Resources/ExceptionMessages.Designer.cs index 7706bc441..c8393678e 100644 --- a/src/AssociationRegistry/Resources/ExceptionMessages.Designer.cs +++ b/src/AssociationRegistry/Resources/ExceptionMessages.Designer.cs @@ -11,46 +11,32 @@ namespace AssociationRegistry { using System; - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class ExceptionMessages { - private static global::System.Resources.ResourceManager resourceMan; + private static System.Resources.ResourceManager resourceMan; - private static global::System.Globalization.CultureInfo resourceCulture; + private static System.Globalization.CultureInfo resourceCulture; - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal ExceptionMessages() { } - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Resources.ResourceManager ResourceManager { + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager { get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AssociationRegistry.Resources.ExceptionMessages", typeof(ExceptionMessages).Assembly); + if (object.Equals(null, resourceMan)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("AssociationRegistry.Resources.ExceptionMessages", typeof(ExceptionMessages).Assembly); resourceMan = temp; } return resourceMan; } } - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Globalization.CultureInfo Culture { + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Globalization.CultureInfo Culture { get { return resourceCulture; } @@ -59,518 +45,351 @@ internal ExceptionMessages() { } } - /// - /// Looks up a localized string similar to Achternaam mag geen nummers bevatten.. - /// - public static string AchternaamBevatNummers { + public static string WebsiteMissingPeriod { get { - return ResourceManager.GetString("AchternaamBevatNummers", resourceCulture); + return ResourceManager.GetString("WebsiteMissingPeriod", resourceCulture); } } - /// - /// Looks up a localized string similar to Achternaam moet een letter bevatten.. - /// - public static string AchternaamZonderLetters { + public static string InvalidWebsiteStart { get { - return ResourceManager.GetString("AchternaamZonderLetters", resourceCulture); + return ResourceManager.GetString("InvalidWebsiteStart", resourceCulture); } } - /// - /// Looks up a localized string similar to Contactgegevens die uit KBO werden overgenomen, kunnen niet verwijderd worden.. - /// - public static string ContactgegevenFromKboCannotBeRemoved { + public static string InvalidTelefoonNummerCharacter { get { - return ResourceManager.GetString("ContactgegevenFromKboCannotBeRemoved", resourceCulture); + return ResourceManager.GetString("InvalidTelefoonNummerCharacter", resourceCulture); } } - /// - /// Looks up a localized string similar to Contactgegevens die uit KBO werden overgenomen, kunnen niet aangepast worden.. - /// - public static string ContactgegevenFromKboCannotBeUpdated { + public static string NoNumbersInTelefoonNummer { get { - return ResourceManager.GetString("ContactgegevenFromKboCannotBeUpdated", resourceCulture); + return ResourceManager.GetString("NoNumbersInTelefoonNummer", resourceCulture); } } - /// - /// Looks up a localized string similar to Request kon niet correct behandeld worden. Controleer het formaat en probeer het opnieuw.. - /// - public static string CouldNotParseRequestException { + public static string InvalidSocialMediaStart { get { - return ResourceManager.GetString("CouldNotParseRequestException", resourceCulture); + return ResourceManager.GetString("InvalidSocialMediaStart", resourceCulture); } } - /// - /// Looks up a localized string similar to Minimum en maximum leeftijd moeten tussen 0 en 150 inclusief liggen.. - /// - public static string DoelgroepOutOfRange { + public static string SocialMediaMissingPeriod { get { - return ResourceManager.GetString("DoelgroepOutOfRange", resourceCulture); + return ResourceManager.GetString("SocialMediaMissingPeriod", resourceCulture); } } - /// - /// Looks up a localized string similar to Een waarde in de hoofdactiviteitenLijst mag slechts 1 maal voorkomen.. - /// - public static string DuplicateHoofdactiviteit { + public static string InvalidContactType { get { - return ResourceManager.GetString("DuplicateHoofdactiviteit", resourceCulture); + return ResourceManager.GetString("InvalidContactType", resourceCulture); } } - /// - /// Looks up a localized string similar to INSZ moet uniek zijn binnen de vereniging.. - /// - public static string DuplicateInszProvided { + public static string DoelgroepOutOfRange { get { - return ResourceManager.GetString("DuplicateInszProvided", resourceCulture); + return ResourceManager.GetString("DoelgroepOutOfRange", resourceCulture); } } - /// - /// Looks up a localized string similar to Locaties moeten uniek zijn binnen de vereniging.. - /// - public static string DuplicateLocatie { + public static string InvalidDoelgroepRange { get { - return ResourceManager.GetString("DuplicateLocatie", resourceCulture); + return ResourceManager.GetString("InvalidDoelgroepRange", resourceCulture); } } - /// - /// Looks up a localized string similar to Einddatum moet na startdatum liggen.. - /// - public static string EinddatumIsBeforeStartdatum { + public static string GeenGeldigeVerenigingInKbo { get { - return ResourceManager.GetString("EinddatumIsBeforeStartdatum", resourceCulture); + return ResourceManager.GetString("GeenGeldigeVerenigingInKbo", resourceCulture); } } - /// - /// Looks up a localized string similar to Einddatum mag niet in de toekomst liggen.. - /// - public static string EinddatumIsInFuture { + public static string UnsupportedOperationForVerenigingstype { get { - return ResourceManager.GetString("EinddatumIsInFuture", resourceCulture); + return ResourceManager.GetString("UnsupportedOperationForVerenigingstype", resourceCulture); } } - /// - /// Looks up a localized string similar to De naam van de vereniging is verplicht.. - /// - public static string EmptyVerenigingsNaam { + public static string DuplicateHoofdactiviteit { get { - return ResourceManager.GetString("EmptyVerenigingsNaam", resourceCulture); + return ResourceManager.GetString("DuplicateHoofdactiviteit", resourceCulture); } } - /// - /// Looks up a localized string similar to Er werd voor dit KBO-nummer geen geldige vereniging gevonden.. - /// - public static string GeenGeldigeVerenigingInKbo { + public static string InvalidInszChars { get { - return ResourceManager.GetString("GeenGeldigeVerenigingInKbo", resourceCulture); + return ResourceManager.GetString("InvalidInszChars", resourceCulture); } } - /// - /// Looks up a localized string similar to Een adres moet bestaan uit straatnaam, huisnummer, postcode, gemeente en land.. - /// - public static string IncompleteAdres { + public static string InvalidInszLength { get { - return ResourceManager.GetString("IncompleteAdres", resourceCulture); + return ResourceManager.GetString("InvalidInszLength", resourceCulture); } } - /// - /// Looks up a localized string similar to Een adresId moet een adresbron en waarde bevatten.. - /// - public static string IncompleteAdresId { + public static string InvalidInszMod97 { get { - return ResourceManager.GetString("IncompleteAdresId", resourceCulture); + return ResourceManager.GetString("InvalidInszMod97", resourceCulture); } } - /// - /// Looks up a localized string similar to Het bevestigingstoken is niet geldig voor deze request.. - /// - public static string InvalidBevestigingstokenProvided { + public static string InvalidKboNummerChars { get { - return ResourceManager.GetString("InvalidBevestigingstokenProvided", resourceCulture); + return ResourceManager.GetString("InvalidKboNummerChars", resourceCulture); } } - /// - /// Looks up a localized string similar to De broncode voor dit adres is niet gekend.. - /// - public static string InvalidBroncode { + public static string InvalidKboNummerLength { get { - return ResourceManager.GetString("InvalidBroncode", resourceCulture); + return ResourceManager.GetString("InvalidKboNummerLength", resourceCulture); } } - /// - /// Looks up a localized string similar to De bronwaarde voor een adres uit het addressenregister moet een Data Vlaanderen PURI zijn.. - /// - public static string InvalidBronwaardeForAR { + public static string InvalidKboNummerMod97 { get { - return ResourceManager.GetString("InvalidBronwaardeForAR", resourceCulture); + return ResourceManager.GetString("InvalidKboNummerMod97", resourceCulture); } } - /// - /// Looks up a localized string similar to Het opgegeven contacttype werd niet herkend. ('email', 'website', 'socialmedia', 'telefoon'). - /// - public static string InvalidContactType { + public static string DuplicateLocatie { get { - return ResourceManager.GetString("InvalidContactType", resourceCulture); + return ResourceManager.GetString("DuplicateLocatie", resourceCulture); } } - /// - /// Looks up a localized string similar to Datum moet van het formaat 'yyyy-MM-dd' zijn.. - /// - public static string InvalidDateFormat { + public static string IncompleteAdres { get { - return ResourceManager.GetString("InvalidDateFormat", resourceCulture); + return ResourceManager.GetString("IncompleteAdres", resourceCulture); } } - /// - /// Looks up a localized string similar to Minimum leeftijd moet kleiner of gelijk zijn aan maximum leeftijd.. - /// - public static string InvalidDoelgroepRange { + public static string IncompleteAdresId { get { - return ResourceManager.GetString("InvalidDoelgroepRange", resourceCulture); + return ResourceManager.GetString("IncompleteAdresId", resourceCulture); } } - /// - /// Looks up a localized string similar to E-mail voldoet niet aan het verwachte formaat (naam@domein.vlaanderen). In naam worden de volgende tekens - /// toegestaan '!#$%&'*+/=?^_`{|}~-', in domein enkel '.' en '-'. - /// . - /// - public static string InvalidEmailFormat { + public static string InvalidBroncode { get { - return ResourceManager.GetString("InvalidEmailFormat", resourceCulture); + return ResourceManager.GetString("InvalidBroncode", resourceCulture); } } - /// - /// Looks up a localized string similar to Foutieve tekens in INSZ.. - /// - public static string InvalidInszChars { + public static string InvalidBronwaardeForAR { get { - return ResourceManager.GetString("InvalidInszChars", resourceCulture); + return ResourceManager.GetString("InvalidBronwaardeForAR", resourceCulture); } } - /// - /// Looks up a localized string similar to INSZ moet 11 cijfers bevatten.. - /// - public static string InvalidInszLength { + public static string MissingAdres { get { - return ResourceManager.GetString("InvalidInszLength", resourceCulture); + return ResourceManager.GetString("MissingAdres", resourceCulture); } } - /// - /// Looks up a localized string similar to Incorrect INSZ: foutieve checksum.. - /// - public static string InvalidInszMod97 { + public static string MultipleCorrespondentieLocaties { get { - return ResourceManager.GetString("InvalidInszMod97", resourceCulture); + return ResourceManager.GetString("MultipleCorrespondentieLocaties", resourceCulture); } } - /// - /// Looks up a localized string similar to Foutieve tekens in Kbo nummer.. - /// - public static string InvalidKboNummerChars { + public static string MultiplePrimaireLocaties { get { - return ResourceManager.GetString("InvalidKboNummerChars", resourceCulture); + return ResourceManager.GetString("MultiplePrimaireLocaties", resourceCulture); } } - /// - /// Looks up a localized string similar to Kbo nummer moet 10 cijfers bevatten.. - /// - public static string InvalidKboNummerLength { + public static string StartdatumIsInFuture { get { - return ResourceManager.GetString("InvalidKboNummerLength", resourceCulture); + return ResourceManager.GetString("StartdatumIsInFuture", resourceCulture); } } - /// - /// Looks up a localized string similar to Incorrect Kbo nummer: foutieve checksum.. - /// - public static string InvalidKboNummerMod97 { + public static string InvalidVCodeFormat { get { - return ResourceManager.GetString("InvalidKboNummerMod97", resourceCulture); + return ResourceManager.GetString("InvalidVCodeFormat", resourceCulture); } } - /// - /// Looks up a localized string similar to Social media url moet beginnen met 'http://' of 'https://'. - /// - public static string InvalidSocialMediaStart { + public static string OutOfRangeVCode { get { - return ResourceManager.GetString("InvalidSocialMediaStart", resourceCulture); + return ResourceManager.GetString("OutOfRangeVCode", resourceCulture); } } - /// - /// Looks up a localized string similar to TelefoonNummer moet bestaan uit cijfers, whitespace en ". / ( ) - + ". - /// - public static string InvalidTelefoonNummerCharacter { + public static string EmptyVerenigingsNaam { get { - return ResourceManager.GetString("InvalidTelefoonNummerCharacter", resourceCulture); + return ResourceManager.GetString("EmptyVerenigingsNaam", resourceCulture); } } - /// - /// Looks up a localized string similar to Formaat van de VCode moet 'V0000000' zijn. - /// - public static string InvalidVCodeFormat { + public static string AchternaamBevatNummers { get { - return ResourceManager.GetString("InvalidVCodeFormat", resourceCulture); + return ResourceManager.GetString("AchternaamBevatNummers", resourceCulture); } } - /// - /// Looks up a localized string similar to Website url moet beginnen met 'http://' of 'https://'. - /// - public static string InvalidWebsiteStart { + public static string AchternaamZonderLetters { get { - return ResourceManager.GetString("InvalidWebsiteStart", resourceCulture); + return ResourceManager.GetString("AchternaamZonderLetters", resourceCulture); } } - /// - /// Looks up a localized string similar to De maatschappelijke zetel volgens KBO kan niet verwijderd worden.. - /// - public static string MaatschappelijkeZetelCanNotBeRemoved { + public static string DuplicateInszProvided { get { - return ResourceManager.GetString("MaatschappelijkeZetelCanNotBeRemoved", resourceCulture); + return ResourceManager.GetString("DuplicateInszProvided", resourceCulture); } } - /// - /// Looks up a localized string similar to De maatschappelijke zetel volgens KBO kan niet gewijzigd worden.. - /// - public static string MaatschappelijkeZetelCanNotBeUpdated { + public static string MultiplePrimaireVertegenwoordigers { get { - return ResourceManager.GetString("MaatschappelijkeZetelCanNotBeUpdated", resourceCulture); + return ResourceManager.GetString("MultiplePrimaireVertegenwoordigers", resourceCulture); } } - /// - /// Looks up a localized string similar to Het locatietype 'Maatschappelijke zetel volgens KBO' kan niet toegekend worden.. - /// - public static string MaatschappelijkeZetelIsNotAllowed { + public static string UnknownInsz { get { - return ResourceManager.GetString("MaatschappelijkeZetelIsNotAllowed", resourceCulture); + return ResourceManager.GetString("UnknownInsz", resourceCulture); } } - /// - /// Looks up a localized string similar to Een locatie moet minstens een adresId of een adres bevatten.. - /// - public static string MissingAdres { + public static string VoornaamBevatNummers { get { - return ResourceManager.GetString("MissingAdres", resourceCulture); + return ResourceManager.GetString("VoornaamBevatNummers", resourceCulture); } } - /// - /// Looks up a localized string similar to Er kan maar één correspondentie locatie zijn binnen de vereniging.. - /// - public static string MultipleCorrespondentieLocaties { + public static string VoornaamZonderLetters { get { - return ResourceManager.GetString("MultipleCorrespondentieLocaties", resourceCulture); + return ResourceManager.GetString("VoornaamZonderLetters", resourceCulture); } } - /// - /// Looks up a localized string similar to Er kan maar één primaire locatie zijn binnen de vereniging.. - /// - public static string MultiplePrimaireLocaties { + public static string InvalidEmailFormat { get { - return ResourceManager.GetString("MultiplePrimaireLocaties", resourceCulture); + return ResourceManager.GetString("InvalidEmailFormat", resourceCulture); } } - /// - /// Looks up a localized string similar to Er mag maar één vertegenwoordiger aangeduid zijn als primair contactpersoon.. - /// - public static string MultiplePrimaireVertegenwoordigers { + public static string InvalidDateFormat { get { - return ResourceManager.GetString("MultiplePrimaireVertegenwoordigers", resourceCulture); + return ResourceManager.GetString("InvalidDateFormat", resourceCulture); } } - /// - /// Looks up a localized string similar to TelefoonNummer moet minstens één cijfer bevatten. - /// - public static string NoNumbersInTelefoonNummer { + public static string CouldNotParseRequestException { get { - return ResourceManager.GetString("NoNumbersInTelefoonNummer", resourceCulture); + return ResourceManager.GetString("CouldNotParseRequestException", resourceCulture); } } - /// - /// Looks up a localized string similar to VCode moet groter zijn dan 1000. - /// - public static string OutOfRangeVCode { + public static string InvalidBevestigingstokenProvided { get { - return ResourceManager.GetString("OutOfRangeVCode", resourceCulture); + return ResourceManager.GetString("InvalidBevestigingstokenProvided", resourceCulture); } } - /// - /// Looks up a localized string similar to Social media url moet minsens één punt bevatten. - /// - public static string SocialMediaMissingPeriod { + public static string MaatschappelijkeZetelIsNotAllowed { get { - return ResourceManager.GetString("SocialMediaMissingPeriod", resourceCulture); + return ResourceManager.GetString("MaatschappelijkeZetelIsNotAllowed", resourceCulture); } } - /// - /// Looks up a localized string similar to Startdatum moet voor einddatum liggen.. - /// - public static string StartdatumIsAfterEinddatum { + public static string MaatschappelijkeZetelCanNotBeUpdated { get { - return ResourceManager.GetString("StartdatumIsAfterEinddatum", resourceCulture); + return ResourceManager.GetString("MaatschappelijkeZetelCanNotBeUpdated", resourceCulture); } } - /// - /// Looks up a localized string similar to Startdatum mag niet in de toekomst liggen.. - /// - public static string StartdatumIsInFuture { + public static string MaatschappelijkeZetelCanNotBeRemoved { get { - return ResourceManager.GetString("StartdatumIsInFuture", resourceCulture); + return ResourceManager.GetString("MaatschappelijkeZetelCanNotBeRemoved", resourceCulture); } } - /// - /// Looks up a localized string similar to De gevraagde vereniging heeft niet de verwachte sequentiewaarde.. - /// - public static string UnexpectedAggregateVersion { + public static string ContactgegevenFromKboCannotBeUpdated { get { - return ResourceManager.GetString("UnexpectedAggregateVersion", resourceCulture); + return ResourceManager.GetString("ContactgegevenFromKboCannotBeUpdated", resourceCulture); } } - /// - /// Looks up a localized string similar to INSZ is niet gekend. - /// - public static string UnknownInsz { + public static string ContactgegevenFromKboCannotBeRemoved { get { - return ResourceManager.GetString("UnknownInsz", resourceCulture); + return ResourceManager.GetString("ContactgegevenFromKboCannotBeRemoved", resourceCulture); } } - /// - /// Looks up a localized string similar to Deze actie kan niet uitgevoerd worden op dit contactgegeven.. - /// - public static string UnsupportedOperationForContactgegevenBron { + public static string EinddatumIsInFuture { get { - return ResourceManager.GetString("UnsupportedOperationForContactgegevenBron", resourceCulture); + return ResourceManager.GetString("EinddatumIsInFuture", resourceCulture); } } - /// - /// Looks up a localized string similar to Deze actie kan niet uitgevoerd worden op deze locatie.. - /// - public static string UnsupportedOperationForLocatietype { + public static string EinddatumIsBeforeStartdatum { get { - return ResourceManager.GetString("UnsupportedOperationForLocatietype", resourceCulture); + return ResourceManager.GetString("EinddatumIsBeforeStartdatum", resourceCulture); } } - /// - /// Looks up a localized string similar to Deze actie kan niet uitgevoerd worden op dit type vereniging.. - /// - public static string UnsupportedOperationForVerenigingstype { + public static string StartdatumIsAfterEinddatum { get { - return ResourceManager.GetString("UnsupportedOperationForVerenigingstype", resourceCulture); + return ResourceManager.GetString("StartdatumIsAfterEinddatum", resourceCulture); } } - /// - /// Looks up a localized string similar to Aan een KBO vereniging kunnen geen vertegenwoordigers toegevoegd worden.. - /// - public static string VerenigingMetRechtspersoonlijkheidCannotAddVertegenwoordigers { + public static string VerenigingMetRechtspersoonlijkheidKanNietGestoptWorden { get { - return ResourceManager.GetString("VerenigingMetRechtspersoonlijkheidCannotAddVertegenwoordigers", resourceCulture); + return ResourceManager.GetString("VerenigingMetRechtspersoonlijkheidKanNietGestoptWorden", resourceCulture); } } - /// - /// Looks up a localized string similar to Een vertegenwoordiger van een KBO vereniging kan niet verwijderd worden.. - /// - public static string VerenigingMetRechtspersoonlijkheidCannotRemoveVertegenwoordigers { + public static string UnsupportedOperationForLocatietype { get { - return ResourceManager.GetString("VerenigingMetRechtspersoonlijkheidCannotRemoveVertegenwoordigers", resourceCulture); + return ResourceManager.GetString("UnsupportedOperationForLocatietype", resourceCulture); } } - /// - /// Looks up a localized string similar to Een KBO-vereniging kan niet gestopt worden.. - /// - public static string VerenigingMetRechtspersoonlijkheidKanNietGestoptWorden { + public static string UnsupportedOperationForContactgegevenBron { get { - return ResourceManager.GetString("VerenigingMetRechtspersoonlijkheidKanNietGestoptWorden", resourceCulture); + return ResourceManager.GetString("UnsupportedOperationForContactgegevenBron", resourceCulture); } } - /// - /// Looks up a localized string similar to Voornaam mag geen nummers bevatten.. - /// - public static string VoornaamBevatNummers { + public static string VerenigingMetRechtspersoonlijkheidCannotAddVertegenwoordigers { get { - return ResourceManager.GetString("VoornaamBevatNummers", resourceCulture); + return ResourceManager.GetString("VerenigingMetRechtspersoonlijkheidCannotAddVertegenwoordigers", resourceCulture); } } - /// - /// Looks up a localized string similar to Voornaam moet een letter bevatten.. - /// - public static string VoornaamZonderLetters { + public static string VerenigingMetRechtspersoonlijkheidCannotRemoveVertegenwoordigers { get { - return ResourceManager.GetString("VoornaamZonderLetters", resourceCulture); + return ResourceManager.GetString("VerenigingMetRechtspersoonlijkheidCannotRemoveVertegenwoordigers", resourceCulture); } } - /// - /// Looks up a localized string similar to Website url moet minsens één punt bevatten. - /// - public static string WebsiteMissingPeriod { + public static string ZoekOpdrachtWasIncorrect { get { - return ResourceManager.GetString("WebsiteMissingPeriod", resourceCulture); + return ResourceManager.GetString("ZoekOpdrachtWasIncorrect", resourceCulture); } } - /// - /// Looks up a localized string similar to Deze zoekopdracht bevat onbekende sorteervelden en kon niet uitgevoerd worden. Onbekende velden: {0}. - /// public static string ZoekOpdrachtBevatOnbekendeSorteerVelden { get { return ResourceManager.GetString("ZoekOpdrachtBevatOnbekendeSorteerVelden", resourceCulture); } } - /// - /// Looks up a localized string similar to Deze zoekopdracht kon niet uitgevoerd worden. Controleer alle parameters en probeer opnieuw.. - /// - public static string ZoekOpdrachtWasIncorrect { + public static string UnexpectedAggregateVersion { get { - return ResourceManager.GetString("ZoekOpdrachtWasIncorrect", resourceCulture); + return ResourceManager.GetString("UnexpectedAggregateVersion", resourceCulture); + } + } + + public static string UnsupportedContent { + get { + return ResourceManager.GetString("UnsupportedContent", resourceCulture); } } } diff --git a/src/AssociationRegistry/Resources/ExceptionMessages.resx b/src/AssociationRegistry/Resources/ExceptionMessages.resx index 388b8851d..f6647bbf3 100644 --- a/src/AssociationRegistry/Resources/ExceptionMessages.resx +++ b/src/AssociationRegistry/Resources/ExceptionMessages.resx @@ -196,4 +196,7 @@ De gevraagde vereniging heeft niet de verwachte sequentiewaarde. + + Deze waarde bevat niet toegestane tekens. + From 03437ddaae9eb8a968b334045359801920f77ccc Mon Sep 17 00:00:00 2001 From: Quinten Van Assche Date: Tue, 9 Jan 2024 11:58:04 +0100 Subject: [PATCH 04/11] feat: OR-2035 add more tests for string and string[] --- .../Extensions/FluentValidatorExtensions.cs | 32 ++- .../Verenigingen/Common/Adres.cs | 7 + .../Verenigingen/Common/AdresId.cs | 3 + .../Verenigingen/Common/ToeTeVoegenLocatie.cs | 5 +- .../Common/ToeTeVoegenVertegenwoordiger.cs | 10 + .../RequestModels/TeWijzigenLocatie.cs | 3 + .../TeWijzigenMaatschappelijkeZetel.cs | 2 + .../RegistreerFeitelijkeVerenigingRequest.cs | 3 + .../HoofdactiviteitVerenigingsloket.cs | 3 + .../Search/ResponseModels/VerenigingsType.cs | 3 + .../TeWijzigenVertegenwoordiger.cs | 7 + .../WijzigBasisgegevensRequest.cs | 5 + .../WijzigBasisgegevensRequest.cs | 4 + .../With_Html_Fields.cs | 185 ++++-------------- 14 files changed, 116 insertions(+), 156 deletions(-) diff --git a/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs b/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs index 9db90e334..22632c157 100644 --- a/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs +++ b/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs @@ -11,7 +11,10 @@ namespace AssociationRegistry.Admin.Api.Infrastructure.Extensions; public static class FluentValidatorExtensions { - public static async Task NullValidateAndThrowAsync(this IValidator validator, [NotNull] T? instance, CancellationToken cancellationToken = default) + public static async Task NullValidateAndThrowAsync( + this IValidator validator, + [NotNull] T? instance, + CancellationToken cancellationToken = default) { if (instance is null) throw new CouldNotParseRequestException(); @@ -19,6 +22,7 @@ public static async Task NullValidateAndThrowAsync(this IValidator validat await validator.ValidateAndThrowAsync(instance, cancellationToken); } } + public class NoHtmlValidator : AbstractValidator { public NoHtmlValidator() @@ -28,20 +32,30 @@ public NoHtmlValidator() foreach (var property in propertiesWithNoHtml) { - RuleFor(model => GetPropertyValue(model, property.Name)) - .Must(BeNoHtml) - .WithMessage(ExceptionMessages.UnsupportedContent) - .When(model => property.GetValue(model) != null); + if (property.PropertyType == typeof(string)) + { + RuleFor(model => GetPropertyValue(model, property.Name) as string) + .Must(BeNoHtml!) + .WithMessage(ExceptionMessages.UnsupportedContent) + .When(model => GetPropertyValue(model, property.Name) != null); + } + else if (property.PropertyType == typeof(string[])) + { + RuleForEach(model => GetPropertyValue(model, property.Name) as string[]) + .Must(BeNoHtml!) + .WithMessage(ExceptionMessages.UnsupportedContent) + .When(model => GetPropertyValue(model, property.Name) != null); + } } } - private static string GetPropertyValue(T model, string propertyName) + private static object? GetPropertyValue(T model, string propertyName) { var property = typeof(T).GetProperty(propertyName); - return property?.GetValue(model) as string; + + return property?.GetValue(model); } private static bool BeNoHtml(string propertyValue) - => Regex.IsMatch(propertyValue, "<.*?>"); + => !Regex.IsMatch(propertyValue, "<.*?>"); } - diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/Adres.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/Adres.cs index b0bab195a..bf145fda8 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/Adres.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/Adres.cs @@ -1,5 +1,6 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Common; +using Infrastructure.HtmlValidation; using System.Runtime.Serialization; /// Een adres van een locatie @@ -8,25 +9,31 @@ public class Adres { /// De straat van het adres [DataMember] + [NoHtml] public string Straatnaam { get; set; } = null!; /// Het huisnummer van het adres [DataMember] + [NoHtml] public string Huisnummer { get; set; } = null!; /// Het busnummer van het adres [DataMember] + [NoHtml] public string? Busnummer { get; set; } /// De postcode van het adres [DataMember] + [NoHtml] public string Postcode { get; set; } = null!; /// De gemeente van het adres [DataMember] + [NoHtml] public string Gemeente { get; set; } = null!; /// Het land van het adres [DataMember] + [NoHtml] public string Land { get; set; } = null!; } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/AdresId.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/AdresId.cs index 8f0de7d54..7a9ae77d0 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/AdresId.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/AdresId.cs @@ -1,5 +1,6 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Common; +using Infrastructure.HtmlValidation; using System.Runtime.Serialization; /// De unieke identificator van het adres in een andere bron @@ -8,9 +9,11 @@ public class AdresId { /// De code van de bron van het adres [DataMember] + [NoHtml] public string Broncode { get; set; } = null!; /// De unieke identificator volgens de bron [DataMember] + [NoHtml] public string Bronwaarde { get; set; } = null!; } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenLocatie.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenLocatie.cs index 2262a0471..84332d300 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenLocatie.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenLocatie.cs @@ -1,5 +1,6 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Common; +using Infrastructure.HtmlValidation; using System.Runtime.Serialization; using Vereniging; @@ -12,9 +13,10 @@ public class ToeTeVoegenLocatie ///
/// Mogelijke waarden:
/// - Activiteiten
- /// - Correspondentie - Slechtséén maal mogelijk
+ /// - Correspondentie - Slechts één maal mogelijk
/// [DataMember] + [NoHtml] public string Locatietype { get; set; } = null!; /// Duidt aan dat dit de primaire locatie is @@ -23,6 +25,7 @@ public class ToeTeVoegenLocatie /// Een beschrijvende naam voor de locatie [DataMember] + [NoHtml] public string? Naam { get; set; } /// De unieke identificator van het adres in een andere bron diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenVertegenwoordiger.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenVertegenwoordiger.cs index 46e6d283d..92e244003 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenVertegenwoordiger.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenVertegenwoordiger.cs @@ -1,5 +1,6 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Common; +using Infrastructure.HtmlValidation; using System.Runtime.Serialization; using Vereniging; using Vereniging.TelefoonNummers; @@ -12,22 +13,27 @@ public class ToeTeVoegenVertegenwoordiger /// Dit is de unieke identificatie van een vertegenwoordiger, dit kan een rijksregisternummer of bisnummer zijn /// [DataMember] + [NoHtml] public string Insz { get; set; } = null!; /// De voornaam van de vertegenwoordiger [DataMember] + [NoHtml] public string Voornaam { get; set; } = null!; /// De achternaam van de vertegenwoordiger [DataMember] + [NoHtml] public string Achternaam { get; set; } = null!; /// Dit is de rol van de vertegenwoordiger binnen de vereniging [DataMember] + [NoHtml] public string? Rol { get; set; } /// Dit is de roepnaam van de vertegenwoordiger [DataMember] + [NoHtml] public string? Roepnaam { get; set; } /// @@ -38,18 +44,22 @@ public class ToeTeVoegenVertegenwoordiger /// Het e-mailadres van de vertegenwoordiger [DataMember(Name = "E-mail")] + [NoHtml] public string? Email { get; set; } /// Het telefoonnummer van de vertegenwoordiger [DataMember] + [NoHtml] public string? Telefoon { get; set; } /// Het mobiel nummer van de vertegenwoordiger [DataMember] + [NoHtml] public string? Mobiel { get; set; } /// Het socialmedia account van de vertegenwoordiger [DataMember] + [NoHtml] public string? SocialMedia { get; set; } public static Vertegenwoordiger Map(ToeTeVoegenVertegenwoordiger vert) diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/FeitelijkeVereniging/WijzigLocatie/RequestModels/TeWijzigenLocatie.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/FeitelijkeVereniging/WijzigLocatie/RequestModels/TeWijzigenLocatie.cs index ad67569af..b2474d7dc 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/FeitelijkeVereniging/WijzigLocatie/RequestModels/TeWijzigenLocatie.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/FeitelijkeVereniging/WijzigLocatie/RequestModels/TeWijzigenLocatie.cs @@ -3,6 +3,7 @@ using System.Runtime.Serialization; using Acties.WijzigLocatie; using Common; +using Infrastructure.HtmlValidation; /// Een locatie van een vereniging [DataContract] @@ -16,6 +17,7 @@ public class TeWijzigenLocatie /// - Correspondentie - Slechts één maal mogelijk
///
[DataMember] + [NoHtml] public string? Locatietype { get; set; } = null!; /// Duidt aan dat dit de primaire locatie is @@ -24,6 +26,7 @@ public class TeWijzigenLocatie /// Een beschrijvende naam voor de locatie [DataMember] + [NoHtml] public string? Naam { get; set; } /// De unieke identificator van het adres in een andere bron diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/TeWijzigenMaatschappelijkeZetel.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/TeWijzigenMaatschappelijkeZetel.cs index 056dce56a..5b0b7e6a9 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/TeWijzigenMaatschappelijkeZetel.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/TeWijzigenMaatschappelijkeZetel.cs @@ -1,6 +1,7 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Locaties.VerenigingMetRechtspersoonlijkheid.WijzigMaatschappelijkeZetel.RequestModels; using Acties.WijzigMaatschappelijkeZetel; +using Infrastructure.HtmlValidation; using System.Runtime.Serialization; [DataContract] @@ -12,6 +13,7 @@ public class TeWijzigenMaatschappelijkeZetel /// Een beschrijvende naam voor de locatie [DataMember] + [NoHtml] public string? Naam { get; set; } public static WijzigMaatschappelijkeZetelCommand.Locatie Map(TeWijzigenMaatschappelijkeZetel locatie, int locatieId) diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RequetsModels/RegistreerFeitelijkeVerenigingRequest.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RequetsModels/RegistreerFeitelijkeVerenigingRequest.cs index c276b8022..73cb937fb 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RequetsModels/RegistreerFeitelijkeVerenigingRequest.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RequetsModels/RegistreerFeitelijkeVerenigingRequest.cs @@ -20,10 +20,12 @@ public class RegistreerFeitelijkeVerenigingRequest /// Korte naam van de vereniging [DataMember] + [NoHtml] public string? KorteNaam { get; set; } /// Korte beschrijving van de vereniging [DataMember] + [NoHtml] public string? KorteBeschrijving { get; set; } /// Datum waarop de vereniging gestart is. Deze datum mag niet later zijn dan vandaag @@ -56,6 +58,7 @@ public class RegistreerFeitelijkeVerenigingRequest /// De codes van de hoofdactivititeiten volgens het verenigingsloket [DataMember] + [NoHtml] public string[] HoofdactiviteitenVerenigingsloket { get; set; } = Array.Empty(); public RegistreerFeitelijkeVerenigingCommand ToCommand() diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Search/ResponseModels/HoofdactiviteitVerenigingsloket.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Search/ResponseModels/HoofdactiviteitVerenigingsloket.cs index ffe514d1b..d3c20f0f2 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Search/ResponseModels/HoofdactiviteitVerenigingsloket.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Search/ResponseModels/HoofdactiviteitVerenigingsloket.cs @@ -1,5 +1,6 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Search.ResponseModels; +using Infrastructure.HtmlValidation; using System.Runtime.Serialization; [DataContract] @@ -9,11 +10,13 @@ public class HoofdactiviteitVerenigingsloket /// De verkorte code van de hoofdactiviteit /// [DataMember] + [NoHtml] public string Code { get; set; } = null!; /// /// De volledige beschrijving van de hoofdactiviteit /// [DataMember] + [NoHtml] public string Naam { get; set; } = null!; } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Search/ResponseModels/VerenigingsType.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Search/ResponseModels/VerenigingsType.cs index a3753efbc..0bdb522ef 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Search/ResponseModels/VerenigingsType.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Search/ResponseModels/VerenigingsType.cs @@ -1,5 +1,6 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Search.ResponseModels; +using Infrastructure.HtmlValidation; using System.Runtime.Serialization; [DataContract] @@ -9,11 +10,13 @@ public class VerenigingsType /// De code van het type vereniging /// [DataMember] + [NoHtml] public string Code { get; set; } = null!; /// /// De beschrijving van het type vereniging /// [DataMember] + [NoHtml] public string Naam { get; set; } = null!; } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Vertegenwoordigers/FeitelijkeVereniging/WijzigVertegenwoordiger/RequestModels/TeWijzigenVertegenwoordiger.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Vertegenwoordigers/FeitelijkeVereniging/WijzigVertegenwoordiger/RequestModels/TeWijzigenVertegenwoordiger.cs index 250d641af..5a47c1c4b 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Vertegenwoordigers/FeitelijkeVereniging/WijzigVertegenwoordiger/RequestModels/TeWijzigenVertegenwoordiger.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Vertegenwoordigers/FeitelijkeVereniging/WijzigVertegenwoordiger/RequestModels/TeWijzigenVertegenwoordiger.cs @@ -1,5 +1,6 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Vertegenwoordigers.FeitelijkeVereniging.WijzigVertegenwoordiger.RequestModels; +using Infrastructure.HtmlValidation; using System.Runtime.Serialization; /// De te wijzigen vertegenwoordiger @@ -8,10 +9,12 @@ public class TeWijzigenVertegenwoordiger { /// Dit is de rol van de vertegenwoordiger binnen de vereniging [DataMember] + [NoHtml] public string? Rol { get; set; } /// Dit is de roepnaam van de vertegenwoordiger [DataMember] + [NoHtml] public string? Roepnaam { get; set; } /// @@ -22,17 +25,21 @@ public class TeWijzigenVertegenwoordiger /// Het e-mailadres van de vertegenwoordiger [DataMember(Name = "E-mail")] + [NoHtml] public string? Email { get; set; } /// Het telefoonnummer van de vertegenwoordiger [DataMember] + [NoHtml] public string? Telefoon { get; set; } /// Het mobiel nummer van de vertegenwoordiger [DataMember] + [NoHtml] public string? Mobiel { get; set; } /// Het socialmedia account van de vertegenwoordiger [DataMember] + [NoHtml] public string? SocialMedia { get; set; } } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/RequestModels/WijzigBasisgegevensRequest.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/RequestModels/WijzigBasisgegevensRequest.cs index 3a76f937a..bcbf0a642 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/RequestModels/WijzigBasisgegevensRequest.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/RequestModels/WijzigBasisgegevensRequest.cs @@ -2,6 +2,7 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.Feiteli using Acties.WijzigBasisgegevens; using Common; +using Infrastructure.HtmlValidation; using Primitives; using System; using System.Linq; @@ -13,14 +14,17 @@ public class WijzigBasisgegevensRequest { /// Nieuwe naam van de vereniging [DataMember] + [NoHtml] public string? Naam { get; set; } /// Nieuwe korte naam van de vereniging [DataMember] + [NoHtml] public string? KorteNaam { get; set; } /// Nieuwe korte beschrijving van de vereniging [DataMember] + [NoHtml] public string? KorteBeschrijving { get; set; } /// Nieuwe startdatum van de vereniging. Deze datum mag niet later zijn dan vandaag @@ -37,6 +41,7 @@ public class WijzigBasisgegevensRequest /// De codes van de nieuwe hoofdactiviteiten volgens het verenigingsloket /// [DataMember] + [NoHtml] public string[]? HoofdactiviteitenVerenigingsloket { get; set; } /// diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/RequestModels/WijzigBasisgegevensRequest.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/RequestModels/WijzigBasisgegevensRequest.cs index 097b23c6c..54be5d241 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/RequestModels/WijzigBasisgegevensRequest.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/RequestModels/WijzigBasisgegevensRequest.cs @@ -4,6 +4,7 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.MetRech using System.Runtime.Serialization; using AssociationRegistry.Acties.VerenigingMetRechtspersoonlijkheid.WijzigBasisgegevens; using Common; +using Infrastructure.HtmlValidation; using Vereniging; [DataContract] @@ -11,6 +12,7 @@ public class WijzigBasisgegevensRequest { /// Nieuwe korte beschrijving van de vereniging [DataMember] + [NoHtml] public string? KorteBeschrijving { get; set; } /// @@ -23,12 +25,14 @@ public class WijzigBasisgegevensRequest /// De codes van de nieuwe hoofdactiviteiten volgens het verenigingsloket /// [DataMember] + [NoHtml] public string[]? HoofdactiviteitenVerenigingsloket { get; set; } /// /// De nieuwe roepnaam van de vereniging /// [DataMember] + [NoHtml] public string? Roepnaam { get; set; } public WijzigBasisgegevensCommand ToCommand(string vCode) diff --git a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs index 27c6e1828..af6e7ca3e 100644 --- a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs +++ b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs @@ -1,155 +1,41 @@ namespace AssociationRegistry.Test.Admin.Api.FeitelijkeVereniging.When_RegistreerFeitelijkeVereniging; using AssociationRegistry.Admin.Api.Constants; -using AssociationRegistry.Admin.Api.Verenigingen.Common; using AssociationRegistry.Admin.Api.Verenigingen.Registreer.FeitelijkeVereniging.RequetsModels; using AutoFixture; using Fixtures; using FluentAssertions; using Framework; using Newtonsoft.Json; +using System.Collections; using System.Net; -using Vereniging; using Xunit; using Xunit.Categories; -using Adres = AssociationRegistry.Admin.Api.Verenigingen.Common.Adres; -using AdresId = AssociationRegistry.Admin.Api.Verenigingen.Common.AdresId; -public sealed class When_RegistreerFeitelijkeVereniging_WithHtmlFields +public class When_RegistreerFeitelijkeVereniging_WithHtmlFields_Data : IEnumerable { - private static When_RegistreerFeitelijkeVereniging_WithHtmlFields? called; - public readonly RegistreerFeitelijkeVerenigingRequest Request; - public readonly HttpResponseMessage Response; - - private When_RegistreerFeitelijkeVereniging_WithHtmlFields(AdminApiFixture fixture) + public IEnumerator GetEnumerator() { var autoFixture = new Fixture().CustomizeAdminApi(); - Request = new RegistreerFeitelijkeVerenigingRequest - { - Naam = $"

{autoFixture.Create()}

", - KorteNaam = autoFixture.Create(), - KorteBeschrijving = autoFixture.Create(), - Startdatum = DateOnly.FromDateTime(DateTime.Today), - IsUitgeschrevenUitPubliekeDatastroom = true, - Doelgroep = new DoelgroepRequest - { - Minimumleeftijd = 1, - Maximumleeftijd = 149, - }, - Contactgegevens = new ToeTeVoegenContactgegeven[] - { - new() - { - Contactgegeventype = Contactgegeventype.Email, - Waarde = "random@example.org", - Beschrijving = "Algemeen", - IsPrimair = false, - }, - }, - Locaties = new[] - { - new ToeTeVoegenLocatie - { - Naam = "Kantoor", - Adres = new Adres - { - Straatnaam = "dorpstraat", - Huisnummer = "69", - Busnummer = "42", - Postcode = "0123", - Gemeente = "Nothingham", - Land = "Belgie", - }, - IsPrimair = true, - Locatietype = Locatietype.Correspondentie, - }, - new ToeTeVoegenLocatie - { - Naam = "Speeltuin", - AdresId = new AdresId - { - Broncode = "AR", - Bronwaarde = AssociationRegistry.Vereniging.AdresId.DataVlaanderenAdresPrefix + "1", - }, - Adres = new Adres - { - Straatnaam = "dorpelstraat", - Huisnummer = "169", - Busnummer = "2", - Postcode = "4567", - Gemeente = "Nothingham", - Land = "Belgie", - }, - IsPrimair = false, - Locatietype = Locatietype.Activiteiten, - }, - new ToeTeVoegenLocatie - { - Naam = "Zwembad", - AdresId = new AdresId - { - Broncode = "AR", - Bronwaarde = AssociationRegistry.Vereniging.AdresId.DataVlaanderenAdresPrefix + "5", - }, - IsPrimair = false, - Locatietype = Locatietype.Activiteiten, - }, - }, - Vertegenwoordigers = new[] - { - new ToeTeVoegenVertegenwoordiger - { - Insz = autoFixture.Create(), - Voornaam = "Jane", - Achternaam = "Doe", - Rol = "Voorzitter, Hoofdcoach", - Roepnaam = "QTPY", - IsPrimair = true, - Email = "qtpy@example.org", - Telefoon = "0123456789", - Mobiel = "987654321", - SocialMedia = "http://example.com", - }, - new ToeTeVoegenVertegenwoordiger - { - Insz = autoFixture.Create(), - Voornaam = "Kim", - Achternaam = "Possible", - Rol = "Master", - Roepnaam = "Lara", - IsPrimair = false, - Email = "master@example.org", - Telefoon = "0000000000", - Mobiel = "6666666666", - SocialMedia = "http://example.com/scrum", - }, - }, - HoofdactiviteitenVerenigingsloket = new[] { "BIAG", "BWWC" }, - }; + var request1 = autoFixture.Create(); + request1.Naam = $"

{autoFixture.Create()}

"; - Response ??= fixture.DefaultClient.RegistreerFeitelijkeVereniging(GetJsonBody(Request)).GetAwaiter().GetResult(); - } + yield return new object[] { request1 }; - public static When_RegistreerFeitelijkeVereniging_WithHtmlFields Called(AdminApiFixture fixture) - => called ??= new When_RegistreerFeitelijkeVereniging_WithHtmlFields(fixture); + var request2 = autoFixture.Create(); + request2.HoofdactiviteitenVerenigingsloket = new[] { "" }; - private string GetJsonBody(RegistreerFeitelijkeVerenigingRequest request) - => GetType() - .GetAssociatedResourceJson("files.request.with_all_fields") - .Replace(oldValue: "{{vereniging.naam}}", request.Naam) - .Replace(oldValue: "{{vereniging.korteNaam}}", request.KorteNaam) - .Replace(oldValue: "{{vereniging.korteBeschrijving}}", request.KorteBeschrijving) - .Replace(oldValue: "{{vereniging.isUitgeschrevenUitPubliekeDatastroom}}", - request.IsUitgeschrevenUitPubliekeDatastroom.ToString().ToLower()) - .Replace(oldValue: "{{vereniging.startdatum}}", request.Startdatum!.Value.ToString(WellknownFormats.DateOnly)) - .Replace(oldValue: "{{vereniging.doelgroep.minimumleeftijd}}", request.Doelgroep!.Minimumleeftijd.ToString()) - .Replace(oldValue: "{{vereniging.doelgroep.maximumleeftijd}}", request.Doelgroep!.Maximumleeftijd.ToString()) - .Replace(oldValue: "{{vereniging.contactgegevens}}", JsonConvert.SerializeObject(request.Contactgegevens)) - .Replace(oldValue: "{{vereniging.locaties}}", JsonConvert.SerializeObject(request.Locaties)) - .Replace(oldValue: "{{vereniging.vertegenwoordigers}}", JsonConvert.SerializeObject(request.Vertegenwoordigers)) - .Replace(oldValue: "{{vereniging.hoofdactiviteitenLijst}}", - JsonConvert.SerializeObject(request.HoofdactiviteitenVerenigingsloket)); + yield return new object[] { request2 }; + + var request3 = autoFixture.Create(); + request3.KorteNaam = "Click here"; + + yield return new object[] { request3 }; + } + + IEnumerator IEnumerable.GetEnumerator() + => GetEnumerator(); } [Collection(nameof(AdminApiCollection))] @@ -164,21 +50,28 @@ public With_Html_Fields(EventsInDbScenariosFixture fixture) _fixture = fixture; } - private RegistreerFeitelijkeVerenigingRequest Request - => When_RegistreerFeitelijkeVereniging_WithHtmlFields.Called(_fixture).Request; - - private HttpResponseMessage Response - => When_RegistreerFeitelijkeVereniging_WithHtmlFields.Called(_fixture).Response; - - [Fact] - public void Then_it_returns_a_bad_request_response() + [Theory] + [ClassData(typeof(When_RegistreerFeitelijkeVereniging_WithHtmlFields_Data))] + public async Task Then_it_returns_a_bad_request_response(RegistreerFeitelijkeVerenigingRequest request) { - Response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + var response = await _fixture.DefaultClient.RegistreerFeitelijkeVereniging(GetJsonBody(request)); + response.StatusCode.Should().Be(HttpStatusCode.BadRequest); } -} -internal static class HtmlExtensions -{ - public static string HtmlEncapsulate(this string input) - => "

" + input + "

"; + private string GetJsonBody(RegistreerFeitelijkeVerenigingRequest request) + => GetType() + .GetAssociatedResourceJson("files.request.with_all_fields") + .Replace(oldValue: "{{vereniging.naam}}", request.Naam) + .Replace(oldValue: "{{vereniging.korteNaam}}", request.KorteNaam) + .Replace(oldValue: "{{vereniging.korteBeschrijving}}", request.KorteBeschrijving) + .Replace(oldValue: "{{vereniging.isUitgeschrevenUitPubliekeDatastroom}}", + request.IsUitgeschrevenUitPubliekeDatastroom.ToString().ToLower()) + .Replace(oldValue: "{{vereniging.startdatum}}", request.Startdatum!.Value.ToString(WellknownFormats.DateOnly)) + .Replace(oldValue: "{{vereniging.doelgroep.minimumleeftijd}}", request.Doelgroep!.Minimumleeftijd.ToString()) + .Replace(oldValue: "{{vereniging.doelgroep.maximumleeftijd}}", request.Doelgroep!.Maximumleeftijd.ToString()) + .Replace(oldValue: "{{vereniging.contactgegevens}}", JsonConvert.SerializeObject(request.Contactgegevens)) + .Replace(oldValue: "{{vereniging.locaties}}", JsonConvert.SerializeObject(request.Locaties)) + .Replace(oldValue: "{{vereniging.vertegenwoordigers}}", JsonConvert.SerializeObject(request.Vertegenwoordigers)) + .Replace(oldValue: "{{vereniging.hoofdactiviteitenLijst}}", + JsonConvert.SerializeObject(request.HoofdactiviteitenVerenigingsloket)); } From 96f869132d82ab8bdb1c309ef5bdacc736da26e0 Mon Sep 17 00:00:00 2001 From: Koen Metsu Date: Tue, 9 Jan 2024 12:05:32 +0100 Subject: [PATCH 05/11] feat: or-2035 wip: add property name to prevent exception --- .../Infrastructure/Extensions/FluentValidatorExtensions.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs b/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs index 22632c157..a252073bc 100644 --- a/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs +++ b/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs @@ -27,6 +27,8 @@ public class NoHtmlValidator : AbstractValidator { public NoHtmlValidator() { + // TODO: nested + // TODO: es kijken naar 'I <3 ' als waarde? var propertiesWithNoHtml = typeof(T).GetProperties() .Where(p => p.GetCustomAttributes(typeof(NoHtmlAttribute), false).Any()); @@ -43,6 +45,7 @@ public NoHtmlValidator() { RuleForEach(model => GetPropertyValue(model, property.Name) as string[]) .Must(BeNoHtml!) + .WithName(property.Name) .WithMessage(ExceptionMessages.UnsupportedContent) .When(model => GetPropertyValue(model, property.Name) != null); } From c636b65f702e9ba1e69e298abad3a6130cb9073f Mon Sep 17 00:00:00 2001 From: Koen Metsu Date: Tue, 9 Jan 2024 17:20:45 +0100 Subject: [PATCH 06/11] feat: or-2035 wip: add seq --- docker-compose.yml | 11 +++++++++++ otel-collector-config.example.yaml | 5 ++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index cf9c45030..ccf342679 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,6 +7,16 @@ services: ports: - "5051:80" + seq: + image: datalust/seq + restart: always + ports: + - "9580:80" + environment: + ACCEPT_EULA: Y + volumes: + - seq-data:/data + elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.4.3 ports: @@ -56,3 +66,4 @@ services: volumes: pg-data: es-data: + seq-data: diff --git a/otel-collector-config.example.yaml b/otel-collector-config.example.yaml index a1b6511b9..b98f7c63a 100644 --- a/otel-collector-config.example.yaml +++ b/otel-collector-config.example.yaml @@ -6,6 +6,9 @@ receivers: exporters: logging: + otlphttp: + endpoint: http://seq/ingest/otlp + processors: batch: @@ -22,4 +25,4 @@ service: logs: receivers: [ otlp ] processors: [ batch ] - exporters: [ logging ] + exporters: [ logging, otlphttp ] From 74c77796118d14f7e35718e26d32708b55740a45 Mon Sep 17 00:00:00 2001 From: Koen Metsu Date: Tue, 9 Jan 2024 17:27:25 +0100 Subject: [PATCH 07/11] fix: or-2035 fix registreer request, check extra field in validationproblemdetails --- .../With_Html_Fields.cs | 15 ++++++-- .../AdminApiAutoFixtureCustomizations.cs | 34 ++++++++++++------- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs index af6e7ca3e..dca332e94 100644 --- a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs +++ b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs @@ -1,8 +1,10 @@ namespace AssociationRegistry.Test.Admin.Api.FeitelijkeVereniging.When_RegistreerFeitelijkeVereniging; using AssociationRegistry.Admin.Api.Constants; +using AssociationRegistry.Admin.Api.Verenigingen.Common; using AssociationRegistry.Admin.Api.Verenigingen.Registreer.FeitelijkeVereniging.RequetsModels; using AutoFixture; +using Be.Vlaanderen.Basisregisters.BasicApiProblem; using Fixtures; using FluentAssertions; using Framework; @@ -24,12 +26,19 @@ public IEnumerator GetEnumerator() yield return new object[] { request1 }; var request2 = autoFixture.Create(); - request2.HoofdactiviteitenVerenigingsloket = new[] { "" }; + request2.HoofdactiviteitenVerenigingsloket = new[] { "" }; yield return new object[] { request2 }; var request3 = autoFixture.Create(); - request3.KorteNaam = "Click here"; + request3.KorteNaam = "Click here"; + + var request4 = autoFixture.Create(); + var contactgegeven = autoFixture.Create(); + contactgegeven.Beschrijving = "
";
+        request4.Contactgegevens = request4.Contactgegevens.Append(contactgegeven).ToArray();
+
+        yield return new object[] { request4 };
 
         yield return new object[] { request3 };
     }
@@ -56,6 +65,8 @@ public async Task Then_it_returns_a_bad_request_response(RegistreerFeitelijkeVer
     {
         var response = await _fixture.DefaultClient.RegistreerFeitelijkeVereniging(GetJsonBody(request));
         response.StatusCode.Should().Be(HttpStatusCode.BadRequest);
+        var body = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync());
+        body.ValidationErrors.Should().ContainKey(ExceptionMessages.UnsupportedContent); // TODO: OF EEN ANDER VELD
     }
 
     private string GetJsonBody(RegistreerFeitelijkeVerenigingRequest request)
diff --git a/test/AssociationRegistry.Test.Admin.Api/Framework/AdminApiAutoFixtureCustomizations.cs b/test/AssociationRegistry.Test.Admin.Api/Framework/AdminApiAutoFixtureCustomizations.cs
index d54f619e5..00193d4cb 100644
--- a/test/AssociationRegistry.Test.Admin.Api/Framework/AdminApiAutoFixtureCustomizations.cs
+++ b/test/AssociationRegistry.Test.Admin.Api/Framework/AdminApiAutoFixtureCustomizations.cs
@@ -83,20 +83,28 @@ private static void CustomizeRegistreerFeitelijkeVerenigingRequest(this IFixture
     {
         fixture.Customize(
             composer => composer.FromFactory(
-                _ => new RegistreerFeitelijkeVerenigingRequest
+                _ =>
                 {
-                    Contactgegevens = fixture.CreateMany().ToArray(),
-                    Locaties = fixture.CreateMany().DistinctBy(l => l.Locatietype).ToArray(),
-                    Startdatum = fixture.Create(),
-                    Naam = fixture.Create(),
-                    Doelgroep = fixture.Create(),
-                    Vertegenwoordigers = fixture.CreateMany().ToArray(),
-                    HoofdactiviteitenVerenigingsloket = fixture.CreateMany()
-                                                               .Select(x => x.Code)
-                                                               .Distinct()
-                                                               .ToArray(),
-                    KorteBeschrijving = fixture.Create(),
-                    KorteNaam = fixture.Create(),
+                    var datum = fixture.Create();
+                    var startDatum = new DateOnly(new Random().Next(1970, DateTime.Now.Year), datum.Value.Month, datum.Value.Day);
+                    var request = new RegistreerFeitelijkeVerenigingRequest();
+
+                    request.Contactgegevens = fixture.CreateMany().ToArray();
+                    request.Locaties = fixture.CreateMany().DistinctBy(l => l.Locatietype).ToArray();
+                    request.Startdatum = startDatum;
+                    request.Naam = fixture.Create();
+                    request.Doelgroep = fixture.Create();
+                    request.Vertegenwoordigers = fixture.CreateMany().ToArray();
+
+                    request.HoofdactiviteitenVerenigingsloket = fixture.CreateMany()
+                                                                       .Select(x => x.Code)
+                                                                       .Distinct()
+                                                                       .ToArray();
+
+                    request.KorteBeschrijving = fixture.Create();
+                    request.KorteNaam = fixture.Create();
+
+                    return request;
                 }).OmitAutoProperties());
     }
 

From 3dc5a42aa31077f2f1de24d0bf01bf3c105c3fe2 Mon Sep 17 00:00:00 2001
From: Koen Metsu 
Date: Tue, 9 Jan 2024 17:27:45 +0100
Subject: [PATCH 08/11] fix: or-2035 add more fields to check for html

---
 .../Verenigingen/Common/ToeTeVoegenContactgegeven.cs   |  4 ++++
 .../Verenigingen/Registreer/Activiteit.cs              |  4 +++-
 .../Registreer/DuplicaatVerenigingContract.cs          |  7 ++++---
 .../Registreer/HoofdactiviteitVerenigingsloket.cs      |  8 ++++++--
 .../Verenigingen/Registreer/Locatie.cs                 | 10 ++++++++--
 .../Registreer/PotentialDuplicatesResponse.cs          |  2 ++
 .../Verenigingen/Registreer/VerenigingsType.cs         |  5 ++++-
 7 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenContactgegeven.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenContactgegeven.cs
index 7216d5836..f2ef593d5 100644
--- a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenContactgegeven.cs
+++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenContactgegeven.cs
@@ -1,5 +1,6 @@
 namespace AssociationRegistry.Admin.Api.Verenigingen.Common;
 
+using Infrastructure.HtmlValidation;
 using Infrastructure.Swagger;
 using System.Runtime.Serialization;
 using Vereniging;
@@ -16,16 +17,19 @@ public class ToeTeVoegenContactgegeven
     [SwaggerParameterExample("Telefoon")]
     [SwaggerParameterExample("Website")]
     [DataMember(Name = "contactgegeventype")]
+    [NoHtml]
     public string Contactgegeventype { get; set; } = null!;
 
     /// De waarde van het contactgegeven
     [DataMember(Name = "waarde")]
+    [NoHtml]
     public string Waarde { get; set; } = null!;
 
     /// 
     ///     Vrij veld die het het contactgegeven beschrijft (bijv: algemeen, administratie, ...)
     /// 
     [DataMember(Name = "beschrijving")]
+    [NoHtml]
     public string? Beschrijving { get; set; }
 
     /// Duidt het contactgegeven aan als primair contactgegeven
diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/Activiteit.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/Activiteit.cs
index 9393dcb6a..582ac8fad 100644
--- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/Activiteit.cs
+++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/Activiteit.cs
@@ -1,7 +1,8 @@
 namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer;
 
-using System.Runtime.Serialization;
 using DuplicateVerenigingDetection;
+using Infrastructure.HtmlValidation;
+using System.Runtime.Serialization;
 
 /// Een activiteit van een vereniging
 [DataContract]
@@ -24,5 +25,6 @@ public static Activiteit FromDuplicaatVereniging(DuplicaatVereniging.Activiteit
 
     /// De categorie van deze activiteit
     [DataMember(Name = "Categorie")]
+    [NoHtml]
     public string Categorie { get; init; }
 }
diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/DuplicaatVerenigingContract.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/DuplicaatVerenigingContract.cs
index 0ed8bb961..d049860a2 100644
--- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/DuplicaatVerenigingContract.cs
+++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/DuplicaatVerenigingContract.cs
@@ -1,5 +1,6 @@
 namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer;
 
+using Infrastructure.HtmlValidation;
 using System.Collections.Immutable;
 using System.Runtime.Serialization;
 
@@ -26,15 +27,15 @@ public DuplicaatVerenigingContract(
     }
 
     /// De unieke identificatie code van deze vereniging
-    [DataMember(Name = "VCode")]
+    [DataMember(Name = "VCode")] [NoHtml]
     public string VCode { get; init; }
 
     /// Naam van de vereniging
-    [DataMember(Name = "Naam")]
+    [DataMember(Name = "Naam")] [NoHtml]
     public string Naam { get; init; }
 
     /// Korte naam van de vereniging
-    [DataMember(Name = "KorteNaam")]
+    [DataMember(Name = "KorteNaam")] [NoHtml]
     public string KorteNaam { get; init; }
 
     /// Type van de vereniging
diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/HoofdactiviteitVerenigingsloket.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/HoofdactiviteitVerenigingsloket.cs
index d86f93956..ebaef694f 100644
--- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/HoofdactiviteitVerenigingsloket.cs
+++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/HoofdactiviteitVerenigingsloket.cs
@@ -1,7 +1,8 @@
 namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer;
 
-using System.Runtime.Serialization;
 using DuplicateVerenigingDetection;
+using Infrastructure.HtmlValidation;
+using System.Runtime.Serialization;
 
 [DataContract]
 public class HoofdactiviteitVerenigingsloket
@@ -14,14 +15,17 @@ public HoofdactiviteitVerenigingsloket(
         Naam = naam;
     }
 
-    public static HoofdactiviteitVerenigingsloket FromDuplicaatVereniging(DuplicaatVereniging.HoofdactiviteitVerenigingsloket hoofdactiviteitVerenigingsloket)
+    public static HoofdactiviteitVerenigingsloket FromDuplicaatVereniging(
+        DuplicaatVereniging.HoofdactiviteitVerenigingsloket hoofdactiviteitVerenigingsloket)
         => new(hoofdactiviteitVerenigingsloket.Code, hoofdactiviteitVerenigingsloket.Naam);
 
     /// De code van de hoofdactivititeit
     [DataMember(Name = "Code")]
+    [NoHtml]
     public string Code { get; init; }
 
     /// De beschrijving van de hoofdactivititeit
     [DataMember(Name = "Naam")]
+    [NoHtml]
     public string Naam { get; init; }
 }
diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/Locatie.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/Locatie.cs
index d7e1a9892..355db801f 100644
--- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/Locatie.cs
+++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/Locatie.cs
@@ -1,7 +1,8 @@
 namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer;
 
-using System.Runtime.Serialization;
 using DuplicateVerenigingDetection;
+using Infrastructure.HtmlValidation;
+using System.Runtime.Serialization;
 
 /// Een locatie van een vereniging
 [DataContract]
@@ -28,6 +29,7 @@ public static Locatie FromDuplicaatVereniging(DuplicaatVereniging.Locatie locati
 
     /// Het soort locatie dat beschreven wordt
     [DataMember(Name = "Locatietype")]
+    [NoHtml]
     public string Locatietype { get; init; }
 
     /// Duidt aan dat dit de primaire locatie is
@@ -36,17 +38,21 @@ public static Locatie FromDuplicaatVereniging(DuplicaatVereniging.Locatie locati
 
     /// Het samengestelde adres van de locatie
     [DataMember(Name = "Adresvoorstelling")]
+    [NoHtml]
     public string Adres { get; init; }
 
     /// Een beschrijvende naam voor de locatie
     [DataMember(Name = "Naam")]
+    [NoHtml]
     public string? Naam { get; init; }
 
     /// Het busnummer van de locatie
     [DataMember(Name = "Postcode")]
+    [NoHtml]
     public string Postcode { get; init; }
 
     /// De gemeente van de locatie
     [DataMember(Name = "Gemeente")]
+    [NoHtml]
     public string Gemeente { get; init; }
-}
\ No newline at end of file
+}
diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/PotentialDuplicatesResponse.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/PotentialDuplicatesResponse.cs
index db474c74d..203e6534f 100644
--- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/PotentialDuplicatesResponse.cs
+++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/PotentialDuplicatesResponse.cs
@@ -2,6 +2,7 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer;
 
 using DuplicateVerenigingDetection;
 using Infrastructure.ConfigurationBindings;
+using Infrastructure.HtmlValidation;
 using System;
 using System.Collections.Immutable;
 using System.Linq;
@@ -19,6 +20,7 @@ public PotentialDuplicatesResponse(string hashedRequest, PotentialDuplicatesFoun
     /// Dit token wordt gebruikt als bevestiging dat de vereniging uniek is en geregistreerd mag worden,
     /// ondanks de voorgestelde duplicaten.
     [DataMember(Name = "BevestigingsToken")]
+    [NoHtml]
     public string BevestigingsToken { get; init; }
 
     /// Een lijst van verenigingen die mogelijks een duplicaat zijn
diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/VerenigingsType.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/VerenigingsType.cs
index eddf21a04..75bcb4d79 100644
--- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/VerenigingsType.cs
+++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/VerenigingsType.cs
@@ -1,7 +1,8 @@
 namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer;
 
-using System.Runtime.Serialization;
 using DuplicateVerenigingDetection;
+using Infrastructure.HtmlValidation;
+using System.Runtime.Serialization;
 
 [DataContract]
 public class VerenigingsType
@@ -19,9 +20,11 @@ public static VerenigingsType FromDuplicaatVereniging(DuplicaatVereniging duplic
 
     /// De code van het type van deze vereniging
     [DataMember(Name = "Code")]
+    [NoHtml]
     public string Code { get; }
 
     /// De beschrijving van het type van deze vereniging
     [DataMember(Name = "Naam")]
+    [NoHtml]
     public string Naam { get; }
 }

From a94e864ef2cf9f84ea98f5007c17411cf1553d05 Mon Sep 17 00:00:00 2001
From: Jan Lesage 
Date: Wed, 10 Jan 2024 16:30:43 +0100
Subject: [PATCH 09/11] fix: OR-2035 recursively apply validation rules for
 requests and invalidate html fields

---
 .../Extensions/FluentValidatorExtensions.cs   | 75 ++++++++++++++-----
 .../With_Html_Fields.cs                       | 20 ++++-
 2 files changed, 74 insertions(+), 21 deletions(-)

diff --git a/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs b/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs
index a252073bc..1da1375f7 100644
--- a/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs
+++ b/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs
@@ -1,13 +1,16 @@
 namespace AssociationRegistry.Admin.Api.Infrastructure.Extensions;
 
 using ExceptionHandlers;
-using System.Diagnostics.CodeAnalysis;
-using System.Threading;
-using System.Threading.Tasks;
 using FluentValidation;
 using HtmlValidation;
-using System.Linq;
+using JasperFx.Core.Reflection;
+using Microsoft.AspNetCore.Http;
+using System;
+using System.Diagnostics.CodeAnalysis;
+using System.Reflection;
 using System.Text.RegularExpressions;
+using System.Threading;
+using System.Threading.Tasks;
 
 public static class FluentValidatorExtensions
 {
@@ -18,40 +21,72 @@ public static async Task NullValidateAndThrowAsync(
     {
         if (instance is null) throw new CouldNotParseRequestException();
 
-        await new NoHtmlValidator().ValidateAndThrowAsync(instance, cancellationToken: cancellationToken);
+        await new NoHtmlValidator().ValidateAndThrowAsync(instance, cancellationToken);
         await validator.ValidateAndThrowAsync(instance, cancellationToken);
     }
 }
 
 public class NoHtmlValidator : AbstractValidator
 {
+    private const string TO_BE_STRIPPED_PREFIX = "to-be-stripped-request-prefix";
+
     public NoHtmlValidator()
     {
         // TODO: nested
         // TODO: es kijken naar 'I <3 ' als waarde?
-        var propertiesWithNoHtml = typeof(T).GetProperties()
-                                            .Where(p => p.GetCustomAttributes(typeof(NoHtmlAttribute), false).Any());
+        RecursivelyApplyRule(typeof(T), TO_BE_STRIPPED_PREFIX);
+    }
+
+    private void RecursivelyApplyRule(Type type, string propertyName)
+    {
+        var props = type.GetProperties();
 
-        foreach (var property in propertiesWithNoHtml)
+        foreach (var prop in props)
         {
-            if (property.PropertyType == typeof(string))
+            var currentPropertyName = $"{propertyName}.{prop.Name}";
+
+            if (prop.HasAttribute())
+            {
+                ApplyRuleFor(prop, currentPropertyName);
+            }
+            else if (prop.PropertyType.IsArray)
             {
-                RuleFor(model => GetPropertyValue(model, property.Name) as string)
-                   .Must(BeNoHtml!)
-                   .WithMessage(ExceptionMessages.UnsupportedContent)
-                   .When(model => GetPropertyValue(model, property.Name) != null);
+                if (prop.PropertyType.IsClass)
+                    RecursivelyApplyRule(prop.PropertyType, currentPropertyName);
+                else
+                    ApplyRuleForEach(prop, currentPropertyName);
             }
-            else if (property.PropertyType == typeof(string[]))
+            else if (prop.PropertyType.IsClass)
             {
-                RuleForEach(model => GetPropertyValue(model, property.Name) as string[])
-                   .Must(BeNoHtml!)
-                   .WithName(property.Name)
-                   .WithMessage(ExceptionMessages.UnsupportedContent)
-                   .When(model => GetPropertyValue(model, property.Name) != null);
+                RecursivelyApplyRule(prop.PropertyType, currentPropertyName);
             }
         }
     }
 
+    private void ApplyRuleFor(PropertyInfo prop, string propertyName)
+    {
+        if (prop.PropertyType == typeof(string))
+            RuleFor(model => GetPropertyValue(model, prop.Name) as string)
+               .Cascade(CascadeMode.Continue)
+               .Must(BeNoHtml!)
+               .WithName(propertyName.Replace($"{TO_BE_STRIPPED_PREFIX}.", newValue: ""))
+               .WithErrorCode(StatusCodes.Status400BadRequest.ToString())
+               .WithMessage(ExceptionMessages.UnsupportedContent)
+               .When(model => GetPropertyValue(model, prop.Name) != null);
+    }
+
+    private void ApplyRuleForEach(PropertyInfo prop, string propertyName)
+    {
+        if (prop.PropertyType == typeof(string[]))
+            RuleForEach(model => Convert.ChangeType(GetPropertyValue(model, prop.Name), prop.PropertyType) as string[])
+               .Cascade(CascadeMode.Continue)
+               .Must(BeNoHtml!)
+               .WithName(propertyName.Replace($"{TO_BE_STRIPPED_PREFIX}.", newValue: ""))
+               .WithErrorCode(StatusCodes.Status400BadRequest.ToString())
+               .WithMessage(ExceptionMessages.UnsupportedContent)
+               .When(model => GetPropertyValue(model, prop.Name) != null);
+    }
+
     private static object? GetPropertyValue(T model, string propertyName)
     {
         var property = typeof(T).GetProperty(propertyName);
@@ -60,5 +95,5 @@ public NoHtmlValidator()
     }
 
     private static bool BeNoHtml(string propertyValue)
-        => !Regex.IsMatch(propertyValue, "<.*?>");
+        => !Regex.IsMatch(propertyValue, pattern: "<.*?>");
 }
diff --git a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs
index dca332e94..9e7661e7d 100644
--- a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs
+++ b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs
@@ -21,7 +21,25 @@ public IEnumerator GetEnumerator()
         var autoFixture = new Fixture().CustomizeAdminApi();
 
         var request1 = autoFixture.Create();
-        request1.Naam = $"

{autoFixture.Create()}

"; + + // request1.Naam = $"

{autoFixture.Create()}

"; + request1.Contactgegevens = new ToeTeVoegenContactgegeven[] + { + new() + { + Beschrijving = $"

{autoFixture.Create()}

", + Contactgegeventype = "Mumbo Jumbo", + Waarde = "Test", + IsPrimair = false, + }, + new() + { + Beschrijving = $"

{autoFixture.Create()}

", + Contactgegeventype = $"

{autoFixture.Create()}

", + Waarde = "Test", + IsPrimair = false, + }, + }; yield return new object[] { request1 }; From 2be788a6838359c60b6b1a9ed7dc7b9346afaeaf Mon Sep 17 00:00:00 2001 From: Jan Lesage Date: Thu, 11 Jan 2024 11:19:10 +0100 Subject: [PATCH 10/11] fix: remove middleware and generic rulebuilder with rulefor and ruleforeach in respective validators --- .../Extensions/FluentValidatorExtensions.cs | 83 ++----------------- .../HtmlValidation/NoHtmlAttribute.cs | 12 --- .../Middleware/NoHtmlMiddleware.cs | 39 --------- .../Verenigingen/Common/Adres.cs | 7 -- .../Verenigingen/Common/AdresId.cs | 3 - .../Verenigingen/Common/AdresIdValidator.cs | 4 + .../Verenigingen/Common/AdresValidator.cs | 16 +++- .../Common/ToeTeVoegenContactgegeven.cs | 4 - .../ToeTeVoegenContactgegevenValidator.cs | 5 ++ .../Verenigingen/Common/ToeTeVoegenLocatie.cs | 3 - .../Common/ToeTeVoegenLocatieValidator.cs | 10 ++- .../Common/ToeTeVoegenVertegenwoordiger.cs | 10 --- .../ToeTeVoegenVertegenwoordigerValidator.cs | 64 ++++++++------ .../RequestModels/TeWijzigenLocatie.cs | 7 +- .../TeWijzigenMaatschappelijkeZetel.cs | 2 - ...eWijzigenMaatschappelijkeZetelValidator.cs | 20 +++++ ...igMaatschappelijkeZetelRequestValidator.cs | 17 +--- .../Verenigingen/Registreer/Activiteit.cs | 2 - .../Registreer/DuplicaatVerenigingContract.cs | 7 +- .../RegistreerFeitelijkeVerenigingRequest.cs | 5 -- ...eerFeitelijkeVerenigingRequestValidator.cs | 20 ++--- .../HoofdactiviteitVerenigingsloket.cs | 3 - .../Verenigingen/Registreer/Locatie.cs | 6 -- .../Registreer/PotentialDuplicatesResponse.cs | 2 - .../Registreer/VerenigingsType.cs | 3 - .../HoofdactiviteitVerenigingsloket.cs | 3 - .../Search/ResponseModels/VerenigingsType.cs | 3 - .../TeWijzigenVertegenwoordiger.cs | 7 -- .../TeWijzigenVertegenwoordigerValidator.cs | 16 ++++ .../WijzigBasisgegevensRequest.cs | 5 -- .../WijzigBasisgegevensRequestValidator.cs | 11 ++- .../WijzigBasisgegevensRequest.cs | 8 +- .../WijzigBasisgegevensRequestValidator.cs | 8 +- .../RequestHandling/With_A_Null_Request.cs | 9 +- .../RequestValidating/A_Doelgroep.cs | 4 +- .../With_Html_Fields.cs | 33 +++----- .../RequestHandling/With_Null_Request.cs | 10 +-- .../RequestValidating/A_Doelgroep.cs | 4 +- .../RequestHandling/With_Null_Request.cs | 10 +-- .../RequestValidating/A_Doelgroep.cs | 4 +- .../RequestHandling/With_Null_Request.cs | 14 ++-- .../RequestValidating/With_A_Locatie.cs | 6 +- 42 files changed, 182 insertions(+), 327 deletions(-) delete mode 100644 src/AssociationRegistry.Admin.Api/Infrastructure/HtmlValidation/NoHtmlAttribute.cs delete mode 100644 src/AssociationRegistry.Admin.Api/Infrastructure/Middleware/NoHtmlMiddleware.cs create mode 100644 src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/TeWijzigenMaatschappelijkeZetelValidator.cs rename src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/{ => RequestModels}/WijzigMaatschappelijkeZetelRequestValidator.cs (51%) rename src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/{ => RequetsModels}/RegistreerFeitelijkeVerenigingRequestValidator.cs (84%) create mode 100644 src/AssociationRegistry.Admin.Api/Verenigingen/Vertegenwoordigers/FeitelijkeVereniging/WijzigVertegenwoordiger/RequestModels/TeWijzigenVertegenwoordigerValidator.cs rename src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/{ => RequestModels}/WijzigBasisgegevensRequestValidator.cs (81%) rename src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/{ => RequestModels}/WijzigBasisgegevensRequestValidator.cs (81%) diff --git a/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs b/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs index 1da1375f7..78be09686 100644 --- a/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs +++ b/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs @@ -2,12 +2,8 @@ namespace AssociationRegistry.Admin.Api.Infrastructure.Extensions; using ExceptionHandlers; using FluentValidation; -using HtmlValidation; -using JasperFx.Core.Reflection; using Microsoft.AspNetCore.Http; -using System; using System.Diagnostics.CodeAnalysis; -using System.Reflection; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; @@ -20,80 +16,15 @@ public static async Task NullValidateAndThrowAsync( CancellationToken cancellationToken = default) { if (instance is null) throw new CouldNotParseRequestException(); - - await new NoHtmlValidator().ValidateAndThrowAsync(instance, cancellationToken); await validator.ValidateAndThrowAsync(instance, cancellationToken); } -} - -public class NoHtmlValidator : AbstractValidator -{ - private const string TO_BE_STRIPPED_PREFIX = "to-be-stripped-request-prefix"; - public NoHtmlValidator() - { - // TODO: nested - // TODO: es kijken naar 'I <3 ' als waarde? - RecursivelyApplyRule(typeof(T), TO_BE_STRIPPED_PREFIX); - } - - private void RecursivelyApplyRule(Type type, string propertyName) - { - var props = type.GetProperties(); - - foreach (var prop in props) - { - var currentPropertyName = $"{propertyName}.{prop.Name}"; - - if (prop.HasAttribute()) - { - ApplyRuleFor(prop, currentPropertyName); - } - else if (prop.PropertyType.IsArray) - { - if (prop.PropertyType.IsClass) - RecursivelyApplyRule(prop.PropertyType, currentPropertyName); - else - ApplyRuleForEach(prop, currentPropertyName); - } - else if (prop.PropertyType.IsClass) - { - RecursivelyApplyRule(prop.PropertyType, currentPropertyName); - } - } - } - - private void ApplyRuleFor(PropertyInfo prop, string propertyName) - { - if (prop.PropertyType == typeof(string)) - RuleFor(model => GetPropertyValue(model, prop.Name) as string) - .Cascade(CascadeMode.Continue) - .Must(BeNoHtml!) - .WithName(propertyName.Replace($"{TO_BE_STRIPPED_PREFIX}.", newValue: "")) - .WithErrorCode(StatusCodes.Status400BadRequest.ToString()) - .WithMessage(ExceptionMessages.UnsupportedContent) - .When(model => GetPropertyValue(model, prop.Name) != null); - } - - private void ApplyRuleForEach(PropertyInfo prop, string propertyName) - { - if (prop.PropertyType == typeof(string[])) - RuleForEach(model => Convert.ChangeType(GetPropertyValue(model, prop.Name), prop.PropertyType) as string[]) - .Cascade(CascadeMode.Continue) - .Must(BeNoHtml!) - .WithName(propertyName.Replace($"{TO_BE_STRIPPED_PREFIX}.", newValue: "")) - .WithErrorCode(StatusCodes.Status400BadRequest.ToString()) - .WithMessage(ExceptionMessages.UnsupportedContent) - .When(model => GetPropertyValue(model, prop.Name) != null); - } - - private static object? GetPropertyValue(T model, string propertyName) - { - var property = typeof(T).GetProperty(propertyName); - - return property?.GetValue(model); - } + public static IRuleBuilder MustNotContainHtml(this IRuleBuilder ruleBuilder) + => ruleBuilder + .Must(NotContainHtml) + .WithErrorCode(StatusCodes.Status400BadRequest.ToString()) + .WithMessage(ExceptionMessages.UnsupportedContent); - private static bool BeNoHtml(string propertyValue) - => !Regex.IsMatch(propertyValue, pattern: "<.*?>"); + private static bool NotContainHtml(string? propertyValue) + => propertyValue is null ? true : !Regex.IsMatch(propertyValue, pattern: "<.*?>"); } diff --git a/src/AssociationRegistry.Admin.Api/Infrastructure/HtmlValidation/NoHtmlAttribute.cs b/src/AssociationRegistry.Admin.Api/Infrastructure/HtmlValidation/NoHtmlAttribute.cs deleted file mode 100644 index eef1e1031..000000000 --- a/src/AssociationRegistry.Admin.Api/Infrastructure/HtmlValidation/NoHtmlAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ - - -namespace AssociationRegistry.Admin.Api.Infrastructure.HtmlValidation -{ - using System; - using System.ComponentModel.DataAnnotations; - using System.Text.RegularExpressions; - - public class NoHtmlAttribute : Attribute - { - } -} diff --git a/src/AssociationRegistry.Admin.Api/Infrastructure/Middleware/NoHtmlMiddleware.cs b/src/AssociationRegistry.Admin.Api/Infrastructure/Middleware/NoHtmlMiddleware.cs deleted file mode 100644 index b4b7d1052..000000000 --- a/src/AssociationRegistry.Admin.Api/Infrastructure/Middleware/NoHtmlMiddleware.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace AssociationRegistry.Admin.Api.Infrastructure.Middleware; - -using Microsoft.AspNetCore.Http; -using System.IO; -using System.Text.RegularExpressions; -using System.Threading.Tasks; - -public class NoHtmlMiddleware -{ - private readonly RequestDelegate _next; - - public NoHtmlMiddleware(RequestDelegate next) - { - _next = next; - } - - public async Task InvokeAsync(HttpContext context) - { - context.Request.EnableBuffering(); - - var requestContent = await new StreamReader(context.Request.Body).ReadToEndAsync(); - context.Request.Body.Position = 0; // Reset the stream position for further processing - - if (ContainsHtml(requestContent)) - { - context.Response.StatusCode = 400; - await context.Response.WriteAsync("HTML content is not allowed."); - return; - } - - await _next(context); - } - - private bool ContainsHtml(string content) - { - // Simple HTML detection logic (can be improved or made more complex as needed) - return Regex.IsMatch(content, "<.*?>"); - } -} \ No newline at end of file diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/Adres.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/Adres.cs index bf145fda8..b0bab195a 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/Adres.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/Adres.cs @@ -1,6 +1,5 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Common; -using Infrastructure.HtmlValidation; using System.Runtime.Serialization; /// Een adres van een locatie @@ -9,31 +8,25 @@ public class Adres { /// De straat van het adres [DataMember] - [NoHtml] public string Straatnaam { get; set; } = null!; /// Het huisnummer van het adres [DataMember] - [NoHtml] public string Huisnummer { get; set; } = null!; /// Het busnummer van het adres [DataMember] - [NoHtml] public string? Busnummer { get; set; } /// De postcode van het adres [DataMember] - [NoHtml] public string Postcode { get; set; } = null!; /// De gemeente van het adres [DataMember] - [NoHtml] public string Gemeente { get; set; } = null!; /// Het land van het adres [DataMember] - [NoHtml] public string Land { get; set; } = null!; } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/AdresId.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/AdresId.cs index 7a9ae77d0..8f0de7d54 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/AdresId.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/AdresId.cs @@ -1,6 +1,5 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Common; -using Infrastructure.HtmlValidation; using System.Runtime.Serialization; /// De unieke identificator van het adres in een andere bron @@ -9,11 +8,9 @@ public class AdresId { /// De code van de bron van het adres [DataMember] - [NoHtml] public string Broncode { get; set; } = null!; /// De unieke identificator volgens de bron [DataMember] - [NoHtml] public string Bronwaarde { get; set; } = null!; } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/AdresIdValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/AdresIdValidator.cs index efc9999c0..a1abb3b17 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/AdresIdValidator.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/AdresIdValidator.cs @@ -1,6 +1,7 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Common; using FluentValidation; +using Infrastructure.Extensions; using Infrastructure.Validation; public class AdresIdValidator : AbstractValidator @@ -9,5 +10,8 @@ public AdresIdValidator() { this.RequireNotNullOrEmpty(adresId => adresId.Broncode); this.RequireNotNullOrEmpty(adresId => adresId.Bronwaarde); + + RuleFor(m => m.Broncode).MustNotContainHtml(); + RuleFor(m => m.Bronwaarde).MustNotContainHtml(); } } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/AdresValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/AdresValidator.cs index 41a337ec3..6a282b4fd 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/AdresValidator.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/AdresValidator.cs @@ -1,6 +1,7 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Common; using FluentValidation; +using Infrastructure.Extensions; using Infrastructure.Validation; public class AdresValidator : AbstractValidator @@ -8,9 +9,16 @@ public class AdresValidator : AbstractValidator public AdresValidator() { this.RequireNotNullOrEmpty(adres => adres.Straatnaam); - this.RequireNotNullOrEmpty(locatie => locatie.Huisnummer); - this.RequireNotNullOrEmpty(locatie => locatie.Gemeente); - this.RequireNotNullOrEmpty(locatie => locatie.Land); - this.RequireNotNullOrEmpty(locatie => locatie.Postcode); + this.RequireNotNullOrEmpty(adres => adres.Huisnummer); + this.RequireNotNullOrEmpty(adres => adres.Gemeente); + this.RequireNotNullOrEmpty(adres => adres.Land); + this.RequireNotNullOrEmpty(adres => adres.Postcode); + + RuleFor(adres => adres.Straatnaam).MustNotContainHtml(); + RuleFor(adres => adres.Huisnummer).MustNotContainHtml(); + RuleFor(adres => adres.Busnummer).MustNotContainHtml(); + RuleFor(adres => adres.Postcode).MustNotContainHtml(); + RuleFor(adres => adres.Gemeente).MustNotContainHtml(); + RuleFor(adres => adres.Land).MustNotContainHtml(); } } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenContactgegeven.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenContactgegeven.cs index f2ef593d5..7216d5836 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenContactgegeven.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenContactgegeven.cs @@ -1,6 +1,5 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Common; -using Infrastructure.HtmlValidation; using Infrastructure.Swagger; using System.Runtime.Serialization; using Vereniging; @@ -17,19 +16,16 @@ public class ToeTeVoegenContactgegeven [SwaggerParameterExample("Telefoon")] [SwaggerParameterExample("Website")] [DataMember(Name = "contactgegeventype")] - [NoHtml] public string Contactgegeventype { get; set; } = null!; /// De waarde van het contactgegeven [DataMember(Name = "waarde")] - [NoHtml] public string Waarde { get; set; } = null!; /// /// Vrij veld die het het contactgegeven beschrijft (bijv: algemeen, administratie, ...) /// [DataMember(Name = "beschrijving")] - [NoHtml] public string? Beschrijving { get; set; } /// Duidt het contactgegeven aan als primair contactgegeven diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenContactgegevenValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenContactgegevenValidator.cs index d2882f6d1..c4d1522f9 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenContactgegevenValidator.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenContactgegevenValidator.cs @@ -1,6 +1,7 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Common; using FluentValidation; +using Infrastructure.Extensions; using Infrastructure.Validation; using Vereniging; @@ -11,6 +12,10 @@ public ToeTeVoegenContactgegevenValidator() this.RequireNotNullOrEmpty(contactgegeven => contactgegeven.Waarde); this.RequireNotNullOrEmpty(contactgegeven => contactgegeven.Contactgegeventype); + RuleFor(contactgegeven => contactgegeven.Beschrijving).MustNotContainHtml(); + RuleFor(contactgegeven => contactgegeven.Contactgegeventype).MustNotContainHtml(); + RuleFor(contactgegeven => contactgegeven.Waarde).MustNotContainHtml(); + RuleFor(contactgegeven => contactgegeven.Contactgegeventype) .Must(Contactgegeventype.CanParse) .WithMessage(contactgegeven => $"De waarde {contactgegeven.Contactgegeventype} is geen gekend contactgegeven type.") diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenLocatie.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenLocatie.cs index 84332d300..20b9d65c2 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenLocatie.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenLocatie.cs @@ -1,6 +1,5 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Common; -using Infrastructure.HtmlValidation; using System.Runtime.Serialization; using Vereniging; @@ -16,7 +15,6 @@ public class ToeTeVoegenLocatie /// - Correspondentie - Slechts één maal mogelijk
///
[DataMember] - [NoHtml] public string Locatietype { get; set; } = null!; /// Duidt aan dat dit de primaire locatie is @@ -25,7 +23,6 @@ public class ToeTeVoegenLocatie /// Een beschrijvende naam voor de locatie [DataMember] - [NoHtml] public string? Naam { get; set; } /// De unieke identificator van het adres in een andere bron diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenLocatieValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenLocatieValidator.cs index 900a0a1cd..914e18ee1 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenLocatieValidator.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenLocatieValidator.cs @@ -1,9 +1,10 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Common; +using FluentValidation; +using Infrastructure.Extensions; +using Infrastructure.Validation; using System; using System.Linq; -using Infrastructure.Validation; -using FluentValidation; using Vereniging; public class ToeTeVoegenLocatieValidator : AbstractValidator @@ -12,6 +13,9 @@ public ToeTeVoegenLocatieValidator() { this.RequireNotNullOrEmpty(locatie => locatie.Locatietype); + RuleFor(locatie => locatie.Naam).MustNotContainHtml(); + RuleFor(locatie => locatie.Locatietype).MustNotContainHtml(); + RuleFor(locatie => locatie.Locatietype) .Must(BeAValidLocationTypeValue) .WithMessage($"'Locatietype' moet een geldige waarde hebben. ({Locatietype.Correspondentie}, {Locatietype.Activiteiten})") @@ -49,6 +53,6 @@ private static object ToAnonymousObject(ToeTeVoegenLocatie l) => new { l.Locatietype, l.Naam, l.Adres?.Straatnaam, l.Adres?.Huisnummer, l.Adres?.Busnummer, l.Adres?.Postcode, l.Adres?.Gemeente, - l.Adres?.Land, l.AdresId?.Bronwaarde, l.AdresId?.Broncode + l.Adres?.Land, l.AdresId?.Bronwaarde, l.AdresId?.Broncode, }; } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenVertegenwoordiger.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenVertegenwoordiger.cs index 92e244003..46e6d283d 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenVertegenwoordiger.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenVertegenwoordiger.cs @@ -1,6 +1,5 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Common; -using Infrastructure.HtmlValidation; using System.Runtime.Serialization; using Vereniging; using Vereniging.TelefoonNummers; @@ -13,27 +12,22 @@ public class ToeTeVoegenVertegenwoordiger /// Dit is de unieke identificatie van een vertegenwoordiger, dit kan een rijksregisternummer of bisnummer zijn ///
[DataMember] - [NoHtml] public string Insz { get; set; } = null!; /// De voornaam van de vertegenwoordiger [DataMember] - [NoHtml] public string Voornaam { get; set; } = null!; /// De achternaam van de vertegenwoordiger [DataMember] - [NoHtml] public string Achternaam { get; set; } = null!; /// Dit is de rol van de vertegenwoordiger binnen de vereniging [DataMember] - [NoHtml] public string? Rol { get; set; } /// Dit is de roepnaam van de vertegenwoordiger [DataMember] - [NoHtml] public string? Roepnaam { get; set; } /// @@ -44,22 +38,18 @@ public class ToeTeVoegenVertegenwoordiger /// Het e-mailadres van de vertegenwoordiger [DataMember(Name = "E-mail")] - [NoHtml] public string? Email { get; set; } /// Het telefoonnummer van de vertegenwoordiger [DataMember] - [NoHtml] public string? Telefoon { get; set; } /// Het mobiel nummer van de vertegenwoordiger [DataMember] - [NoHtml] public string? Mobiel { get; set; } /// Het socialmedia account van de vertegenwoordiger [DataMember] - [NoHtml] public string? SocialMedia { get; set; } public static Vertegenwoordiger Map(ToeTeVoegenVertegenwoordiger vert) diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenVertegenwoordigerValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenVertegenwoordigerValidator.cs index 248d18edb..f8c4a7b75 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenVertegenwoordigerValidator.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Common/ToeTeVoegenVertegenwoordigerValidator.cs @@ -1,64 +1,78 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Common; -using System.Linq; -using Infrastructure.Validation; using FluentValidation; +using Infrastructure.Extensions; +using Infrastructure.Validation; +using System.Linq; public class ToeTeVoegenVertegenwoordigerValidator : AbstractValidator { public ToeTeVoegenVertegenwoordigerValidator() { this.RequireNotNullOrEmpty(vertegenwoordiger => vertegenwoordiger.Insz); - this.RequireNotNullOrEmpty(vertegenwoordiger => vertegenwoordiger.Voornaam); + this.RequireNotNullOrEmpty(vertegenwoordiger => vertegenwoordiger.Achternaam); + + RuleFor(vertegenwoordiger => vertegenwoordiger.Voornaam).MustNotContainHtml(); + RuleFor(vertegenwoordiger => vertegenwoordiger.Achternaam).MustNotContainHtml(); + RuleFor(vertegenwoordiger => vertegenwoordiger.Insz).MustNotContainHtml(); + RuleFor(vertegenwoordiger => vertegenwoordiger.Email).MustNotContainHtml(); + RuleFor(vertegenwoordiger => vertegenwoordiger.SocialMedia).MustNotContainHtml(); + RuleFor(vertegenwoordiger => vertegenwoordiger.Mobiel).MustNotContainHtml(); + RuleFor(vertegenwoordiger => vertegenwoordiger.Roepnaam).MustNotContainHtml(); + RuleFor(vertegenwoordiger => vertegenwoordiger.Rol).MustNotContainHtml(); + RuleFor(vertegenwoordiger => vertegenwoordiger.Telefoon).MustNotContainHtml(); + RuleFor(vertegenwoordiger => vertegenwoordiger.Voornaam) - .Must(NotContainNumbers) - .When(vertegenwoordiger => !string.IsNullOrEmpty(vertegenwoordiger.Voornaam)) - .WithMessage("'Voornaam' mag geen cijfers bevatten."); + .Must(NotContainNumbers) + .When(vertegenwoordiger => !string.IsNullOrEmpty(vertegenwoordiger.Voornaam)) + .WithMessage("'Voornaam' mag geen cijfers bevatten."); + RuleFor(vertegenwoordiger => vertegenwoordiger.Voornaam) - .Must(ContainAtLeastOneLetter) - .When(vertegenwoordiger => !string.IsNullOrEmpty(vertegenwoordiger.Voornaam)) - .WithMessage("'Voornaam' moet minstens een letter bevatten."); + .Must(ContainAtLeastOneLetter) + .When(vertegenwoordiger => !string.IsNullOrEmpty(vertegenwoordiger.Voornaam)) + .WithMessage("'Voornaam' moet minstens een letter bevatten."); - this.RequireNotNullOrEmpty(vertegenwoordiger => vertegenwoordiger.Achternaam); RuleFor(vertegenwoordiger => vertegenwoordiger.Achternaam) - .Must(NotContainNumbers) - .When(vertegenwoordiger => !string.IsNullOrEmpty(vertegenwoordiger.Achternaam)) - .WithMessage("'Achternaam' mag geen cijfers bevatten."); + .Must(NotContainNumbers) + .When(vertegenwoordiger => !string.IsNullOrEmpty(vertegenwoordiger.Achternaam)) + .WithMessage("'Achternaam' mag geen cijfers bevatten."); + RuleFor(vertegenwoordiger => vertegenwoordiger.Achternaam) - .Must(ContainAtLeastOneLetter) - .When(vertegenwoordiger => !string.IsNullOrEmpty(vertegenwoordiger.Achternaam)) - .WithMessage("'Achternaam' moet minstens een letter bevatten."); + .Must(ContainAtLeastOneLetter) + .When(vertegenwoordiger => !string.IsNullOrEmpty(vertegenwoordiger.Achternaam)) + .WithMessage("'Achternaam' moet minstens een letter bevatten."); RuleFor(vertegenwoordiger => vertegenwoordiger.Insz) - .Must(ContainOnlyNumbersDotsAndDashes) - .When(vertegenwoordiger => !string.IsNullOrEmpty(vertegenwoordiger.Insz)) - .WithMessage("Insz heeft incorrect formaat (00.00.00-000.00 of 00000000000)"); + .Must(ContainOnlyNumbersDotsAndDashes) + .When(vertegenwoordiger => !string.IsNullOrEmpty(vertegenwoordiger.Insz)) + .WithMessage("Insz heeft incorrect formaat (00.00.00-000.00 of 00000000000)"); RuleFor(vertegenwoordiger => vertegenwoordiger.Insz) - .Must(Have11Numbers) - .When( + .Must(Have11Numbers) + .When( vertegenwoordiger => !string.IsNullOrEmpty(vertegenwoordiger.Insz) && ContainOnlyNumbersDotsAndDashes(vertegenwoordiger.Insz)) - .WithMessage("Insz moet 11 cijfers bevatten"); + .WithMessage("Insz moet 11 cijfers bevatten"); } private bool ContainOnlyNumbersDotsAndDashes(string? insz) { - insz = insz!.Replace(".", string.Empty).Replace("-", string.Empty); + insz = insz!.Replace(oldValue: ".", string.Empty).Replace(oldValue: "-", string.Empty); + return long.TryParse(insz, out _); } private bool Have11Numbers(string? insz) { - insz = insz!.Replace(".", string.Empty).Replace("-", string.Empty); + insz = insz!.Replace(oldValue: ".", string.Empty).Replace(oldValue: "-", string.Empty); + return insz.Length == 11; } private static bool NotContainNumbers(string arg) => !arg.Any(char.IsDigit); - private static bool ContainAtLeastOneLetter(string arg) => arg.Any(char.IsLetter); } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/FeitelijkeVereniging/WijzigLocatie/RequestModels/TeWijzigenLocatie.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/FeitelijkeVereniging/WijzigLocatie/RequestModels/TeWijzigenLocatie.cs index b2474d7dc..1dd7c1f4c 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/FeitelijkeVereniging/WijzigLocatie/RequestModels/TeWijzigenLocatie.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/FeitelijkeVereniging/WijzigLocatie/RequestModels/TeWijzigenLocatie.cs @@ -1,9 +1,8 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Locaties.FeitelijkeVereniging.WijzigLocatie.RequestModels; -using System.Runtime.Serialization; using Acties.WijzigLocatie; using Common; -using Infrastructure.HtmlValidation; +using System.Runtime.Serialization; /// Een locatie van een vereniging [DataContract] @@ -17,8 +16,7 @@ public class TeWijzigenLocatie /// - Correspondentie - Slechts één maal mogelijk
///
[DataMember] - [NoHtml] - public string? Locatietype { get; set; } = null!; + public string? Locatietype { get; set; } /// Duidt aan dat dit de primaire locatie is [DataMember] @@ -26,7 +24,6 @@ public class TeWijzigenLocatie /// Een beschrijvende naam voor de locatie [DataMember] - [NoHtml] public string? Naam { get; set; } /// De unieke identificator van het adres in een andere bron diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/TeWijzigenMaatschappelijkeZetel.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/TeWijzigenMaatschappelijkeZetel.cs index 5b0b7e6a9..056dce56a 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/TeWijzigenMaatschappelijkeZetel.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/TeWijzigenMaatschappelijkeZetel.cs @@ -1,7 +1,6 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Locaties.VerenigingMetRechtspersoonlijkheid.WijzigMaatschappelijkeZetel.RequestModels; using Acties.WijzigMaatschappelijkeZetel; -using Infrastructure.HtmlValidation; using System.Runtime.Serialization; [DataContract] @@ -13,7 +12,6 @@ public class TeWijzigenMaatschappelijkeZetel /// Een beschrijvende naam voor de locatie [DataMember] - [NoHtml] public string? Naam { get; set; } public static WijzigMaatschappelijkeZetelCommand.Locatie Map(TeWijzigenMaatschappelijkeZetel locatie, int locatieId) diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/TeWijzigenMaatschappelijkeZetelValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/TeWijzigenMaatschappelijkeZetelValidator.cs new file mode 100644 index 000000000..5d5354960 --- /dev/null +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/TeWijzigenMaatschappelijkeZetelValidator.cs @@ -0,0 +1,20 @@ +namespace AssociationRegistry.Admin.Api.Verenigingen.Locaties.VerenigingMetRechtspersoonlijkheid.WijzigMaatschappelijkeZetel.RequestModels; + +using FluentValidation; +using Infrastructure.Extensions; + +public class TeWijzigenMaatschappelijkeZetelValidator : AbstractValidator +{ + public TeWijzigenMaatschappelijkeZetelValidator() + { + RuleFor(request => request) + .Must(HaveAtLeastOneValue) + .WithMessage("'Locatie' moet ingevuld zijn."); + + RuleFor(maatschappelijkeZetel => maatschappelijkeZetel.Naam).MustNotContainHtml(); + } + + private bool HaveAtLeastOneValue(TeWijzigenMaatschappelijkeZetel locatie) + => locatie.IsPrimair is not null || + locatie.Naam is not null; +} diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/WijzigMaatschappelijkeZetelRequestValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/WijzigMaatschappelijkeZetelRequestValidator.cs similarity index 51% rename from src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/WijzigMaatschappelijkeZetelRequestValidator.cs rename to src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/WijzigMaatschappelijkeZetelRequestValidator.cs index 13ef419a6..52052936f 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/WijzigMaatschappelijkeZetelRequestValidator.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/WijzigMaatschappelijkeZetelRequestValidator.cs @@ -1,7 +1,6 @@ -namespace AssociationRegistry.Admin.Api.Verenigingen.Locaties.VerenigingMetRechtspersoonlijkheid.WijzigMaatschappelijkeZetel; +namespace AssociationRegistry.Admin.Api.Verenigingen.Locaties.VerenigingMetRechtspersoonlijkheid.WijzigMaatschappelijkeZetel.RequestModels; using FluentValidation; -using RequestModels; // ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract public class WijzigMaatschappelijkeZetelRequestValidator : AbstractValidator @@ -16,17 +15,3 @@ public WijzigMaatschappelijkeZetelRequestValidator() .SetValidator(new TeWijzigenMaatschappelijkeZetelValidator()); } } - -public class TeWijzigenMaatschappelijkeZetelValidator : AbstractValidator -{ - public TeWijzigenMaatschappelijkeZetelValidator() - { - RuleFor(request => request) - .Must(HaveAtLeastOneValue) - .WithMessage("'Locatie' moet ingevuld zijn."); - } - - private bool HaveAtLeastOneValue(TeWijzigenMaatschappelijkeZetel locatie) - => locatie.IsPrimair is not null || - locatie.Naam is not null; -} diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/Activiteit.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/Activiteit.cs index 582ac8fad..52bbd1804 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/Activiteit.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/Activiteit.cs @@ -1,7 +1,6 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer; using DuplicateVerenigingDetection; -using Infrastructure.HtmlValidation; using System.Runtime.Serialization; /// Een activiteit van een vereniging @@ -25,6 +24,5 @@ public static Activiteit FromDuplicaatVereniging(DuplicaatVereniging.Activiteit /// De categorie van deze activiteit [DataMember(Name = "Categorie")] - [NoHtml] public string Categorie { get; init; } } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/DuplicaatVerenigingContract.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/DuplicaatVerenigingContract.cs index d049860a2..0ed8bb961 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/DuplicaatVerenigingContract.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/DuplicaatVerenigingContract.cs @@ -1,6 +1,5 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer; -using Infrastructure.HtmlValidation; using System.Collections.Immutable; using System.Runtime.Serialization; @@ -27,15 +26,15 @@ public DuplicaatVerenigingContract( } /// De unieke identificatie code van deze vereniging - [DataMember(Name = "VCode")] [NoHtml] + [DataMember(Name = "VCode")] public string VCode { get; init; } /// Naam van de vereniging - [DataMember(Name = "Naam")] [NoHtml] + [DataMember(Name = "Naam")] public string Naam { get; init; } /// Korte naam van de vereniging - [DataMember(Name = "KorteNaam")] [NoHtml] + [DataMember(Name = "KorteNaam")] public string KorteNaam { get; init; } /// Type van de vereniging diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RequetsModels/RegistreerFeitelijkeVerenigingRequest.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RequetsModels/RegistreerFeitelijkeVerenigingRequest.cs index 73cb937fb..8d65272c4 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RequetsModels/RegistreerFeitelijkeVerenigingRequest.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RequetsModels/RegistreerFeitelijkeVerenigingRequest.cs @@ -2,7 +2,6 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer.FeitelijkeVereni using Acties.RegistreerFeitelijkeVereniging; using Common; -using Infrastructure.HtmlValidation; using System; using System.ComponentModel.DataAnnotations; using System.Linq; @@ -15,17 +14,14 @@ public class RegistreerFeitelijkeVerenigingRequest /// Naam van de vereniging [DataMember] [Required] - [NoHtml] public string Naam { get; set; } = null!; /// Korte naam van de vereniging [DataMember] - [NoHtml] public string? KorteNaam { get; set; } /// Korte beschrijving van de vereniging [DataMember] - [NoHtml] public string? KorteBeschrijving { get; set; } /// Datum waarop de vereniging gestart is. Deze datum mag niet later zijn dan vandaag @@ -58,7 +54,6 @@ public class RegistreerFeitelijkeVerenigingRequest /// De codes van de hoofdactivititeiten volgens het verenigingsloket [DataMember] - [NoHtml] public string[] HoofdactiviteitenVerenigingsloket { get; set; } = Array.Empty(); public RegistreerFeitelijkeVerenigingCommand ToCommand() diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RegistreerFeitelijkeVerenigingRequestValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RequetsModels/RegistreerFeitelijkeVerenigingRequestValidator.cs similarity index 84% rename from src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RegistreerFeitelijkeVerenigingRequestValidator.cs rename to src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RequetsModels/RegistreerFeitelijkeVerenigingRequestValidator.cs index 8ce1c5a85..0871985f5 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RegistreerFeitelijkeVerenigingRequestValidator.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/FeitelijkeVereniging/RequetsModels/RegistreerFeitelijkeVerenigingRequestValidator.cs @@ -1,12 +1,11 @@ // ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract -namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer.FeitelijkeVereniging; +namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer.FeitelijkeVereniging.RequetsModels; using Common; using FluentValidation; using Framework; -using Ganss.XSS; +using Infrastructure.Extensions; using Infrastructure.Validation; -using RequetsModels; using System; using System.Linq; using Vereniging.Exceptions; @@ -20,9 +19,10 @@ public RegistreerFeitelijkeVerenigingRequestValidator(IClock clock) _clock = clock; this.RequireNotNullOrEmpty(request => request.Naam); - RuleFor(request => request.Naam) - .Must(NotHaveHtmlMarkup) - .WithMessage("Er mogen geen HTML of JavaScript tags in de request opgenomen worden."); + RuleFor(request => request.Naam).MustNotContainHtml(); + RuleFor(request => request.KorteNaam).MustNotContainHtml(); + RuleFor(request => request.KorteBeschrijving).MustNotContainHtml(); + RuleForEach(request => request.HoofdactiviteitenVerenigingsloket).MustNotContainHtml(); RuleFor(request => request.Locaties) .Must(ToeTeVoegenLocatieValidator.NotHaveDuplicates) @@ -59,14 +59,6 @@ public RegistreerFeitelijkeVerenigingRequestValidator(IClock clock) .SetValidator(new ToeTeVoegenVertegenwoordigerValidator()); } - private bool NotHaveHtmlMarkup(string htmlCandidate) - { - var sanitizer = new HtmlSanitizer(); - var output = sanitizer.Sanitize(htmlCandidate); - - return htmlCandidate == output; - } - private bool BeTodayOrBefore(DateOnly? date) => _clock.Today >= date; diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/HoofdactiviteitVerenigingsloket.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/HoofdactiviteitVerenigingsloket.cs index ebaef694f..fbdfbebda 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/HoofdactiviteitVerenigingsloket.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/HoofdactiviteitVerenigingsloket.cs @@ -1,7 +1,6 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer; using DuplicateVerenigingDetection; -using Infrastructure.HtmlValidation; using System.Runtime.Serialization; [DataContract] @@ -21,11 +20,9 @@ public static HoofdactiviteitVerenigingsloket FromDuplicaatVereniging( /// De code van de hoofdactivititeit [DataMember(Name = "Code")] - [NoHtml] public string Code { get; init; } /// De beschrijving van de hoofdactivititeit [DataMember(Name = "Naam")] - [NoHtml] public string Naam { get; init; } } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/Locatie.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/Locatie.cs index 355db801f..fcaa1c589 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/Locatie.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/Locatie.cs @@ -1,7 +1,6 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer; using DuplicateVerenigingDetection; -using Infrastructure.HtmlValidation; using System.Runtime.Serialization; /// Een locatie van een vereniging @@ -29,7 +28,6 @@ public static Locatie FromDuplicaatVereniging(DuplicaatVereniging.Locatie locati /// Het soort locatie dat beschreven wordt [DataMember(Name = "Locatietype")] - [NoHtml] public string Locatietype { get; init; } /// Duidt aan dat dit de primaire locatie is @@ -38,21 +36,17 @@ public static Locatie FromDuplicaatVereniging(DuplicaatVereniging.Locatie locati /// Het samengestelde adres van de locatie [DataMember(Name = "Adresvoorstelling")] - [NoHtml] public string Adres { get; init; } /// Een beschrijvende naam voor de locatie [DataMember(Name = "Naam")] - [NoHtml] public string? Naam { get; init; } /// Het busnummer van de locatie [DataMember(Name = "Postcode")] - [NoHtml] public string Postcode { get; init; } /// De gemeente van de locatie [DataMember(Name = "Gemeente")] - [NoHtml] public string Gemeente { get; init; } } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/PotentialDuplicatesResponse.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/PotentialDuplicatesResponse.cs index 203e6534f..db474c74d 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/PotentialDuplicatesResponse.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/PotentialDuplicatesResponse.cs @@ -2,7 +2,6 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer; using DuplicateVerenigingDetection; using Infrastructure.ConfigurationBindings; -using Infrastructure.HtmlValidation; using System; using System.Collections.Immutable; using System.Linq; @@ -20,7 +19,6 @@ public PotentialDuplicatesResponse(string hashedRequest, PotentialDuplicatesFoun /// Dit token wordt gebruikt als bevestiging dat de vereniging uniek is en geregistreerd mag worden, /// ondanks de voorgestelde duplicaten. [DataMember(Name = "BevestigingsToken")] - [NoHtml] public string BevestigingsToken { get; init; } /// Een lijst van verenigingen die mogelijks een duplicaat zijn diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/VerenigingsType.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/VerenigingsType.cs index 75bcb4d79..f09f5f8f7 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/VerenigingsType.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Registreer/VerenigingsType.cs @@ -1,7 +1,6 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Registreer; using DuplicateVerenigingDetection; -using Infrastructure.HtmlValidation; using System.Runtime.Serialization; [DataContract] @@ -20,11 +19,9 @@ public static VerenigingsType FromDuplicaatVereniging(DuplicaatVereniging duplic /// De code van het type van deze vereniging [DataMember(Name = "Code")] - [NoHtml] public string Code { get; } /// De beschrijving van het type van deze vereniging [DataMember(Name = "Naam")] - [NoHtml] public string Naam { get; } } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Search/ResponseModels/HoofdactiviteitVerenigingsloket.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Search/ResponseModels/HoofdactiviteitVerenigingsloket.cs index d3c20f0f2..ffe514d1b 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Search/ResponseModels/HoofdactiviteitVerenigingsloket.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Search/ResponseModels/HoofdactiviteitVerenigingsloket.cs @@ -1,6 +1,5 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Search.ResponseModels; -using Infrastructure.HtmlValidation; using System.Runtime.Serialization; [DataContract] @@ -10,13 +9,11 @@ public class HoofdactiviteitVerenigingsloket /// De verkorte code van de hoofdactiviteit /// [DataMember] - [NoHtml] public string Code { get; set; } = null!; /// /// De volledige beschrijving van de hoofdactiviteit /// [DataMember] - [NoHtml] public string Naam { get; set; } = null!; } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Search/ResponseModels/VerenigingsType.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Search/ResponseModels/VerenigingsType.cs index 0bdb522ef..a3753efbc 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Search/ResponseModels/VerenigingsType.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Search/ResponseModels/VerenigingsType.cs @@ -1,6 +1,5 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Search.ResponseModels; -using Infrastructure.HtmlValidation; using System.Runtime.Serialization; [DataContract] @@ -10,13 +9,11 @@ public class VerenigingsType /// De code van het type vereniging /// [DataMember] - [NoHtml] public string Code { get; set; } = null!; /// /// De beschrijving van het type vereniging /// [DataMember] - [NoHtml] public string Naam { get; set; } = null!; } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Vertegenwoordigers/FeitelijkeVereniging/WijzigVertegenwoordiger/RequestModels/TeWijzigenVertegenwoordiger.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Vertegenwoordigers/FeitelijkeVereniging/WijzigVertegenwoordiger/RequestModels/TeWijzigenVertegenwoordiger.cs index 5a47c1c4b..250d641af 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Vertegenwoordigers/FeitelijkeVereniging/WijzigVertegenwoordiger/RequestModels/TeWijzigenVertegenwoordiger.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Vertegenwoordigers/FeitelijkeVereniging/WijzigVertegenwoordiger/RequestModels/TeWijzigenVertegenwoordiger.cs @@ -1,6 +1,5 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.Vertegenwoordigers.FeitelijkeVereniging.WijzigVertegenwoordiger.RequestModels; -using Infrastructure.HtmlValidation; using System.Runtime.Serialization; /// De te wijzigen vertegenwoordiger @@ -9,12 +8,10 @@ public class TeWijzigenVertegenwoordiger { /// Dit is de rol van de vertegenwoordiger binnen de vereniging [DataMember] - [NoHtml] public string? Rol { get; set; } /// Dit is de roepnaam van de vertegenwoordiger [DataMember] - [NoHtml] public string? Roepnaam { get; set; } /// @@ -25,21 +22,17 @@ public class TeWijzigenVertegenwoordiger /// Het e-mailadres van de vertegenwoordiger [DataMember(Name = "E-mail")] - [NoHtml] public string? Email { get; set; } /// Het telefoonnummer van de vertegenwoordiger [DataMember] - [NoHtml] public string? Telefoon { get; set; } /// Het mobiel nummer van de vertegenwoordiger [DataMember] - [NoHtml] public string? Mobiel { get; set; } /// Het socialmedia account van de vertegenwoordiger [DataMember] - [NoHtml] public string? SocialMedia { get; set; } } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Vertegenwoordigers/FeitelijkeVereniging/WijzigVertegenwoordiger/RequestModels/TeWijzigenVertegenwoordigerValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Vertegenwoordigers/FeitelijkeVereniging/WijzigVertegenwoordiger/RequestModels/TeWijzigenVertegenwoordigerValidator.cs new file mode 100644 index 000000000..712b3ae93 --- /dev/null +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Vertegenwoordigers/FeitelijkeVereniging/WijzigVertegenwoordiger/RequestModels/TeWijzigenVertegenwoordigerValidator.cs @@ -0,0 +1,16 @@ +namespace AssociationRegistry.Admin.Api.Verenigingen.Vertegenwoordigers.FeitelijkeVereniging.WijzigVertegenwoordiger.RequestModels; + +using FluentValidation; +using Infrastructure.Extensions; + +public class TeWijzigenVertegenwoordigerValidator : AbstractValidator +{ + public TeWijzigenVertegenwoordigerValidator() + { + RuleFor(vertegenwoordiger => vertegenwoordiger.Email).MustNotContainHtml(); + RuleFor(vertegenwoordiger => vertegenwoordiger.Mobiel).MustNotContainHtml(); + RuleFor(vertegenwoordiger => vertegenwoordiger.SocialMedia).MustNotContainHtml(); + RuleFor(vertegenwoordiger => vertegenwoordiger.Roepnaam).MustNotContainHtml(); + RuleFor(vertegenwoordiger => vertegenwoordiger.Rol).MustNotContainHtml(); + } +} diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/RequestModels/WijzigBasisgegevensRequest.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/RequestModels/WijzigBasisgegevensRequest.cs index bcbf0a642..3a76f937a 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/RequestModels/WijzigBasisgegevensRequest.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/RequestModels/WijzigBasisgegevensRequest.cs @@ -2,7 +2,6 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.Feiteli using Acties.WijzigBasisgegevens; using Common; -using Infrastructure.HtmlValidation; using Primitives; using System; using System.Linq; @@ -14,17 +13,14 @@ public class WijzigBasisgegevensRequest { /// Nieuwe naam van de vereniging [DataMember] - [NoHtml] public string? Naam { get; set; } /// Nieuwe korte naam van de vereniging [DataMember] - [NoHtml] public string? KorteNaam { get; set; } /// Nieuwe korte beschrijving van de vereniging [DataMember] - [NoHtml] public string? KorteBeschrijving { get; set; } /// Nieuwe startdatum van de vereniging. Deze datum mag niet later zijn dan vandaag @@ -41,7 +37,6 @@ public class WijzigBasisgegevensRequest /// De codes van de nieuwe hoofdactiviteiten volgens het verenigingsloket /// [DataMember] - [NoHtml] public string[]? HoofdactiviteitenVerenigingsloket { get; set; } /// diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/WijzigBasisgegevensRequestValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/RequestModels/WijzigBasisgegevensRequestValidator.cs similarity index 81% rename from src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/WijzigBasisgegevensRequestValidator.cs rename to src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/RequestModels/WijzigBasisgegevensRequestValidator.cs index f6059fc3b..1e8df20d9 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/WijzigBasisgegevensRequestValidator.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/RequestModels/WijzigBasisgegevensRequestValidator.cs @@ -1,10 +1,10 @@ // ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract -namespace AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.FeitelijkeVereniging; +namespace AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.FeitelijkeVereniging.RequestModels; -using System.Linq; using Common; using FluentValidation; -using RequestModels; +using Infrastructure.Extensions; +using System.Linq; public class WijzigBasisgegevensRequestValidator : AbstractValidator { @@ -15,6 +15,11 @@ public WijzigBasisgegevensRequestValidator() .OverridePropertyName("request") .WithMessage("Een request mag niet leeg zijn."); + RuleFor(request => request.Naam).MustNotContainHtml(); + RuleFor(request => request.KorteNaam).MustNotContainHtml(); + RuleFor(request => request.KorteBeschrijving).MustNotContainHtml(); + RuleForEach(request => request.HoofdactiviteitenVerenigingsloket).MustNotContainHtml(); + RuleFor(request => request.Naam) .Must(naam => naam?.Trim() is null or not "") .WithMessage("'Naam' mag niet leeg zijn."); diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/RequestModels/WijzigBasisgegevensRequest.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/RequestModels/WijzigBasisgegevensRequest.cs index 54be5d241..569cdf3bb 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/RequestModels/WijzigBasisgegevensRequest.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/RequestModels/WijzigBasisgegevensRequest.cs @@ -1,10 +1,9 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.MetRechtspersoonlijkheid.RequestModels; +using Acties.VerenigingMetRechtspersoonlijkheid.WijzigBasisgegevens; +using Common; using System.Linq; using System.Runtime.Serialization; -using AssociationRegistry.Acties.VerenigingMetRechtspersoonlijkheid.WijzigBasisgegevens; -using Common; -using Infrastructure.HtmlValidation; using Vereniging; [DataContract] @@ -12,7 +11,6 @@ public class WijzigBasisgegevensRequest { /// Nieuwe korte beschrijving van de vereniging [DataMember] - [NoHtml] public string? KorteBeschrijving { get; set; } /// @@ -25,14 +23,12 @@ public class WijzigBasisgegevensRequest /// De codes van de nieuwe hoofdactiviteiten volgens het verenigingsloket /// [DataMember] - [NoHtml] public string[]? HoofdactiviteitenVerenigingsloket { get; set; } /// /// De nieuwe roepnaam van de vereniging /// [DataMember] - [NoHtml] public string? Roepnaam { get; set; } public WijzigBasisgegevensCommand ToCommand(string vCode) diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/WijzigBasisgegevensRequestValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/RequestModels/WijzigBasisgegevensRequestValidator.cs similarity index 81% rename from src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/WijzigBasisgegevensRequestValidator.cs rename to src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/RequestModels/WijzigBasisgegevensRequestValidator.cs index f0cce7d97..61a10f89b 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/WijzigBasisgegevensRequestValidator.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/RequestModels/WijzigBasisgegevensRequestValidator.cs @@ -1,9 +1,9 @@ // ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract -namespace AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.MetRechtspersoonlijkheid; +namespace AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.MetRechtspersoonlijkheid.RequestModels; using Common; using FluentValidation; -using RequestModels; +using Infrastructure.Extensions; using System.Linq; public class WijzigBasisgegevensRequestValidator : AbstractValidator @@ -15,6 +15,10 @@ public WijzigBasisgegevensRequestValidator() .OverridePropertyName("request") .WithMessage("Een request mag niet leeg zijn."); + RuleFor(request => request.Roepnaam).MustNotContainHtml(); + RuleFor(request => request.KorteBeschrijving).MustNotContainHtml(); + RuleForEach(request => request.HoofdactiviteitenVerenigingsloket).MustNotContainHtml(); + RuleFor(request => request.HoofdactiviteitenVerenigingsloket) .Must(NotHaveDuplicates!) .WithMessage("Elke waarde in de hoofdactiviteiten mag slechts 1 maal voorkomen.") diff --git a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/RequestHandling/With_A_Null_Request.cs b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/RequestHandling/With_A_Null_Request.cs index 8b49afbf7..5ce44ef4d 100644 --- a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/RequestHandling/With_A_Null_Request.cs +++ b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/RequestHandling/With_A_Null_Request.cs @@ -1,9 +1,9 @@ namespace AssociationRegistry.Test.Admin.Api.FeitelijkeVereniging.When_RegistreerFeitelijkeVereniging.RequestHandling; -using AssociationRegistry.Admin.Api.Infrastructure; using AssociationRegistry.Admin.Api.Infrastructure.ConfigurationBindings; using AssociationRegistry.Admin.Api.Infrastructure.ExceptionHandlers; using AssociationRegistry.Admin.Api.Verenigingen.Registreer.FeitelijkeVereniging; +using AssociationRegistry.Admin.Api.Verenigingen.Registreer.FeitelijkeVereniging.RequetsModels; using Fakes; using Framework; using Xunit; @@ -17,13 +17,16 @@ public class With_A_Null_Request public With_A_Null_Request() { var messageBusMock = new MessageBusMock(); - _controller = new RegistreerFeitelijkeVerenigingController(messageBusMock, new RegistreerFeitelijkeVerenigingRequestValidator(new ClockStub(DateOnly.MaxValue)), new AppSettings()); + + _controller = new RegistreerFeitelijkeVerenigingController(messageBusMock, + new RegistreerFeitelijkeVerenigingRequestValidator( + new ClockStub(DateOnly.MaxValue)), new AppSettings()); } [Fact] public async Task Then_it_throws_a_CouldNotParseRequestException() { await Assert.ThrowsAsync( - async () => await _controller.Post(request: null, new CommandMetadataProviderStub { Initiator= "OVO000001" }, string.Empty)); + async () => await _controller.Post(request: null, new CommandMetadataProviderStub { Initiator = "OVO000001" }, string.Empty)); } } diff --git a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/RequestValidating/A_Doelgroep.cs b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/RequestValidating/A_Doelgroep.cs index ae6acabd4..a584f707d 100644 --- a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/RequestValidating/A_Doelgroep.cs +++ b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/RequestValidating/A_Doelgroep.cs @@ -1,7 +1,7 @@ namespace AssociationRegistry.Test.Admin.Api.FeitelijkeVereniging.When_RegistreerFeitelijkeVereniging.RequestValidating; using AssociationRegistry.Admin.Api.Verenigingen.Common; -using AssociationRegistry.Admin.Api.Verenigingen.Registreer.FeitelijkeVereniging; +using AssociationRegistry.Admin.Api.Verenigingen.Registreer.FeitelijkeVereniging.RequetsModels; using FluentValidation.TestHelper; using Test.Framework; using Xunit; @@ -15,6 +15,6 @@ public void Uses_DoelgroepValidator() { var validator = new RegistreerFeitelijkeVerenigingRequestValidator(new ClockStub(DateOnly.MaxValue)); - validator.ShouldHaveChildValidator(request => request.Doelgroep, typeof(DoelgroepRequestValidator)); + validator.ShouldHaveChildValidator(expression: request => request.Doelgroep, typeof(DoelgroepRequestValidator)); } } diff --git a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs index 9e7661e7d..fd422ca82 100644 --- a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs +++ b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_RegistreerFeitelijkeVereniging/With_Html_Fields.cs @@ -21,25 +21,7 @@ public IEnumerator GetEnumerator() var autoFixture = new Fixture().CustomizeAdminApi(); var request1 = autoFixture.Create(); - - // request1.Naam = $"

{autoFixture.Create()}

"; - request1.Contactgegevens = new ToeTeVoegenContactgegeven[] - { - new() - { - Beschrijving = $"

{autoFixture.Create()}

", - Contactgegeventype = "Mumbo Jumbo", - Waarde = "Test", - IsPrimair = false, - }, - new() - { - Beschrijving = $"

{autoFixture.Create()}

", - Contactgegeventype = $"

{autoFixture.Create()}

", - Waarde = "Test", - IsPrimair = false, - }, - }; + request1.Naam = $"

{autoFixture.Create()}

"; yield return new object[] { request1 }; @@ -51,14 +33,18 @@ public IEnumerator GetEnumerator() var request3 = autoFixture.Create(); request3.KorteNaam = "Click here"; + yield return new object[] { request3 }; + var request4 = autoFixture.Create(); var contactgegeven = autoFixture.Create(); + contactgegeven.Beschrijving = "
";
+        contactgegeven.Beschrijving = $"

{autoFixture.Create()}

"; + contactgegeven.Waarde = "Test"; + request4.Contactgegevens = request4.Contactgegevens.Append(contactgegeven).ToArray(); yield return new object[] { request4 }; - - yield return new object[] { request3 }; } IEnumerator IEnumerable.GetEnumerator() @@ -83,8 +69,11 @@ public async Task Then_it_returns_a_bad_request_response(RegistreerFeitelijkeVer { var response = await _fixture.DefaultClient.RegistreerFeitelijkeVereniging(GetJsonBody(request)); response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + var body = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); - body.ValidationErrors.Should().ContainKey(ExceptionMessages.UnsupportedContent); // TODO: OF EEN ANDER VELD + + body.HttpStatus.Should().Be(400); + body.Detail.Should().ContainAny("Validatie mislukt!"); } private string GetJsonBody(RegistreerFeitelijkeVerenigingRequest request) diff --git a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_WijzigBasisGegevens/RequestHandling/With_Null_Request.cs b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_WijzigBasisGegevens/RequestHandling/With_Null_Request.cs index b480a0cdf..173aca036 100644 --- a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_WijzigBasisGegevens/RequestHandling/With_Null_Request.cs +++ b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_WijzigBasisGegevens/RequestHandling/With_Null_Request.cs @@ -1,9 +1,9 @@ namespace AssociationRegistry.Test.Admin.Api.FeitelijkeVereniging.When_WijzigBasisGegevens.RequestHandling; -using AssociationRegistry.Admin.Api.Infrastructure; using AssociationRegistry.Admin.Api.Infrastructure.ConfigurationBindings; using AssociationRegistry.Admin.Api.Infrastructure.ExceptionHandlers; using AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.FeitelijkeVereniging; +using AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.FeitelijkeVereniging.RequestModels; using Fakes; using Framework; using Xunit; @@ -26,9 +26,9 @@ public async Task Then_it_throws_a_CouldNotParseRequestException() await Assert.ThrowsAsync( async () => await _controller.Patch( new WijzigBasisgegevensRequestValidator(), - null, - "V0001001", - new CommandMetadataProviderStub { Initiator = "OVO0001001"}, - "M/\"1\"")); + request: null, + vCode: "V0001001", + new CommandMetadataProviderStub { Initiator = "OVO0001001" }, + ifMatch: "M/\"1\"")); } } diff --git a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_WijzigBasisGegevens/RequestValidating/A_Doelgroep.cs b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_WijzigBasisGegevens/RequestValidating/A_Doelgroep.cs index 61bb3b1a2..690393679 100644 --- a/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_WijzigBasisGegevens/RequestValidating/A_Doelgroep.cs +++ b/test/AssociationRegistry.Test.Admin.Api/FeitelijkeVereniging/When_WijzigBasisGegevens/RequestValidating/A_Doelgroep.cs @@ -1,7 +1,7 @@ namespace AssociationRegistry.Test.Admin.Api.FeitelijkeVereniging.When_WijzigBasisGegevens.RequestValidating; using AssociationRegistry.Admin.Api.Verenigingen.Common; -using AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.FeitelijkeVereniging; +using AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.FeitelijkeVereniging.RequestModels; using FluentValidation.TestHelper; using Xunit; using Xunit.Categories; @@ -14,6 +14,6 @@ public void Uses_DoelgroepValidator() { var validator = new WijzigBasisgegevensRequestValidator(); - validator.ShouldHaveChildValidator(request => request.Doelgroep, typeof(DoelgroepRequestValidator)); + validator.ShouldHaveChildValidator(expression: request => request.Doelgroep, typeof(DoelgroepRequestValidator)); } } diff --git a/test/AssociationRegistry.Test.Admin.Api/VerenigingMetRechtspersoonlijkheid/When_WijzigBasisGegevens/RequestHandling/With_Null_Request.cs b/test/AssociationRegistry.Test.Admin.Api/VerenigingMetRechtspersoonlijkheid/When_WijzigBasisGegevens/RequestHandling/With_Null_Request.cs index e87cf0aca..e2579a594 100644 --- a/test/AssociationRegistry.Test.Admin.Api/VerenigingMetRechtspersoonlijkheid/When_WijzigBasisGegevens/RequestHandling/With_Null_Request.cs +++ b/test/AssociationRegistry.Test.Admin.Api/VerenigingMetRechtspersoonlijkheid/When_WijzigBasisGegevens/RequestHandling/With_Null_Request.cs @@ -1,9 +1,9 @@ namespace AssociationRegistry.Test.Admin.Api.VerenigingMetRechtspersoonlijkheid.When_WijzigBasisGegevens.RequestHandling; -using AssociationRegistry.Admin.Api.Infrastructure; using AssociationRegistry.Admin.Api.Infrastructure.ConfigurationBindings; using AssociationRegistry.Admin.Api.Infrastructure.ExceptionHandlers; using AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.MetRechtspersoonlijkheid; +using AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.MetRechtspersoonlijkheid.RequestModels; using Fakes; using Framework; using Xunit; @@ -26,9 +26,9 @@ public async Task Then_it_throws_a_CouldNotParseRequestException() await Assert.ThrowsAsync( async () => await _controller.Patch( new WijzigBasisgegevensRequestValidator(), - null, - "V0001001", - new CommandMetadataProviderStub { Initiator= "OVO000001" }, - "M/\"1\"")); + request: null, + vCode: "V0001001", + new CommandMetadataProviderStub { Initiator = "OVO000001" }, + ifMatch: "M/\"1\"")); } } diff --git a/test/AssociationRegistry.Test.Admin.Api/VerenigingMetRechtspersoonlijkheid/When_WijzigBasisGegevens/RequestValidating/A_Doelgroep.cs b/test/AssociationRegistry.Test.Admin.Api/VerenigingMetRechtspersoonlijkheid/When_WijzigBasisGegevens/RequestValidating/A_Doelgroep.cs index 44b9e75ab..be744daa7 100644 --- a/test/AssociationRegistry.Test.Admin.Api/VerenigingMetRechtspersoonlijkheid/When_WijzigBasisGegevens/RequestValidating/A_Doelgroep.cs +++ b/test/AssociationRegistry.Test.Admin.Api/VerenigingMetRechtspersoonlijkheid/When_WijzigBasisGegevens/RequestValidating/A_Doelgroep.cs @@ -1,7 +1,7 @@ namespace AssociationRegistry.Test.Admin.Api.VerenigingMetRechtspersoonlijkheid.When_WijzigBasisGegevens.RequestValidating; using AssociationRegistry.Admin.Api.Verenigingen.Common; -using AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.MetRechtspersoonlijkheid; +using AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.MetRechtspersoonlijkheid.RequestModels; using FluentValidation.TestHelper; using Xunit; using Xunit.Categories; @@ -14,6 +14,6 @@ public void Uses_DoelgroepValidator() { var validator = new WijzigBasisgegevensRequestValidator(); - validator.ShouldHaveChildValidator(request => request.Doelgroep, typeof(DoelgroepRequestValidator)); + validator.ShouldHaveChildValidator(expression: request => request.Doelgroep, typeof(DoelgroepRequestValidator)); } } diff --git a/test/AssociationRegistry.Test.Admin.Api/VerenigingMetRechtspersoonlijkheid/When_Wijzig_MaatschappelijkeZetel/RequestHandling/With_Null_Request.cs b/test/AssociationRegistry.Test.Admin.Api/VerenigingMetRechtspersoonlijkheid/When_Wijzig_MaatschappelijkeZetel/RequestHandling/With_Null_Request.cs index 9188a405c..55cd621b2 100644 --- a/test/AssociationRegistry.Test.Admin.Api/VerenigingMetRechtspersoonlijkheid/When_Wijzig_MaatschappelijkeZetel/RequestHandling/With_Null_Request.cs +++ b/test/AssociationRegistry.Test.Admin.Api/VerenigingMetRechtspersoonlijkheid/When_Wijzig_MaatschappelijkeZetel/RequestHandling/With_Null_Request.cs @@ -1,9 +1,9 @@ namespace AssociationRegistry.Test.Admin.Api.VerenigingMetRechtspersoonlijkheid.When_Wijzig_MaatschappelijkeZetel.RequestHandling; -using AssociationRegistry.Admin.Api.Infrastructure; using AssociationRegistry.Admin.Api.Infrastructure.ConfigurationBindings; using AssociationRegistry.Admin.Api.Infrastructure.ExceptionHandlers; using AssociationRegistry.Admin.Api.Verenigingen.Locaties.VerenigingMetRechtspersoonlijkheid.WijzigMaatschappelijkeZetel; +using AssociationRegistry.Admin.Api.Verenigingen.Locaties.VerenigingMetRechtspersoonlijkheid.WijzigMaatschappelijkeZetel.RequestModels; using Fakes; using Framework; using Xunit; @@ -17,7 +17,9 @@ public class With_Null_Request public With_Null_Request() { var messageBusMock = new MessageBusMock(); - _controller = new WijzigMaatschappelijkeZetelController(messageBusMock, new WijzigMaatschappelijkeZetelRequestValidator(),new AppSettings()); + + _controller = new WijzigMaatschappelijkeZetelController(messageBusMock, new WijzigMaatschappelijkeZetelRequestValidator(), + new AppSettings()); } [Fact] @@ -25,10 +27,10 @@ public async Task Then_it_throws_a_CouldNotParseRequestException() { await Assert.ThrowsAsync( async () => await _controller.Patch( - "V0001001", - 1, - null, + vCode: "V0001001", + locatieId: 1, + request: null, new CommandMetadataProviderStub { Initiator = "OVO000001" }, - "M/\"1\"")); + ifMatch: "M/\"1\"")); } } diff --git a/test/AssociationRegistry.Test.Admin.Api/VerenigingMetRechtspersoonlijkheid/When_Wijzig_MaatschappelijkeZetel/RequestValidating/With_A_Locatie.cs b/test/AssociationRegistry.Test.Admin.Api/VerenigingMetRechtspersoonlijkheid/When_Wijzig_MaatschappelijkeZetel/RequestValidating/With_A_Locatie.cs index 73f907bd0..7429fb15a 100644 --- a/test/AssociationRegistry.Test.Admin.Api/VerenigingMetRechtspersoonlijkheid/When_Wijzig_MaatschappelijkeZetel/RequestValidating/With_A_Locatie.cs +++ b/test/AssociationRegistry.Test.Admin.Api/VerenigingMetRechtspersoonlijkheid/When_Wijzig_MaatschappelijkeZetel/RequestValidating/With_A_Locatie.cs @@ -1,8 +1,8 @@ namespace AssociationRegistry.Test.Admin.Api.VerenigingMetRechtspersoonlijkheid.When_Wijzig_MaatschappelijkeZetel.RequestValidating; -using AssociationRegistry.Admin.Api.Verenigingen.Locaties.VerenigingMetRechtspersoonlijkheid.WijzigMaatschappelijkeZetel; -using Framework; +using AssociationRegistry.Admin.Api.Verenigingen.Locaties.VerenigingMetRechtspersoonlijkheid.WijzigMaatschappelijkeZetel.RequestModels; using FluentValidation.TestHelper; +using Framework; using Xunit; using Xunit.Categories; @@ -13,6 +13,6 @@ public class With_A_Locatie : ValidatorTest public void Uses_TeWijzigenMaatschappelijkeZetelValidator() { var validator = new WijzigMaatschappelijkeZetelRequestValidator(); - validator.ShouldHaveChildValidator(request => request.Locatie, typeof(TeWijzigenMaatschappelijkeZetelValidator)); + validator.ShouldHaveChildValidator(expression: request => request.Locatie, typeof(TeWijzigenMaatschappelijkeZetelValidator)); } } From 7b4711e1684244ad83a3906e5b9e5dc8e23cd6d7 Mon Sep 17 00:00:00 2001 From: Quinten Van Assche Date: Thu, 11 Jan 2024 11:41:39 +0100 Subject: [PATCH 11/11] feat: or-2035 remove HtmlSanitizer --- AssociationRegistry.sln | 1 - paket.dependencies | 2 -- paket.lock | 10 +--------- .../Extensions/FluentValidatorExtensions.cs | 7 ------- .../Infrastructure/Validation/ValidatorHelpers.cs | 11 +++++++++++ .../TeWijzigenMaatschappelijkeZetelValidator.cs | 1 + .../TeWijzigenVertegenwoordigerValidator.cs | 1 + .../WijzigBasisgegevensRequestValidator.cs | 1 + .../WijzigBasisgegevensRequestValidator.cs | 1 + src/AssociationRegistry.Admin.Api/paket.references | 1 - test/AssociationRegistry.Test/paket.references | 1 - 11 files changed, 16 insertions(+), 21 deletions(-) diff --git a/AssociationRegistry.sln b/AssociationRegistry.sln index 0ea4a85fe..759113309 100644 --- a/AssociationRegistry.sln +++ b/AssociationRegistry.sln @@ -12,7 +12,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Solution Items", ".Solutio build.fsx = build.fsx global.json = global.json paket.dependencies = paket.dependencies - paket.lock = paket.lock SolutionInfo.cs = SolutionInfo.cs .gitignore = .gitignore package.json = package.json diff --git a/paket.dependencies b/paket.dependencies index 66d3e7548..b2a48b05b 100644 --- a/paket.dependencies +++ b/paket.dependencies @@ -54,7 +54,6 @@ nuget Be.Vlaanderen.Basisregisters.DataDog.Tracing.Sql 5.0.0 nuget Be.Vlaanderen.Basisregisters.DataDog.Tracing.SqlStreamStore 5.0.0 nuget Destructurama.JsonNet 2.0.0 -nuget HtmlSanitizer // FIX SWASHBUCKLE ASSEMBLY VERSION MISMATCH nuget Swashbuckle.AspNetCore.SwaggerGen 6.3.0 @@ -135,4 +134,3 @@ group Testing nuget Microsoft.Extensions.DependencyInjection 6.0.0 nuget System.Collections.Immutable ~> 7.0 - diff --git a/paket.lock b/paket.lock index 0d82af3e5..9c8e67fda 100644 --- a/paket.lock +++ b/paket.lock @@ -1,11 +1,6 @@ RESTRICTION: || (== net472) (== net6.0) NUGET remote: https://api.nuget.org/v3/index.json - AngleSharp (0.16.1) - System.Buffers (>= 4.5.1) - System.Text.Encoding.CodePages (>= 5.0) - AngleSharp.Css (0.16.1) - AngleSharp (>= 0.16) AspNetCore.HealthChecks.SqlServer (6.0.2) Microsoft.Data.SqlClient (>= 3.0.1) Microsoft.Extensions.Diagnostics.HealthChecks (>= 6.0) @@ -469,9 +464,6 @@ NUGET Microsoft.Extensions.Logging.Abstractions (>= 3.0.3) Grpc.Net.Common (2.50) - restriction: || (&& (== net472) (>= netstandard2.1)) (== net6.0) Grpc.Core.Api (>= 2.50) - HtmlSanitizer (6.0.453) - AngleSharp (0.16.1) - AngleSharp.Css (0.16.1) Humanizer.Core (2.14.1) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) IdentityModel (6.0) - restriction: || (&& (== net472) (>= netcoreapp3.1)) (== net6.0) IdentityModel.AspNetCore.OAuth2Introspection (6.0) @@ -1423,7 +1415,7 @@ NUGET Microsoft.NETCore.Platforms (>= 1.1) - restriction: || (&& (== net472) (< net45)) (== net6.0) Microsoft.NETCore.Targets (>= 1.1) - restriction: || (&& (== net472) (< net45)) (== net6.0) System.Runtime (>= 4.3) - restriction: || (&& (== net472) (< net45)) (== net6.0) - System.Text.Encoding.CodePages (6.0) + System.Text.Encoding.CodePages (6.0) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) System.Runtime.CompilerServices.Unsafe (>= 6.0) System.Text.Encoding.Extensions (4.3) - restriction: || (&& (== net472) (>= net6.0)) (== net6.0) Microsoft.NETCore.Platforms (>= 1.1) - restriction: || (&& (== net472) (< net45)) (== net6.0) diff --git a/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs b/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs index 78be09686..e39550e24 100644 --- a/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs +++ b/src/AssociationRegistry.Admin.Api/Infrastructure/Extensions/FluentValidatorExtensions.cs @@ -19,12 +19,5 @@ public static async Task NullValidateAndThrowAsync( await validator.ValidateAndThrowAsync(instance, cancellationToken); } - public static IRuleBuilder MustNotContainHtml(this IRuleBuilder ruleBuilder) - => ruleBuilder - .Must(NotContainHtml) - .WithErrorCode(StatusCodes.Status400BadRequest.ToString()) - .WithMessage(ExceptionMessages.UnsupportedContent); - private static bool NotContainHtml(string? propertyValue) - => propertyValue is null ? true : !Regex.IsMatch(propertyValue, pattern: "<.*?>"); } diff --git a/src/AssociationRegistry.Admin.Api/Infrastructure/Validation/ValidatorHelpers.cs b/src/AssociationRegistry.Admin.Api/Infrastructure/Validation/ValidatorHelpers.cs index 6125d5ee0..e443979a0 100644 --- a/src/AssociationRegistry.Admin.Api/Infrastructure/Validation/ValidatorHelpers.cs +++ b/src/AssociationRegistry.Admin.Api/Infrastructure/Validation/ValidatorHelpers.cs @@ -4,6 +4,8 @@ namespace AssociationRegistry.Admin.Api.Infrastructure.Validation; using System.Linq.Expressions; using FluentValidation; using FluentValidation.Internal; +using Microsoft.AspNetCore.Http; +using System.Text.RegularExpressions; public static class ValidatorHelpers { @@ -35,4 +37,13 @@ public static void RequireValidKboNummer(this AbstractValidator validator, .WithMessage($"'{expression.GetMember().Name}' moet 10 cijfers bevatten.") .When(request => !string.IsNullOrEmpty(expression.Compile().Invoke(request))); } + + public static IRuleBuilder MustNotContainHtml(this IRuleBuilder ruleBuilder) + => ruleBuilder + .Must(NotContainHtml) + .WithErrorCode(StatusCodes.Status400BadRequest.ToString()) + .WithMessage(ExceptionMessages.UnsupportedContent); + + private static bool NotContainHtml(string? propertyValue) + => propertyValue is null || !Regex.IsMatch(propertyValue, pattern: "<.*?>"); } diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/TeWijzigenMaatschappelijkeZetelValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/TeWijzigenMaatschappelijkeZetelValidator.cs index 5d5354960..aeaec92fb 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/TeWijzigenMaatschappelijkeZetelValidator.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Locaties/VerenigingMetRechtspersoonlijkheid/WijzigMaatschappelijkeZetel/RequestModels/TeWijzigenMaatschappelijkeZetelValidator.cs @@ -2,6 +2,7 @@ using FluentValidation; using Infrastructure.Extensions; +using Infrastructure.Validation; public class TeWijzigenMaatschappelijkeZetelValidator : AbstractValidator { diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/Vertegenwoordigers/FeitelijkeVereniging/WijzigVertegenwoordiger/RequestModels/TeWijzigenVertegenwoordigerValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/Vertegenwoordigers/FeitelijkeVereniging/WijzigVertegenwoordiger/RequestModels/TeWijzigenVertegenwoordigerValidator.cs index 712b3ae93..ba4c0ea3d 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/Vertegenwoordigers/FeitelijkeVereniging/WijzigVertegenwoordiger/RequestModels/TeWijzigenVertegenwoordigerValidator.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/Vertegenwoordigers/FeitelijkeVereniging/WijzigVertegenwoordiger/RequestModels/TeWijzigenVertegenwoordigerValidator.cs @@ -2,6 +2,7 @@ using FluentValidation; using Infrastructure.Extensions; +using Infrastructure.Validation; public class TeWijzigenVertegenwoordigerValidator : AbstractValidator { diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/RequestModels/WijzigBasisgegevensRequestValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/RequestModels/WijzigBasisgegevensRequestValidator.cs index 1e8df20d9..17d6cfb59 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/RequestModels/WijzigBasisgegevensRequestValidator.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/FeitelijkeVereniging/RequestModels/WijzigBasisgegevensRequestValidator.cs @@ -4,6 +4,7 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.Feiteli using Common; using FluentValidation; using Infrastructure.Extensions; +using Infrastructure.Validation; using System.Linq; public class WijzigBasisgegevensRequestValidator : AbstractValidator diff --git a/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/RequestModels/WijzigBasisgegevensRequestValidator.cs b/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/RequestModels/WijzigBasisgegevensRequestValidator.cs index 61a10f89b..80f4d8d02 100644 --- a/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/RequestModels/WijzigBasisgegevensRequestValidator.cs +++ b/src/AssociationRegistry.Admin.Api/Verenigingen/WijzigBasisgegevens/MetRechtspersoonlijkheid/RequestModels/WijzigBasisgegevensRequestValidator.cs @@ -4,6 +4,7 @@ namespace AssociationRegistry.Admin.Api.Verenigingen.WijzigBasisgegevens.MetRech using Common; using FluentValidation; using Infrastructure.Extensions; +using Infrastructure.Validation; using System.Linq; public class WijzigBasisgegevensRequestValidator : AbstractValidator diff --git a/src/AssociationRegistry.Admin.Api/paket.references b/src/AssociationRegistry.Admin.Api/paket.references index 114262a4b..2792d32c9 100755 --- a/src/AssociationRegistry.Admin.Api/paket.references +++ b/src/AssociationRegistry.Admin.Api/paket.references @@ -5,7 +5,6 @@ Be.Vlaanderen.Basisregisters.DataDog.Tracing.Autofac Be.Vlaanderen.Basisregisters.BlobStore AspNetCore.HealthChecks.SqlServer -HtmlSanitizer IdentityModel.AspNetCore.OAuth2Introspection Marten Marten.CommandLine diff --git a/test/AssociationRegistry.Test/paket.references b/test/AssociationRegistry.Test/paket.references index 3865410b4..ab209e49d 100644 --- a/test/AssociationRegistry.Test/paket.references +++ b/test/AssociationRegistry.Test/paket.references @@ -6,7 +6,6 @@ Be.Vlaanderen.Basisregisters.EventHandling.Autofac AutoFixture FluentAssertions FluentAssertions.Json -HtmlSanitizer Marten Moq Microsoft.AspNetCore.Mvc.Testing