Skip to content

Commit 21fad76

Browse files
authored
Use ProcessAuthorizer for update data values and presentation texts. (#205)
* Same as PR #948 commit 59201a0e86b1e6ac40a71585b8fea9cd27406079 in Storage.
1 parent 561e68a commit 21fad76

3 files changed

Lines changed: 55 additions & 4 deletions

File tree

src/Controllers/Storage/InstancesController.cs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public class InstancesController : ControllerBase
4545
private readonly GeneralSettings _generalSettings;
4646
private readonly IRegisterService _registerService;
4747
private readonly IApplicationService _applicationService;
48+
private readonly IProcessAuthorizer _processAuthorizer;
4849

4950
/// <summary>
5051
/// Initializes a new instance of the <see cref="InstancesController"/> class
@@ -57,6 +58,7 @@ public class InstancesController : ControllerBase
5758
/// <param name="registerService">the instance register service.</param>
5859
/// <param name="applicationService">the application service.</param>
5960
/// <param name="settings">the general settings.</param>
61+
/// <param name="processAuthorizer">the process authorizer.</param>
6062
public InstancesController(
6163
IInstanceRepository instanceRepository,
6264
IPartiesWithInstancesClient partiesWithInstancesClient,
@@ -65,7 +67,8 @@ public InstancesController(
6567
IInstanceEventService instanceEventService,
6668
IRegisterService registerService,
6769
IApplicationService applicationService,
68-
IOptions<GeneralSettings> settings
70+
IOptions<GeneralSettings> settings,
71+
IProcessAuthorizer processAuthorizer
6972
)
7073
{
7174
_instanceRepository = instanceRepository;
@@ -77,6 +80,7 @@ IOptions<GeneralSettings> settings
7780
_registerService = registerService;
7881
_applicationService = applicationService;
7982
_generalSettings = settings.Value;
83+
_processAuthorizer = processAuthorizer;
8084
}
8185

8286
/// <summary>
@@ -911,9 +915,11 @@ await _instanceEventService.DispatchEvent(
911915
/// <param name="presentationTexts">Collection of changes to the presentation texts collection.</param>
912916
/// <param name="cancellationToken">CancellationToken</param>
913917
/// <returns>The instance that was updated with an updated collection of presentation texts.</returns>
914-
[Authorize(Policy = AuthzConstants.POLICY_INSTANCE_WRITE)]
918+
[Authorize]
915919
[HttpPut("{instanceOwnerPartyId:int}/{instanceGuid:guid}/presentationtexts")]
916920
[ProducesResponseType(StatusCodes.Status200OK)]
921+
[ProducesResponseType(StatusCodes.Status400BadRequest)]
922+
[ProducesResponseType(StatusCodes.Status403Forbidden)]
917923
[Consumes("application/json")]
918924
[Produces("application/json")]
919925
public async Task<ActionResult<Instance>> UpdatePresentationTexts(
@@ -934,6 +940,11 @@ CancellationToken cancellationToken
934940
cancellationToken
935941
);
936942

943+
if (!await _processAuthorizer.AuthorizePresentationTextsUpdate(instance))
944+
{
945+
return Forbid();
946+
}
947+
937948
if (instance.PresentationTexts == null)
938949
{
939950
instance.PresentationTexts = new Dictionary<string, string>();
@@ -969,10 +980,11 @@ CancellationToken cancellationToken
969980
/// <param name="dataValues">Collection of changes to the data values collection.</param>
970981
/// <param name="cancellationToken">CancellationToken</param>
971982
/// <returns>The instance that was updated with an updated collection of data values.</returns>
972-
[Authorize(Policy = AuthzConstants.POLICY_INSTANCE_WRITE)]
983+
[Authorize]
973984
[HttpPut("{instanceOwnerPartyId:int}/{instanceGuid:guid}/datavalues")]
974985
[ProducesResponseType(StatusCodes.Status200OK)]
975986
[ProducesResponseType(StatusCodes.Status400BadRequest)]
987+
[ProducesResponseType(StatusCodes.Status403Forbidden)]
976988
[Consumes("application/json")]
977989
[Produces("application/json")]
978990
public async Task<ActionResult<Instance>> UpdateDataValues(
@@ -993,6 +1005,11 @@ CancellationToken cancellationToken
9931005
cancellationToken
9941006
);
9951007

1008+
if (!await _processAuthorizer.AuthorizeDataValuesUpdate(instance))
1009+
{
1010+
return Forbid();
1011+
}
1012+
9961013
instance.DataValues ??= new Dictionary<string, string>();
9971014

9981015
List<string> updateProperties = [];

src/Services/Storage/Implementation/ProcessAuthorizer.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
using System;
33
using System.Collections.Generic;
44
using System.Threading.Tasks;
5+
using Altinn.Platform.Storage.Configuration;
56
using Altinn.Platform.Storage.Interface.Models;
7+
using Microsoft.Extensions.Options;
68

79
namespace Altinn.Platform.Storage.Authorization;
810

@@ -12,13 +14,15 @@ namespace Altinn.Platform.Storage.Authorization;
1214
public class ProcessAuthorizer : IProcessAuthorizer
1315
{
1416
private readonly IAuthorization _authorizationService;
17+
private readonly GeneralSettings _settings;
1518

1619
/// <summary>
1720
/// Initializes a new instance of the <see cref="ProcessAuthorizer"/> class.
1821
/// </summary>
19-
public ProcessAuthorizer(IAuthorization authorizationService)
22+
public ProcessAuthorizer(IAuthorization authorizationService, IOptions<GeneralSettings> settings)
2023
{
2124
_authorizationService = authorizationService;
25+
_settings = settings.Value;
2226
}
2327

2428
/// <inheritdoc/>
@@ -34,6 +38,13 @@ public Task<bool> AuthorizeProcessNext(Instance instance, ProcessState nextProce
3438
/// <inheritdoc/>
3539
public Task<bool> AuthorizeDataElementLock(Instance instance) => Authorize(instance);
3640

41+
/// <inheritdoc/>
42+
public Task<bool> AuthorizePresentationTextsUpdate(Instance instance) => Authorize(instance);
43+
44+
/// <inheritdoc/>
45+
public Task<bool> AuthorizeDataValuesUpdate(Instance instance) =>
46+
AuthorizeWithSyncAdapterBypass(instance);
47+
3748
/// <summary>
3849
/// Get all actions that allow process next for the given task type.
3950
/// </summary>
@@ -97,4 +108,14 @@ private async Task<bool> Authorize(Instance instance, ProcessState? nextProcessS
97108

98109
return false;
99110
}
111+
112+
private Task<bool> AuthorizeWithSyncAdapterBypass(Instance instance)
113+
{
114+
if (_authorizationService.UserHasRequiredScope(_settings.InstanceSyncAdapterScope))
115+
{
116+
return Task.FromResult(true);
117+
}
118+
119+
return Authorize(instance);
120+
}
100121
}

src/Services/Storage/Interface/IProcessAuthorizer.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,17 @@ public interface IProcessAuthorizer
2828
/// Checks the task-type actions plus "reject", since the flow type is not known at lock time.
2929
/// </summary>
3030
Task<bool> AuthorizeDataElementLock(Instance instance);
31+
32+
/// <summary>
33+
/// Determines if the user is authorized to update presentation texts.
34+
/// Checks the task-type actions plus "reject", since the flow type is not known at update time.
35+
/// </summary>
36+
Task<bool> AuthorizePresentationTextsUpdate(Instance instance);
37+
38+
/// <summary>
39+
/// Determines if the user is authorized to update data values.
40+
/// Checks the task-type actions plus "reject", since the flow type is not known at update time.
41+
/// Has a bypass for the sync adapter scope.
42+
/// </summary>
43+
Task<bool> AuthorizeDataValuesUpdate(Instance instance);
3144
}

0 commit comments

Comments
 (0)