Skip to content

Commit 49948b2

Browse files
authored
fix: Return distinct actions in GetAlinnActions (#1298)
## Description GetAltinnActions now removes duplicate action/resource tuples, which results in simpler XACML requests and dialog tokens. ## Related Issue(s) - N/A ## Verification - [x] **Your** code builds clean without any errors or warnings - [x] Manual testing done (required) - [x] Relevant automated test added (if you find this hard, leave it and we'll help out) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Improved handling of duplicate actions in the Altinn authorization process, ensuring a cleaner and more accurate list of actions. - **Bug Fixes** - Enhanced test coverage for action retrieval, ensuring the correct actions and attributes are validated. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
1 parent f213d3d commit 49948b2

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

src/Digdir.Domain.Dialogporten.Infrastructure/Altinn/Authorization/DialogEntityExtensions.cs

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public static List<AltinnAction> GetAltinnActions(this DialogEntity dialogEntity
2020
.Select(x => new AltinnAction(GetReadActionForAuthorizationAttribute(x.AuthorizationAttribute!), x.AuthorizationAttribute)))
2121
// We always need to check if the user can read the main resource
2222
.Append(new AltinnAction(Constants.ReadAction, Constants.MainResource))
23+
.GroupBy(x => new { x.Name, x.AuthorizationAttribute })
24+
.Select(g => g.First()) // Remove duplicates by grouping
2325
.ToList();
2426
}
2527

tests/Digdir.Domain.Dialogporten.Infrastructure.Unit.Tests/DialogEntityExtensionsTests.cs

+22-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Digdir.Domain.Dialogporten.Application.Common.Authorization;
22
using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities;
3+
using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Actions;
34
using Digdir.Domain.Dialogporten.Infrastructure.Altinn.Authorization;
45
using Xunit;
56

@@ -13,11 +14,23 @@ public void GetAltinnActionsShouldReturnCorrectActionsForTransmissionAuthorizati
1314
// Arrange
1415
var dialogEntity = new DialogEntity
1516
{
16-
ApiActions = [],
17-
GuiActions = [],
17+
ApiActions = [
18+
new DialogApiAction { Action = "read" },
19+
new DialogApiAction { Action = "read" },
20+
new DialogApiAction { Action = "read", AuthorizationAttribute = "foo" },
21+
new DialogApiAction { Action = "transmissionread", AuthorizationAttribute = "bar" },
22+
new DialogApiAction { Action = "apiread" },
23+
],
24+
GuiActions = [
25+
new DialogGuiAction { Action = "read" },
26+
new DialogGuiAction { Action = "read" },
27+
new DialogGuiAction { Action = "read", AuthorizationAttribute = "foo" },
28+
new DialogGuiAction { Action = "transmissionread", AuthorizationAttribute = "bar" },
29+
new DialogGuiAction { Action = "guiread" },
30+
],
1831
Transmissions =
1932
[
20-
new() { AuthorizationAttribute = "foo" },
33+
new() { AuthorizationAttribute = "bar" },
2134
new() { AuthorizationAttribute = "urn:altinn:subresource:bar" },
2235
new() { AuthorizationAttribute = "urn:altinn:task:Task_1" },
2336
new() { AuthorizationAttribute = "urn:altinn:resource:some-service:element1" },
@@ -30,8 +43,12 @@ public void GetAltinnActionsShouldReturnCorrectActionsForTransmissionAuthorizati
3043

3144
// Assert
3245
Assert.NotNull(actions);
33-
Assert.NotEmpty(actions);
34-
Assert.Contains(actions, a => a is { Name: Constants.TransmissionReadAction, AuthorizationAttribute: "foo" });
46+
Assert.Equal(9, actions.Count);
47+
Assert.Contains(actions, a => a is { Name: Constants.ReadAction, AuthorizationAttribute: Constants.MainResource });
48+
Assert.Contains(actions, a => a is { Name: Constants.ReadAction, AuthorizationAttribute: "foo" });
49+
Assert.Contains(actions, a => a is { Name: Constants.TransmissionReadAction, AuthorizationAttribute: "bar" });
50+
Assert.Contains(actions, a => a is { Name: "apiread", AuthorizationAttribute: Constants.MainResource });
51+
Assert.Contains(actions, a => a is { Name: "guiread", AuthorizationAttribute: Constants.MainResource });
3552
Assert.Contains(actions, a => a is { Name: Constants.TransmissionReadAction, AuthorizationAttribute: "urn:altinn:subresource:bar" });
3653
Assert.Contains(actions, a => a is { Name: Constants.TransmissionReadAction, AuthorizationAttribute: "urn:altinn:task:Task_1" });
3754
Assert.Contains(actions, a => a is { Name: Constants.ReadAction, AuthorizationAttribute: "urn:altinn:resource:some-service:element1" });

0 commit comments

Comments
 (0)