From 53992eb323be797eddb9087db7de12e1b9ac611e Mon Sep 17 00:00:00 2001 From: HauklandJ Date: Mon, 18 Nov 2024 16:26:05 +0100 Subject: [PATCH 01/12] update builder to standard set in correspondance (1/2) --- .../Signing/SigningDelegationService.cs | 51 ++++--- src/Altinn.App.Core/Helpers/AppIdHelper.cs | 5 + .../AccessManagement/AccessRightBuilder.cs | 54 +++++++ .../AccessManagement/DelegationBuilder.cs | 139 ++++++++++++++++++ .../DelegationRequestBuilder.cs | 95 ------------ .../Models/DelegationRequest.cs | 3 + 6 files changed, 234 insertions(+), 113 deletions(-) create mode 100644 src/Altinn.App.Core/Internal/AccessManagement/AccessRightBuilder.cs create mode 100644 src/Altinn.App.Core/Internal/AccessManagement/DelegationBuilder.cs delete mode 100644 src/Altinn.App.Core/Internal/AccessManagement/DelegationRequestBuilder.cs diff --git a/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs b/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs index 07824bef3..213a9263f 100644 --- a/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs +++ b/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs @@ -26,25 +26,40 @@ CancellationToken ct { if (state.IsAccessDelegated is false) { - // csharpier-ignore-start - string appResourceId = AppIdHelper.ToResourceId(instance.AppId); - DelegationRequest delegation = DelegationRequestBuilder - .CreateBuilder(appResourceId, instance.Id) - .WithDelegator(new Delegator { IdType = DelegationConst.Party, Id = "" }) // TODO: assign delegator - .WithRecipient(new Delegatee { IdType = DelegationConst.Party, Id = signeeContext.PartyId.ToString() }) - .AddRight() - .WithAction(DelegationConst.ActionId, ActionType.Read) - .AddResource(DelegationConst.Resource, appResourceId) // TODO: translate app id to altinn resource id - .AddResource(DelegationConst.Task, taskId) - .BuildRight() - .AddRight() - .WithAction(DelegationConst.ActionId, ActionType.Sign) - .AddResource(DelegationConst.Resource, appResourceId) // TODO: translate app id to altinn resource id - .AddResource(DelegationConst.Task, taskId) - .BuildRight() + DelegationRequest delegationRequest = DelegationBuilder + .Create() + .WithApplicationId(instance.AppId) + .WithInstanceId(instance.Id) + .WithDelegator(new Delegator { IdType = DelegationConst.Party, Id = "" }) + .WithRecipient( + new Delegatee { IdType = DelegationConst.Party, Id = signeeContext.PartyId.ToString() } + ) + .WithRights( + [ + AccessRightBuilder + .Create() + .WithAction(DelegationConst.ActionId, ActionType.Read) + .WithResources( + [ + new Resource { Type = DelegationConst.Resource, Value = AppIdHelper.ToResourceId(instance.AppId) }, + new Resource { Type = DelegationConst.Task, Value = taskId } + ] + ) + .Build(), + AccessRightBuilder + .Create() + .WithAction(DelegationConst.ActionId, ActionType.Sign) + .WithResources( + [ + new Resource { Type = DelegationConst.Resource, Value = AppIdHelper.ToResourceId(instance.AppId) }, + new Resource { Type = DelegationConst.Task, Value = taskId } + ] + ) + .Build() + ] + ) .Build(); - // csharpier-ignore-end - var response = await accessManagementClient.DelegateRights(delegation, ct); + var response = await accessManagementClient.DelegateRights(delegationRequest, ct); state.IsAccessDelegated = await Task.FromResult(true); } } diff --git a/src/Altinn.App.Core/Helpers/AppIdHelper.cs b/src/Altinn.App.Core/Helpers/AppIdHelper.cs index b0e682f88..63a4725fc 100644 --- a/src/Altinn.App.Core/Helpers/AppIdHelper.cs +++ b/src/Altinn.App.Core/Helpers/AppIdHelper.cs @@ -6,4 +6,9 @@ internal static string ToResourceId(string appId) { return ""; //TODO } + + internal static bool IsResourceId(string appId) + { + return false; //TODO + } } diff --git a/src/Altinn.App.Core/Internal/AccessManagement/AccessRightBuilder.cs b/src/Altinn.App.Core/Internal/AccessManagement/AccessRightBuilder.cs new file mode 100644 index 000000000..4ad68506a --- /dev/null +++ b/src/Altinn.App.Core/Internal/AccessManagement/AccessRightBuilder.cs @@ -0,0 +1,54 @@ +using Altinn.App.Core.Internal.AccessManagement.Models; +using Altinn.App.Core.Internal.AccessManagement.Models.Shared; + +namespace Altinn.App.Core.Internal.AccessManagement; + +internal interface IAccessRightBuilderStart +{ + IAccessRightBuilderAction WithAction(string type, string value); +} + +internal interface IAccessRightBuilderAction +{ + IAccessRightBuilder WithResource(string type, string value); + IAccessRightBuilder WithResources(List resources); +} + +internal interface IAccessRightBuilder : IAccessRightBuilderStart, IAccessRightBuilderAction +{ + RightRequest Build(); +} + +internal sealed class AccessRightBuilder : IAccessRightBuilder +{ + private AltinnAction? _action; + private List? _resources; + + private AccessRightBuilder() { } + + public static IAccessRightBuilderStart Create() => new AccessRightBuilder(); + + public IAccessRightBuilderAction WithAction(string type, string value) + { + _action = new AltinnAction { Type = type, Value = value }; + return this; + } + + public IAccessRightBuilder WithResource(string type, string value) + { + _resources = [new Resource { Type = type, Value = value }]; + + return this; + } + + public IAccessRightBuilder WithResources(List resources) + { + _resources = [.. _resources ?? [], .. resources]; + return this; + } + + public RightRequest Build() + { + return new RightRequest { Action = _action, Resource = _resources ?? [] }; + } +} diff --git a/src/Altinn.App.Core/Internal/AccessManagement/DelegationBuilder.cs b/src/Altinn.App.Core/Internal/AccessManagement/DelegationBuilder.cs new file mode 100644 index 000000000..c183136ba --- /dev/null +++ b/src/Altinn.App.Core/Internal/AccessManagement/DelegationBuilder.cs @@ -0,0 +1,139 @@ +using System.Diagnostics.CodeAnalysis; +using Altinn.App.Core.Helpers; +using Altinn.App.Core.Internal.AccessManagement.Models; +using Altinn.App.Core.Internal.AccessManagement.Models.Shared; + +namespace Altinn.App.Core.Internal.AccessManagement; + +internal abstract class DelegationBuilderBase +{ + internal static void NotNullOrEmpty([NotNull] object? value, string? errorMessage = null) + { + if ( + value is null + || value is string str && string.IsNullOrWhiteSpace(str) + || value is ReadOnlyMemory { IsEmpty: true } + ) + { + throw new ArgumentNullException(errorMessage); // TODO: add custom exception + } + } +} + +internal interface IDelegationBuilderStart +{ + IDelegationBuilderApplicationId WithApplicationId(string applicationId); +} + +internal interface IDelegationBuilderApplicationId +{ + IDelegationBuilderInstanceId WithInstanceId(string instanceId); +} + +internal interface IDelegationBuilderInstanceId +{ + IDelegationBuilderDelegator WithDelegator(Delegator delegator); +} + +internal interface IDelegationBuilderDelegator +{ + IDelegationBuilderRecipient WithRecipient(Delegatee recipient); +} + +internal interface IDelegationBuilderRecipient +{ + IDelegationBuilder WithRight(RightRequest rightRequest); + IDelegationBuilder WithRights(List rightRequests); +} + +internal interface IDelegationBuilder + : IDelegationBuilderStart, + IDelegationBuilderApplicationId, + IDelegationBuilderInstanceId, + IDelegationBuilderDelegator, + IDelegationBuilderRecipient +{ + DelegationRequest Build(); +} + +internal sealed class DelegationBuilder : DelegationBuilderBase, IDelegationBuilder +{ + private string? _applicationId; + private string? _instanceId; + private Delegator? _delegator; + private Delegatee? _recipient; + private List? _rights; + + private DelegationBuilder() { } + + public static IDelegationBuilderStart Create() => new DelegationBuilder(); + + public IDelegationBuilderApplicationId WithApplicationId(string applicationId) + { + NotNullOrEmpty(applicationId, nameof(applicationId)); + if (!AppIdHelper.IsResourceId(applicationId)) + { + applicationId = AppIdHelper.ToResourceId(applicationId); + } + + _applicationId = applicationId; + return this; + } + + public IDelegationBuilderInstanceId WithInstanceId(string instanceId) + { + NotNullOrEmpty(instanceId, nameof(instanceId)); + _instanceId = instanceId; + return this; + } + + public IDelegationBuilderDelegator WithDelegator(Delegator delegator) + { + NotNullOrEmpty(delegator, nameof(delegator)); + _delegator = delegator; + return this; + } + + public IDelegationBuilderRecipient WithRecipient(Delegatee recipient) + { + NotNullOrEmpty(recipient, nameof(recipient)); + _recipient = recipient; + return this; + } + + public IDelegationBuilder WithRight(RightRequest rightRequest) + { + _rights = [rightRequest]; + return this; + } + + public IDelegationBuilder WithRights(List rightRequests) + { + _rights = [.. _rights ?? [], .. rightRequests]; + return this; + } + + public IDelegationBuilder WithRight(AccessRightBuilder rightBuilder) + { + _rights = [rightBuilder.Build()]; + return this; + } + + public DelegationRequest Build() + { + NotNullOrEmpty(_applicationId, nameof(_applicationId)); + NotNullOrEmpty(_instanceId, nameof(_instanceId)); + NotNullOrEmpty(_delegator, nameof(_delegator)); + NotNullOrEmpty(_recipient, nameof(_recipient)); + NotNullOrEmpty(_rights, nameof(_rights)); + + return new DelegationRequest + { + ResourceId = _applicationId, + InstanceId = _instanceId, + From = _delegator, + To = _recipient, + Rights = _rights + }; + } +} diff --git a/src/Altinn.App.Core/Internal/AccessManagement/DelegationRequestBuilder.cs b/src/Altinn.App.Core/Internal/AccessManagement/DelegationRequestBuilder.cs deleted file mode 100644 index 0e339e309..000000000 --- a/src/Altinn.App.Core/Internal/AccessManagement/DelegationRequestBuilder.cs +++ /dev/null @@ -1,95 +0,0 @@ -using Altinn.App.Core.Internal.AccessManagement.Models; -using Altinn.App.Core.Internal.AccessManagement.Models.Shared; - -namespace Altinn.App.Core.Internal.AccessManagement; - -internal interface IDelegatorStep -{ - IRecipientStep WithDelegator(Delegator delegator); -} - -internal interface IRecipientStep -{ - IRightStep WithRecipient(Delegatee recipient); -} - -internal interface IRightStep : IDelegationCreateStep -{ - IRightBuilder AddRight(); -} - -internal interface IDelegationCreateStep -{ - DelegationRequest Build(); -} - -internal interface IRightBuilder -{ - IRightBuilder WithAction(string type, string value); - IRightBuilder AddResource(string type, string value); - IRightStep BuildRight(); -} - -internal sealed class DelegationRequestBuilder : IDelegatorStep, IRecipientStep, IRightStep, IDelegationCreateStep -{ - private DelegationRequest _delegation; - - public DelegationRequestBuilder(string applicationId, string instanceId) - { - _delegation = new DelegationRequest() { ResourceId = applicationId, InstanceId = instanceId }; - } - - public static IDelegatorStep CreateBuilder(string applicationId, string instanceId) => - new DelegationRequestBuilder(applicationId, instanceId); - - public IRecipientStep WithDelegator(Delegator delegator) - { - _delegation.From = delegator; - return this; - } - - public IRightStep WithRecipient(Delegatee recipient) - { - _delegation.To = recipient; - return this; - } - - public IRightBuilder AddRight() - { - return new RightBuilder(this); - } - - public DelegationRequest Build() - { - return _delegation; - } - - internal sealed class RightBuilder : IRightBuilder - { - private readonly IRightStep _parentBuilder; - private readonly RightRequest _right = new RightRequest { Resource = new List() }; - - public RightBuilder(IRightStep parentBuilder) - { - _parentBuilder = parentBuilder; - } - - public IRightBuilder WithAction(string type, string value) - { - _right.Action = new AltinnAction { Type = type, Value = value }; - return this; - } - - public IRightBuilder AddResource(string type, string value) - { - _right.Resource.Add(new Resource { Type = type, Value = value }); - return this; - } - - public IRightStep BuildRight() - { - ((DelegationRequestBuilder)_parentBuilder)._delegation.Rights.Add(_right); - return _parentBuilder; - } - } -} diff --git a/src/Altinn.App.Core/Internal/AccessManagement/Models/DelegationRequest.cs b/src/Altinn.App.Core/Internal/AccessManagement/Models/DelegationRequest.cs index effc914d2..83cea9894 100644 --- a/src/Altinn.App.Core/Internal/AccessManagement/Models/DelegationRequest.cs +++ b/src/Altinn.App.Core/Internal/AccessManagement/Models/DelegationRequest.cs @@ -28,4 +28,7 @@ internal sealed class RightRequest [JsonPropertyName("action")] internal AltinnAction? Action { get; set; } + + [JsonPropertyName("taskId")] + internal string? TaskId { get; set; } } From 390fd6bf7c841e804b7fdba0807864d76eb903ae Mon Sep 17 00:00:00 2001 From: HauklandJ Date: Wed, 20 Nov 2024 12:58:42 +0100 Subject: [PATCH 02/12] restructure: add builders folder --- .../Features/Signing/SigningDelegationService.cs | 1 + .../AccessManagement/{ => Builders}/AccessRightBuilder.cs | 2 +- .../AccessManagement/{ => Builders}/DelegationBuilder.cs | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) rename src/Altinn.App.Core/Internal/AccessManagement/{ => Builders}/AccessRightBuilder.cs (95%) rename src/Altinn.App.Core/Internal/AccessManagement/{ => Builders}/DelegationBuilder.cs (97%) diff --git a/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs b/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs index 213a9263f..12fb69288 100644 --- a/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs +++ b/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs @@ -2,6 +2,7 @@ using Altinn.App.Core.Features.Signing.Models; using Altinn.App.Core.Helpers; using Altinn.App.Core.Internal.AccessManagement; +using Altinn.App.Core.Internal.AccessManagement.Builders; using Altinn.App.Core.Internal.AccessManagement.Models; using Altinn.App.Core.Internal.AccessManagement.Models.Shared; using Altinn.Platform.Storage.Interface.Models; diff --git a/src/Altinn.App.Core/Internal/AccessManagement/AccessRightBuilder.cs b/src/Altinn.App.Core/Internal/AccessManagement/Builders/AccessRightBuilder.cs similarity index 95% rename from src/Altinn.App.Core/Internal/AccessManagement/AccessRightBuilder.cs rename to src/Altinn.App.Core/Internal/AccessManagement/Builders/AccessRightBuilder.cs index 4ad68506a..9a053725d 100644 --- a/src/Altinn.App.Core/Internal/AccessManagement/AccessRightBuilder.cs +++ b/src/Altinn.App.Core/Internal/AccessManagement/Builders/AccessRightBuilder.cs @@ -1,7 +1,7 @@ using Altinn.App.Core.Internal.AccessManagement.Models; using Altinn.App.Core.Internal.AccessManagement.Models.Shared; -namespace Altinn.App.Core.Internal.AccessManagement; +namespace Altinn.App.Core.Internal.AccessManagement.Builders; internal interface IAccessRightBuilderStart { diff --git a/src/Altinn.App.Core/Internal/AccessManagement/DelegationBuilder.cs b/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs similarity index 97% rename from src/Altinn.App.Core/Internal/AccessManagement/DelegationBuilder.cs rename to src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs index c183136ba..3aaf827a3 100644 --- a/src/Altinn.App.Core/Internal/AccessManagement/DelegationBuilder.cs +++ b/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs @@ -1,9 +1,10 @@ using System.Diagnostics.CodeAnalysis; using Altinn.App.Core.Helpers; +using Altinn.App.Core.Internal.AccessManagement.Builders; using Altinn.App.Core.Internal.AccessManagement.Models; using Altinn.App.Core.Internal.AccessManagement.Models.Shared; -namespace Altinn.App.Core.Internal.AccessManagement; +namespace Altinn.App.Core.Internal.AccessManagement.Builders; internal abstract class DelegationBuilderBase { From 5a1ab9190cf3f48090c229c51f5dfef4212e6bca Mon Sep 17 00:00:00 2001 From: HauklandJ Date: Wed, 20 Nov 2024 13:26:36 +0100 Subject: [PATCH 03/12] formatting --- .../Features/Signing/SigningDelegationService.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs b/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs index 12fb69288..cd677c811 100644 --- a/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs +++ b/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs @@ -42,7 +42,11 @@ CancellationToken ct .WithAction(DelegationConst.ActionId, ActionType.Read) .WithResources( [ - new Resource { Type = DelegationConst.Resource, Value = AppIdHelper.ToResourceId(instance.AppId) }, + new Resource + { + Type = DelegationConst.Resource, + Value = AppIdHelper.ToResourceId(instance.AppId) + }, new Resource { Type = DelegationConst.Task, Value = taskId } ] ) @@ -52,7 +56,11 @@ CancellationToken ct .WithAction(DelegationConst.ActionId, ActionType.Sign) .WithResources( [ - new Resource { Type = DelegationConst.Resource, Value = AppIdHelper.ToResourceId(instance.AppId) }, + new Resource + { + Type = DelegationConst.Resource, + Value = AppIdHelper.ToResourceId(instance.AppId) + }, new Resource { Type = DelegationConst.Task, Value = taskId } ] ) From 1a2df625bb45f1a73ea58a6da7dad7d4560fa687 Mon Sep 17 00:00:00 2001 From: HauklandJ Date: Wed, 20 Nov 2024 13:27:02 +0100 Subject: [PATCH 04/12] add TryGet method to retrieve app resource id --- src/Altinn.App.Core/Helpers/AppIdHelper.cs | 29 +++++++++++++++++++ .../Builders/DelegationBuilder.cs | 9 ++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/Altinn.App.Core/Helpers/AppIdHelper.cs b/src/Altinn.App.Core/Helpers/AppIdHelper.cs index 63a4725fc..d232370ba 100644 --- a/src/Altinn.App.Core/Helpers/AppIdHelper.cs +++ b/src/Altinn.App.Core/Helpers/AppIdHelper.cs @@ -1,3 +1,5 @@ +using System.Diagnostics.CodeAnalysis; + namespace Altinn.App.Core.Helpers; internal sealed class AppIdHelper @@ -11,4 +13,31 @@ internal static bool IsResourceId(string appId) { return false; //TODO } + + internal static bool TryGetResourceId(string appId, [NotNullWhen(true)] out string? resourceId) + { + if (string.IsNullOrEmpty(appId)) + { + resourceId = null; + return false; + } + + if (IsResourceId(appId)) + { + resourceId = appId; + return true; + } + + resourceId = ToResourceId(appId); + + if (IsResourceId(resourceId)) + { + return true; + } + else + { + resourceId = null; + return false; + } + } } diff --git a/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs b/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs index 3aaf827a3..3b6b9cbc8 100644 --- a/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs +++ b/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs @@ -72,12 +72,9 @@ private DelegationBuilder() { } public IDelegationBuilderApplicationId WithApplicationId(string applicationId) { NotNullOrEmpty(applicationId, nameof(applicationId)); - if (!AppIdHelper.IsResourceId(applicationId)) - { - applicationId = AppIdHelper.ToResourceId(applicationId); - } - - _applicationId = applicationId; + _applicationId = AppIdHelper.TryGetResourceId(applicationId, out string? resourceId) + ? resourceId + : throw new ArgumentException("Invalid application ID", nameof(applicationId)); return this; } From dd6fba7b1bf1ce921a564ec16d738673411c3146 Mon Sep 17 00:00:00 2001 From: HauklandJ Date: Wed, 20 Nov 2024 13:50:41 +0100 Subject: [PATCH 05/12] cleanup --- .../Features/Signing/Mocks/AltinnCorrespondance.cs | 2 +- .../Internal/AccessManagement/Builders/DelegationBuilder.cs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Altinn.App.Core/Features/Signing/Mocks/AltinnCorrespondance.cs b/src/Altinn.App.Core/Features/Signing/Mocks/AltinnCorrespondance.cs index 068a768d5..f5055f5a2 100644 --- a/src/Altinn.App.Core/Features/Signing/Mocks/AltinnCorrespondance.cs +++ b/src/Altinn.App.Core/Features/Signing/Mocks/AltinnCorrespondance.cs @@ -6,7 +6,7 @@ namespace Altinn.App.Core.Features.Signing.Mocks; #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member public class CorrespondanceClientMock { - public async Task Initialize(InitializeCorrespondenceRequestMock requestMock) + public static async Task Initialize(InitializeCorrespondenceRequestMock requestMock) { var responseMock = new InitializeCorrespondencesResponseMock { diff --git a/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs b/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs index 3b6b9cbc8..ec30323e5 100644 --- a/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs +++ b/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs @@ -1,6 +1,5 @@ using System.Diagnostics.CodeAnalysis; using Altinn.App.Core.Helpers; -using Altinn.App.Core.Internal.AccessManagement.Builders; using Altinn.App.Core.Internal.AccessManagement.Models; using Altinn.App.Core.Internal.AccessManagement.Models.Shared; From 83e584e3f95514e20212a8bf5f05fd19ba5e1f37 Mon Sep 17 00:00:00 2001 From: HauklandJ Date: Wed, 20 Nov 2024 14:15:34 +0100 Subject: [PATCH 06/12] formatting --- .../Features/Signing/Mocks/AltinnCorrespondance.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Altinn.App.Core/Features/Signing/Mocks/AltinnCorrespondance.cs b/src/Altinn.App.Core/Features/Signing/Mocks/AltinnCorrespondance.cs index f5055f5a2..f26ff92b8 100644 --- a/src/Altinn.App.Core/Features/Signing/Mocks/AltinnCorrespondance.cs +++ b/src/Altinn.App.Core/Features/Signing/Mocks/AltinnCorrespondance.cs @@ -6,7 +6,9 @@ namespace Altinn.App.Core.Features.Signing.Mocks; #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member public class CorrespondanceClientMock { - public static async Task Initialize(InitializeCorrespondenceRequestMock requestMock) + public static async Task Initialize( + InitializeCorrespondenceRequestMock requestMock + ) { var responseMock = new InitializeCorrespondencesResponseMock { From 889695b3e3dfa880e54b470951bc90094472c046 Mon Sep 17 00:00:00 2001 From: HauklandJ Date: Wed, 20 Nov 2024 14:16:59 +0100 Subject: [PATCH 07/12] add custom exceptions --- .../AccessManagementClient.cs | 5 +- .../Builders/DelegationBuilder.cs | 3 +- .../AccessManagementArgumentException.cs | 12 +++++ .../Exceptions/AccessManagementException.cs | 18 ++++++++ .../AccessManagementRequestException.cs | 46 +++++++++++++++++++ .../Exceptions/DelegationException.cs | 15 ------ 6 files changed, 81 insertions(+), 18 deletions(-) create mode 100644 src/Altinn.App.Core/Internal/AccessManagement/Exceptions/AccessManagementArgumentException.cs create mode 100644 src/Altinn.App.Core/Internal/AccessManagement/Exceptions/AccessManagementException.cs create mode 100644 src/Altinn.App.Core/Internal/AccessManagement/Exceptions/AccessManagementRequestException.cs delete mode 100644 src/Altinn.App.Core/Internal/AccessManagement/Exceptions/DelegationException.cs diff --git a/src/Altinn.App.Core/Internal/AccessManagement/AccessManagementClient.cs b/src/Altinn.App.Core/Internal/AccessManagement/AccessManagementClient.cs index 7ec52bf49..a43e4260c 100644 --- a/src/Altinn.App.Core/Internal/AccessManagement/AccessManagementClient.cs +++ b/src/Altinn.App.Core/Internal/AccessManagement/AccessManagementClient.cs @@ -71,9 +71,10 @@ public async Task DelegateRights(DelegationRequest delegatio } catch (Exception e) { - var ex = new DelegationException( + var ex = new AccessManagementRequestException( $"Something went wrong when processing the access management request.", - httpResponseMessage, + null, + httpResponseMessage?.StatusCode, httpContent, e ); diff --git a/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs b/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs index ec30323e5..a6cf5fada 100644 --- a/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs +++ b/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using Altinn.App.Core.Helpers; +using Altinn.App.Core.Internal.AccessManagement.Exceptions; using Altinn.App.Core.Internal.AccessManagement.Models; using Altinn.App.Core.Internal.AccessManagement.Models.Shared; @@ -15,7 +16,7 @@ value is null || value is ReadOnlyMemory { IsEmpty: true } ) { - throw new ArgumentNullException(errorMessage); // TODO: add custom exception + throw new AccessManagementArgumentException(errorMessage); // TODO: add custom exception } } } diff --git a/src/Altinn.App.Core/Internal/AccessManagement/Exceptions/AccessManagementArgumentException.cs b/src/Altinn.App.Core/Internal/AccessManagement/Exceptions/AccessManagementArgumentException.cs new file mode 100644 index 000000000..d88bc3cc8 --- /dev/null +++ b/src/Altinn.App.Core/Internal/AccessManagement/Exceptions/AccessManagementArgumentException.cs @@ -0,0 +1,12 @@ +namespace Altinn.App.Core.Internal.AccessManagement.Exceptions; + +internal sealed class AccessManagementArgumentException : AccessManagementException +{ + public AccessManagementArgumentException() { } + + public AccessManagementArgumentException(string? message) + : base(message) { } + + public AccessManagementArgumentException(string? message, Exception? innerException) + : base(message, innerException) { } +} diff --git a/src/Altinn.App.Core/Internal/AccessManagement/Exceptions/AccessManagementException.cs b/src/Altinn.App.Core/Internal/AccessManagement/Exceptions/AccessManagementException.cs new file mode 100644 index 000000000..0b07ca5fb --- /dev/null +++ b/src/Altinn.App.Core/Internal/AccessManagement/Exceptions/AccessManagementException.cs @@ -0,0 +1,18 @@ +namespace Altinn.App.Core.Internal.AccessManagement.Exceptions; + +/// +/// Generic Access Management related exception. +/// +internal abstract class AccessManagementException : Exception +{ + /// + protected AccessManagementException() { } + + /// + protected AccessManagementException(string? message) + : base(message) { } + + /// + protected AccessManagementException(string? message, Exception? innerException) + : base(message, innerException) { } +} diff --git a/src/Altinn.App.Core/Internal/AccessManagement/Exceptions/AccessManagementRequestException.cs b/src/Altinn.App.Core/Internal/AccessManagement/Exceptions/AccessManagementRequestException.cs new file mode 100644 index 000000000..6106d923e --- /dev/null +++ b/src/Altinn.App.Core/Internal/AccessManagement/Exceptions/AccessManagementRequestException.cs @@ -0,0 +1,46 @@ +using System.Net; +using Microsoft.AspNetCore.Mvc; + +namespace Altinn.App.Core.Internal.AccessManagement.Exceptions; + +internal sealed class AccessManagementRequestException : AccessManagementException +{ + internal ProblemDetails? ProblemDetails { get; init; } + internal HttpStatusCode? StatusCode { get; init; } + internal string? ResponseBody { get; init; } + + public AccessManagementRequestException() { } + + public AccessManagementRequestException(string? message) + : base(message) { } + + public AccessManagementRequestException(string? message, Exception? innerException) + : base(message, innerException) { } + + public AccessManagementRequestException( + string? message, + ProblemDetails? problemDetails, + HttpStatusCode? statusCode, + string? responseBody + ) + : base(message) + { + ProblemDetails = problemDetails; + StatusCode = statusCode; + ResponseBody = responseBody; + } + + public AccessManagementRequestException( + string? message, + ProblemDetails? problemDetails, + HttpStatusCode? statusCode, + string? responseBody, + Exception? innerException + ) + : base(message, innerException) + { + ProblemDetails = problemDetails; + StatusCode = statusCode; + ResponseBody = responseBody; + } +} diff --git a/src/Altinn.App.Core/Internal/AccessManagement/Exceptions/DelegationException.cs b/src/Altinn.App.Core/Internal/AccessManagement/Exceptions/DelegationException.cs deleted file mode 100644 index 8b5b11ca9..000000000 --- a/src/Altinn.App.Core/Internal/AccessManagement/Exceptions/DelegationException.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Altinn.App.Core.Internal.AccessManagement.Exceptions; - -internal sealed class DelegationException : Exception -{ - internal DelegationException( - string? message, - HttpResponseMessage? response, - string? content, - Exception? innerException - ) - : base( - $"{message}: StatusCode={response?.StatusCode}\nReason={response?.ReasonPhrase}\nBody={content}\n", - innerException - ) { } -} From 76712ff71ae5b3785eb9120126f83a071921526a Mon Sep 17 00:00:00 2001 From: HauklandJ Date: Wed, 20 Nov 2024 14:43:47 +0100 Subject: [PATCH 08/12] use IOptions for plattformsettings --- .../Internal/AccessManagement/AccessManagementClient.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Altinn.App.Core/Internal/AccessManagement/AccessManagementClient.cs b/src/Altinn.App.Core/Internal/AccessManagement/AccessManagementClient.cs index a43e4260c..6c7022b64 100644 --- a/src/Altinn.App.Core/Internal/AccessManagement/AccessManagementClient.cs +++ b/src/Altinn.App.Core/Internal/AccessManagement/AccessManagementClient.cs @@ -8,6 +8,7 @@ using Altinn.App.Core.Internal.App; using Altinn.Common.AccessTokenClient.Services; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; namespace Altinn.App.Core.Internal.AccessManagement; @@ -21,7 +22,7 @@ internal sealed class AccessManagementClient( HttpClient httpClient, IAppMetadata appMetadata, IAccessTokenGenerator accessTokenGenerator, - PlatformSettings platformSettings, + IOptions platformSettings, Telemetry? telemetry = null ) : IAccessManagementClient { @@ -36,7 +37,7 @@ public async Task DelegateRights(DelegationRequest delegatio HttpResponseMessage? httpResponseMessage = null; string? httpContent = null; - UrlHelper urlHelper = new(platformSettings); + UrlHelper urlHelper = new(platformSettings.Value); try { var application = await appMetadata.GetApplicationMetadata(); From 19be6a094cc69aceeb29f4e851f222e62ab3079e Mon Sep 17 00:00:00 2001 From: HauklandJ Date: Mon, 25 Nov 2024 15:54:45 +0100 Subject: [PATCH 09/12] simplify builder --- .../Features/Signing/SigningDelegationService.cs | 6 ++---- .../AccessManagement/Builders/AccessRightBuilder.cs | 12 ++++++------ .../AccessManagement/Models/Shared/Resource.cs | 3 +-- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs b/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs index cd677c811..49143ac80 100644 --- a/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs +++ b/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs @@ -39,12 +39,11 @@ CancellationToken ct [ AccessRightBuilder .Create() - .WithAction(DelegationConst.ActionId, ActionType.Read) + .WithAction(ActionType.Read) .WithResources( [ new Resource { - Type = DelegationConst.Resource, Value = AppIdHelper.ToResourceId(instance.AppId) }, new Resource { Type = DelegationConst.Task, Value = taskId } @@ -53,12 +52,11 @@ CancellationToken ct .Build(), AccessRightBuilder .Create() - .WithAction(DelegationConst.ActionId, ActionType.Sign) + .WithAction(ActionType.Sign) .WithResources( [ new Resource { - Type = DelegationConst.Resource, Value = AppIdHelper.ToResourceId(instance.AppId) }, new Resource { Type = DelegationConst.Task, Value = taskId } diff --git a/src/Altinn.App.Core/Internal/AccessManagement/Builders/AccessRightBuilder.cs b/src/Altinn.App.Core/Internal/AccessManagement/Builders/AccessRightBuilder.cs index 9a053725d..ee70abc73 100644 --- a/src/Altinn.App.Core/Internal/AccessManagement/Builders/AccessRightBuilder.cs +++ b/src/Altinn.App.Core/Internal/AccessManagement/Builders/AccessRightBuilder.cs @@ -5,12 +5,12 @@ namespace Altinn.App.Core.Internal.AccessManagement.Builders; internal interface IAccessRightBuilderStart { - IAccessRightBuilderAction WithAction(string type, string value); + IAccessRightBuilderAction WithAction(string value); } internal interface IAccessRightBuilderAction { - IAccessRightBuilder WithResource(string type, string value); + IAccessRightBuilder WithResource(string value); IAccessRightBuilder WithResources(List resources); } @@ -28,15 +28,15 @@ private AccessRightBuilder() { } public static IAccessRightBuilderStart Create() => new AccessRightBuilder(); - public IAccessRightBuilderAction WithAction(string type, string value) + public IAccessRightBuilderAction WithAction(string value) { - _action = new AltinnAction { Type = type, Value = value }; + _action = new AltinnAction { Type = DelegationConst.ActionId, Value = value }; return this; } - public IAccessRightBuilder WithResource(string type, string value) + public IAccessRightBuilder WithResource(string value) { - _resources = [new Resource { Type = type, Value = value }]; + _resources = [new Resource { Type = DelegationConst.Resource, Value = value }]; return this; } diff --git a/src/Altinn.App.Core/Internal/AccessManagement/Models/Shared/Resource.cs b/src/Altinn.App.Core/Internal/AccessManagement/Models/Shared/Resource.cs index c6959a839..88e4777a0 100644 --- a/src/Altinn.App.Core/Internal/AccessManagement/Models/Shared/Resource.cs +++ b/src/Altinn.App.Core/Internal/AccessManagement/Models/Shared/Resource.cs @@ -1,11 +1,10 @@ using System.Text.Json.Serialization; - namespace Altinn.App.Core.Internal.AccessManagement.Models.Shared; internal sealed class Resource { [JsonPropertyName("type")] - internal required string Type { get; set; } + internal string Type { get; set; } = DelegationConst.Resource; [JsonPropertyName("value")] internal required string Value { get; set; } From 2e93861d16df934c9e7c7c75d67cb0c0283f6f60 Mon Sep 17 00:00:00 2001 From: HauklandJ Date: Mon, 2 Dec 2024 09:35:07 +0100 Subject: [PATCH 10/12] format --- .../Features/Signing/SigningDelegationService.cs | 10 ++-------- .../AccessManagement/Models/Shared/Resource.cs | 1 + 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs b/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs index 49143ac80..fede99bf6 100644 --- a/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs +++ b/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs @@ -42,10 +42,7 @@ CancellationToken ct .WithAction(ActionType.Read) .WithResources( [ - new Resource - { - Value = AppIdHelper.ToResourceId(instance.AppId) - }, + new Resource { Value = AppIdHelper.ToResourceId(instance.AppId) }, new Resource { Type = DelegationConst.Task, Value = taskId } ] ) @@ -55,10 +52,7 @@ CancellationToken ct .WithAction(ActionType.Sign) .WithResources( [ - new Resource - { - Value = AppIdHelper.ToResourceId(instance.AppId) - }, + new Resource { Value = AppIdHelper.ToResourceId(instance.AppId) }, new Resource { Type = DelegationConst.Task, Value = taskId } ] ) diff --git a/src/Altinn.App.Core/Internal/AccessManagement/Models/Shared/Resource.cs b/src/Altinn.App.Core/Internal/AccessManagement/Models/Shared/Resource.cs index 88e4777a0..f25902638 100644 --- a/src/Altinn.App.Core/Internal/AccessManagement/Models/Shared/Resource.cs +++ b/src/Altinn.App.Core/Internal/AccessManagement/Models/Shared/Resource.cs @@ -1,4 +1,5 @@ using System.Text.Json.Serialization; + namespace Altinn.App.Core.Internal.AccessManagement.Models.Shared; internal sealed class Resource From 535da111868cbe9662b7183162cc335bf659653b Mon Sep 17 00:00:00 2001 From: HauklandJ Date: Mon, 2 Dec 2024 09:37:52 +0100 Subject: [PATCH 11/12] trailing comma --- .../Features/Signing/SigningDelegationService.cs | 4 ++-- .../Internal/AccessManagement/Builders/DelegationBuilder.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs b/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs index fede99bf6..55c9f1a1a 100644 --- a/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs +++ b/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs @@ -43,7 +43,7 @@ CancellationToken ct .WithResources( [ new Resource { Value = AppIdHelper.ToResourceId(instance.AppId) }, - new Resource { Type = DelegationConst.Task, Value = taskId } + new Resource { Type = DelegationConst.Task, Value = taskId }, ] ) .Build(), @@ -53,7 +53,7 @@ CancellationToken ct .WithResources( [ new Resource { Value = AppIdHelper.ToResourceId(instance.AppId) }, - new Resource { Type = DelegationConst.Task, Value = taskId } + new Resource { Type = DelegationConst.Task, Value = taskId }, ] ) .Build() diff --git a/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs b/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs index a6cf5fada..d8f0e73da 100644 --- a/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs +++ b/src/Altinn.App.Core/Internal/AccessManagement/Builders/DelegationBuilder.cs @@ -131,7 +131,7 @@ public DelegationRequest Build() InstanceId = _instanceId, From = _delegator, To = _recipient, - Rights = _rights + Rights = _rights, }; } } From 4f59333d3ec039921113538a9383297a99913cec Mon Sep 17 00:00:00 2001 From: HauklandJ Date: Mon, 2 Dec 2024 09:48:19 +0100 Subject: [PATCH 12/12] more formatting --- .../Features/Signing/SigningDelegationService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs b/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs index 55c9f1a1a..0a74956b2 100644 --- a/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs +++ b/src/Altinn.App.Core/Features/Signing/SigningDelegationService.cs @@ -56,7 +56,7 @@ CancellationToken ct new Resource { Type = DelegationConst.Task, Value = taskId }, ] ) - .Build() + .Build(), ] ) .Build();