From 9b55191cae2b52d6da572bcf0a8d28ba52d3d7cc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 6 Jun 2024 07:17:04 +0200 Subject: [PATCH 1/5] chore(deps): update dependency verify.xunit to v25 (#673) --- test/Altinn.App.Common.Tests/Altinn.App.Common.Tests.csproj | 2 +- test/Altinn.App.Core.Tests/Altinn.App.Core.Tests.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Altinn.App.Common.Tests/Altinn.App.Common.Tests.csproj b/test/Altinn.App.Common.Tests/Altinn.App.Common.Tests.csproj index afa1c8356..845e5a459 100644 --- a/test/Altinn.App.Common.Tests/Altinn.App.Common.Tests.csproj +++ b/test/Altinn.App.Common.Tests/Altinn.App.Common.Tests.csproj @@ -16,7 +16,7 @@ - + diff --git a/test/Altinn.App.Core.Tests/Altinn.App.Core.Tests.csproj b/test/Altinn.App.Core.Tests/Altinn.App.Core.Tests.csproj index 557484cac..b7775ad29 100644 --- a/test/Altinn.App.Core.Tests/Altinn.App.Core.Tests.csproj +++ b/test/Altinn.App.Core.Tests/Altinn.App.Core.Tests.csproj @@ -42,7 +42,7 @@ - + From a2cc1fc2227a7700f79c22c1833a5f57ed1f7df5 Mon Sep 17 00:00:00 2001 From: Johannes Haukland <42615991+HauklandJ@users.noreply.github.com> Date: Fri, 7 Jun 2024 10:32:34 +0200 Subject: [PATCH 2/5] Fix/attachment-uppercase-extension-fails (#676) * refactor: extract method for handling filetype from file name extraction * test: file type from file name * test: use more realistic file names in test * test: additional case with multiple dots in filename --- .../RequestHandling/DataRestrictionValidation.cs | 8 +++++++- .../RequestHandling/DataRestrictionValidationTests.cs | 11 +++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Altinn.App.Api/Helpers/RequestHandling/DataRestrictionValidation.cs b/src/Altinn.App.Api/Helpers/RequestHandling/DataRestrictionValidation.cs index 2f50bb34a..101ea7004 100644 --- a/src/Altinn.App.Api/Helpers/RequestHandling/DataRestrictionValidation.cs +++ b/src/Altinn.App.Api/Helpers/RequestHandling/DataRestrictionValidation.cs @@ -92,7 +92,7 @@ public static (bool Success, List Errors) CompliesWithDataRestr return (true, errors); } - string filetype = splitFilename[splitFilename.Length - 1]; + string filetype = GetFileTypeFromFileName(filename); var mimeType = MimeTypeMap.GetMimeType(filetype); if (!request.Headers.TryGetValue("Content-Type", out StringValues contentType)) @@ -164,4 +164,10 @@ public static (bool Success, List Errors) CompliesWithDataRestr return filename; } + + internal static string GetFileTypeFromFileName(string filename) + { + string[] splitFilename = filename.Split('.'); + return splitFilename[^1].ToLower(); + } } diff --git a/test/Altinn.App.Api.Tests/Helpers/RequestHandling/DataRestrictionValidationTests.cs b/test/Altinn.App.Api.Tests/Helpers/RequestHandling/DataRestrictionValidationTests.cs index 48e2fdd4a..e65f81a54 100644 --- a/test/Altinn.App.Api.Tests/Helpers/RequestHandling/DataRestrictionValidationTests.cs +++ b/test/Altinn.App.Api.Tests/Helpers/RequestHandling/DataRestrictionValidationTests.cs @@ -254,4 +254,15 @@ public void CompliesWithDataRestrictions_returns_true_when_octetstream_in_allow_ valid.Should().BeTrue(); errors.Should().BeEmpty(); } + + [Theory] + [InlineData("name.pdf")] + [InlineData("name.PDF")] + [InlineData("name.Pdf")] + [InlineData("my.name.is.pDf")] + public void GetFileTypeFromFileName_returns_lowercase_filetype(string filename) + { + string fileType = DataRestrictionValidation.GetFileTypeFromFileName(filename); + fileType.Should().Be("pdf"); + } } From 6a08e31c99786781dc04e1bfaad5290def641a68 Mon Sep 17 00:00:00 2001 From: Johannes Haukland <42615991+HauklandJ@users.noreply.github.com> Date: Mon, 10 Jun 2024 10:51:13 +0200 Subject: [PATCH 3/5] Refactor: move comparator settings into mimetype map (#678) * refactor: move comparator settings into mimetype map * test: add back removed test * test: rename GetFileTypeTest to reflect changes * refactor: simplify with Path.GetExtension --- .../RequestHandling/DataRestrictionValidation.cs | 8 +------- src/Altinn.App.Core/Helpers/MimeTypeMap.cs | 2 +- .../DataRestrictionValidationTests.cs | 11 ----------- .../Helpers/MimeTypeMapTests.cs | 12 ++++++++++++ 4 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/Altinn.App.Api/Helpers/RequestHandling/DataRestrictionValidation.cs b/src/Altinn.App.Api/Helpers/RequestHandling/DataRestrictionValidation.cs index 101ea7004..e725405e2 100644 --- a/src/Altinn.App.Api/Helpers/RequestHandling/DataRestrictionValidation.cs +++ b/src/Altinn.App.Api/Helpers/RequestHandling/DataRestrictionValidation.cs @@ -92,7 +92,7 @@ public static (bool Success, List Errors) CompliesWithDataRestr return (true, errors); } - string filetype = GetFileTypeFromFileName(filename); + string filetype = Path.GetExtension(filename); var mimeType = MimeTypeMap.GetMimeType(filetype); if (!request.Headers.TryGetValue("Content-Type", out StringValues contentType)) @@ -164,10 +164,4 @@ public static (bool Success, List Errors) CompliesWithDataRestr return filename; } - - internal static string GetFileTypeFromFileName(string filename) - { - string[] splitFilename = filename.Split('.'); - return splitFilename[^1].ToLower(); - } } diff --git a/src/Altinn.App.Core/Helpers/MimeTypeMap.cs b/src/Altinn.App.Core/Helpers/MimeTypeMap.cs index 58a68c7e0..ec2bb881f 100644 --- a/src/Altinn.App.Core/Helpers/MimeTypeMap.cs +++ b/src/Altinn.App.Core/Helpers/MimeTypeMap.cs @@ -621,7 +621,7 @@ private static FrozenDictionary BuildMappings() #endregion }; - return mappings.ToFrozenDictionary(); + return mappings.ToFrozenDictionary(StringComparer.OrdinalIgnoreCase); } /// diff --git a/test/Altinn.App.Api.Tests/Helpers/RequestHandling/DataRestrictionValidationTests.cs b/test/Altinn.App.Api.Tests/Helpers/RequestHandling/DataRestrictionValidationTests.cs index e65f81a54..48e2fdd4a 100644 --- a/test/Altinn.App.Api.Tests/Helpers/RequestHandling/DataRestrictionValidationTests.cs +++ b/test/Altinn.App.Api.Tests/Helpers/RequestHandling/DataRestrictionValidationTests.cs @@ -254,15 +254,4 @@ public void CompliesWithDataRestrictions_returns_true_when_octetstream_in_allow_ valid.Should().BeTrue(); errors.Should().BeEmpty(); } - - [Theory] - [InlineData("name.pdf")] - [InlineData("name.PDF")] - [InlineData("name.Pdf")] - [InlineData("my.name.is.pDf")] - public void GetFileTypeFromFileName_returns_lowercase_filetype(string filename) - { - string fileType = DataRestrictionValidation.GetFileTypeFromFileName(filename); - fileType.Should().Be("pdf"); - } } diff --git a/test/Altinn.App.Core.Tests/Helpers/MimeTypeMapTests.cs b/test/Altinn.App.Core.Tests/Helpers/MimeTypeMapTests.cs index 7cc89fbae..36e52a6bb 100644 --- a/test/Altinn.App.Core.Tests/Helpers/MimeTypeMapTests.cs +++ b/test/Altinn.App.Core.Tests/Helpers/MimeTypeMapTests.cs @@ -7,6 +7,18 @@ namespace Altinn.App.Core.Tests.Helpers; public class MimeTypeMapTests { + [Theory] + [InlineData(".pdf")] + [InlineData(".pDF")] + public void GetMimeType_ShouldNotBe_CaseSensitive(string extension) + { + // Act + var mimeType = MimeTypeMap.GetMimeType(extension); + + // Assert + mimeType.ToString().Should().BeEquivalentTo("application/pdf"); + } + [Fact] public void GetMimeType_ShouldReturnCorrectMimeType_for_pdf() { From 3b7429d95c3c27104dbf6e2d8f9b00a8d60f8d0a Mon Sep 17 00:00:00 2001 From: Martin Othamar Date: Tue, 11 Jun 2024 08:25:11 +0200 Subject: [PATCH 4/5] Set `AnalysisMode` to `Recommended`, fix resulting warnings (#675) --- .editorconfig | 18 +++++++ .../ApplicationMetadataController.cs | 6 +-- .../Controllers/AuthorizationController.cs | 3 +- .../Controllers/DataController.cs | 40 ++++++++++------ .../Controllers/DataTagsController.cs | 12 +++-- .../Controllers/InstancesController.cs | 47 +++++++++++++------ .../Controllers/PartiesController.cs | 3 +- .../Controllers/PdfController.cs | 2 +- .../Controllers/ProcessController.cs | 8 +++- .../Controllers/RedirectController.cs | 2 +- .../Controllers/StatelessDataController.cs | 15 +++++- .../RequestHandling/MultipartRequestReader.cs | 17 ++++++- .../RequestHandling/RequestPartValidator.cs | 2 +- .../Telemetry/HealthTelemetryFilter.cs | 2 +- .../Telemetry/IdentityTelemetryFilter.cs | 9 ++-- .../Configuration/AppSettings.cs | 2 + .../Constants/AuthzConstants.cs | 2 + .../DefaultEFormidlingService.cs | 3 +- .../Extensions/ClaimsPrincipalExtensions.cs | 5 +- .../Features/Action/SigningUserAction.cs | 3 +- .../Features/DataLists/DataListsFactory.cs | 2 +- .../DataLists/InstanceDataListsFactory.cs | 2 +- .../Altinn2MetadataApiClient.cs | 5 +- .../Validation/Helpers/ModelStateHelpers.cs | 8 ++-- src/Altinn.App.Core/Helpers/AppTextHelper.cs | 4 +- .../Helpers/AuthenticationHelper.cs | 5 +- .../Helpers/DataModel/DataModel.cs | 3 +- .../Helpers/InstantiationHelper.cs | 20 +++++--- .../Helpers/JsonSerializerIgnorePrefix.cs | 2 +- .../Helpers/MultiDecisionHelper.cs | 3 +- src/Altinn.App.Core/Helpers/ObjectUtils.cs | 6 +-- src/Altinn.App.Core/Helpers/PathHelper.cs | 2 +- src/Altinn.App.Core/Helpers/SelfLinkHelper.cs | 6 +-- .../Helpers/ShadowFieldsConverter.cs | 2 +- src/Altinn.App.Core/Helpers/UserHelper.cs | 20 ++++---- .../Implementation/AppResourcesSI.cs | 2 +- .../Implementation/DefaultAppEvents.cs | 3 +- .../Implementation/PrefillSI.cs | 3 +- .../Clients/KeyVault/SecretsLocalClient.cs | 4 +- .../Profile/ProfileClientCachingDecorator.cs | 4 +- .../Clients/Storage/InstanceClient.cs | 11 +++-- .../Clients/Storage/InstanceEventClient.cs | 3 +- .../Clients/Storage/TextClient.cs | 2 +- .../Internal/Data/DataService.cs | 4 +- .../Expressions/ExpressionEvaluator.cs | 14 +++--- .../Internal/Pdf/PdfService.cs | 8 +++- .../EventHandlers/EndEventEventHandler.cs | 3 +- .../Process/ExclusiveGatewayFactory.cs | 2 +- .../Process/ExpressionsExclusiveGateway.cs | 3 +- .../Internal/Process/ProcessReader.cs | 7 ++- .../Common/ProcessTaskFinalizer.cs | 3 +- .../Common/ProcessTaskInitializer.cs | 5 +- .../Internal/Validation/ValidationService.cs | 3 +- src/Altinn.App.Core/Models/AppIdentifier.cs | 4 +- src/Altinn.App.Core/Models/DataList.cs | 2 + .../Models/InstanceIdentifier.cs | 15 ++++-- src/Directory.Build.props | 3 +- 57 files changed, 269 insertions(+), 130 deletions(-) diff --git a/.editorconfig b/.editorconfig index 32314fd23..09294cd3e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -128,6 +128,24 @@ dotnet_diagnostic.CA1822.severity = suggestion # IDE0080: Remove unnecessary suppression operator dotnet_diagnostic.IDE0080.severity = error +# CA1716: Rename namespace "" so that it no longer conflicts with the reserved language keyword 'Interface' +# TODO: fixing this would be breaking +dotnet_diagnostic.CA1716.severity = suggestion + +# CA1805: Do not initialize unnecessarily +dotnet_diagnostic.CA1805.severity = suggestion + +# CA1711: Identifiers should not have incorrect suffix +# TODO: fixing this would be breaking +dotnet_diagnostic.CA1711.severity = suggestion + +# CA2201: Do not raise reserved exception types +dotnet_diagnostic.CA2201.severity = suggestion + +# CA1720: Identifier contains type name +# TODO: fixing this would be breaking +dotnet_diagnostic.CA1720.severity = suggestion + [Program.cs] dotnet_diagnostic.CA1050.severity = none dotnet_diagnostic.S1118.severity = none diff --git a/src/Altinn.App.Api/Controllers/ApplicationMetadataController.cs b/src/Altinn.App.Api/Controllers/ApplicationMetadataController.cs index 02d86b06e..386d4c714 100644 --- a/src/Altinn.App.Api/Controllers/ApplicationMetadataController.cs +++ b/src/Altinn.App.Api/Controllers/ApplicationMetadataController.cs @@ -47,7 +47,7 @@ public async Task> GetAction( string wantedAppId = $"{org}/{app}"; - if (!checkOrgApp || application.Id.Equals(wantedAppId)) + if (!checkOrgApp || application.Id.Equals(wantedAppId, StringComparison.Ordinal)) { return Ok(application); } @@ -72,7 +72,7 @@ public async Task> GetPolicy(string org, string app) string policy = await _appMetadata.GetApplicationXACMLPolicy(); string wantedAppId = $"{org}/{app}"; - if (application.Id.Equals(wantedAppId)) + if (application.Id.Equals(wantedAppId, StringComparison.Ordinal)) { return Content(policy, "text/xml", System.Text.Encoding.UTF8); } @@ -100,7 +100,7 @@ public async Task> GetProcess(string org, string app) string wantedAppId = $"{org}/{app}"; try { - if (application.Id.Equals(wantedAppId)) + if (application.Id.Equals(wantedAppId, StringComparison.Ordinal)) { string process = await _appMetadata.GetApplicationBPMNProcess(); return Content(process, "text/xml", System.Text.Encoding.UTF8); diff --git a/src/Altinn.App.Api/Controllers/AuthorizationController.cs b/src/Altinn.App.Api/Controllers/AuthorizationController.cs index 13f4e04cc..7590e0dfc 100644 --- a/src/Altinn.App.Api/Controllers/AuthorizationController.cs +++ b/src/Altinn.App.Api/Controllers/AuthorizationController.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Altinn.App.Core.Configuration; using Altinn.App.Core.Helpers; using Altinn.App.Core.Internal.Auth; @@ -83,7 +84,7 @@ public async Task GetCurrentParty(bool returnPartyObject = false) { Response.Cookies.Append( _settings.GetAltinnPartyCookieName, - userContext.PartyId.ToString(), + userContext.PartyId.ToString(CultureInfo.InvariantCulture), new CookieOptions { Domain = _settings.HostName } ); } diff --git a/src/Altinn.App.Api/Controllers/DataController.cs b/src/Altinn.App.Api/Controllers/DataController.cs index 4f51ea025..fe709a6e9 100644 --- a/src/Altinn.App.Api/Controllers/DataController.cs +++ b/src/Altinn.App.Api/Controllers/DataController.cs @@ -1,3 +1,4 @@ +using System.Globalization; using System.Net; using System.Security.Claims; using System.Text.Json; @@ -133,7 +134,7 @@ [FromQuery] string dataType Application application = await _appMetadata.GetApplicationMetadata(); DataType? dataTypeFromMetadata = application.DataTypes.First(e => - e.Id.Equals(dataType, StringComparison.InvariantCultureIgnoreCase) + e.Id.Equals(dataType, StringComparison.OrdinalIgnoreCase) ); if (dataTypeFromMetadata == null) @@ -302,7 +303,9 @@ public async Task Get( return NotFound($"Did not find instance {instance}"); } - DataElement? dataElement = instance.Data.First(m => m.Id.Equals(dataGuid.ToString())); + DataElement? dataElement = instance.Data.First(m => + m.Id.Equals(dataGuid.ToString(), StringComparison.Ordinal) + ); if (dataElement == null) { @@ -380,7 +383,9 @@ public async Task Put( ); } - DataElement? dataElement = instance.Data.First(m => m.Id.Equals(dataGuid.ToString())); + DataElement? dataElement = instance.Data.First(m => + m.Id.Equals(dataGuid.ToString(), StringComparison.Ordinal) + ); if (dataElement == null) { @@ -459,7 +464,7 @@ public async Task> PatchFormData( ); } - var dataElement = instance.Data.First(m => m.Id.Equals(dataGuid.ToString())); + var dataElement = instance.Data.First(m => m.Id.Equals(dataGuid.ToString(), StringComparison.Ordinal)); if (dataElement == null) { @@ -547,7 +552,9 @@ [FromRoute] Guid dataGuid ); } - DataElement? dataElement = instance.Data.Find(m => m.Id.Equals(dataGuid.ToString())); + DataElement? dataElement = instance.Data.Find(m => + m.Id.Equals(dataGuid.ToString(), StringComparison.Ordinal) + ); if (dataElement == null) { @@ -604,7 +611,7 @@ private async Task CreateBinaryData( Stream fileStream ) { - int instanceOwnerPartyId = int.Parse(instanceBefore.Id.Split("/")[0]); + int instanceOwnerPartyId = int.Parse(instanceBefore.Id.Split("/")[0], CultureInfo.InvariantCulture); Guid instanceGuid = Guid.Parse(instanceBefore.Id.Split("/")[1]); DataElement dataElement = await _dataClient.InsertBinaryData( @@ -655,7 +662,7 @@ private async Task CreateAppModelData(string org, string app, Inst await UpdatePresentationTextsOnInstance(instance, dataType, appModel); await UpdateDataValuesOnInstance(instance, dataType, appModel); - int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId); + int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId, CultureInfo.InvariantCulture); ObjectUtils.InitializeAltinnRowId(appModel); ObjectUtils.PrepareModelForXmlStorage(appModel); @@ -692,7 +699,7 @@ DataElement dataElement if (dataStream != null) { string? userOrgClaim = User.GetOrg(); - if (userOrgClaim == null || !org.Equals(userOrgClaim, StringComparison.InvariantCultureIgnoreCase)) + if (userOrgClaim == null || !org.Equals(userOrgClaim, StringComparison.OrdinalIgnoreCase)) { await _instanceClient.UpdateReadStatus(instanceOwnerPartyId, instanceGuid, "read"); } @@ -822,7 +829,7 @@ await _dataClient.UpdateData( // This is likely not required as the instance is already read string? userOrgClaim = User.GetOrg(); - if (userOrgClaim == null || !org.Equals(userOrgClaim, StringComparison.InvariantCultureIgnoreCase)) + if (userOrgClaim == null || !org.Equals(userOrgClaim, StringComparison.OrdinalIgnoreCase)) { await _instanceClient.UpdateReadStatus(instanceOwnerId, instanceGuid, "read"); } @@ -860,7 +867,7 @@ private async Task PutFormData( string? language ) { - int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId); + int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId, CultureInfo.InvariantCulture); string classRef = dataType.AppLogic.ClassRef; Guid instanceGuid = Guid.Parse(instance.Id.Split("/")[1]); @@ -928,7 +935,7 @@ private async Task UpdatePresentationTextsOnInstance(Instance instance, string d if (updatedValues.Count > 0) { await _instanceClient.UpdatePresentationTexts( - int.Parse(instance.Id.Split("/")[0]), + int.Parse(instance.Id.Split("/")[0], CultureInfo.InvariantCulture), Guid.Parse(instance.Id.Split("/")[1]), new PresentationTexts { Texts = updatedValues } ); @@ -947,7 +954,7 @@ private async Task UpdateDataValuesOnInstance(Instance instance, string dataType if (updatedValues.Count > 0) { await _instanceClient.UpdateDataValues( - int.Parse(instance.Id.Split("/")[0]), + int.Parse(instance.Id.Split("/")[0], CultureInfo.InvariantCulture), Guid.Parse(instance.Id.Split("/")[1]), new DataValues { Values = updatedValues } ); @@ -996,7 +1003,7 @@ private static bool IsValidContributer(DataType dataType, ClaimsPrincipal user) string key = item.Split(':')[0]; string value = item.Split(':')[1]; - switch (key.ToLower()) + switch (key.ToLowerInvariant()) { case "org": if (value.Equals(user.GetOrg(), StringComparison.OrdinalIgnoreCase)) @@ -1006,7 +1013,12 @@ private static bool IsValidContributer(DataType dataType, ClaimsPrincipal user) break; case "orgno": - if (value.Equals(user.GetOrgNumber().ToString())) + if ( + value.Equals( + user.GetOrgNumber()?.ToString(CultureInfo.InvariantCulture), + StringComparison.Ordinal + ) + ) { return true; } diff --git a/src/Altinn.App.Api/Controllers/DataTagsController.cs b/src/Altinn.App.Api/Controllers/DataTagsController.cs index 9b9116984..1a13dc698 100644 --- a/src/Altinn.App.Api/Controllers/DataTagsController.cs +++ b/src/Altinn.App.Api/Controllers/DataTagsController.cs @@ -61,7 +61,9 @@ [FromRoute] Guid dataGuid return NotFound($"Unable to find instance based on the given parameters."); } - DataElement? dataElement = instance.Data.FirstOrDefault(m => m.Id.Equals(dataGuid.ToString())); + DataElement? dataElement = instance.Data.FirstOrDefault(m => + m.Id.Equals(dataGuid.ToString(), StringComparison.Ordinal) + ); if (dataElement == null) { @@ -106,7 +108,9 @@ [FromBody] string tag return NotFound("Unable to find instance based on the given parameters."); } - DataElement? dataElement = instance.Data.FirstOrDefault(m => m.Id.Equals(dataGuid.ToString())); + DataElement? dataElement = instance.Data.FirstOrDefault(m => + m.Id.Equals(dataGuid.ToString(), StringComparison.Ordinal) + ); if (dataElement == null) { @@ -160,7 +164,9 @@ [FromRoute] string tag return NotFound("Unable to find instance based on the given parameters."); } - DataElement? dataElement = instance.Data.FirstOrDefault(m => m.Id.Equals(dataGuid.ToString())); + DataElement? dataElement = instance.Data.FirstOrDefault(m => + m.Id.Equals(dataGuid.ToString(), StringComparison.Ordinal) + ); if (dataElement == null) { diff --git a/src/Altinn.App.Api/Controllers/InstancesController.cs b/src/Altinn.App.Api/Controllers/InstancesController.cs index cdf5651c9..66aa24586 100644 --- a/src/Altinn.App.Api/Controllers/InstancesController.cs +++ b/src/Altinn.App.Api/Controllers/InstancesController.cs @@ -1,3 +1,4 @@ +using System.Globalization; using System.Net; using System.Text; using Altinn.App.Api.Helpers.RequestHandling; @@ -146,7 +147,7 @@ [FromRoute] Guid instanceGuid string? userOrgClaim = User.GetOrg(); - if (userOrgClaim == null || !org.Equals(userOrgClaim, StringComparison.InvariantCultureIgnoreCase)) + if (userOrgClaim == null || !org.Equals(userOrgClaim, StringComparison.OrdinalIgnoreCase)) { await _instanceClient.UpdateReadStatus(instanceOwnerPartyId, instanceGuid, "read"); } @@ -239,7 +240,10 @@ [FromQuery] int? instanceOwnerPartyId // create minimum instance template instanceTemplate = new Instance { - InstanceOwner = new InstanceOwner { PartyId = instanceOwnerPartyId.Value.ToString() } + InstanceOwner = new InstanceOwner + { + PartyId = instanceOwnerPartyId.Value.ToString(CultureInfo.InvariantCulture) + } }; } @@ -331,7 +335,7 @@ [FromQuery] int? instanceOwnerPartyId instance = await _instanceClient.GetInstance( app, org, - int.Parse(instance.InstanceOwner.PartyId), + int.Parse(instance.InstanceOwner.PartyId, CultureInfo.InvariantCulture), Guid.Parse(instance.Id.Split("/")[1]) ); @@ -425,7 +429,11 @@ [FromBody] InstansiationInstance instansiationInstance return NotFound($"Cannot lookup party: {partyLookupException.Message}"); } - if (copySourceInstance && party.PartyId.ToString() != instansiationInstance.SourceInstanceId.Split("/")[0]) + if ( + copySourceInstance + && party.PartyId.ToString(CultureInfo.InvariantCulture) + != instansiationInstance.SourceInstanceId.Split("/")[0] + ) { return BadRequest("It is not possible to copy instances between instance owners."); } @@ -705,7 +713,7 @@ [FromBody] Substatus substatus Instance instance = await _instanceClient.GetInstance(app, org, instanceOwnerPartyId, instanceGuid); string? orgClaim = User.GetOrg(); - if (!instance.Org.Equals(orgClaim)) + if (!instance.Org.Equals(orgClaim, StringComparison.OrdinalIgnoreCase)) { return Forbid(); } @@ -783,7 +791,7 @@ int instanceOwnerPartyId new() { { "appId", $"{org}/{app}" }, - { "instanceOwner.partyId", instanceOwnerPartyId.ToString() }, + { "instanceOwner.partyId", instanceOwnerPartyId.ToString(CultureInfo.InvariantCulture) }, { "status.isArchived", "false" }, { "status.isSoftDeleted", "false" } }; @@ -863,14 +871,17 @@ Instance sourceInstance { string org = application.Org; string app = application.AppIdentifier.App; - int instanceOwnerPartyId = int.Parse(targetInstance.InstanceOwner.PartyId); + int instanceOwnerPartyId = int.Parse(targetInstance.InstanceOwner.PartyId, CultureInfo.InvariantCulture); string[] sourceSplit = sourceInstance.Id.Split("/"); Guid sourceInstanceGuid = Guid.Parse(sourceSplit[1]); List dts = application .DataTypes.Where(dt => dt.AppLogic?.ClassRef != null) - .Where(dt => dt.TaskId != null && dt.TaskId.Equals(targetInstance.Process.CurrentTask.ElementId)) + .Where(dt => + dt.TaskId != null + && dt.TaskId.Equals(targetInstance.Process.CurrentTask.ElementId, StringComparison.Ordinal) + ) .ToList(); List excludedDataTypes = application.CopyInstanceSettings.ExcludedDataTypes; @@ -881,9 +892,9 @@ Instance sourceInstance continue; } - if (dts.Any(dts => dts.Id.Equals(de.DataType))) + if (dts.Any(dts => dts.Id.Equals(de.DataType, StringComparison.Ordinal))) { - DataType dt = dts.First(dt => dt.Id.Equals(de.DataType)); + DataType dt = dts.First(dt => dt.Id.Equals(de.DataType, StringComparison.Ordinal)); Type type; try @@ -913,7 +924,11 @@ Instance sourceInstance DataHelper.ResetDataFields(application.CopyInstanceSettings.ExcludedDataFields, data); } - await _prefillService.PrefillDataModel(instanceOwnerPartyId.ToString(), dt.Id, data); + await _prefillService.PrefillDataModel( + instanceOwnerPartyId.ToString(CultureInfo.InvariantCulture), + dt.Id, + data + ); await _instantiationProcessor.DataCreation(targetInstance, data, null); @@ -998,7 +1013,9 @@ string action { try { - return await _altinnPartyClientClient.GetParty(int.Parse(instanceOwner.PartyId)); + return await _altinnPartyClientClient.GetParty( + int.Parse(instanceOwner.PartyId, CultureInfo.InvariantCulture) + ); } catch (Exception e) when (e is not ServiceException) { @@ -1058,7 +1075,7 @@ string action private async Task StorePrefillParts(Instance instance, ApplicationMetadata appInfo, List parts) { Guid instanceGuid = Guid.Parse(instance.Id.Split("/")[1]); - int instanceOwnerIdAsInt = int.Parse(instance.InstanceOwner.PartyId); + int instanceOwnerIdAsInt = int.Parse(instance.InstanceOwner.PartyId, CultureInfo.InvariantCulture); string org = instance.Org; string app = instance.AppId.Split("/")[1]; @@ -1219,7 +1236,7 @@ object data if (updatedValues.Count > 0) { await _instanceClient.UpdatePresentationTexts( - int.Parse(instance.Id.Split("/")[0]), + int.Parse(instance.Id.Split("/")[0], CultureInfo.InvariantCulture), Guid.Parse(instance.Id.Split("/")[1]), new PresentationTexts { Texts = updatedValues } ); @@ -1238,7 +1255,7 @@ object data if (updatedValues.Count > 0) { await _instanceClient.UpdateDataValues( - int.Parse(instance.Id.Split("/")[0]), + int.Parse(instance.Id.Split("/")[0], CultureInfo.InvariantCulture), Guid.Parse(instance.Id.Split("/")[1]), new DataValues { Values = updatedValues } ); diff --git a/src/Altinn.App.Api/Controllers/PartiesController.cs b/src/Altinn.App.Api/Controllers/PartiesController.cs index 39ce416bb..0fe5ff7d9 100644 --- a/src/Altinn.App.Api/Controllers/PartiesController.cs +++ b/src/Altinn.App.Api/Controllers/PartiesController.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Altinn.App.Core.Configuration; using Altinn.App.Core.Helpers; using Altinn.App.Core.Internal.App; @@ -167,7 +168,7 @@ public async Task UpdateSelectedParty(int partyId) Response.Cookies.Append( _settings.GetAltinnPartyCookieName, - partyId.ToString(), + partyId.ToString(CultureInfo.InvariantCulture), new CookieOptions { Domain = _settings.HostName } ); diff --git a/src/Altinn.App.Api/Controllers/PdfController.cs b/src/Altinn.App.Api/Controllers/PdfController.cs index 29434aabb..433849140 100644 --- a/src/Altinn.App.Api/Controllers/PdfController.cs +++ b/src/Altinn.App.Api/Controllers/PdfController.cs @@ -132,7 +132,7 @@ [FromRoute] Guid dataGuid JsonSerializer.Deserialize(layoutSetsString, _jsonSerializerOptions) ?? throw new JsonException("Could not deserialize LayoutSets"); layoutSet = layoutSets.Sets?.FirstOrDefault(t => - t.DataType.Equals(dataElement.DataType) && t.Tasks.Contains(taskId) + t.DataType.Equals(dataElement.DataType, StringComparison.Ordinal) && t.Tasks.Contains(taskId) ); } diff --git a/src/Altinn.App.Api/Controllers/ProcessController.cs b/src/Altinn.App.Api/Controllers/ProcessController.cs index dc46a040f..5c5099b2b 100644 --- a/src/Altinn.App.Api/Controllers/ProcessController.cs +++ b/src/Altinn.App.Api/Controllers/ProcessController.cs @@ -1,3 +1,4 @@ +using System.Globalization; using System.Net; using Altinn.App.Api.Infrastructure.Filters; using Altinn.App.Api.Models; @@ -563,7 +564,12 @@ [FromRoute] Guid instanceGuid { try { - return Ok(await _processClient.GetProcessHistory(instanceGuid.ToString(), instanceOwnerPartyId.ToString())); + return Ok( + await _processClient.GetProcessHistory( + instanceGuid.ToString(), + instanceOwnerPartyId.ToString(CultureInfo.InvariantCulture) + ) + ); } catch (PlatformHttpException e) { diff --git a/src/Altinn.App.Api/Controllers/RedirectController.cs b/src/Altinn.App.Api/Controllers/RedirectController.cs index e71dc4bc9..a93ca9bef 100644 --- a/src/Altinn.App.Api/Controllers/RedirectController.cs +++ b/src/Altinn.App.Api/Controllers/RedirectController.cs @@ -80,6 +80,6 @@ private bool IsValidRedirectUri(string urlHost) .ToList(); string redirectHost = string.Join(".", goToList); - return validHost.Equals(redirectHost); + return validHost.Equals(redirectHost, StringComparison.OrdinalIgnoreCase); } } diff --git a/src/Altinn.App.Api/Controllers/StatelessDataController.cs b/src/Altinn.App.Api/Controllers/StatelessDataController.cs index 49df9bd01..7aaa0f322 100644 --- a/src/Altinn.App.Api/Controllers/StatelessDataController.cs +++ b/src/Altinn.App.Api/Controllers/StatelessDataController.cs @@ -1,3 +1,4 @@ +using System.Globalization; using System.Net; using Altinn.App.Api.Infrastructure.Filters; using Altinn.App.Core.Extensions; @@ -110,7 +111,12 @@ public async Task Get( ); } - EnforcementResult enforcementResult = await AuthorizeAction(org, app, Convert.ToInt32(owner.PartyId), "read"); + EnforcementResult enforcementResult = await AuthorizeAction( + org, + app, + Convert.ToInt32(owner.PartyId, CultureInfo.InvariantCulture), + "read" + ); if (!enforcementResult.Authorized) { @@ -225,7 +231,12 @@ public async Task Post( return BadRequest($"Invalid party header"); } - EnforcementResult enforcementResult = await AuthorizeAction(org, app, Convert.ToInt32(owner.PartyId), "read"); + EnforcementResult enforcementResult = await AuthorizeAction( + org, + app, + Convert.ToInt32(owner.PartyId, CultureInfo.InvariantCulture), + "read" + ); if (!enforcementResult.Authorized) { diff --git a/src/Altinn.App.Api/Helpers/RequestHandling/MultipartRequestReader.cs b/src/Altinn.App.Api/Helpers/RequestHandling/MultipartRequestReader.cs index a65a81bfa..9aa77216c 100644 --- a/src/Altinn.App.Api/Helpers/RequestHandling/MultipartRequestReader.cs +++ b/src/Altinn.App.Api/Helpers/RequestHandling/MultipartRequestReader.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Altinn.App.Core.Helpers.Extensions; using Microsoft.AspNetCore.WebUtilities; using Microsoft.Net.Http.Headers; @@ -69,13 +70,25 @@ out ContentDispositionHeaderValue? contentDisposition ) ) { - Errors.Add(string.Format("Part number {0} doesn't have a content disposition", partCounter)); + Errors.Add( + string.Format( + CultureInfo.InvariantCulture, + "Part number {0} doesn't have a content disposition", + partCounter + ) + ); continue; } if (section.ContentType == null) { - Errors.Add(string.Format("Part number {0} doesn't have a content type", partCounter)); + Errors.Add( + string.Format( + CultureInfo.InvariantCulture, + "Part number {0} doesn't have a content type", + partCounter + ) + ); continue; } diff --git a/src/Altinn.App.Api/Helpers/RequestHandling/RequestPartValidator.cs b/src/Altinn.App.Api/Helpers/RequestHandling/RequestPartValidator.cs index c52b919dd..ebe525264 100644 --- a/src/Altinn.App.Api/Helpers/RequestHandling/RequestPartValidator.cs +++ b/src/Altinn.App.Api/Helpers/RequestHandling/RequestPartValidator.cs @@ -27,7 +27,7 @@ public RequestPartValidator(Application appInfo) { if (part.Name == "instance") { - if (!part.ContentType.StartsWith("application/json")) + if (!part.ContentType.StartsWith("application/json", StringComparison.Ordinal)) { return $"Unexpected Content-Type '{part.ContentType}' of embedded instance template. Expecting 'application/json'"; } diff --git a/src/Altinn.App.Api/Infrastructure/Telemetry/HealthTelemetryFilter.cs b/src/Altinn.App.Api/Infrastructure/Telemetry/HealthTelemetryFilter.cs index 5b87dd537..1859d8ffd 100644 --- a/src/Altinn.App.Api/Infrastructure/Telemetry/HealthTelemetryFilter.cs +++ b/src/Altinn.App.Api/Infrastructure/Telemetry/HealthTelemetryFilter.cs @@ -37,7 +37,7 @@ private static bool ExcludeItemTelemetry(ITelemetry item) { RequestTelemetry request = item as RequestTelemetry; - if (request != null && request.Url.ToString().EndsWith("/health")) + if (request != null && request.Url.ToString().EndsWith("/health", StringComparison.OrdinalIgnoreCase)) { return true; } diff --git a/src/Altinn.App.Api/Infrastructure/Telemetry/IdentityTelemetryFilter.cs b/src/Altinn.App.Api/Infrastructure/Telemetry/IdentityTelemetryFilter.cs index f0eb983dc..15141dd86 100644 --- a/src/Altinn.App.Api/Infrastructure/Telemetry/IdentityTelemetryFilter.cs +++ b/src/Altinn.App.Api/Infrastructure/Telemetry/IdentityTelemetryFilter.cs @@ -1,5 +1,6 @@ #nullable disable using System.Diagnostics.CodeAnalysis; +using System.Globalization; using Altinn.App.Core.Extensions; using Microsoft.ApplicationInsights.Channel; using Microsoft.ApplicationInsights.DataContracts; @@ -42,17 +43,17 @@ public void Process(ITelemetry item) int? partyId = ctx.User.GetPartyIdAsInt(); int authLevel = ctx.User.GetAuthenticationLevel(); - request.Properties.Add("partyId", partyId.ToString()); - request.Properties.Add("authLevel", authLevel.ToString()); + request.Properties.Add("partyId", partyId?.ToString(CultureInfo.InvariantCulture) ?? ""); + request.Properties.Add("authLevel", authLevel.ToString(CultureInfo.InvariantCulture)); if (userId != null) { - request.Properties.Add("userId", userId.ToString()); + request.Properties.Add("userId", userId?.ToString(CultureInfo.InvariantCulture) ?? ""); } if (orgNumber != null) { - request.Properties.Add("orgNumber", orgNumber.ToString()); + request.Properties.Add("orgNumber", orgNumber?.ToString(CultureInfo.InvariantCulture) ?? ""); } } } diff --git a/src/Altinn.App.Core/Configuration/AppSettings.cs b/src/Altinn.App.Core/Configuration/AppSettings.cs index 59c70b419..962226e02 100644 --- a/src/Altinn.App.Core/Configuration/AppSettings.cs +++ b/src/Altinn.App.Core/Configuration/AppSettings.cs @@ -6,6 +6,7 @@ namespace Altinn.App.Core.Configuration; // TODO: IOptions validation so that we know which of these properties are required public class AppSettings { +#pragma warning disable CA1707 // Identifiers should not contain underscores /// /// Constant for the location of json schema file /// @@ -15,6 +16,7 @@ public class AppSettings /// Constant for the location of validation configuration file /// public const string VALIDATION_CONFIG_FILENAME = "validation.json"; +#pragma warning restore CA1707 // Identifiers should not contain underscores /// /// The app configuration baseUrl where files are stored in the container diff --git a/src/Altinn.App.Core/Constants/AuthzConstants.cs b/src/Altinn.App.Core/Constants/AuthzConstants.cs index 97517042d..bd11696f6 100644 --- a/src/Altinn.App.Core/Constants/AuthzConstants.cs +++ b/src/Altinn.App.Core/Constants/AuthzConstants.cs @@ -5,6 +5,7 @@ namespace Altinn.App.Core.Constants; /// public static class AuthzConstants { +#pragma warning disable CA1707 // Identifiers should not contain underscores /// /// Policy tag for reading an instance. /// @@ -24,4 +25,5 @@ public static class AuthzConstants /// Policy tag for authorizing client scope. /// public const string POLICY_INSTANCE_COMPLETE = "InstanceComplete"; +#pragma warning restore CA1707 // Identifiers should not contain underscores } diff --git a/src/Altinn.App.Core/EFormidling/Implementation/DefaultEFormidlingService.cs b/src/Altinn.App.Core/EFormidling/Implementation/DefaultEFormidlingService.cs index dbe3e2d61..b96fd3748 100644 --- a/src/Altinn.App.Core/EFormidling/Implementation/DefaultEFormidlingService.cs +++ b/src/Altinn.App.Core/EFormidling/Implementation/DefaultEFormidlingService.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.Globalization; using Altinn.App.Core.Configuration; using Altinn.App.Core.Constants; using Altinn.App.Core.EFormidling.Interface; @@ -196,7 +197,7 @@ private async Task SendInstanceData(Instance instance, Dictionary GetAltinn2Codelist(string id, string langCode, int? version = null) { var response = await _client.GetAsync( - $"https://www.altinn.no/api/metadata/codelists/{id}/{version?.ToString() ?? string.Empty}?language={langCode}" + $"https://www.altinn.no/api/metadata/codelists/{id}/{version?.ToString(CultureInfo.InvariantCulture) ?? string.Empty}?language={langCode}" ); if (response.StatusCode == System.Net.HttpStatusCode.NotFound) { response = await _client.GetAsync( - $"https://www.altinn.no/api/metadata/codelists/{id}/{version?.ToString() ?? string.Empty}" + $"https://www.altinn.no/api/metadata/codelists/{id}/{version?.ToString(CultureInfo.InvariantCulture) ?? string.Empty}" ); } response.EnsureSuccessStatusCode(); diff --git a/src/Altinn.App.Core/Features/Validation/Helpers/ModelStateHelpers.cs b/src/Altinn.App.Core/Features/Validation/Helpers/ModelStateHelpers.cs index a5ab2fc19..a22871460 100644 --- a/src/Altinn.App.Core/Features/Validation/Helpers/ModelStateHelpers.cs +++ b/src/Altinn.App.Core/Features/Validation/Helpers/ModelStateHelpers.cs @@ -66,7 +66,7 @@ private static (ValidationIssueSeverity Severity, string Message) GetSeverityFro GeneralSettings generalSettings ) { - if (originalMessage.StartsWith(generalSettings.SoftValidationPrefix)) + if (originalMessage.StartsWith(generalSettings.SoftValidationPrefix, StringComparison.Ordinal)) { return ( ValidationIssueSeverity.Warning, @@ -75,7 +75,7 @@ GeneralSettings generalSettings } #pragma warning disable CS0618 // Type or member is obsolete - if (originalMessage.StartsWith(generalSettings.FixedValidationPrefix)) + if (originalMessage.StartsWith(generalSettings.FixedValidationPrefix, StringComparison.Ordinal)) { return ( ValidationIssueSeverity.Fixed, @@ -84,7 +84,7 @@ GeneralSettings generalSettings } #pragma warning restore CS0618 // Type or member is obsolete - if (originalMessage.StartsWith(generalSettings.InfoValidationPrefix)) + if (originalMessage.StartsWith(generalSettings.InfoValidationPrefix, StringComparison.Ordinal)) { return ( ValidationIssueSeverity.Informational, @@ -92,7 +92,7 @@ GeneralSettings generalSettings ); } - if (originalMessage.StartsWith(generalSettings.SuccessValidationPrefix)) + if (originalMessage.StartsWith(generalSettings.SuccessValidationPrefix, StringComparison.Ordinal)) { return ( ValidationIssueSeverity.Success, diff --git a/src/Altinn.App.Core/Helpers/AppTextHelper.cs b/src/Altinn.App.Core/Helpers/AppTextHelper.cs index d441fc2ee..9d0e62d4e 100644 --- a/src/Altinn.App.Core/Helpers/AppTextHelper.cs +++ b/src/Altinn.App.Core/Helpers/AppTextHelper.cs @@ -1,3 +1,5 @@ +using System.Globalization; + namespace Altinn.App.Core.Helpers; /// @@ -37,7 +39,7 @@ string languageId stringList[i] = textParams[i]; } - text = string.Format(text, stringList); + text = string.Format(CultureInfo.InvariantCulture, text, stringList); } } diff --git a/src/Altinn.App.Core/Helpers/AuthenticationHelper.cs b/src/Altinn.App.Core/Helpers/AuthenticationHelper.cs index 8d7a7cc34..f8bd5a49f 100644 --- a/src/Altinn.App.Core/Helpers/AuthenticationHelper.cs +++ b/src/Altinn.App.Core/Helpers/AuthenticationHelper.cs @@ -1,3 +1,4 @@ +using System.Globalization; using System.Security.Claims; using AltinnCore.Authentication.Constants; using Microsoft.AspNetCore.Http; @@ -22,9 +23,9 @@ public static int GetUserId(HttpContext context) { foreach (Claim claim in context.User.Claims) { - if (claim.Type.Equals(AltinnCoreClaimTypes.UserId)) + if (claim.Type.Equals(AltinnCoreClaimTypes.UserId, StringComparison.Ordinal)) { - userId = Convert.ToInt32(claim.Value); + userId = Convert.ToInt32(claim.Value, CultureInfo.InvariantCulture); } } } diff --git a/src/Altinn.App.Core/Helpers/DataModel/DataModel.cs b/src/Altinn.App.Core/Helpers/DataModel/DataModel.cs index ae7b5a0d6..361d9098a 100644 --- a/src/Altinn.App.Core/Helpers/DataModel/DataModel.cs +++ b/src/Altinn.App.Core/Helpers/DataModel/DataModel.cs @@ -1,3 +1,4 @@ +using System.Globalization; using System.Reflection; using System.Text.RegularExpressions; @@ -224,7 +225,7 @@ internal static (string key, int? index) ParseKeyPart(string keypart) return (keypart, null); } var match = _keyPartRegex.Match(keypart); - return (match.Groups[1].Value, int.Parse(match.Groups[2].Value)); + return (match.Groups[1].Value, int.Parse(match.Groups[2].Value, CultureInfo.InvariantCulture)); } private static void AddIndiciesRecursive( diff --git a/src/Altinn.App.Core/Helpers/InstantiationHelper.cs b/src/Altinn.App.Core/Helpers/InstantiationHelper.cs index f0b31da71..122e9dac6 100644 --- a/src/Altinn.App.Core/Helpers/InstantiationHelper.cs +++ b/src/Altinn.App.Core/Helpers/InstantiationHelper.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Altinn.Platform.Register.Enums; using Altinn.Platform.Register.Models; using Altinn.Platform.Storage.Interface.Models; @@ -110,9 +111,12 @@ public static bool IsPartyAllowedToInstantiate(Party? party, PartyTypesAllowed? bool isSubUnit = party.UnitType != null - && (SUB_UNIT_CODE.Equals(party.UnitType.Trim()) || SUB_UNIT_CODE_AAFY.Equals(party.UnitType.Trim())); + && ( + SUB_UNIT_CODE.Equals(party.UnitType.Trim(), StringComparison.Ordinal) + || SUB_UNIT_CODE_AAFY.Equals(party.UnitType.Trim(), StringComparison.Ordinal) + ); bool isMainUnit = !isSubUnit; - bool isKbo = party.UnitType != null && BANKRUPTCY_CODE.Equals(party.UnitType.Trim()); + bool isKbo = party.UnitType != null && BANKRUPTCY_CODE.Equals(party.UnitType.Trim(), StringComparison.Ordinal); switch (partyType) { @@ -192,19 +196,23 @@ public static InstanceOwner PartyToInstanceOwner(Party party) { if (!string.IsNullOrEmpty(party.SSN)) { - return new() { PartyId = party.PartyId.ToString(), PersonNumber = party.SSN, }; + return new() { PartyId = party.PartyId.ToString(CultureInfo.InvariantCulture), PersonNumber = party.SSN, }; } else if (!string.IsNullOrEmpty(party.OrgNumber)) { - return new() { PartyId = party.PartyId.ToString(), OrganisationNumber = party.OrgNumber, }; + return new() + { + PartyId = party.PartyId.ToString(CultureInfo.InvariantCulture), + OrganisationNumber = party.OrgNumber, + }; } else if (party.PartyTypeName.Equals(PartyType.SelfIdentified)) { - return new() { PartyId = party.PartyId.ToString(), Username = party.Name, }; + return new() { PartyId = party.PartyId.ToString(CultureInfo.InvariantCulture), Username = party.Name, }; } return new() { - PartyId = party.PartyId.ToString(), + PartyId = party.PartyId.ToString(CultureInfo.InvariantCulture), // instanceOwnerPartyType == "unknown" }; } diff --git a/src/Altinn.App.Core/Helpers/JsonSerializerIgnorePrefix.cs b/src/Altinn.App.Core/Helpers/JsonSerializerIgnorePrefix.cs index 79a3c0ec9..81edde649 100644 --- a/src/Altinn.App.Core/Helpers/JsonSerializerIgnorePrefix.cs +++ b/src/Altinn.App.Core/Helpers/JsonSerializerIgnorePrefix.cs @@ -22,7 +22,7 @@ internal static JsonSerializerOptions GetOptions(string prefix) if (ti.Kind != JsonTypeInfoKind.Object) return; - ti.Properties.RemoveAll(prop => prop.Name.StartsWith(prefix)); + ti.Properties.RemoveAll(prop => prop.Name.StartsWith(prefix, StringComparison.Ordinal)); }; JsonSerializerOptions newOptions = diff --git a/src/Altinn.App.Core/Helpers/MultiDecisionHelper.cs b/src/Altinn.App.Core/Helpers/MultiDecisionHelper.cs index 7b6afbe31..1cf269924 100644 --- a/src/Altinn.App.Core/Helpers/MultiDecisionHelper.cs +++ b/src/Altinn.App.Core/Helpers/MultiDecisionHelper.cs @@ -1,3 +1,4 @@ +using System.Globalization; using System.Security.Claims; using Altinn.App.Core.Models; using Altinn.Authorization.ABAC.Xacml.JsonProfile; @@ -94,7 +95,7 @@ private static List CreateMultipleActionCategory(List { XacmlJsonCategory actionCategory; actionCategory = DecisionHelper.CreateActionCategory(actionType, true); - actionCategory.Id = ActionId + counter.ToString(); + actionCategory.Id = ActionId + counter.ToString(CultureInfo.InvariantCulture); actionCategories.Add(actionCategory); counter++; } diff --git a/src/Altinn.App.Core/Helpers/ObjectUtils.cs b/src/Altinn.App.Core/Helpers/ObjectUtils.cs index ba40cada1..8ac0a1a84 100644 --- a/src/Altinn.App.Core/Helpers/ObjectUtils.cs +++ b/src/Altinn.App.Core/Helpers/ObjectUtils.cs @@ -25,7 +25,7 @@ public static void InitializeAltinnRowId(object model, int depth = 64) ); } - if (type.Namespace?.StartsWith("System") == true) + if (type.Namespace?.StartsWith("System", StringComparison.Ordinal) == true) { return; // System.DateTime.Now causes infinite recursion, and we shuldn't recurse into system types anyway. } @@ -90,7 +90,7 @@ public static void PrepareModelForXmlStorage(object model, int depth = 64) ); } - if (type.Namespace?.StartsWith("System") == true) + if (type.Namespace?.StartsWith("System", StringComparison.Ordinal) == true) { return; } @@ -190,7 +190,7 @@ public static void RemoveAltinnRowId(object model, int depth = 64) ); } var type = model.GetType(); - if (type.Namespace?.StartsWith("System") == true) + if (type.Namespace?.StartsWith("System", StringComparison.Ordinal) == true) { return; // System.DateTime.Now causes infinite recursion, and we shuldn't recurse into system types anyway. } diff --git a/src/Altinn.App.Core/Helpers/PathHelper.cs b/src/Altinn.App.Core/Helpers/PathHelper.cs index c3fb2d24e..a75a8bdfc 100644 --- a/src/Altinn.App.Core/Helpers/PathHelper.cs +++ b/src/Altinn.App.Core/Helpers/PathHelper.cs @@ -16,7 +16,7 @@ public static bool ValidateLegalFilePath(string legalPath, string filePath) var fullRootedFolder = Path.GetFullPath(legalPath + Path.DirectorySeparatorChar); var expandedFilename = Path.GetFullPath(filePath); - return expandedFilename.StartsWith(fullRootedFolder); + return expandedFilename.StartsWith(fullRootedFolder, StringComparison.Ordinal); } /// diff --git a/src/Altinn.App.Core/Helpers/SelfLinkHelper.cs b/src/Altinn.App.Core/Helpers/SelfLinkHelper.cs index d7ee798ae..b52ca7176 100644 --- a/src/Altinn.App.Core/Helpers/SelfLinkHelper.cs +++ b/src/Altinn.App.Core/Helpers/SelfLinkHelper.cs @@ -21,7 +21,7 @@ public static void SetInstanceAppSelfLinks(Instance instance, HttpRequest reques string selfLink = $"{host}{url}"; - int start = selfLink.IndexOf("/instances"); + int start = selfLink.IndexOf("/instances", StringComparison.OrdinalIgnoreCase); if (start > 0) { selfLink = string.Concat(selfLink.AsSpan(0, start), "/instances"); @@ -29,7 +29,7 @@ public static void SetInstanceAppSelfLinks(Instance instance, HttpRequest reques selfLink += $"/{instance.Id}"; - if (!selfLink.EndsWith(instance.Id)) + if (!selfLink.EndsWith(instance.Id, StringComparison.OrdinalIgnoreCase)) { selfLink += instance.Id; } @@ -66,7 +66,7 @@ HttpRequest request string selfLink = $"{host}{url}"; - int start = selfLink.IndexOf("/instances"); + int start = selfLink.IndexOf("/instances", StringComparison.OrdinalIgnoreCase); if (start > 0) { selfLink = string.Concat(selfLink.AsSpan(0, start), "/instances"); diff --git a/src/Altinn.App.Core/Helpers/ShadowFieldsConverter.cs b/src/Altinn.App.Core/Helpers/ShadowFieldsConverter.cs index 3bf92e0f7..86325ddb1 100644 --- a/src/Altinn.App.Core/Helpers/ShadowFieldsConverter.cs +++ b/src/Altinn.App.Core/Helpers/ShadowFieldsConverter.cs @@ -23,7 +23,7 @@ public void ModifyPrefixInfo(JsonTypeInfo ti) if (ti.Kind != JsonTypeInfoKind.Object) return; - ti.Properties.RemoveAll(prop => prop.Name.StartsWith(_ignorePrefix)); + ti.Properties.RemoveAll(prop => prop.Name.StartsWith(_ignorePrefix, StringComparison.Ordinal)); } } diff --git a/src/Altinn.App.Core/Helpers/UserHelper.cs b/src/Altinn.App.Core/Helpers/UserHelper.cs index ecaa9c703..c1eeb45bd 100644 --- a/src/Altinn.App.Core/Helpers/UserHelper.cs +++ b/src/Altinn.App.Core/Helpers/UserHelper.cs @@ -1,3 +1,4 @@ +using System.Globalization; using System.Security.Claims; using Altinn.App.Core.Configuration; using Altinn.App.Core.Internal.Profile; @@ -47,24 +48,24 @@ public async Task GetUserContext(HttpContext context) foreach (Claim claim in context.User.Claims) { - if (claim.Type.Equals(AltinnCoreClaimTypes.UserName)) + if (claim.Type.Equals(AltinnCoreClaimTypes.UserName, StringComparison.Ordinal)) { userContext.UserName = claim.Value; } - if (claim.Type.Equals(AltinnCoreClaimTypes.UserId)) + if (claim.Type.Equals(AltinnCoreClaimTypes.UserId, StringComparison.Ordinal)) { - userContext.UserId = Convert.ToInt32(claim.Value); + userContext.UserId = Convert.ToInt32(claim.Value, CultureInfo.InvariantCulture); } - if (claim.Type.Equals(AltinnCoreClaimTypes.PartyID)) + if (claim.Type.Equals(AltinnCoreClaimTypes.PartyID, StringComparison.Ordinal)) { - userContext.PartyId = Convert.ToInt32(claim.Value); + userContext.PartyId = Convert.ToInt32(claim.Value, CultureInfo.InvariantCulture); } - if (claim.Type.Equals(AltinnCoreClaimTypes.AuthenticationLevel)) + if (claim.Type.Equals(AltinnCoreClaimTypes.AuthenticationLevel, StringComparison.Ordinal)) { - userContext.AuthenticationLevel = Convert.ToInt32(claim.Value); + userContext.AuthenticationLevel = Convert.ToInt32(claim.Value, CultureInfo.InvariantCulture); } } @@ -75,7 +76,10 @@ await _profileClient.GetUserProfile(userContext.UserId) if (context.Request.Cookies[_settings.GetAltinnPartyCookieName] != null) { - userContext.PartyId = Convert.ToInt32(context.Request.Cookies[_settings.GetAltinnPartyCookieName]); + userContext.PartyId = Convert.ToInt32( + context.Request.Cookies[_settings.GetAltinnPartyCookieName], + CultureInfo.InvariantCulture + ); } if (userContext.PartyId == userProfile.PartyId) diff --git a/src/Altinn.App.Core/Implementation/AppResourcesSI.cs b/src/Altinn.App.Core/Implementation/AppResourcesSI.cs index 6a0e00a8d..5adb31c4f 100644 --- a/src/Altinn.App.Core/Implementation/AppResourcesSI.cs +++ b/src/Altinn.App.Core/Implementation/AppResourcesSI.cs @@ -212,7 +212,7 @@ public string GetClassRefForLogicDataType(string dataType) Application application = GetApplication(); string classRef = string.Empty; - DataType? element = application.DataTypes.SingleOrDefault(d => d.Id.Equals(dataType)); + DataType? element = application.DataTypes.SingleOrDefault(d => d.Id.Equals(dataType, StringComparison.Ordinal)); if (element != null) { diff --git a/src/Altinn.App.Core/Implementation/DefaultAppEvents.cs b/src/Altinn.App.Core/Implementation/DefaultAppEvents.cs index 729ac6784..19a697a17 100644 --- a/src/Altinn.App.Core/Implementation/DefaultAppEvents.cs +++ b/src/Altinn.App.Core/Implementation/DefaultAppEvents.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Altinn.App.Core.Internal.App; using Altinn.App.Core.Internal.Data; using Altinn.App.Core.Internal.Instances; @@ -69,7 +70,7 @@ private async Task AutoDeleteDataElements(Instance instance) _dataClient.DeleteData( applicationMetadata.Org, applicationMetadata.AppIdentifier.App, - int.Parse(instance.InstanceOwner.PartyId), + int.Parse(instance.InstanceOwner.PartyId, CultureInfo.InvariantCulture), Guid.Parse(item.InstanceGuid), Guid.Parse(item.Id), true diff --git a/src/Altinn.App.Core/Implementation/PrefillSI.cs b/src/Altinn.App.Core/Implementation/PrefillSI.cs index 0a839cca1..895380dc8 100644 --- a/src/Altinn.App.Core/Implementation/PrefillSI.cs +++ b/src/Altinn.App.Core/Implementation/PrefillSI.cs @@ -1,3 +1,4 @@ +using System.Globalization; using System.Reflection; using Altinn.App.Core.Features; using Altinn.App.Core.Helpers; @@ -93,7 +94,7 @@ public async Task PrefillDataModel( _allowOverwrite = allowOverwriteToken.ToObject(); } - Party? party = await _altinnPartyClientClient.GetParty(int.Parse(partyId)); + Party? party = await _altinnPartyClientClient.GetParty(int.Parse(partyId, CultureInfo.InvariantCulture)); if (party == null) { string errorMessage = $"Could find party for partyId: {partyId}"; diff --git a/src/Altinn.App.Core/Infrastructure/Clients/KeyVault/SecretsLocalClient.cs b/src/Altinn.App.Core/Infrastructure/Clients/KeyVault/SecretsLocalClient.cs index 042851d88..ff254da36 100644 --- a/src/Altinn.App.Core/Infrastructure/Clients/KeyVault/SecretsLocalClient.cs +++ b/src/Altinn.App.Core/Infrastructure/Clients/KeyVault/SecretsLocalClient.cs @@ -46,9 +46,9 @@ public KeyVaultClient GetKeyVaultClient() } /// - public async Task GetSecretAsync(string secretId) + public async Task GetSecretAsync(string secretName) { - string token = GetTokenFromSecrets(secretId); + string token = GetTokenFromSecrets(secretName); return await Task.FromResult(token); } diff --git a/src/Altinn.App.Core/Infrastructure/Clients/Profile/ProfileClientCachingDecorator.cs b/src/Altinn.App.Core/Infrastructure/Clients/Profile/ProfileClientCachingDecorator.cs index d0a1e4133..cab458bdb 100644 --- a/src/Altinn.App.Core/Infrastructure/Clients/Profile/ProfileClientCachingDecorator.cs +++ b/src/Altinn.App.Core/Infrastructure/Clients/Profile/ProfileClientCachingDecorator.cs @@ -22,7 +22,7 @@ public class ProfileClientCachingDecorator : IProfileClient public ProfileClientCachingDecorator( IProfileClient decoratedService, IMemoryCache memoryCache, - IOptions _settings + IOptions settings ) { _decoratedService = decoratedService; @@ -30,7 +30,7 @@ IOptions _settings _cacheOptions = new() { - AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(_settings.Value.ProfileCacheLifetimeSeconds) + AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(settings.Value.ProfileCacheLifetimeSeconds) }; } diff --git a/src/Altinn.App.Core/Infrastructure/Clients/Storage/InstanceClient.cs b/src/Altinn.App.Core/Infrastructure/Clients/Storage/InstanceClient.cs index c6cecad87..609f618ae 100644 --- a/src/Altinn.App.Core/Infrastructure/Clients/Storage/InstanceClient.cs +++ b/src/Altinn.App.Core/Infrastructure/Clients/Storage/InstanceClient.cs @@ -1,3 +1,4 @@ +using System.Globalization; using System.Net; using System.Net.Http.Headers; using System.Text; @@ -60,10 +61,10 @@ public InstanceClient( } /// - public async Task GetInstance(string app, string org, int instanceOwnerPartyId, Guid instanceGuid) + public async Task GetInstance(string app, string org, int instanceOwnerPartyId, Guid instanceId) { - using var activity = _telemetry?.StartGetInstanceByGuidActivity(instanceGuid); - string instanceIdentifier = $"{instanceOwnerPartyId}/{instanceGuid}"; + using var activity = _telemetry?.StartGetInstanceByGuidActivity(instanceId); + string instanceIdentifier = $"{instanceOwnerPartyId}/{instanceId}"; string apiUrl = $"instances/{instanceIdentifier}"; string token = JwtTokenUtil.GetTokenFromContext(_httpContextAccessor.HttpContext, _settings.RuntimeCookieName); @@ -78,7 +79,7 @@ public async Task GetInstance(string app, string org, int instanceOwne } else { - _logger.LogError($"Unable to fetch instance with instance id {instanceGuid}"); + _logger.LogError($"Unable to fetch instance with instance id {instanceId}"); throw await PlatformHttpException.CreateAsync(response); } } @@ -90,7 +91,7 @@ public async Task GetInstance(Instance instance) using var activity = _telemetry?.StartGetInstanceByInstanceActivity(instanceGuid); string app = instance.AppId.Split("/")[1]; string org = instance.Org; - int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId); + int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId, CultureInfo.InvariantCulture); return await GetInstance(app, org, instanceOwnerPartyId, instanceGuid); } diff --git a/src/Altinn.App.Core/Infrastructure/Clients/Storage/InstanceEventClient.cs b/src/Altinn.App.Core/Infrastructure/Clients/Storage/InstanceEventClient.cs index 97db5f58e..5224647c4 100644 --- a/src/Altinn.App.Core/Infrastructure/Clients/Storage/InstanceEventClient.cs +++ b/src/Altinn.App.Core/Infrastructure/Clients/Storage/InstanceEventClient.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.Globalization; using System.Net.Http.Headers; using System.Text; using Altinn.App.Core.Configuration; @@ -66,7 +67,7 @@ string to StringBuilder bld = new StringBuilder(); foreach (string type in eventTypes) { - bld.Append($"{paramSeparator}eventTypes={type}"); + bld.Append(CultureInfo.InvariantCulture, $"{paramSeparator}eventTypes={type}"); paramSeparator = '&'; } diff --git a/src/Altinn.App.Core/Infrastructure/Clients/Storage/TextClient.cs b/src/Altinn.App.Core/Infrastructure/Clients/Storage/TextClient.cs index f037eec7e..d35eba899 100644 --- a/src/Altinn.App.Core/Infrastructure/Clients/Storage/TextClient.cs +++ b/src/Altinn.App.Core/Infrastructure/Clients/Storage/TextClient.cs @@ -62,7 +62,7 @@ IMemoryCache memoryCache public async Task GetText(string org, string app, string language) { TextResource? textResource = null; - string cacheKey = $"{org}-{app}-{language.ToLower()}"; + string cacheKey = $"{org}-{app}-{language.ToLowerInvariant()}"; if (!_memoryCache.TryGetValue(cacheKey, out textResource)) { diff --git a/src/Altinn.App.Core/Internal/Data/DataService.cs b/src/Altinn.App.Core/Internal/Data/DataService.cs index 8f9e822fd..bbe27960a 100644 --- a/src/Altinn.App.Core/Internal/Data/DataService.cs +++ b/src/Altinn.App.Core/Internal/Data/DataService.cs @@ -27,7 +27,9 @@ public DataService(IDataClient dataClient, IAppMetadata appMetadata) /// public async Task<(Guid dataElementId, T? model)> GetByType(Instance instance, string dataTypeId) { - DataElement? dataElement = instance.Data.SingleOrDefault(d => d.DataType.Equals(dataTypeId)); + DataElement? dataElement = instance.Data.SingleOrDefault(d => + d.DataType.Equals(dataTypeId, StringComparison.Ordinal) + ); if (dataElement == null) { diff --git a/src/Altinn.App.Core/Internal/Expressions/ExpressionEvaluator.cs b/src/Altinn.App.Core/Internal/Expressions/ExpressionEvaluator.cs index 30ffbf3eb..45b607576 100644 --- a/src/Altinn.App.Core/Internal/Expressions/ExpressionEvaluator.cs +++ b/src/Altinn.App.Core/Internal/Expressions/ExpressionEvaluator.cs @@ -266,7 +266,7 @@ private static string Round(object?[] args) int precision = 0; if (args.Length == 2 && args[1] is not null) { - precision = Convert.ToInt32(args[1]); + precision = Convert.ToInt32(args[1], CultureInfo.InvariantCulture); } return number.Value.ToString($"N{precision}", CultureInfo.InvariantCulture); @@ -386,7 +386,7 @@ bool ab $"Expected number, got value {(ab ? "true" : "false")}" ), string s => ParseNumber(s), - IConvertible c => Convert.ToDouble(c), + IConvertible c => Convert.ToDouble(c, CultureInfo.InvariantCulture), _ => null }; } @@ -398,7 +398,7 @@ bool ab return PrepareBooleanArg(args[0]) ? args[1] : null; } - if (args.Length > 2 && !"else".Equals(args[2] as string, StringComparison.InvariantCultureIgnoreCase)) + if (args.Length > 2 && !"else".Equals(args[2] as string, StringComparison.OrdinalIgnoreCase)) { throw new ExpressionEvaluatorTypeErrorException("Expected third argument to be \"else\""); } @@ -488,15 +488,15 @@ bool ab if (value is string svalue) { // Special case for "TruE" to be equal to true - if ("true".Equals(svalue, StringComparison.InvariantCultureIgnoreCase)) + if ("true".Equals(svalue, StringComparison.OrdinalIgnoreCase)) { return "true"; } - else if ("false".Equals(svalue, StringComparison.InvariantCultureIgnoreCase)) + else if ("false".Equals(svalue, StringComparison.OrdinalIgnoreCase)) { return "false"; } - else if ("null".Equals(svalue, StringComparison.InvariantCultureIgnoreCase)) + else if ("null".Equals(svalue, StringComparison.OrdinalIgnoreCase)) { return null; } @@ -523,7 +523,7 @@ bool ab throw new ExpressionEvaluatorTypeErrorException($"Expected 2 argument(s), got {args.Length}"); } - return string.Equals(ToStringForEquals(args[0]), ToStringForEquals(args[1]), StringComparison.InvariantCulture); + return string.Equals(ToStringForEquals(args[0]), ToStringForEquals(args[1]), StringComparison.Ordinal); } private static object Argv(object?[] args, object[]? positionalArguments) diff --git a/src/Altinn.App.Core/Internal/Pdf/PdfService.cs b/src/Altinn.App.Core/Internal/Pdf/PdfService.cs index 7df8db7ba..600b21db3 100644 --- a/src/Altinn.App.Core/Internal/Pdf/PdfService.cs +++ b/src/Altinn.App.Core/Internal/Pdf/PdfService.cs @@ -195,8 +195,12 @@ private static string GetFileName(Instance instance, TextResource? textResource) } TextResourceElement? titleText = - textResource.Resources.Find(textResourceElement => textResourceElement.Id.Equals("appName")) - ?? textResource.Resources.Find(textResourceElement => textResourceElement.Id.Equals("ServiceName")); + textResource.Resources.Find(textResourceElement => + textResourceElement.Id.Equals("appName", StringComparison.Ordinal) + ) + ?? textResource.Resources.Find(textResourceElement => + textResourceElement.Id.Equals("ServiceName", StringComparison.Ordinal) + ); if (titleText != null && !string.IsNullOrEmpty(titleText.Value)) { diff --git a/src/Altinn.App.Core/Internal/Process/EventHandlers/EndEventEventHandler.cs b/src/Altinn.App.Core/Internal/Process/EventHandlers/EndEventEventHandler.cs index 2e9dbe69c..9ebd24525 100644 --- a/src/Altinn.App.Core/Internal/Process/EventHandlers/EndEventEventHandler.cs +++ b/src/Altinn.App.Core/Internal/Process/EventHandlers/EndEventEventHandler.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Altinn.App.Core.Internal.App; using Altinn.App.Core.Internal.Instances; using Altinn.App.Core.Models; @@ -48,7 +49,7 @@ private async Task AutoDeleteOnProcessEndIfEnabled(Instance instance) ApplicationMetadata applicationMetadata = await _appMetadata.GetApplicationMetadata(); if (applicationMetadata.AutoDeleteOnProcessEnd && instance.Process?.Ended != null) { - int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId); + int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId, CultureInfo.InvariantCulture); await _instanceClient.DeleteInstance(instanceOwnerPartyId, instanceIdentifier.InstanceGuid, true); } } diff --git a/src/Altinn.App.Core/Internal/Process/ExclusiveGatewayFactory.cs b/src/Altinn.App.Core/Internal/Process/ExclusiveGatewayFactory.cs index 099be5bf6..6f3b69fd3 100644 --- a/src/Altinn.App.Core/Internal/Process/ExclusiveGatewayFactory.cs +++ b/src/Altinn.App.Core/Internal/Process/ExclusiveGatewayFactory.cs @@ -30,7 +30,7 @@ public ExclusiveGatewayFactory(IEnumerable gateways) public IProcessExclusiveGateway? GetProcessExclusiveGateway(string gatewayId) { return _gateways.FirstOrDefault(gateway => - String.Equals(gateway.GatewayId, gatewayId, StringComparison.CurrentCultureIgnoreCase) + string.Equals(gateway.GatewayId, gatewayId, StringComparison.OrdinalIgnoreCase) ); } } diff --git a/src/Altinn.App.Core/Internal/Process/ExpressionsExclusiveGateway.cs b/src/Altinn.App.Core/Internal/Process/ExpressionsExclusiveGateway.cs index a22f885dd..35bfe198d 100644 --- a/src/Altinn.App.Core/Internal/Process/ExpressionsExclusiveGateway.cs +++ b/src/Altinn.App.Core/Internal/Process/ExpressionsExclusiveGateway.cs @@ -1,3 +1,4 @@ +using System.Globalization; using System.Text; using System.Text.Json; using Altinn.App.Core.Features; @@ -98,7 +99,7 @@ private async Task GetLayoutEvaluatorState( dataElementType, instance.Org, instance.AppId.Split("/")[1], - int.Parse(instance.InstanceOwner.PartyId), + int.Parse(instance.InstanceOwner.PartyId, CultureInfo.InvariantCulture), dataGuid.Value ); } diff --git a/src/Altinn.App.Core/Internal/Process/ProcessReader.cs b/src/Altinn.App.Core/Internal/Process/ProcessReader.cs index f5f2aba41..c854cda60 100644 --- a/src/Altinn.App.Core/Internal/Process/ProcessReader.cs +++ b/src/Altinn.App.Core/Internal/Process/ProcessReader.cs @@ -24,7 +24,12 @@ public class ProcessReader : IProcessReader public ProcessReader(IProcessClient processClient, Telemetry? telemetry = null) { XmlSerializer serializer = new XmlSerializer(typeof(Definitions)); - Definitions? definitions = (Definitions?)serializer.Deserialize(processClient.GetProcessDefinition()); + // TODO: IO should be async + using var stream = processClient.GetProcessDefinition(); +#pragma warning disable CA5369 // Use XmlReader for 'XmlSerializer.Deserialize()' + // NOTE: this is trusted XML input, as it comes from the apps own code + Definitions? definitions = (Definitions?)serializer.Deserialize(stream); +#pragma warning restore CA5369 // Use XmlReader for 'XmlSerializer.Deserialize()' _definitions = definitions diff --git a/src/Altinn.App.Core/Internal/Process/ProcessTasks/Common/ProcessTaskFinalizer.cs b/src/Altinn.App.Core/Internal/Process/ProcessTasks/Common/ProcessTaskFinalizer.cs index 996baeba0..5914c07ea 100644 --- a/src/Altinn.App.Core/Internal/Process/ProcessTasks/Common/ProcessTaskFinalizer.cs +++ b/src/Altinn.App.Core/Internal/Process/ProcessTasks/Common/ProcessTaskFinalizer.cs @@ -1,3 +1,4 @@ +using System.Globalization; using System.Text.Json; using Altinn.App.Core.Configuration; using Altinn.App.Core.Helpers; @@ -85,7 +86,7 @@ DataType dataType Guid instanceGuid = Guid.Parse(instance.Id.Split("/")[1]); Guid dataGuid = Guid.Parse(dataElement.Id); string app = instance.AppId.Split("/")[1]; - int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId); + int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId, CultureInfo.InvariantCulture); object data = await _dataClient.GetFormData( instanceGuid, modelType, diff --git a/src/Altinn.App.Core/Internal/Process/ProcessTasks/Common/ProcessTaskInitializer.cs b/src/Altinn.App.Core/Internal/Process/ProcessTasks/Common/ProcessTaskInitializer.cs index cd2850f72..3c96de722 100644 --- a/src/Altinn.App.Core/Internal/Process/ProcessTasks/Common/ProcessTaskInitializer.cs +++ b/src/Altinn.App.Core/Internal/Process/ProcessTasks/Common/ProcessTaskInitializer.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Altinn.App.Core.Features; using Altinn.App.Core.Helpers; using Altinn.App.Core.Internal.App; @@ -107,7 +108,7 @@ private async Task UpdatePresentationTextsOnInstance(Instance instance, string d if (updatedValues.Count > 0) { Instance updatedInstance = await _instanceClient.UpdatePresentationTexts( - int.Parse(instance.Id.Split("/")[0]), + int.Parse(instance.Id.Split("/")[0], CultureInfo.InvariantCulture), Guid.Parse(instance.Id.Split("/")[1]), new PresentationTexts { Texts = updatedValues } ); @@ -129,7 +130,7 @@ private async Task UpdateDataValuesOnInstance(Instance instance, string dataType if (updatedValues.Count > 0) { Instance updatedInstance = await _instanceClient.UpdateDataValues( - int.Parse(instance.Id.Split("/")[0]), + int.Parse(instance.Id.Split("/")[0], CultureInfo.InvariantCulture), Guid.Parse(instance.Id.Split("/")[1]), new DataValues { Values = updatedValues } ); diff --git a/src/Altinn.App.Core/Internal/Validation/ValidationService.cs b/src/Altinn.App.Core/Internal/Validation/ValidationService.cs index 46e2fcd4c..8b8916e12 100644 --- a/src/Altinn.App.Core/Internal/Validation/ValidationService.cs +++ b/src/Altinn.App.Core/Internal/Validation/ValidationService.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Altinn.App.Core.Features; using Altinn.App.Core.Internal.App; using Altinn.App.Core.Internal.AppModel; @@ -139,7 +140,7 @@ public async Task> ValidateDataElement( Guid instanceGuid = Guid.Parse(instance.Id.Split("/")[1]); string app = instance.AppId.Split("/")[1]; - int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId); + int instanceOwnerPartyId = int.Parse(instance.InstanceOwner.PartyId, CultureInfo.InvariantCulture); var data = await _dataClient.GetFormData( instanceGuid, modelType, diff --git a/src/Altinn.App.Core/Models/AppIdentifier.cs b/src/Altinn.App.Core/Models/AppIdentifier.cs index 0b61d1988..3d1627612 100644 --- a/src/Altinn.App.Core/Models/AppIdentifier.cs +++ b/src/Altinn.App.Core/Models/AppIdentifier.cs @@ -93,8 +93,8 @@ public bool Equals(AppIdentifier? other) { return Org != null && App != null - && Org.Equals(other?.Org, StringComparison.CurrentCultureIgnoreCase) - && App.Equals(other?.App, StringComparison.CurrentCultureIgnoreCase); + && Org.Equals(other?.Org, StringComparison.OrdinalIgnoreCase) + && App.Equals(other?.App, StringComparison.OrdinalIgnoreCase); } /// diff --git a/src/Altinn.App.Core/Models/DataList.cs b/src/Altinn.App.Core/Models/DataList.cs index 7bf0060ad..e9682b700 100644 --- a/src/Altinn.App.Core/Models/DataList.cs +++ b/src/Altinn.App.Core/Models/DataList.cs @@ -14,6 +14,8 @@ public class DataList /// Gets or sets the metadata of the DataList. /// #pragma warning disable IDE1006 // Naming Styles - public members should be PascalCase +#pragma warning disable CA1707 // Identifiers should not contain underscores public DataListMetadata _metaData { get; set; } = new DataListMetadata(); +#pragma warning restore CA1707 // Identifiers should not contain underscores #pragma warning restore IDE1006 // Naming Styles } diff --git a/src/Altinn.App.Core/Models/InstanceIdentifier.cs b/src/Altinn.App.Core/Models/InstanceIdentifier.cs index 6363edd29..ae6ac5c94 100644 --- a/src/Altinn.App.Core/Models/InstanceIdentifier.cs +++ b/src/Altinn.App.Core/Models/InstanceIdentifier.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Altinn.Platform.Storage.Interface.Models; namespace Altinn.App.Core.Models; @@ -110,7 +111,7 @@ public override string ToString() private static (int InstanceOwnerPartyId, Guid InstanceGuid) DeconstructInstanceId(string instanceId) { var deconstructed = instanceId.Split("/"); - int instanceOwnerPartyId = int.Parse(deconstructed[0]); + int instanceOwnerPartyId = int.Parse(deconstructed[0], CultureInfo.InvariantCulture); Guid instanceGuid = Guid.Parse(deconstructed[1]); return (instanceOwnerPartyId, instanceGuid); @@ -129,13 +130,17 @@ private static (int InstanceOwnerId, Guid InstanceOwnerGuid) DeconstructInstance string searchForSingular = "/instance/"; string instanceSubpath = string.Empty; - if (url.Contains(searchForPlural, StringComparison.InvariantCultureIgnoreCase)) + if (url.Contains(searchForPlural, StringComparison.OrdinalIgnoreCase)) { - instanceSubpath = url.Substring(url.IndexOf(searchForPlural) + searchForPlural.Length); + instanceSubpath = url.Substring( + url.IndexOf(searchForPlural, StringComparison.OrdinalIgnoreCase) + searchForPlural.Length + ); } - else if (url.Contains(searchForSingular, StringComparison.InvariantCultureIgnoreCase)) + else if (url.Contains(searchForSingular, StringComparison.OrdinalIgnoreCase)) { - instanceSubpath = url.Substring(url.IndexOf(searchForSingular) + searchForSingular.Length); + instanceSubpath = url.Substring( + url.IndexOf(searchForSingular, StringComparison.OrdinalIgnoreCase) + searchForSingular.Length + ); } if (string.IsNullOrEmpty(instanceSubpath)) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 6669928bf..5dff295a1 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -13,6 +13,7 @@ + Recommended enable enable true @@ -50,4 +51,4 @@ true - \ No newline at end of file + From f858d9c117b21b95afa7fb68dd6823d8234b666d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 12:37:18 +0200 Subject: [PATCH 5/5] chore(deps): update nuget non-major dependencies (main) (#672) * chore(deps): update nuget non-major dependencies * Fixes test failure by updating openapi spec --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Daniel Skovli --- src/Altinn.App.Api/Altinn.App.Api.csproj | 2 +- src/Altinn.App.Core/Altinn.App.Core.csproj | 2 +- .../Altinn.App.Api.Tests.csproj | 4 +-- .../Altinn.App.Api.Tests/OpenApi/swagger.json | 28 +++++++++++++++++++ .../Altinn.App.Api.Tests/OpenApi/swagger.yaml | 20 +++++++++++++ 5 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/Altinn.App.Api/Altinn.App.Api.csproj b/src/Altinn.App.Api/Altinn.App.Api.csproj index 483bfd035..2eb16f505 100644 --- a/src/Altinn.App.Api/Altinn.App.Api.csproj +++ b/src/Altinn.App.Api/Altinn.App.Api.csproj @@ -16,7 +16,7 @@ - + diff --git a/src/Altinn.App.Core/Altinn.App.Core.csproj b/src/Altinn.App.Core/Altinn.App.Core.csproj index 1181f2e07..0f8a74b30 100644 --- a/src/Altinn.App.Core/Altinn.App.Core.csproj +++ b/src/Altinn.App.Core/Altinn.App.Core.csproj @@ -15,7 +15,7 @@ - + diff --git a/test/Altinn.App.Api.Tests/Altinn.App.Api.Tests.csproj b/test/Altinn.App.Api.Tests/Altinn.App.Api.Tests.csproj index 9fec1f441..cf8a4a42b 100644 --- a/test/Altinn.App.Api.Tests/Altinn.App.Api.Tests.csproj +++ b/test/Altinn.App.Api.Tests/Altinn.App.Api.Tests.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/test/Altinn.App.Api.Tests/OpenApi/swagger.json b/test/Altinn.App.Api.Tests/OpenApi/swagger.json index badb23eb8..4779a497a 100644 --- a/test/Altinn.App.Api.Tests/OpenApi/swagger.json +++ b/test/Altinn.App.Api.Tests/OpenApi/swagger.json @@ -4838,6 +4838,13 @@ }, "nullable": true }, + "metadata": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KeyValueEntry" + }, + "nullable": true + }, "deleteStatus": { "$ref": "#/components/schemas/DeleteStatus" }, @@ -5078,6 +5085,13 @@ }, "nullable": true }, + "metadata": { + "type": "array", + "items": { + "$ref": "#/components/schemas/KeyValueEntry" + }, + "nullable": true + }, "deleteStatus": { "$ref": "#/components/schemas/DeleteStatus" }, @@ -5610,6 +5624,20 @@ }, "additionalProperties": false }, + "KeyValueEntry": { + "type": "object", + "properties": { + "key": { + "type": "string", + "nullable": true + }, + "value": { + "type": "string", + "nullable": true + } + }, + "additionalProperties": false + }, "Logo": { "type": "object", "properties": { diff --git a/test/Altinn.App.Api.Tests/OpenApi/swagger.yaml b/test/Altinn.App.Api.Tests/OpenApi/swagger.yaml index f6d0e3252..a7e893eca 100644 --- a/test/Altinn.App.Api.Tests/OpenApi/swagger.yaml +++ b/test/Altinn.App.Api.Tests/OpenApi/swagger.yaml @@ -2993,6 +2993,11 @@ components: items: type: string nullable: true + metadata: + type: array + items: + $ref: '#/components/schemas/KeyValueEntry' + nullable: true deleteStatus: $ref: '#/components/schemas/DeleteStatus' fileScanResult: @@ -3168,6 +3173,11 @@ components: items: type: string nullable: true + metadata: + type: array + items: + $ref: '#/components/schemas/KeyValueEntry' + nullable: true deleteStatus: $ref: '#/components/schemas/DeleteStatus' fileScanResult: @@ -3551,6 +3561,16 @@ components: $ref: '#/components/schemas/PatchOperation' nullable: true additionalProperties: false + KeyValueEntry: + type: object + properties: + key: + type: string + nullable: true + value: + type: string + nullable: true + additionalProperties: false Logo: type: object properties: