From c364572c5e2f98869c91ea2de2cb44ccbd6753d7 Mon Sep 17 00:00:00 2001 From: Phil Schneider Date: Thu, 13 Jun 2024 21:25:33 +0200 Subject: [PATCH 1/4] fix(invite): add locking to invite process (#788) * fix(invite): add locking to invite process * fix regression in unit-test Refs: #787 --------- Co-authored-by: Norbert Truchsess --- .../InvitationProcessTypeExecutor.cs | 11 ++++++- .../CompanyDataBusinessLogicTests.cs | 31 +++++-------------- .../InvitationProcessTypeExecutorTests.cs | 12 +++---- 3 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/processes/Invitation.Executor/InvitationProcessTypeExecutor.cs b/src/processes/Invitation.Executor/InvitationProcessTypeExecutor.cs index e9871bfbef..a03b0a04d3 100644 --- a/src/processes/Invitation.Executor/InvitationProcessTypeExecutor.cs +++ b/src/processes/Invitation.Executor/InvitationProcessTypeExecutor.cs @@ -48,6 +48,15 @@ public class InvitationProcessTypeExecutor : IProcessTypeExecutor ProcessStepTypeId.INVITATION_CREATE_DATABASE_IDP, ProcessStepTypeId.INVITATION_CREATE_USER); + private static readonly IEnumerable LockableProcessSteps = ImmutableArray.Create( + ProcessStepTypeId.INVITATION_CREATE_CENTRAL_IDP, + ProcessStepTypeId.INVITATION_CREATE_SHARED_IDP_SERVICE_ACCOUNT, + ProcessStepTypeId.INVITATION_CREATE_CENTRAL_IDP_ORG_MAPPER, + ProcessStepTypeId.INVITATION_CREATE_SHARED_REALM, + ProcessStepTypeId.INVITATION_CREATE_SHARED_CLIENT, + ProcessStepTypeId.INVITATION_CREATE_DATABASE_IDP, + ProcessStepTypeId.INVITATION_CREATE_USER); + private readonly IPortalRepositories _portalRepositories; private readonly IInvitationProcessService _invitationProcessService; private Guid _companyInvitationId; @@ -80,7 +89,7 @@ public InvitationProcessTypeExecutor(IPortalRepositories portalRepositories, IIn return new IProcessTypeExecutor.InitializationResult(false, null); } - public ValueTask IsLockRequested(ProcessStepTypeId processStepTypeId) => new(false); + public ValueTask IsLockRequested(ProcessStepTypeId processStepTypeId) => new(LockableProcessSteps.Contains(processStepTypeId)); public ProcessTypeId GetProcessTypeId() => ProcessTypeId.INVITATION; diff --git a/tests/administration/Administration.Service.Tests/BusinessLogic/CompanyDataBusinessLogicTests.cs b/tests/administration/Administration.Service.Tests/BusinessLogic/CompanyDataBusinessLogicTests.cs index c7b6c36f95..afbdf957c7 100644 --- a/tests/administration/Administration.Service.Tests/BusinessLogic/CompanyDataBusinessLogicTests.cs +++ b/tests/administration/Administration.Service.Tests/BusinessLogic/CompanyDataBusinessLogicTests.cs @@ -24,7 +24,6 @@ using Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling; using Org.Eclipse.TractusX.Portal.Backend.Framework.Models; using Org.Eclipse.TractusX.Portal.Backend.IssuerComponent.Library.BusinessLogic; -using Org.Eclipse.TractusX.Portal.Backend.IssuerComponent.Library.Models; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Extensions; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Models; @@ -859,33 +858,20 @@ public async Task GetCompanyCertificateWithBpnNumber_WithEmptyResult_ReturnsExpe #region GetAllCompanyCertificates - [Fact] - public async Task GetAllCompanyCertificatesAsync_WithDefaultRequest_GetsExpectedEntries() - { - // Arrange - SetupPagination(); - var sut = _fixture.Create(); - - // Act - var result = await sut.GetAllCompanyCertificatesAsync(0, 5, null, null, null); - - // Assert - result.Content.Should().HaveCount(3); - } - - [Fact] - public async Task GetAllCompanyCertificatesAsync_WithSmallSize_GetsExpectedEntries() + [Theory] + [InlineData(10, 0, 7, 7)] + [InlineData(10, 1, 7, 3)] + [InlineData(10, 0, 15, 10)] + public async Task GetAllCompanyCertificatesAsync_GetsExpectedEntries(int num, int page, int requested, int expected) { // Arrange - const int expectedCount = 3; - SetupPagination(); - var sut = _fixture.Create(); + SetupPagination(num); // Act - var result = await sut.GetAllCompanyCertificatesAsync(0, expectedCount, null, null, null); + var result = await _sut.GetAllCompanyCertificatesAsync(page, requested, null, null, null); // Assert - result.Content.Should().HaveCount(expectedCount); + result.Content.Should().HaveCount(expected); } #endregion @@ -979,7 +965,6 @@ public async Task GetCompanyCertificateDocumentAsync_WithDocumentStatusIsNotLock public async Task DeleteCompanyCertificateAsync_WithDocumentNotExisting_ThrowsNotFoundException() { // Arrange - //var sut = _fixture.Create(); A.CallTo(() => _companyCertificateRepository.GetCompanyCertificateDocumentDetailsForIdUntrackedAsync(Guid.NewGuid(), _identity.CompanyId)) .Returns((Guid.NewGuid(), DocumentStatusId.LOCKED, new[] { Guid.NewGuid() }.AsEnumerable(), false)); diff --git a/tests/processes/Invitation.Executor.Tests/InvitationProcessTypeExecutorTests.cs b/tests/processes/Invitation.Executor.Tests/InvitationProcessTypeExecutorTests.cs index 62eb808208..395a13f137 100644 --- a/tests/processes/Invitation.Executor.Tests/InvitationProcessTypeExecutorTests.cs +++ b/tests/processes/Invitation.Executor.Tests/InvitationProcessTypeExecutorTests.cs @@ -312,14 +312,14 @@ public void IsExecutableProcessStep_ReturnsExpected(bool checklistHandlerReturnV #region IsLockRequested [Theory] - [InlineData(ProcessStepTypeId.INVITATION_CREATE_CENTRAL_IDP, false)] - [InlineData(ProcessStepTypeId.INVITATION_CREATE_SHARED_IDP_SERVICE_ACCOUNT, false)] + [InlineData(ProcessStepTypeId.INVITATION_CREATE_CENTRAL_IDP, true)] + [InlineData(ProcessStepTypeId.INVITATION_CREATE_SHARED_IDP_SERVICE_ACCOUNT, true)] [InlineData(ProcessStepTypeId.INVITATION_UPDATE_CENTRAL_IDP_URLS, false)] - [InlineData(ProcessStepTypeId.INVITATION_CREATE_CENTRAL_IDP_ORG_MAPPER, false)] - [InlineData(ProcessStepTypeId.INVITATION_CREATE_SHARED_REALM, false)] + [InlineData(ProcessStepTypeId.INVITATION_CREATE_CENTRAL_IDP_ORG_MAPPER, true)] + [InlineData(ProcessStepTypeId.INVITATION_CREATE_SHARED_REALM, true)] [InlineData(ProcessStepTypeId.INVITATION_ENABLE_CENTRAL_IDP, false)] - [InlineData(ProcessStepTypeId.INVITATION_CREATE_DATABASE_IDP, false)] - [InlineData(ProcessStepTypeId.INVITATION_CREATE_USER, false)] + [InlineData(ProcessStepTypeId.INVITATION_CREATE_DATABASE_IDP, true)] + [InlineData(ProcessStepTypeId.INVITATION_CREATE_USER, true)] public async Task IsLockRequested_ReturnsExpected(ProcessStepTypeId stepTypeId, bool isLocked) { // Act From 3baed5a1cb620285097a11a67d45bc28f56c1c0f Mon Sep 17 00:00:00 2001 From: Norbert Truchsess Date: Fri, 14 Jun 2024 14:16:53 +0200 Subject: [PATCH 2/4] fix(invite): adjust exceptionhandling for encryption (#790) * fix encryption throwing systemexception * add unit test * update framework version * update DEPENDENCIES --- DEPENDENCIES | 2 +- .../Framework.Async/Directory.Build.props | 2 +- .../Framework.Cors/Directory.Build.props | 2 +- .../Framework.DBAccess/Directory.Build.props | 2 +- .../Directory.Build.props | 2 +- .../Directory.Build.props | 2 +- .../Directory.Build.props | 2 +- .../Directory.Build.props | 2 +- .../Directory.Build.props | 2 +- .../Directory.Build.props | 2 +- .../Framework.IO/Directory.Build.props | 2 +- .../Framework.Linq/Directory.Build.props | 2 +- .../Framework.Logging/Directory.Build.props | 2 +- .../Configuration/EncryptionModeConfig.cs | 18 ++ .../Framework.Models/Directory.Build.props | 2 +- .../Encryption/CryptoHelper.cs | 47 +++++- .../Framework.Seeding/Directory.Build.props | 2 +- .../Framework.Swagger/Directory.Build.props | 2 +- .../Framework.Token/Directory.Build.props | 2 +- .../Framework.Web/Directory.Build.props | 2 +- .../InvitationProcessService.cs | 13 +- .../EncryptionHelperTests.cs | 90 +++++++++- .../InvitationProcessServiceTests.cs | 159 +++++++++++------- 23 files changed, 274 insertions(+), 89 deletions(-) diff --git a/DEPENDENCIES b/DEPENDENCIES index 8f0b34a960..89e2e7268c 100644 --- a/DEPENDENCIES +++ b/DEPENDENCIES @@ -11,7 +11,7 @@ nuget/nuget/-/Flurl.Http.Signed/3.2.4, MIT, approved, #3503 nuget/nuget/-/Flurl.Signed/3.0.6, MIT, approved, #3501 nuget/nuget/-/HtmlAgilityPack/1.11.59, MIT, approved, #9293 nuget/nuget/-/Humanizer.Core/2.14.1, MIT, approved, #10060 -nuget/nuget/-/Json.More.Net/2.0.0, MIT, approved, clearlydefined +nuget/nuget/-/Json.More.Net/2.0.0, MIT AND OFL-1.1 AND CC-BY-SA-4.0, approved, #15173 nuget/nuget/-/JsonPointer.Net/4.0.0, MIT, approved, clearlydefined nuget/nuget/-/JsonSchema.Net/6.0.5, MIT AND OFL-1.1 AND CC-BY-SA-4.0, approved, #13370 nuget/nuget/-/Laraue.EfCoreTriggers.Common/8.0.3, MIT, approved, #13968 diff --git a/src/framework/Framework.Async/Directory.Build.props b/src/framework/Framework.Async/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.Async/Directory.Build.props +++ b/src/framework/Framework.Async/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/framework/Framework.Cors/Directory.Build.props b/src/framework/Framework.Cors/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.Cors/Directory.Build.props +++ b/src/framework/Framework.Cors/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/framework/Framework.DBAccess/Directory.Build.props b/src/framework/Framework.DBAccess/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.DBAccess/Directory.Build.props +++ b/src/framework/Framework.DBAccess/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/framework/Framework.DateTimeProvider/Directory.Build.props b/src/framework/Framework.DateTimeProvider/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.DateTimeProvider/Directory.Build.props +++ b/src/framework/Framework.DateTimeProvider/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/framework/Framework.DependencyInjection/Directory.Build.props b/src/framework/Framework.DependencyInjection/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.DependencyInjection/Directory.Build.props +++ b/src/framework/Framework.DependencyInjection/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/framework/Framework.ErrorHandling.Controller/Directory.Build.props b/src/framework/Framework.ErrorHandling.Controller/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.ErrorHandling.Controller/Directory.Build.props +++ b/src/framework/Framework.ErrorHandling.Controller/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/framework/Framework.ErrorHandling.Web/Directory.Build.props b/src/framework/Framework.ErrorHandling.Web/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.ErrorHandling.Web/Directory.Build.props +++ b/src/framework/Framework.ErrorHandling.Web/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/framework/Framework.ErrorHandling/Directory.Build.props b/src/framework/Framework.ErrorHandling/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.ErrorHandling/Directory.Build.props +++ b/src/framework/Framework.ErrorHandling/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/framework/Framework.HttpClientExtensions/Directory.Build.props b/src/framework/Framework.HttpClientExtensions/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.HttpClientExtensions/Directory.Build.props +++ b/src/framework/Framework.HttpClientExtensions/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/framework/Framework.IO/Directory.Build.props b/src/framework/Framework.IO/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.IO/Directory.Build.props +++ b/src/framework/Framework.IO/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/framework/Framework.Linq/Directory.Build.props b/src/framework/Framework.Linq/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.Linq/Directory.Build.props +++ b/src/framework/Framework.Linq/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/framework/Framework.Logging/Directory.Build.props b/src/framework/Framework.Logging/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.Logging/Directory.Build.props +++ b/src/framework/Framework.Logging/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/framework/Framework.Models/Configuration/EncryptionModeConfig.cs b/src/framework/Framework.Models/Configuration/EncryptionModeConfig.cs index 5a5deae84b..2026b59bdd 100644 --- a/src/framework/Framework.Models/Configuration/EncryptionModeConfig.cs +++ b/src/framework/Framework.Models/Configuration/EncryptionModeConfig.cs @@ -17,6 +17,8 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ +using Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling; +using Org.Eclipse.TractusX.Portal.Backend.Framework.Models.Encryption; using Org.Eclipse.TractusX.Portal.Backend.Framework.Models.Validation; using System.ComponentModel.DataAnnotations; using System.Security.Cryptography; @@ -39,3 +41,19 @@ public class EncryptionModeConfig [ValidateEnumValue] public PaddingMode PaddingMode { get; set; } } + +public static class EncryptionModeConfigExtension +{ + public static CryptoHelper GetCryptoHelper(this IEnumerable configs, int index) + { + var cryptoConfig = configs.SingleOrDefault(x => x.Index == index) ?? throw new ConfigurationException($"EncryptionModeIndex {index} is not configured"); + try + { + return new(Convert.FromHexString(cryptoConfig.EncryptionKey), cryptoConfig.CipherMode, cryptoConfig.PaddingMode); + } + catch (FormatException) + { + throw new ConfigurationException($"EncryptionModeConfig index {index} is not valid. EncryptionKey cannot be parsed as hex-string"); + } + } +} diff --git a/src/framework/Framework.Models/Directory.Build.props b/src/framework/Framework.Models/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.Models/Directory.Build.props +++ b/src/framework/Framework.Models/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/framework/Framework.Models/Encryption/CryptoHelper.cs b/src/framework/Framework.Models/Encryption/CryptoHelper.cs index 96d5a6a866..23cc33136a 100644 --- a/src/framework/Framework.Models/Encryption/CryptoHelper.cs +++ b/src/framework/Framework.Models/Encryption/CryptoHelper.cs @@ -17,13 +17,58 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ +using Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling; using System.Security.Cryptography; using System.Text; namespace Org.Eclipse.TractusX.Portal.Backend.Framework.Models.Encryption; -public static class CryptoHelper +public class CryptoHelper { + private readonly byte[] _encryptionKey; + + private readonly CipherMode _cipherMode; + private readonly PaddingMode _paddingMode; + + public CryptoHelper(byte[] encryptionKey, CipherMode cipherMode, PaddingMode paddingMode) + { + _encryptionKey = encryptionKey; + _cipherMode = cipherMode; + _paddingMode = paddingMode; + } + + public (byte[] Result, byte[] InitializationVector) Encrypt(string data) + { + try + { + return Encrypt(data, _encryptionKey, _cipherMode, _paddingMode); + } + catch (ArgumentException e) + { + throw new ConfigurationException($"Invalid Encryption Config: {e.Message}", e); + } + catch (CryptographicException e) + { + throw new ConflictException($"Data could not be encrypted: {e.Message}", e); + } + } + + public string Decrypt(byte[] data, byte[]? initializationVector) + { + try + { + return Decrypt(data, initializationVector, _encryptionKey, _cipherMode, _paddingMode); + } + catch (ArgumentException e) + { + throw new ConfigurationException($"Invalid Encryption Config: {e.Message}", e); + } + catch (CryptographicException e) + { + throw new ConflictException($"Data could not be decrypted: {e.Message}", e); + } + } + public static (byte[] Result, byte[] InitializationVector) Encrypt(string data, byte[] encryptionKey, CipherMode cipherMode, PaddingMode paddingMode) { using var aes = Aes.Create(); diff --git a/src/framework/Framework.Seeding/Directory.Build.props b/src/framework/Framework.Seeding/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.Seeding/Directory.Build.props +++ b/src/framework/Framework.Seeding/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/framework/Framework.Swagger/Directory.Build.props b/src/framework/Framework.Swagger/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.Swagger/Directory.Build.props +++ b/src/framework/Framework.Swagger/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/framework/Framework.Token/Directory.Build.props b/src/framework/Framework.Token/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.Token/Directory.Build.props +++ b/src/framework/Framework.Token/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/framework/Framework.Web/Directory.Build.props b/src/framework/Framework.Web/Directory.Build.props index 124e7e0c55..d7cf622f5f 100644 --- a/src/framework/Framework.Web/Directory.Build.props +++ b/src/framework/Framework.Web/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.1 + 2.2.2 diff --git a/src/processes/Invitation.Executor/InvitationProcessService.cs b/src/processes/Invitation.Executor/InvitationProcessService.cs index a2323af1b9..4a88d14e0f 100644 --- a/src/processes/Invitation.Executor/InvitationProcessService.cs +++ b/src/processes/Invitation.Executor/InvitationProcessService.cs @@ -20,6 +20,7 @@ using Microsoft.Extensions.Options; using Org.Eclipse.TractusX.Portal.Backend.ExternalSystems.Provisioning.Library; using Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling; +using Org.Eclipse.TractusX.Portal.Backend.Framework.Models.Configuration; using Org.Eclipse.TractusX.Portal.Backend.Framework.Models.Encryption; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess; using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Models; @@ -84,6 +85,7 @@ public InvitationProcessService( public async Task<(IEnumerable? nextStepTypeIds, ProcessStepStatusId stepStatusId, bool modified, string? processMessage)> CreateSharedIdpServiceAccount(Guid invitationId) { + var cryptoHelper = _settings.EncryptionConfigs.GetCryptoHelper(_settings.EncryptionConfigIndex); var companyInvitationRepository = _portalRepositories.GetInstance(); var idpName = await companyInvitationRepository.GetIdpNameForInvitationId(invitationId).ConfigureAwait(ConfigureAwaitOptions.None); @@ -94,7 +96,7 @@ public InvitationProcessService( var (clientId, clientSecret, serviceAccountUserId) = await _idpManagement.CreateSharedIdpServiceAccountAsync(idpName).ConfigureAwait(ConfigureAwaitOptions.None); - var (secret, initializationVector, encryptionMode) = Encrypt(clientSecret); + var (secret, initializationVector) = cryptoHelper.Encrypt(clientSecret); companyInvitationRepository.AttachAndModifyCompanyInvitation(invitationId, x => { @@ -108,7 +110,7 @@ public InvitationProcessService( x.ClientId = clientId; x.ClientSecret = secret; x.InitializationVector = initializationVector; - x.EncryptionMode = encryptionMode; + x.EncryptionMode = _settings.EncryptionConfigIndex; x.ServiceAccountUserId = serviceAccountUserId; x.IdpName = idpName; }); @@ -116,13 +118,6 @@ public InvitationProcessService( return (Enumerable.Repeat(ProcessStepTypeId.INVITATION_ADD_REALM_ROLE, 1), ProcessStepStatusId.DONE, true, null); } - private (byte[] Secret, byte[] InitializationVector, int EncryptionMode) Encrypt(string clientSecret) - { - var cryptoConfig = _settings.EncryptionConfigs.SingleOrDefault(x => x.Index == _settings.EncryptionConfigIndex) ?? throw new ConfigurationException($"EncryptionModeIndex {_settings.EncryptionConfigIndex} is not configured"); - var (secret, initializationVector) = CryptoHelper.Encrypt(clientSecret, Convert.FromHexString(cryptoConfig.EncryptionKey), cryptoConfig.CipherMode, cryptoConfig.PaddingMode); - return (secret, initializationVector, _settings.EncryptionConfigIndex); - } - public async Task<(IEnumerable? nextStepTypeIds, ProcessStepStatusId stepStatusId, bool modified, string? processMessage)> AddRealmRoleMappingsToUserAsync(Guid invitationId) { var companyInvitationRepository = _portalRepositories.GetInstance(); diff --git a/tests/framework/Framework.Models.Tests/EncryptionHelperTests.cs b/tests/framework/Framework.Models.Tests/EncryptionHelperTests.cs index 5fb8e2ec31..4a4e9f3519 100644 --- a/tests/framework/Framework.Models.Tests/EncryptionHelperTests.cs +++ b/tests/framework/Framework.Models.Tests/EncryptionHelperTests.cs @@ -17,6 +17,7 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ +using Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling; using Org.Eclipse.TractusX.Portal.Backend.Framework.Models.Encryption; using System.Security.Cryptography; @@ -56,7 +57,7 @@ public void EncryptDecrypt_ECB_NoIV_Success(PaddingMode paddingMode) [InlineData(CipherMode.ECB, PaddingMode.ISO10126)] [InlineData(CipherMode.ECB, PaddingMode.PKCS7)] - public void EncryptDecrypt_WithIV_Success(CipherMode cipherMode, PaddingMode paddingMode) + public void EncryptDecryptStatic_WithIV_Success(CipherMode cipherMode, PaddingMode paddingMode) { var data = _fixture.Create(); var key = _fixture.CreateMany(32).ToArray(); @@ -65,6 +66,93 @@ public void EncryptDecrypt_WithIV_Success(CipherMode cipherMode, PaddingMode pad result.Should().Be(data); } + [Theory] + [InlineData(CipherMode.CBC, PaddingMode.ANSIX923)] + [InlineData(CipherMode.CBC, PaddingMode.ISO10126)] + [InlineData(CipherMode.CBC, PaddingMode.PKCS7)] + [InlineData(CipherMode.CFB, PaddingMode.ANSIX923)] + [InlineData(CipherMode.CFB, PaddingMode.ISO10126)] + [InlineData(CipherMode.CFB, PaddingMode.None)] + [InlineData(CipherMode.CFB, PaddingMode.PKCS7)] + [InlineData(CipherMode.CFB, PaddingMode.Zeros)] + [InlineData(CipherMode.ECB, PaddingMode.ANSIX923)] + [InlineData(CipherMode.ECB, PaddingMode.ISO10126)] + [InlineData(CipherMode.ECB, PaddingMode.PKCS7)] + public void EncryptDecrypt_Success(CipherMode cipherMode, PaddingMode paddingMode) + { + var key = _fixture.CreateMany(32).ToArray(); + var data = _fixture.Create(); + var sut = new CryptoHelper(key, cipherMode, paddingMode); + var (encrypted, iv) = sut.Encrypt(data); + var decrypted = sut.Decrypt(encrypted, iv); + decrypted.Should().Be(data); + } + + [Fact] + public void Encrypt_InvalidKey_Throws() + { + var key = _fixture.CreateMany(5).ToArray(); + var data = _fixture.Create(); + var sut = new CryptoHelper(key, CipherMode.CFB, PaddingMode.PKCS7); + + Assert.Throws(() => sut.Encrypt(data)); + } + + [Fact] + public void Encrypt_InvalidMode_Throws() + { + var key = _fixture.CreateMany(32).ToArray(); + var data = _fixture.Create(); + var sut = new CryptoHelper(key, CipherMode.ECB, PaddingMode.None); + + Assert.Throws(() => sut.Encrypt(data)); + } + + [Fact] + public void Decrypt_InvalidKey_Throws() + { + var (encrypted, iv) = new CryptoHelper(_fixture.CreateMany(32).ToArray(), CipherMode.CFB, PaddingMode.PKCS7).Encrypt(_fixture.Create()); + + var sut = new CryptoHelper(_fixture.CreateMany(5).ToArray(), CipherMode.CFB, PaddingMode.PKCS7); + + Assert.Throws(() => sut.Decrypt(encrypted, iv)); + } + + [Fact] + public void Decrypt_WrongKey_Throws() + { + var (encrypted, iv) = new CryptoHelper(_fixture.CreateMany(32).ToArray(), CipherMode.CFB, PaddingMode.PKCS7).Encrypt(_fixture.Create()); + + var sut = new CryptoHelper(_fixture.CreateMany(32).ToArray(), CipherMode.CFB, PaddingMode.PKCS7); + + Assert.Throws(() => sut.Decrypt(encrypted, iv)); + } + + [Fact] + public void Decrypt_InvalidIV_Throws() + { + var key = _fixture.CreateMany(32).ToArray(); + var (encrypted, _) = new CryptoHelper(key, CipherMode.CFB, PaddingMode.PKCS7).Encrypt(_fixture.Create()); + + var sut = new CryptoHelper(key, CipherMode.CFB, PaddingMode.PKCS7); + + Assert.Throws(() => sut.Decrypt(encrypted, _fixture.CreateMany(5).ToArray())); + } + + [Fact] + public void Decrypt_WrongIV_Throws() + { + var key = _fixture.CreateMany(32).ToArray(); + var data = _fixture.Create(); + var (encrypted, _) = new CryptoHelper(key, CipherMode.CFB, PaddingMode.PKCS7).Encrypt(data); + + var sut = new CryptoHelper(key, CipherMode.CFB, PaddingMode.PKCS7); + + var decrypted = sut.Decrypt(encrypted, _fixture.CreateMany(16).ToArray()); + + decrypted.Should().NotBeNullOrEmpty().And.NotBe(data); + } + [Theory] [InlineData("Sup3rS3cureTest!", "2b7e151628aed2a6abf715892b7e151628aed2a6abf715892b7e151628aed2a6", CipherMode.ECB, PaddingMode.PKCS7)] [InlineData("Sup3rS3cureTest!", "5892b7e151628aed2a6abf715892b7e151628aed2a62b7e151628aed2a6abf71", CipherMode.CBC, PaddingMode.PKCS7)] diff --git a/tests/processes/Invitation.Executor.Tests/InvitationProcessServiceTests.cs b/tests/processes/Invitation.Executor.Tests/InvitationProcessServiceTests.cs index b86753f5e5..5d78193614 100644 --- a/tests/processes/Invitation.Executor.Tests/InvitationProcessServiceTests.cs +++ b/tests/processes/Invitation.Executor.Tests/InvitationProcessServiceTests.cs @@ -37,6 +37,7 @@ namespace Org.Eclipse.TractusX.Portal.Backend.Processes.Invitation.Executor.Test public class InvitationProcessServiceTests { + private readonly IPortalRepositories _portalRepositories; private readonly ICompanyInvitationRepository _companyInvitationRepository; private readonly ICompanyRepository _companyRepository; private readonly IIdentityProviderRepository _identityProviderRepository; @@ -56,7 +57,7 @@ public InvitationProcessServiceTests() .ForEach(b => _fixture.Behaviors.Remove(b)); _fixture.Behaviors.Add(new OmitOnRecursionBehavior()); - var portalRepositories = A.Fake(); + _portalRepositories = A.Fake(); _companyInvitationRepository = A.Fake(); _companyRepository = A.Fake(); _identityProviderRepository = A.Fake(); @@ -66,13 +67,13 @@ public InvitationProcessServiceTests() _userProvisioningService = A.Fake(); _mailingProcessCreation = A.Fake(); - A.CallTo(() => portalRepositories.GetInstance()) + A.CallTo(() => _portalRepositories.GetInstance()) .Returns(_companyInvitationRepository); - A.CallTo(() => portalRepositories.GetInstance()) + A.CallTo(() => _portalRepositories.GetInstance()) .Returns(_companyRepository); - A.CallTo(() => portalRepositories.GetInstance()) + A.CallTo(() => _portalRepositories.GetInstance()) .Returns(_identityProviderRepository); - A.CallTo(() => portalRepositories.GetInstance()) + A.CallTo(() => _portalRepositories.GetInstance()) .Returns(_applicationRepository); _encryptionKey = _fixture.CreateMany(32).ToArray(); @@ -103,7 +104,7 @@ public InvitationProcessServiceTests() _sut = new InvitationProcessService( _idpManagement, _userProvisioningService, - portalRepositories, + _portalRepositories, _mailingProcessCreation, _setting); } @@ -129,7 +130,7 @@ public async Task CreateCentralIdp_WithValid_ReturnsExpected() // Act var result = await _sut.CreateCentralIdp(companyInvitation.Id); - // Act + // Assert companyInvitation.IdpName.Should().Be("cl1-testCorp"); result.modified.Should().BeTrue(); result.processMessage.Should().BeNull(); @@ -147,10 +148,10 @@ public async Task CreateCentralIdp_WithNotExisting_ThrowsConflictException() .Returns((string?)null); // Act - async Task Act() => await _sut.CreateCentralIdp(companyInvitation.Id); + Task Act() => _sut.CreateCentralIdp(companyInvitation.Id); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("Org name must not be null"); } @@ -177,7 +178,7 @@ public async Task CreateSharedIdpServiceAccount_WithValid_ReturnsExpected() // Act var result = await _sut.CreateSharedIdpServiceAccount(companyInvitation.Id); - // Act + // Assert companyInvitation.ClientId.Should().Be("cl1"); companyInvitation.ClientSecret.Should().NotBeNull(); result.modified.Should().BeTrue(); @@ -197,13 +198,51 @@ public async Task CreateSharedIdpServiceAccount_WithNotExisting_ThrowsConflictEx .Returns((string?)null); // Act - async Task Act() => await _sut.CreateSharedIdpServiceAccount(companyInvitation.Id); + Task Act() => _sut.CreateSharedIdpServiceAccount(companyInvitation.Id); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("Idp name must not be null"); } + [Fact] + public async Task CreateSharedIdpServiceAccount_WithInvalidEncryptionKey_Throws() + { + // Arrange + var companyInvitation = _fixture.Create(); + + var settings = Options.Create(new InvitationSettings + { + EncryptionConfigIndex = 0, + EncryptionConfigs = [ + new EncryptionModeConfig + { + Index = 0, + CipherMode = CipherMode.CBC, + PaddingMode = PaddingMode.PKCS7, + EncryptionKey = _fixture.Create() + } + ] + }); + + var sut = new InvitationProcessService( + _idpManagement, + _userProvisioningService, + _portalRepositories, + _mailingProcessCreation, + settings); + + // Act + Task Act() => sut.CreateSharedIdpServiceAccount(companyInvitation.Id); + await Assert.ThrowsAsync(Act); + + // Assert + A.CallTo(() => _idpManagement.GetNextCentralIdentityProviderNameAsync()) + .MustNotHaveHappened(); + A.CallTo(() => _idpManagement.CreateSharedIdpServiceAccountAsync(A._)) + .MustNotHaveHappened(); + } + #endregion #region AddRealmRoleMappingsToUserAsync @@ -220,7 +259,7 @@ public async Task AddRealmRoleMappingsToUserAsync_WithValid_ReturnsExpected() // Act var result = await _sut.AddRealmRoleMappingsToUserAsync(companyInvitationId); - // Act + // Assert result.modified.Should().BeTrue(); result.processMessage.Should().BeNull(); result.stepStatusId.Should().Be(ProcessStepStatusId.DONE); @@ -237,10 +276,10 @@ public async Task AddRealmRoleMappingsToUserAsync_WithNotExisting_ThrowsConflict .Returns((string?)null); // Act - async Task Act() => await _sut.AddRealmRoleMappingsToUserAsync(companyInvitation.Id); + Task Act() => _sut.AddRealmRoleMappingsToUserAsync(companyInvitation.Id); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("ServiceAccountUserId must not be null"); } @@ -261,7 +300,7 @@ public async Task UpdateCentralIdpUrl_WithValid_ReturnsExpected() // Act var result = await _sut.UpdateCentralIdpUrl(companyInvitation.Id); - // Act + // Assert A.CallTo(() => _idpManagement.UpdateCentralIdentityProviderUrlsAsync("idp1", "testCorp", "TestLoginTheme", "cl1", password)) .MustHaveHappenedOnceExactly(); result.modified.Should().BeTrue(); @@ -280,10 +319,10 @@ public async Task UpdateCentralIdpUrl_WithClientSecretNotSet_ThrowsConflictExcep .Returns(("testCorp", "cl1", "idp1", null, null, null)); // Act - async Task Act() => await _sut.UpdateCentralIdpUrl(companyInvitation.Id); + Task Act() => _sut.UpdateCentralIdpUrl(companyInvitation.Id); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("ClientSecret must not be null"); } @@ -296,10 +335,10 @@ public async Task UpdateCentralIdpUrl_WithClientIdNotSet_ThrowsConflictException .Returns(("testCorp", "cl1", null, null, null, null)); // Act - async Task Act() => await _sut.UpdateCentralIdpUrl(companyInvitation.Id); + Task Act() => _sut.UpdateCentralIdpUrl(companyInvitation.Id); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("ClientId must not be null"); } @@ -312,10 +351,10 @@ public async Task UpdateCentralIdpUrl_WithIdpNotSet_ThrowsConflictException() .Returns(("testCorp", null, null, null, null, null)); // Act - async Task Act() => await _sut.UpdateCentralIdpUrl(companyInvitation.Id); + Task Act() => _sut.UpdateCentralIdpUrl(companyInvitation.Id); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("Idp name must not be null"); } @@ -334,7 +373,7 @@ public async Task CreateCentralIdpOrgMapper_WithValid_ReturnsExpected() // Act var result = await _sut.CreateCentralIdpOrgMapper(companyInvitation.Id); - // Act + // Assert A.CallTo(() => _idpManagement.CreateCentralIdentityProviderOrganisationMapperAsync("idp1", "testCorp")) .MustHaveHappenedOnceExactly(); result.modified.Should().BeTrue(); @@ -353,10 +392,10 @@ public async Task CreateCentralIdpOrgMapper_WithNotExisting_ThrowsConflictExcept .Returns((true, "testCorp", null)); // Act - async Task Act() => await _sut.CreateCentralIdpOrgMapper(companyInvitation.Id); + Task Act() => _sut.CreateCentralIdpOrgMapper(companyInvitation.Id); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("Idp name must not be null"); } @@ -377,7 +416,7 @@ public async Task CreateSharedIdpRealmIdpClient_WithValid_ReturnsExpected() // Act var result = await _sut.CreateSharedIdpRealm(companyInvitation.Id); - // Act + // Assert A.CallTo(() => _idpManagement.CreateSharedRealmIdpClientAsync("idp1", "TestLoginTheme", "testCorp", "cl1", password)) .MustHaveHappenedOnceExactly(); result.modified.Should().BeTrue(); @@ -396,10 +435,10 @@ public async Task CreateSharedIdpRealmIdpClient_WithClientSecretNotSet_ThrowsCon .Returns(("testCorp", "cl1", "idp1", null, null, null)); // Act - async Task Act() => await _sut.CreateSharedIdpRealm(companyInvitation.Id); + Task Act() => _sut.CreateSharedIdpRealm(companyInvitation.Id); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("ClientSecret must not be null"); } @@ -412,10 +451,10 @@ public async Task CreateSharedIdpRealmIdpClient_WithClientIdNotSet_ThrowsConflic .Returns(("testCorp", "cl1", null, null, null, null)); // Act - async Task Act() => await _sut.CreateSharedIdpRealm(companyInvitation.Id); + Task Act() => _sut.CreateSharedIdpRealm(companyInvitation.Id); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("ClientId must not be null"); } @@ -428,10 +467,10 @@ public async Task CreateSharedIdpRealmIdpClient_WithIdpNotSet_ThrowsConflictExce .Returns(("testCorp", null, null, null, null, null)); // Act - async Task Act() => await _sut.CreateSharedIdpRealm(companyInvitation.Id); + Task Act() => _sut.CreateSharedIdpRealm(companyInvitation.Id); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("Idp name must not be null"); } @@ -452,7 +491,7 @@ public async Task CreateSharedClient_WithValid_ReturnsExpected() // Act var result = await _sut.CreateSharedClient(companyInvitation.Id); - // Act + // Assert A.CallTo(() => _idpManagement.CreateSharedClientAsync("idp1", "cl1", password)) .MustHaveHappenedOnceExactly(); result.modified.Should().BeTrue(); @@ -471,10 +510,10 @@ public async Task CreateSharedClient_WithClientSecretNotSet_ThrowsConflictExcept .Returns(("testCorp", "cl1", "idp1", null, null, null)); // Act - async Task Act() => await _sut.CreateSharedClient(companyInvitation.Id); + Task Act() => _sut.CreateSharedClient(companyInvitation.Id); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("ClientSecret must not be null"); } @@ -487,10 +526,10 @@ public async Task CreateSharedClient_WithClientIdNotSet_ThrowsConflictException( .Returns(("testCorp", "cl1", null, null, null, null)); // Act - async Task Act() => await _sut.CreateSharedClient(companyInvitation.Id); + Task Act() => _sut.CreateSharedClient(companyInvitation.Id); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("ClientId must not be null"); } @@ -503,10 +542,10 @@ public async Task CreateSharedClient_WithIdpNotSet_ThrowsConflictException() .Returns(("testCorp", null, null, null, null, null)); // Act - async Task Act() => await _sut.CreateSharedClient(companyInvitation.Id); + Task Act() => _sut.CreateSharedClient(companyInvitation.Id); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("Idp name must not be null"); } @@ -525,7 +564,7 @@ public async Task EnableCentralIdp_WithValid_ReturnsExpected() // Act var result = await _sut.EnableCentralIdp(companyInvitation.Id); - // Act + // Assert A.CallTo(() => _idpManagement.EnableCentralIdentityProviderAsync("idp123")) .MustHaveHappenedOnceExactly(); @@ -545,10 +584,10 @@ public async Task EnableCentralIdp_WithNotExisting_ThrowsConflictException() .Returns((string?)null); // Act - async Task Act() => await _sut.EnableCentralIdp(companyInvitation.Id); + Task Act() => _sut.EnableCentralIdp(companyInvitation.Id); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("Idp name must not be null"); } @@ -588,7 +627,7 @@ public async Task CreateIdpDatabase_WithValid_ReturnsExpected() // Act var result = await _sut.CreateIdpDatabase(companyInvitation.Id); - // Act + // Assert A.CallTo(() => _identityProviderRepository.CreateIdentityProvider(IdentityProviderCategoryId.KEYCLOAK_OIDC, IdentityProviderTypeId.SHARED, company.Id, null)) .MustHaveHappenedOnceExactly(); A.CallTo(() => _identityProviderRepository.CreateIamIdentityProvider(idpId, "cl1-testCorp")) @@ -610,10 +649,10 @@ public async Task CreateIdpDatabase_WithNotExisting_ThrowsNotFoundException() .Returns((false, "testCorp", (string?)null)); // Act - async Task Act() => await _sut.CreateIdpDatabase(companyInvitation.Id); + Task Act() => _sut.CreateIdpDatabase(companyInvitation.Id); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be($"CompanyInvitation {companyInvitation.Id} does not exist"); } @@ -626,10 +665,10 @@ public async Task CreateIdpDatabase_WithIdpNotSet_ThrowsConflictException() .Returns((true, "testCorp", (string?)null)); // Act - async Task Act() => await _sut.CreateIdpDatabase(companyInvitation.Id); + Task Act() => _sut.CreateIdpDatabase(companyInvitation.Id); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("IdpName must be set for the company invitation"); } @@ -661,7 +700,7 @@ public async Task CreateUser_WithValid_ReturnsExpected() // Act var result = await _sut.CreateUser(companyInvitation.Id, CancellationToken.None); - // Act + // Assert result.modified.Should().BeTrue(); result.processMessage.Should().BeNull(); result.stepStatusId.Should().Be(ProcessStepStatusId.DONE); @@ -683,10 +722,10 @@ public async Task CreateUser_WithCreateOwnCompanyIdpUserThrowsException_ThrowsEx .Returns(Enumerable.Repeat>((companyId, "ironman", "testPw", new ConflictException("test")), 1).ToAsyncEnumerable()); // Act - async Task Act() => await _sut.CreateUser(companyInvitation.Id, CancellationToken.None); + Task Act() => _sut.CreateUser(companyInvitation.Id, CancellationToken.None); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("test"); } @@ -699,10 +738,10 @@ public async Task CreateUser_WithNotExisting_ThrowsNotFoundException() .Returns((false, null, null, string.Empty, Enumerable.Empty>(), null!)); // Act - async Task Act() => await _sut.CreateUser(companyInvitation.Id, CancellationToken.None); + Task Act() => _sut.CreateUser(companyInvitation.Id, CancellationToken.None); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be($"CompanyInvitation {companyInvitation.Id} does not exist"); } @@ -715,10 +754,10 @@ public async Task CreateUser_WithoutApplication_ThrowsConflictException() .Returns((true, null, null, string.Empty, Enumerable.Empty>(), null!)); // Act - async Task Act() => await _sut.CreateUser(companyInvitation.Id, CancellationToken.None); + Task Act() => _sut.CreateUser(companyInvitation.Id, CancellationToken.None); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("Application must be set for the company invitation"); } @@ -732,10 +771,10 @@ public async Task CreateUser_WithoutCompany_ThrowsConflictException() .Returns((true, applicationId, null, string.Empty, Enumerable.Empty>(), null!)); // Act - async Task Act() => await _sut.CreateUser(companyInvitation.Id, CancellationToken.None); + Task Act() => _sut.CreateUser(companyInvitation.Id, CancellationToken.None); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("Company must be set for the company invitation"); } @@ -750,10 +789,10 @@ public async Task CreateUser_WithoutIdp_ThrowsConflictException() .Returns((true, applicationId, companyId, "testCorp", Enumerable.Empty>(), null!)); // Act - async Task Act() => await _sut.CreateUser(companyInvitation.Id, CancellationToken.None); + Task Act() => _sut.CreateUser(companyInvitation.Id, CancellationToken.None); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("There must only exist one idp for the company invitation"); } @@ -770,10 +809,10 @@ public async Task CreateUser_WithWrongUserRoles_ThrowsConfigurationException() .Throws(new ConflictException("test")); // Act - async Task Act() => await _sut.CreateUser(companyInvitation.Id, CancellationToken.None); + Task Act() => _sut.CreateUser(companyInvitation.Id, CancellationToken.None); var ex = await Assert.ThrowsAsync(Act); - // Act + // Assert ex.Message.Should().Be("InvitedUserInitialRoles: test"); } From b41820cf0bc65f0fda37c6f03846a26dbe72a93b Mon Sep 17 00:00:00 2001 From: Norbert Truchsess Date: Mon, 17 Jun 2024 09:55:43 +0200 Subject: [PATCH 3/4] chore: fix code quality findings (#786) * fix nullable warnings * fix async execution * update framework version * add synchronous WebAppHelper method for backwards compatibility * fix ifAny nullability issues --- .../IdentityProviderBusinessLogic.cs | 7 ++++++- .../BusinessLogic/NetworkBusinessLogic.cs | 2 +- .../BusinessLogic/UserUploadBusinessLogic.cs | 2 +- .../Administration.Service/Program.cs | 6 +++--- .../Framework.Async/Directory.Build.props | 2 +- .../Framework.Cors/Directory.Build.props | 2 +- .../Framework.DBAccess/Directory.Build.props | 2 +- .../Directory.Build.props | 2 +- .../Directory.Build.props | 2 +- .../Directory.Build.props | 2 +- .../Directory.Build.props | 2 +- .../Directory.Build.props | 2 +- .../Directory.Build.props | 2 +- .../Framework.IO/Directory.Build.props | 2 +- .../Framework.Linq/Directory.Build.props | 2 +- .../Framework.Linq/IfAnyExtension.cs | 6 ++++-- .../Framework.Logging/Directory.Build.props | 2 +- .../Framework.Models/Directory.Build.props | 2 +- .../BaseOptionEnumerableValidation.cs | 4 ++-- .../Framework.Seeding/Directory.Build.props | 2 +- .../Framework.Swagger/Directory.Build.props | 2 +- .../Framework.Token/Directory.Build.props | 2 +- .../Framework.Web/Directory.Build.props | 2 +- .../Framework.Web/StartupServiceExtensions.cs | 2 +- .../WebApplicationBuildRunner.cs | 21 ++++++++++++++++--- .../BusinessLogic/IdentityProvidersUpdater.cs | 6 +++--- .../BusinessLogic/UsersUpdater.cs | 6 +++--- src/keycloak/Keycloak.Seeding/Program.cs | 4 ++-- src/maintenance/Maintenance.App/Program.cs | 4 ++-- src/marketplace/Apps.Service/Program.cs | 6 +++--- src/marketplace/Services.Service/Program.cs | 6 +++--- .../Notifications.Service/Program.cs | 6 +++--- .../PortalBackend.Migrations/Program.cs | 2 +- src/processes/Processes.Worker/Program.cs | 2 +- .../ProvisioningDBAccess.cs | 4 ++-- .../Service/ServiceAccountCreation.cs | 4 ++-- .../Provisioning.Migrations/Program.cs | 2 +- .../Registration.Service/Program.cs | 6 +++--- src/web/Web.Initialization/WebAppHelper.cs | 16 +++++++------- 39 files changed, 89 insertions(+), 69 deletions(-) diff --git a/src/administration/Administration.Service/BusinessLogic/IdentityProviderBusinessLogic.cs b/src/administration/Administration.Service/BusinessLogic/IdentityProviderBusinessLogic.cs index fccb1642f0..191793bd29 100644 --- a/src/administration/Administration.Service/BusinessLogic/IdentityProviderBusinessLogic.cs +++ b/src/administration/Administration.Service/BusinessLogic/IdentityProviderBusinessLogic.cs @@ -746,8 +746,13 @@ private UserUpdateError CreateUserUpdateError(int line, Exception error) => IEnumerable<(Guid IdentityProviderId, string Alias)> existingIdps, [EnumeratorCancellation] CancellationToken cancellationToken) { - await foreach (var (companyUserId, profile, identityProviderLinks) in userProfileLinkDatas.WithCancellation(cancellationToken)) + await foreach (var userProfileLinkData in userProfileLinkDatas.WithCancellation(cancellationToken)) { + if (userProfileLinkData == default) + { + throw new UnexpectedConditionException("userProfileLinkData should never be default here"); + } + var (companyUserId, profile, identityProviderLinks) = userProfileLinkData; Exception? error = null; var success = false; try diff --git a/src/administration/Administration.Service/BusinessLogic/NetworkBusinessLogic.cs b/src/administration/Administration.Service/BusinessLogic/NetworkBusinessLogic.cs index 183cb4a7e5..ada1674d78 100644 --- a/src/administration/Administration.Service/BusinessLogic/NetworkBusinessLogic.cs +++ b/src/administration/Administration.Service/BusinessLogic/NetworkBusinessLogic.cs @@ -274,7 +274,7 @@ await data.ValidateDatabaseData( return idpAliasData; }, out var idpAliasDataTask) - ? await idpAliasDataTask!.ConfigureAwait(ConfigureAwaitOptions.None) + ? await idpAliasDataTask.ConfigureAwait(ConfigureAwaitOptions.None) : default(IDictionary?); var idpIds = idpAliase?.Keys ?? Enumerable.Empty(); diff --git a/src/administration/Administration.Service/BusinessLogic/UserUploadBusinessLogic.cs b/src/administration/Administration.Service/BusinessLogic/UserUploadBusinessLogic.cs index 39ff53eb42..63513c11f7 100644 --- a/src/administration/Administration.Service/BusinessLogic/UserUploadBusinessLogic.cs +++ b/src/administration/Administration.Service/BusinessLogic/UserUploadBusinessLogic.cs @@ -253,7 +253,7 @@ private async ValueTask> GetUserRoleDatas(IEnumerable< unknownRoles => _userProvisioningService.GetOwnCompanyPortalRoleDatas(_settings.Portal.KeycloakClientID, unknownRoles, companyId), out var roleDataTask)) { - var roleData = await roleDataTask!.ConfigureAwait(ConfigureAwaitOptions.None); + var roleData = await roleDataTask.ConfigureAwait(ConfigureAwaitOptions.None); if (roleData != null) { validRoleData.AddRange(roleData); diff --git a/src/administration/Administration.Service/Program.cs b/src/administration/Administration.Service/Program.cs index 885cb7ab9d..a6868d2408 100644 --- a/src/administration/Administration.Service/Program.cs +++ b/src/administration/Administration.Service/Program.cs @@ -37,8 +37,8 @@ var VERSION = "v2"; -WebAppHelper - .BuildAndRunWebApplication(args, "administration", VERSION, builder => +await WebAppHelper + .BuildAndRunWebApplicationAsync(args, "administration", VERSION, builder => { builder.Services .AddPublicInfos(); @@ -97,4 +97,4 @@ .AddSingleton(); builder.Services.AddProvisioningDBAccess(builder.Configuration); - }); + }).ConfigureAwait(ConfigureAwaitOptions.None); diff --git a/src/framework/Framework.Async/Directory.Build.props b/src/framework/Framework.Async/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.Async/Directory.Build.props +++ b/src/framework/Framework.Async/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.Cors/Directory.Build.props b/src/framework/Framework.Cors/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.Cors/Directory.Build.props +++ b/src/framework/Framework.Cors/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.DBAccess/Directory.Build.props b/src/framework/Framework.DBAccess/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.DBAccess/Directory.Build.props +++ b/src/framework/Framework.DBAccess/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.DateTimeProvider/Directory.Build.props b/src/framework/Framework.DateTimeProvider/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.DateTimeProvider/Directory.Build.props +++ b/src/framework/Framework.DateTimeProvider/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.DependencyInjection/Directory.Build.props b/src/framework/Framework.DependencyInjection/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.DependencyInjection/Directory.Build.props +++ b/src/framework/Framework.DependencyInjection/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.ErrorHandling.Controller/Directory.Build.props b/src/framework/Framework.ErrorHandling.Controller/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.ErrorHandling.Controller/Directory.Build.props +++ b/src/framework/Framework.ErrorHandling.Controller/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.ErrorHandling.Web/Directory.Build.props b/src/framework/Framework.ErrorHandling.Web/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.ErrorHandling.Web/Directory.Build.props +++ b/src/framework/Framework.ErrorHandling.Web/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.ErrorHandling/Directory.Build.props b/src/framework/Framework.ErrorHandling/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.ErrorHandling/Directory.Build.props +++ b/src/framework/Framework.ErrorHandling/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.HttpClientExtensions/Directory.Build.props b/src/framework/Framework.HttpClientExtensions/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.HttpClientExtensions/Directory.Build.props +++ b/src/framework/Framework.HttpClientExtensions/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.IO/Directory.Build.props b/src/framework/Framework.IO/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.IO/Directory.Build.props +++ b/src/framework/Framework.IO/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.Linq/Directory.Build.props b/src/framework/Framework.Linq/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.Linq/Directory.Build.props +++ b/src/framework/Framework.Linq/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.Linq/IfAnyExtension.cs b/src/framework/Framework.Linq/IfAnyExtension.cs index d5cb182fa5..118acf5f61 100644 --- a/src/framework/Framework.Linq/IfAnyExtension.cs +++ b/src/framework/Framework.Linq/IfAnyExtension.cs @@ -17,6 +17,8 @@ * SPDX-License-Identifier: Apache-2.0 ********************************************************************************/ +using System.Diagnostics.CodeAnalysis; + namespace Org.Eclipse.TractusX.Portal.Backend.Framework.Linq; public static class IfAnyExtension @@ -94,7 +96,7 @@ public static bool IfAny(this IEnumerable source, Action> a return false; } - public static bool IfAny(this IEnumerable source, Func, R> process, out R? returnValue) where R : class? + public static bool IfAny(this IEnumerable source, Func, R> process, [MaybeNullWhen(false)] out R returnValue) { var enumerator = source.GetEnumerator(); @@ -104,7 +106,7 @@ public static bool IfAny(this IEnumerable source, Func, return true; } - returnValue = null; + returnValue = default; return false; } } diff --git a/src/framework/Framework.Logging/Directory.Build.props b/src/framework/Framework.Logging/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.Logging/Directory.Build.props +++ b/src/framework/Framework.Logging/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.Models/Directory.Build.props b/src/framework/Framework.Models/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.Models/Directory.Build.props +++ b/src/framework/Framework.Models/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.Models/Validation/BaseOptionEnumerableValidation.cs b/src/framework/Framework.Models/Validation/BaseOptionEnumerableValidation.cs index 9e8021b199..d01d16152e 100644 --- a/src/framework/Framework.Models/Validation/BaseOptionEnumerableValidation.cs +++ b/src/framework/Framework.Models/Validation/BaseOptionEnumerableValidation.cs @@ -75,7 +75,7 @@ public ValidateOptionsResult Validate(string? name, TOptions options) return validationErrors.IfAny( errors => errors.Select(r => $"DataAnnotation validation failed for members: '{string.Join(",", r.MemberNames)}' with the error: '{r.ErrorMessage}'."), out var messages) - ? ValidateOptionsResult.Fail(messages!) + ? ValidateOptionsResult.Fail(messages) : ValidateOptionsResult.Success; } private IEnumerable GetValidationErrors(Type type, IConfiguration configSection) => @@ -100,7 +100,7 @@ var x when x.GetInterfaces().Contains(typeof(IEnumerable)) && (configSection.GetSection(propertyName).Get(property.PropertyType) as IEnumerable) ?.ToIEnumerable() .Select((_, i) => configSection.GetSection($"{propertyName}:{i}")) - .SelectMany(section => GetValidationErrors(genericType!, section)) ?? Enumerable.Empty(), + .SelectMany(section => GetValidationErrors(genericType, section)) ?? Enumerable.Empty(), _ => Enumerable.Empty() }; } diff --git a/src/framework/Framework.Seeding/Directory.Build.props b/src/framework/Framework.Seeding/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.Seeding/Directory.Build.props +++ b/src/framework/Framework.Seeding/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.Swagger/Directory.Build.props b/src/framework/Framework.Swagger/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.Swagger/Directory.Build.props +++ b/src/framework/Framework.Swagger/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.Token/Directory.Build.props b/src/framework/Framework.Token/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.Token/Directory.Build.props +++ b/src/framework/Framework.Token/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.Web/Directory.Build.props b/src/framework/Framework.Web/Directory.Build.props index d7cf622f5f..86295857c2 100644 --- a/src/framework/Framework.Web/Directory.Build.props +++ b/src/framework/Framework.Web/Directory.Build.props @@ -19,7 +19,7 @@ - 2.2.2 + 2.3.0 diff --git a/src/framework/Framework.Web/StartupServiceExtensions.cs b/src/framework/Framework.Web/StartupServiceExtensions.cs index a9d91cafc2..7c4b157804 100644 --- a/src/framework/Framework.Web/StartupServiceExtensions.cs +++ b/src/framework/Framework.Web/StartupServiceExtensions.cs @@ -73,7 +73,7 @@ public static IServiceCollection AddDefaultServices(this IServiceColle .ValidateOnStart(); services.AddHealthChecks() - .AddCheck("JwtBearerConfiguration", tags: new[] { "keycloak" }); + .AddCheck("JwtBearerConfiguration", tags: ["keycloak"]); services.AddHttpContextAccessor(); diff --git a/src/framework/Framework.Web/WebApplicationBuildRunner.cs b/src/framework/Framework.Web/WebApplicationBuildRunner.cs index c003893ee2..d14cc3b3c7 100644 --- a/src/framework/Framework.Web/WebApplicationBuildRunner.cs +++ b/src/framework/Framework.Web/WebApplicationBuildRunner.cs @@ -1,5 +1,4 @@ /******************************************************************************** - * Copyright (c) 2023 BMW Group AG * Copyright (c) 2023 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional @@ -29,7 +28,23 @@ namespace Org.Eclipse.TractusX.Portal.Backend.Framework.Web; public static class WebApplicationBuildRunner { + [Obsolete("use BuildAndRunWebApplicationAsync instead")] public static void BuildAndRunWebApplication( + string[] args, + string path, + string version, + string cookieName, + Action? configureBuilder, + Action? configureApp) => + BuildAndRunWebApplicationAsync( + args, + path, + version, + cookieName, + configureBuilder, + configureApp).GetAwaiter().GetResult(); + + public static async Task BuildAndRunWebApplicationAsync( string[] args, string path, string version, @@ -63,7 +78,7 @@ public static void BuildAndRunWebApplication( var app = builder.Build().CreateApp(path, version); configureApp?.Invoke(app, builder.Environment); - app.Run(); + await app.RunAsync().ConfigureAwait(ConfigureAwaitOptions.None); } catch (Exception ex) when (!ex.GetType().Name.Equals("StopTheHostException", StringComparison.Ordinal)) { @@ -72,7 +87,7 @@ public static void BuildAndRunWebApplication( finally { Log.Information("Server Shutting down"); - Log.CloseAndFlush(); + await Log.CloseAndFlushAsync().ConfigureAwait(false); } } } diff --git a/src/keycloak/Keycloak.Seeding/BusinessLogic/IdentityProvidersUpdater.cs b/src/keycloak/Keycloak.Seeding/BusinessLogic/IdentityProvidersUpdater.cs index 5e8204b0b6..a38ee33689 100644 --- a/src/keycloak/Keycloak.Seeding/BusinessLogic/IdentityProvidersUpdater.cs +++ b/src/keycloak/Keycloak.Seeding/BusinessLogic/IdentityProvidersUpdater.cs @@ -115,9 +115,9 @@ await keycloak.UpdateIdentityProviderMapperAsync( private static async Task DeleteObsoleteIdentityProviderMappers(KeycloakClient keycloak, string realm, string alias, IEnumerable mappers, IEnumerable updateMappers, CancellationToken cancellationToken) { if (mappers.ExceptBy(updateMappers.Select(x => x.Name), x => x.Name).IfAny( - async mappers => + async deleteMappers => { - foreach (var mapper in mappers) + foreach (var mapper in deleteMappers) { await keycloak.DeleteIdentityProviderMapperAsync( realm, @@ -128,7 +128,7 @@ await keycloak.DeleteIdentityProviderMapperAsync( }, out var deleteMappersTask)) { - await deleteMappersTask!.ConfigureAwait(ConfigureAwaitOptions.None); + await deleteMappersTask.ConfigureAwait(ConfigureAwaitOptions.None); } } diff --git a/src/keycloak/Keycloak.Seeding/BusinessLogic/UsersUpdater.cs b/src/keycloak/Keycloak.Seeding/BusinessLogic/UsersUpdater.cs index 33834b971a..14289c2b6c 100644 --- a/src/keycloak/Keycloak.Seeding/BusinessLogic/UsersUpdater.cs +++ b/src/keycloak/Keycloak.Seeding/BusinessLogic/UsersUpdater.cs @@ -131,7 +131,7 @@ private static async Task UpdateUserRoles(Func>> getUserR delete => deleteRoles(delete), out var deleteRolesTask)) { - await deleteRolesTask!.ConfigureAwait(ConfigureAwaitOptions.None); + await deleteRolesTask.ConfigureAwait(ConfigureAwaitOptions.None); } if (seedRoles.IfAny( @@ -143,12 +143,12 @@ private static async Task UpdateUserRoles(Func>> getUserR add => addRoles(allRoles.IntersectBy(add, x => x.Name)), out var addRolesTask)) { - await addRolesTask!.ConfigureAwait(ConfigureAwaitOptions.None); + await addRolesTask.ConfigureAwait(ConfigureAwaitOptions.None); } }, out var updateRolesTask)) { - await updateRolesTask!.ConfigureAwait(ConfigureAwaitOptions.None); + await updateRolesTask.ConfigureAwait(ConfigureAwaitOptions.None); } } diff --git a/src/keycloak/Keycloak.Seeding/Program.cs b/src/keycloak/Keycloak.Seeding/Program.cs index 989c1e8fd6..b444d7c327 100644 --- a/src/keycloak/Keycloak.Seeding/Program.cs +++ b/src/keycloak/Keycloak.Seeding/Program.cs @@ -89,12 +89,12 @@ catch (Exception ex) when (!ex.GetType().Name.Equals("StopTheHostException", StringComparison.Ordinal)) { Log.Fatal(ex, "Unhandled exception"); - Log.CloseAndFlush(); + await Log.CloseAndFlushAsync().ConfigureAwait(false); Environment.ExitCode = 1; throw; } finally { Log.Information("Server Shutting down"); - Log.CloseAndFlush(); + await Log.CloseAndFlushAsync().ConfigureAwait(false); } diff --git a/src/maintenance/Maintenance.App/Program.cs b/src/maintenance/Maintenance.App/Program.cs index 256d24d5be..8b3e261e30 100644 --- a/src/maintenance/Maintenance.App/Program.cs +++ b/src/maintenance/Maintenance.App/Program.cs @@ -46,7 +46,7 @@ .AddLogging() .Build(); - host.Run(); + await host.RunAsync().ConfigureAwait(ConfigureAwaitOptions.None); } catch (Exception ex) when (!ex.GetType().Name.Equals("StopTheHostException", StringComparison.Ordinal)) { @@ -55,5 +55,5 @@ finally { Log.Information("Server Shutting down"); - Log.CloseAndFlush(); + await Log.CloseAndFlushAsync().ConfigureAwait(false); } diff --git a/src/marketplace/Apps.Service/Program.cs b/src/marketplace/Apps.Service/Program.cs index 4f1c91e4c8..1ba4cf95e1 100644 --- a/src/marketplace/Apps.Service/Program.cs +++ b/src/marketplace/Apps.Service/Program.cs @@ -32,8 +32,8 @@ var VERSION = "v2"; -WebAppHelper - .BuildAndRunWebApplication(args, "apps", VERSION, builder => +await WebAppHelper + .BuildAndRunWebApplicationAsync(args, "apps", VERSION, builder => { builder.Services .AddPublicInfos(); @@ -58,4 +58,4 @@ .AddProvisioningDBAccess(builder.Configuration); builder.Services.AddMailingProcessCreation(builder.Configuration.GetSection("MailingProcessCreation")); - }); + }).ConfigureAwait(ConfigureAwaitOptions.None); diff --git a/src/marketplace/Services.Service/Program.cs b/src/marketplace/Services.Service/Program.cs index 9300f411e0..43ca334e85 100644 --- a/src/marketplace/Services.Service/Program.cs +++ b/src/marketplace/Services.Service/Program.cs @@ -32,8 +32,8 @@ var VERSION = "v2"; -WebAppHelper - .BuildAndRunWebApplication(args, "services", VERSION, builder => +await WebAppHelper + .BuildAndRunWebApplicationAsync(args, "services", VERSION, builder => { builder.Services .AddPublicInfos(); @@ -56,4 +56,4 @@ .AddProvisioningDBAccess(builder.Configuration); builder.Services.AddMailingProcessCreation(builder.Configuration.GetSection("MailingProcessCreation")); - }); + }).ConfigureAwait(ConfigureAwaitOptions.None); diff --git a/src/notifications/Notifications.Service/Program.cs b/src/notifications/Notifications.Service/Program.cs index b7c45da8eb..809b488973 100644 --- a/src/notifications/Notifications.Service/Program.cs +++ b/src/notifications/Notifications.Service/Program.cs @@ -25,8 +25,8 @@ var VERSION = "v2"; -WebAppHelper - .BuildAndRunWebApplication(args, "notification", VERSION, builder => +await WebAppHelper + .BuildAndRunWebApplicationAsync(args, "notification", VERSION, builder => { builder.Services .AddPublicInfos(); @@ -37,4 +37,4 @@ builder.Services .AddTransient() .ConfigureNotificationSettings(builder.Configuration.GetSection("Notifications")); - }); + }).ConfigureAwait(ConfigureAwaitOptions.None); diff --git a/src/portalbackend/PortalBackend.Migrations/Program.cs b/src/portalbackend/PortalBackend.Migrations/Program.cs index 7ae8f2f2f6..d35ea966fe 100644 --- a/src/portalbackend/PortalBackend.Migrations/Program.cs +++ b/src/portalbackend/PortalBackend.Migrations/Program.cs @@ -62,5 +62,5 @@ finally { Log.Information("Process Shutting down..."); - Log.CloseAndFlush(); + await Log.CloseAndFlushAsync().ConfigureAwait(false); } diff --git a/src/processes/Processes.Worker/Program.cs b/src/processes/Processes.Worker/Program.cs index 440c5dec5c..065c5c17b2 100644 --- a/src/processes/Processes.Worker/Program.cs +++ b/src/processes/Processes.Worker/Program.cs @@ -110,5 +110,5 @@ finally { Log.Information("Server Shutting down"); - Log.CloseAndFlush(); + await Log.CloseAndFlushAsync().ConfigureAwait(false); } diff --git a/src/provisioning/Provisioning.DBAccess/ProvisioningDBAccess.cs b/src/provisioning/Provisioning.DBAccess/ProvisioningDBAccess.cs index 374cfde05d..3b4705fae7 100644 --- a/src/provisioning/Provisioning.DBAccess/ProvisioningDBAccess.cs +++ b/src/provisioning/Provisioning.DBAccess/ProvisioningDBAccess.cs @@ -34,14 +34,14 @@ public ProvisioningDBAccess(ProvisioningDbContext provisioningDBContext) public async Task GetNextClientSequenceAsync() { - var nextSequence = _dbContext.ClientSequences.Add(new ClientSequence()).Entity; + var nextSequence = (await _dbContext.ClientSequences.AddAsync(new ClientSequence()).ConfigureAwait(false)).Entity; await _dbContext.SaveChangesAsync().ConfigureAwait(ConfigureAwaitOptions.None); return nextSequence.SequenceId; } public async Task GetNextIdentityProviderSequenceAsync() { - var nextSequence = _dbContext.IdentityProviderSequences.Add(new IdentityProviderSequence()).Entity; + var nextSequence = (await _dbContext.IdentityProviderSequences.AddAsync(new IdentityProviderSequence()).ConfigureAwait(false)).Entity; await _dbContext.SaveChangesAsync().ConfigureAwait(ConfigureAwaitOptions.None); return nextSequence.SequenceId; } diff --git a/src/provisioning/Provisioning.Library/Service/ServiceAccountCreation.cs b/src/provisioning/Provisioning.Library/Service/ServiceAccountCreation.cs index 10a81ef4a9..fd71152960 100644 --- a/src/provisioning/Provisioning.Library/Service/ServiceAccountCreation.cs +++ b/src/provisioning/Provisioning.Library/Service/ServiceAccountCreation.cs @@ -80,7 +80,7 @@ public class ServiceAccountCreation( }, out var keycloakRolesTask)) { - await keycloakRolesTask!.ConfigureAwait(ConfigureAwaitOptions.None); + await keycloakRolesTask.ConfigureAwait(ConfigureAwaitOptions.None); } Guid? processId = null; @@ -187,7 +187,7 @@ private Guid CreateDatabaseServiceAccount( await provisioningManager.AddProtocolMapperAsync(serviceAccountData.InternalClientId).ConfigureAwait(ConfigureAwaitOptions.None); }, out var bpnTask)) { - await bpnTask!.ConfigureAwait(ConfigureAwaitOptions.None); + await bpnTask.ConfigureAwait(ConfigureAwaitOptions.None); } return (clientId, enhancedName, serviceAccountData); diff --git a/src/provisioning/Provisioning.Migrations/Program.cs b/src/provisioning/Provisioning.Migrations/Program.cs index 502208dcd6..ffef01bb91 100644 --- a/src/provisioning/Provisioning.Migrations/Program.cs +++ b/src/provisioning/Provisioning.Migrations/Program.cs @@ -55,5 +55,5 @@ finally { Log.Information("Process Shutting down..."); - Log.CloseAndFlush(); + await Log.CloseAndFlushAsync().ConfigureAwait(false); } diff --git a/src/registration/Registration.Service/Program.cs b/src/registration/Registration.Service/Program.cs index 71003d227f..e848214f3b 100644 --- a/src/registration/Registration.Service/Program.cs +++ b/src/registration/Registration.Service/Program.cs @@ -31,8 +31,8 @@ var VERSION = "v2"; -WebAppHelper - .BuildAndRunWebApplication(args, "registration", VERSION, builder => +await WebAppHelper + .BuildAndRunWebApplicationAsync(args, "registration", VERSION, builder => { builder.Services .AddPublicInfos(); @@ -50,4 +50,4 @@ builder.Services.AddApplicationChecklistCreation(builder.Configuration.GetSection("ApplicationCreation")); builder.Services.AddBpnAccess(builder.Configuration.GetValue("BPN_Address") ?? throw new ConfigurationException("BPN_Address is not configured")); builder.Services.AddMailingProcessCreation(builder.Configuration.GetSection("MailingProcessCreation")); - }); + }).ConfigureAwait(ConfigureAwaitOptions.None); diff --git a/src/web/Web.Initialization/WebAppHelper.cs b/src/web/Web.Initialization/WebAppHelper.cs index 81980a1e5f..e336d0faf6 100644 --- a/src/web/Web.Initialization/WebAppHelper.cs +++ b/src/web/Web.Initialization/WebAppHelper.cs @@ -35,21 +35,19 @@ namespace Org.Eclipse.TractusX.Portal.Backend.Web.Initialization; public static class WebAppHelper { - public static void BuildAndRunWebApplication(string[] args, string path, string version, Action configureBuilder) => + public static Task BuildAndRunWebApplicationAsync(string[] args, string path, string version, Action configureBuilder) => WebApplicationBuildRunner - .BuildAndRunWebApplication(args, path, version, ".Portal", + .BuildAndRunWebApplicationAsync(args, path, version, ".Portal", builder => { configureBuilder.Invoke(builder); builder.Services.AddTransient(); builder.Services.AddTransient(); - builder.Services.AddAuthorization(options => - { - options.AddPolicy(PolicyTypes.ValidIdentity, policy => policy.Requirements.Add(new MandatoryIdentityClaimRequirement(PolicyTypeId.ValidIdentity))); - options.AddPolicy(PolicyTypes.ValidCompany, policy => policy.Requirements.Add(new MandatoryIdentityClaimRequirement(PolicyTypeId.ValidCompany))); - options.AddPolicy(PolicyTypes.CompanyUser, policy => policy.Requirements.Add(new MandatoryIdentityClaimRequirement(PolicyTypeId.CompanyUser))); - options.AddPolicy(PolicyTypes.ServiceAccount, policy => policy.Requirements.Add(new MandatoryIdentityClaimRequirement(PolicyTypeId.ServiceAccount))); - }); + builder.Services.AddAuthorizationBuilder() + .AddPolicy(PolicyTypes.ValidIdentity, policy => policy.Requirements.Add(new MandatoryIdentityClaimRequirement(PolicyTypeId.ValidIdentity))) + .AddPolicy(PolicyTypes.ValidCompany, policy => policy.Requirements.Add(new MandatoryIdentityClaimRequirement(PolicyTypeId.ValidCompany))) + .AddPolicy(PolicyTypes.CompanyUser, policy => policy.Requirements.Add(new MandatoryIdentityClaimRequirement(PolicyTypeId.CompanyUser))) + .AddPolicy(PolicyTypes.ServiceAccount, policy => policy.Requirements.Add(new MandatoryIdentityClaimRequirement(PolicyTypeId.ServiceAccount))); builder.Services.AddClaimsIdentityService(); builder.Services.AddPublicInfos(); }, From e170c2be9cddfabb68ffa22b7a5f3e841647cf4d Mon Sep 17 00:00:00 2001 From: Evelyn Gurschler Date: Mon, 24 Jun 2024 11:36:15 +0200 Subject: [PATCH 4/4] fix(image-build): change from emulation to cross-compile (#803) * fix(image-build): change from emulation to cross-compile for building multi-platform images https://github.com/eclipse-tractusx/portal-backend/issues/802 https://docs.docker.com/build/building/multi-platform https://devblogs.microsoft.com/dotnet/improving-multiplatform-container-support also improve dockerfiles by removing unnecessary base stage and aligning environment variables --- .github/workflows/iam-seeding.yml | 3 --- .github/workflows/maintenance-service.yml | 3 --- .github/workflows/marketplace-app-service.yml | 3 --- .github/workflows/notification-service.yml | 3 --- .github/workflows/portal-migrations.yml | 3 --- .github/workflows/processes-worker.yml | 3 --- .github/workflows/provisioning-migrations.yml | 3 --- .github/workflows/registration-service.yml | 3 --- .github/workflows/release.yml | 3 --- .github/workflows/release_candidate.yml | 3 --- .github/workflows/release_iam-seeding.yml | 3 --- .github/workflows/release_release_candidate.yml | 3 --- .github/workflows/services-service.yml | 3 --- docker/Dockerfile-administration-service | 11 ++++++----- docker/Dockerfile-iam-seeding | 8 +++----- docker/Dockerfile-maintenance-service | 8 +++----- docker/Dockerfile-marketplace-app-service | 11 ++++++----- docker/Dockerfile-notification-service | 11 ++++++----- docker/Dockerfile-portal-migrations | 8 +++----- docker/Dockerfile-processes-worker | 8 +++----- docker/Dockerfile-provisioning-migrations | 8 +++----- docker/Dockerfile-registration-service | 11 ++++++----- docker/Dockerfile-services-service | 11 ++++++----- 23 files changed, 45 insertions(+), 89 deletions(-) diff --git a/.github/workflows/iam-seeding.yml b/.github/workflows/iam-seeding.yml index cdb397984b..e234a5a757 100644 --- a/.github/workflows/iam-seeding.yml +++ b/.github/workflows/iam-seeding.yml @@ -58,9 +58,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0 - - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - name: Docker meta id: meta uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 diff --git a/.github/workflows/maintenance-service.yml b/.github/workflows/maintenance-service.yml index 57d16faacc..052514010b 100644 --- a/.github/workflows/maintenance-service.yml +++ b/.github/workflows/maintenance-service.yml @@ -59,9 +59,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0 - - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - name: Docker meta id: meta uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 diff --git a/.github/workflows/marketplace-app-service.yml b/.github/workflows/marketplace-app-service.yml index 50389cf68a..6d78792089 100644 --- a/.github/workflows/marketplace-app-service.yml +++ b/.github/workflows/marketplace-app-service.yml @@ -64,9 +64,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0 - - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - name: Docker meta id: meta uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 diff --git a/.github/workflows/notification-service.yml b/.github/workflows/notification-service.yml index 35fef7ad80..1505e2580e 100644 --- a/.github/workflows/notification-service.yml +++ b/.github/workflows/notification-service.yml @@ -62,9 +62,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0 - - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - name: Docker meta id: meta uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 diff --git a/.github/workflows/portal-migrations.yml b/.github/workflows/portal-migrations.yml index 8556c0f465..8b0268a705 100644 --- a/.github/workflows/portal-migrations.yml +++ b/.github/workflows/portal-migrations.yml @@ -59,9 +59,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0 - - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - name: Docker meta id: meta uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 diff --git a/.github/workflows/processes-worker.yml b/.github/workflows/processes-worker.yml index e1338fbc8c..7d881a4767 100644 --- a/.github/workflows/processes-worker.yml +++ b/.github/workflows/processes-worker.yml @@ -66,9 +66,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0 - - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - name: Docker meta id: meta uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 diff --git a/.github/workflows/provisioning-migrations.yml b/.github/workflows/provisioning-migrations.yml index 8a493882aa..3a877783e2 100644 --- a/.github/workflows/provisioning-migrations.yml +++ b/.github/workflows/provisioning-migrations.yml @@ -59,9 +59,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0 - - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - name: Docker meta id: meta uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 diff --git a/.github/workflows/registration-service.yml b/.github/workflows/registration-service.yml index 75302be6ef..8ea8c43166 100644 --- a/.github/workflows/registration-service.yml +++ b/.github/workflows/registration-service.yml @@ -63,9 +63,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0 - - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - name: Docker meta id: meta uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d87bf2028e..e1d383e23a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -82,9 +82,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0 - - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - name: Docker meta id: meta uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 diff --git a/.github/workflows/release_candidate.yml b/.github/workflows/release_candidate.yml index eeb35fc825..29b7f76dc1 100644 --- a/.github/workflows/release_candidate.yml +++ b/.github/workflows/release_candidate.yml @@ -82,9 +82,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0 - - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - name: Docker meta id: meta uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 diff --git a/.github/workflows/release_iam-seeding.yml b/.github/workflows/release_iam-seeding.yml index 71c7e56ece..438cfd90ee 100644 --- a/.github/workflows/release_iam-seeding.yml +++ b/.github/workflows/release_iam-seeding.yml @@ -49,9 +49,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0 - - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - name: Docker meta id: meta uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 diff --git a/.github/workflows/release_release_candidate.yml b/.github/workflows/release_release_candidate.yml index fb894b6171..58d6a47452 100644 --- a/.github/workflows/release_release_candidate.yml +++ b/.github/workflows/release_release_candidate.yml @@ -81,9 +81,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0 - - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - name: Docker meta id: meta uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 diff --git a/.github/workflows/services-service.yml b/.github/workflows/services-service.yml index 6ea12aecc0..ec03311d19 100644 --- a/.github/workflows/services-service.yml +++ b/.github/workflows/services-service.yml @@ -63,9 +63,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d70bba72b1f3fd22344832f00baa16ece964efeb # v3.3.0 - - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - name: Docker meta id: meta uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 diff --git a/docker/Dockerfile-administration-service b/docker/Dockerfile-administration-service index 40342922da..fdb12e281b 100644 --- a/docker/Dockerfile-administration-service +++ b/docker/Dockerfile-administration-service @@ -17,17 +17,18 @@ # SPDX-License-Identifier: Apache-2.0 ############################################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS base - -FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine-amd64 AS publish +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS publish +ARG TARGETARCH WORKDIR / COPY LICENSE NOTICE.md DEPENDENCIES / COPY src/ src/ WORKDIR /src/administration/Administration.Service RUN dotnet publish "Administration.Service.csproj" -c Release -o /app/publish -FROM base AS final -ENV COMPlus_EnableDiagnostics=0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine +ENV \ + COMPlus_EnableDiagnostics=0 \ + ASPNETCORE_URLS=http://+:8080 WORKDIR /app COPY --from=publish /app/publish . ENV ASPNETCORE_URLS http://+:8080 diff --git a/docker/Dockerfile-iam-seeding b/docker/Dockerfile-iam-seeding index 0781114715..00afa9066c 100644 --- a/docker/Dockerfile-iam-seeding +++ b/docker/Dockerfile-iam-seeding @@ -17,10 +17,8 @@ # SPDX-License-Identifier: Apache-2.0 ############################################################### -FROM mcr.microsoft.com/dotnet/runtime:8.0-alpine AS base - -FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine-amd64 AS publish -WORKDIR / +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS publish +ARG TARGETARCH COPY LICENSE NOTICE.md DEPENDENCIES / COPY /src/framework/Framework.Async /src/framework/Framework.Async COPY /src/framework/Framework.ErrorHandling /src/framework/Framework.ErrorHandling @@ -34,7 +32,7 @@ COPY /src/keycloak/Keycloak.Seeding /src/keycloak/Keycloak.Seeding WORKDIR /src/keycloak/Keycloak.Seeding RUN dotnet publish "Keycloak.Seeding.csproj" -c Release -o /app/publish -FROM base AS final +FROM mcr.microsoft.com/dotnet/runtime:8.0-alpine ENV COMPlus_EnableDiagnostics=0 WORKDIR /app COPY --from=publish /app/publish . diff --git a/docker/Dockerfile-maintenance-service b/docker/Dockerfile-maintenance-service index e1bf499351..928b7622f2 100644 --- a/docker/Dockerfile-maintenance-service +++ b/docker/Dockerfile-maintenance-service @@ -17,10 +17,8 @@ # SPDX-License-Identifier: Apache-2.0 ############################################################### -FROM mcr.microsoft.com/dotnet/runtime:8.0-alpine AS base - -FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine-amd64 AS publish -WORKDIR / +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS publish +ARG TARGETARCH COPY LICENSE NOTICE.md DEPENDENCIES / COPY src/maintenance/Maintenance.App/ src/maintenance/Maintenance.App/ COPY src/portalbackend/PortalBackend.DBAccess/ src/portalbackend/PortalBackend.DBAccess/ @@ -37,7 +35,7 @@ RUN dotnet restore "src/maintenance/Maintenance.App/Maintenance.App.csproj" WORKDIR /src/maintenance/Maintenance.App RUN dotnet publish "Maintenance.App.csproj" -c Release -o /app/publish -FROM base AS final +FROM mcr.microsoft.com/dotnet/runtime:8.0-alpine ENV COMPlus_EnableDiagnostics=0 WORKDIR /app COPY --from=publish /app/publish . diff --git a/docker/Dockerfile-marketplace-app-service b/docker/Dockerfile-marketplace-app-service index c0a6b29378..0fb61ab91a 100644 --- a/docker/Dockerfile-marketplace-app-service +++ b/docker/Dockerfile-marketplace-app-service @@ -17,17 +17,18 @@ # SPDX-License-Identifier: Apache-2.0 ############################################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS base - -FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine-amd64 AS publish +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS publish +ARG TARGETARCH WORKDIR / COPY LICENSE NOTICE.md DEPENDENCIES / COPY src/ src/ WORKDIR /src/marketplace/Apps.Service RUN dotnet publish "Apps.Service.csproj" -c Release -o /app/publish -FROM base AS final -ENV COMPlus_EnableDiagnostics=0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine +ENV \ + COMPlus_EnableDiagnostics=0 \ + ASPNETCORE_URLS=http://+:8080 WORKDIR /app COPY --from=publish /app/publish . ENV ASPNETCORE_URLS http://+:8080 diff --git a/docker/Dockerfile-notification-service b/docker/Dockerfile-notification-service index b5e1b6147c..a7f73c0c3d 100644 --- a/docker/Dockerfile-notification-service +++ b/docker/Dockerfile-notification-service @@ -17,17 +17,18 @@ # SPDX-License-Identifier: Apache-2.0 ############################################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS base - -FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine-amd64 AS publish +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS publish +ARG TARGETARCH WORKDIR / COPY LICENSE NOTICE.md DEPENDENCIES / COPY src/ src/ WORKDIR /src/notifications/Notifications.Service RUN dotnet publish "Notifications.Service.csproj" -c Release -o /app/publish -FROM base AS final -ENV COMPlus_EnableDiagnostics=0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine +ENV \ + COMPlus_EnableDiagnostics=0 \ + ASPNETCORE_URLS=http://+:8080 WORKDIR /app COPY --from=publish /app/publish . ENV ASPNETCORE_URLS http://+:8080 diff --git a/docker/Dockerfile-portal-migrations b/docker/Dockerfile-portal-migrations index 98ff6657bc..64f717e549 100644 --- a/docker/Dockerfile-portal-migrations +++ b/docker/Dockerfile-portal-migrations @@ -17,10 +17,8 @@ # SPDX-License-Identifier: Apache-2.0 ############################################################### -FROM mcr.microsoft.com/dotnet/runtime:8.0-alpine AS base - -FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine-amd64 AS publish -WORKDIR / +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS publish +ARG TARGETARCH COPY LICENSE NOTICE.md DEPENDENCIES / COPY /src/portalbackend /src/portalbackend COPY /src/framework/Framework.DBAccess /src/framework/Framework.DBAccess @@ -34,7 +32,7 @@ COPY /src/processes/Processes.ProcessIdentity/ /src/processes/Processes.ProcessI WORKDIR /src/portalbackend/PortalBackend.Migrations RUN dotnet publish "PortalBackend.Migrations.csproj" -c Release -o /migrations/publish -FROM base AS final +FROM mcr.microsoft.com/dotnet/runtime:8.0-alpine ENV COMPlus_EnableDiagnostics=0 WORKDIR /migrations COPY --from=publish /migrations/publish . diff --git a/docker/Dockerfile-processes-worker b/docker/Dockerfile-processes-worker index 47e1cb59c2..88c8a4b718 100644 --- a/docker/Dockerfile-processes-worker +++ b/docker/Dockerfile-processes-worker @@ -17,17 +17,15 @@ # SPDX-License-Identifier: Apache-2.0 ############################################################### -FROM mcr.microsoft.com/dotnet/runtime:8.0-alpine AS base - -FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine-amd64 AS publish -WORKDIR / +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS publish +ARG TARGETARCH COPY LICENSE NOTICE.md DEPENDENCIES / COPY src/ src/ RUN dotnet restore "src/processes/Processes.Worker/Processes.Worker.csproj" WORKDIR /src/processes/Processes.Worker RUN dotnet publish "Processes.Worker.csproj" -c Release -o /app/publish -FROM base AS final +FROM mcr.microsoft.com/dotnet/runtime:8.0-alpine ENV COMPlus_EnableDiagnostics=0 WORKDIR /app COPY --from=publish /app/publish . diff --git a/docker/Dockerfile-provisioning-migrations b/docker/Dockerfile-provisioning-migrations index dfbc26581c..ffa44ee1d9 100644 --- a/docker/Dockerfile-provisioning-migrations +++ b/docker/Dockerfile-provisioning-migrations @@ -17,10 +17,8 @@ # SPDX-License-Identifier: Apache-2.0 ############################################################### -FROM mcr.microsoft.com/dotnet/runtime:8.0-alpine AS base - -FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine-amd64 AS publish -WORKDIR / +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS publish +ARG TARGETARCH COPY LICENSE NOTICE.md DEPENDENCIES / COPY /src/provisioning /src/provisioning COPY /src/framework/Framework.ErrorHandling /src/framework/Framework.ErrorHandling @@ -31,7 +29,7 @@ COPY /src/framework/Framework.Logging /src/framework/Framework.Logging WORKDIR /src/provisioning/Provisioning.Migrations RUN dotnet publish "Provisioning.Migrations.csproj" -c Release -o /migrations/publish -FROM base AS final +FROM mcr.microsoft.com/dotnet/runtime:8.0-alpine ENV COMPlus_EnableDiagnostics=0 WORKDIR /migrations COPY --from=publish /migrations/publish . diff --git a/docker/Dockerfile-registration-service b/docker/Dockerfile-registration-service index 5e897bdaa8..b6cdbf2dfe 100644 --- a/docker/Dockerfile-registration-service +++ b/docker/Dockerfile-registration-service @@ -17,17 +17,18 @@ # SPDX-License-Identifier: Apache-2.0 ############################################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS base - -FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine-amd64 AS publish +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS publish +ARG TARGETARCH WORKDIR / COPY LICENSE NOTICE.md DEPENDENCIES / COPY src/ src/ WORKDIR /src/registration/Registration.Service RUN dotnet publish "Registration.Service.csproj" -c Release -o /app/publish -FROM base AS final -ENV COMPlus_EnableDiagnostics=0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine +ENV \ + COMPlus_EnableDiagnostics=0 \ + ASPNETCORE_URLS=http://+:8080 WORKDIR /app COPY --from=publish /app/publish . ENV ASPNETCORE_URLS http://+:8080 diff --git a/docker/Dockerfile-services-service b/docker/Dockerfile-services-service index 59a249d07e..38881f33b9 100644 --- a/docker/Dockerfile-services-service +++ b/docker/Dockerfile-services-service @@ -17,17 +17,18 @@ # SPDX-License-Identifier: Apache-2.0 ############################################################### -FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS base - -FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine-amd64 AS publish +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS publish +ARG TARGETARCH WORKDIR / COPY LICENSE NOTICE.md DEPENDENCIES / COPY src/ src/ WORKDIR /src/marketplace/Services.Service RUN dotnet publish "Services.Service.csproj" -c Release -o /app/publish -FROM base AS final -ENV COMPlus_EnableDiagnostics=0 +FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine +ENV \ + COMPlus_EnableDiagnostics=0 \ + ASPNETCORE_URLS=http://+:8080 WORKDIR /app COPY --from=publish /app/publish . ENV ASPNETCORE_URLS http://+:8080