Skip to content

Commit 35ce8af

Browse files
lovollLøvoll, Remi
andauthored
Feature/remilovoll/26/03/movepolicyfilemigrating (#2603)
* Changed path algoritm on instance delegation * Added new policy path 1. when moving instance delegation 2. in app instance delegation in existinf api * Copilot comments --------- Co-authored-by: Løvoll, Remi <acn-rlovo@ai-dev.no>
1 parent 9691b51 commit 35ce8af

File tree

8 files changed

+261
-19
lines changed

8 files changed

+261
-19
lines changed

src/apps/Altinn.AccessManagement/src/Altinn.AccessManagement.Core/Helpers/DelegationHelper.cs

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -500,16 +500,16 @@ public static bool TryGetDelegationPolicyPathFromInstanceRule(InstanceRight rule
500500
catch (Exception)
501501
{
502502
return false;
503-
}
504-
503+
}
504+
505505
sb.Append(rule.ToType);
506506
sb.Append('-');
507507
sb.Append(rule.ToUuid);
508508
sb.Append('/');
509509

510510
sb.Append(rule.InstanceDelegationSource);
511511
sb.Append('/');
512-
512+
513513
sb.Append(rule.InstanceDelegationMode);
514514
sb.Append('/');
515515

@@ -519,6 +519,48 @@ public static bool TryGetDelegationPolicyPathFromInstanceRule(InstanceRight rule
519519
return true;
520520
}
521521

522+
/// <summary>
523+
/// Gets the delegation policy path for a single Rule given the storage is in dbo schema under EntityFramework
524+
/// </summary>
525+
/// <returns>A bool indicating whether necessary params to build the path where found</returns>
526+
public static bool TryGetNewDelegationPolicyPathFromInstanceRule(InstanceRight rule, out string instanceDelegationPolicyPath)
527+
{
528+
instanceDelegationPolicyPath = null;
529+
StringBuilder sb = new StringBuilder();
530+
531+
sb.Append("resourceregistry");
532+
sb.Append('/');
533+
534+
sb.Append(rule.ResourceId);
535+
sb.Append('/');
536+
537+
sb.Append("instances");
538+
sb.Append('/');
539+
540+
sb.Append("from_");
541+
sb.Append(rule.FromUuid);
542+
sb.Append('/');
543+
544+
sb.Append("to_");
545+
sb.Append(rule.ToUuid);
546+
sb.Append('/');
547+
548+
try
549+
{
550+
sb.Append(rule.InstanceId.AsFileName(false));
551+
sb.Append('/');
552+
}
553+
catch (Exception)
554+
{
555+
return false;
556+
}
557+
558+
sb.Append("delegationpolicy.xml");
559+
instanceDelegationPolicyPath = sb.ToString();
560+
561+
return true;
562+
}
563+
522564
/// <summary>
523565
/// Returns the count of unique Policies in a list of Rules
524566
/// </summary>

src/apps/Altinn.AccessManagement/src/Altinn.AccessManagement.Core/Services/AppsInstanceDelegationService.cs

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System.ComponentModel.DataAnnotations;
2-
using System.Formats.Asn1;
1+
using System.ComponentModel.DataAnnotations;
32
using Altinn.AccessManagement.Core.Clients.Interfaces;
43
using Altinn.AccessManagement.Core.Configuration;
54
using Altinn.AccessManagement.Core.Constants;
@@ -8,6 +7,7 @@
87
using Altinn.AccessManagement.Core.Helpers;
98
using Altinn.AccessManagement.Core.Helpers.Extensions;
109
using Altinn.AccessManagement.Core.Models;
10+
using Altinn.AccessManagement.Core.Models.Party;
1111
using Altinn.AccessManagement.Core.Models.Register;
1212
using Altinn.AccessManagement.Core.Models.ResourceRegistry;
1313
using Altinn.AccessManagement.Core.Models.Rights;
@@ -17,6 +17,7 @@
1717
using Altinn.Platform.Register.Models;
1818
using Altinn.Urn;
1919
using Altinn.Urn.Json;
20+
using Azure.Core;
2021
using Microsoft.Extensions.Options;
2122

2223
namespace Altinn.AccessManagement.Core.Services.Implementation;
@@ -27,22 +28,26 @@ namespace Altinn.AccessManagement.Core.Services.Implementation;
2728
public class AppsInstanceDelegationService : IAppsInstanceDelegationService
2829
{
2930
private readonly IPartiesClient _partiesClient;
31+
private readonly IAMPartyService _partyService;
3032
private readonly IPolicyInformationPoint _pip;
3133
private readonly IPolicyAdministrationPoint _pap;
3234
private readonly IResourceRegistryClient _resourceRegistryClient;
3335
private readonly AppsInstanceDelegationSettings _appsInstanceDelegationSettings;
3436
private readonly string appInstanceResourcePath = "appInstanceDelegationRequest.Resource";
37+
private readonly Microsoft.FeatureManagement.IFeatureManager _featureManager;
3538

3639
/// <summary>
3740
/// Initializes a new instance of the <see cref="AppsInstanceDelegationService"/> class.
3841
/// </summary>
39-
public AppsInstanceDelegationService(IPartiesClient partiesClient, IOptions<AppsInstanceDelegationSettings> appsInstanceDelegationSettings, IResourceRegistryClient resourceRegistryClient, IPolicyInformationPoint pip, IPolicyAdministrationPoint pap)
42+
public AppsInstanceDelegationService(IPartiesClient partiesClient, IAMPartyService partyService, IOptions<AppsInstanceDelegationSettings> appsInstanceDelegationSettings, IResourceRegistryClient resourceRegistryClient, IPolicyInformationPoint pip, IPolicyAdministrationPoint pap, Microsoft.FeatureManagement.IFeatureManager featureManager)
4043
{
4144
_partiesClient = partiesClient;
45+
_partyService = partyService;
4246
_pip = pip;
4347
_resourceRegistryClient = resourceRegistryClient;
4448
_pap = pap;
4549
_appsInstanceDelegationSettings = appsInstanceDelegationSettings.Value;
50+
_featureManager = featureManager;
4651
}
4752

4853
private async Task<(UuidType DelegationType, Guid? Uuid)> TranslatePartyUuidToPersonOrganizationUuid(PartyUrn partyId)
@@ -224,10 +229,46 @@ public async Task<Result<ResourceDelegationCheckResponse>> DelegationCheck(AppsI
224229
return await Task.FromResult(result);
225230
}
226231

232+
private async Task<MinimalParty> GetMinimalParty(PartyUrn urn, CancellationToken cancellationToken)
233+
{
234+
switch (urn.KeySpan.ToString())
235+
{
236+
case AltinnXacmlConstants.MatchAttributeIdentifiers.PartyUuidAttribute:
237+
return await _partyService.GetByUid(new Guid(urn.ValueSpan.ToString()), cancellationToken);
238+
case AltinnXacmlConstants.MatchAttributeIdentifiers.OrganizationNumberAttribute:
239+
return await _partyService.GetByOrgNo(Authorization.Api.Contracts.Register.OrganizationNumber.Parse(urn.ValueSpan), cancellationToken);
240+
default:
241+
return null;
242+
}
243+
}
244+
227245
/// <inheritdoc/>
228246
public async Task<Result<AppsInstanceDelegationResponse>> Delegate(AppsInstanceDelegationRequest request, CancellationToken cancellationToken = default)
229247
{
248+
bool useEF = await _featureManager.IsEnabledAsync("AccessManagement.InstanceDelegation.EF");
249+
string instanceId = request.InstanceId;
250+
251+
if (useEF)
252+
{
253+
// Create instance urn and use it for the internal processing but reset it for response as we should not change the contract
254+
MinimalParty party = await GetMinimalParty(request.From, cancellationToken);
255+
256+
if (party == null)
257+
{
258+
ValidationErrorBuilder errors = default;
259+
errors.Add(ValidationErrors.InvalidPartyUrn, "From");
260+
if (errors.TryBuild(out var invalidParty))
261+
{
262+
return invalidParty;
263+
}
264+
}
265+
266+
string instanceUrn = $"{AltinnXacmlConstants.MatchAttributeIdentifiers.InstanceAttribute}:{party.PartyId}/{instanceId}";
267+
request.InstanceId = instanceUrn;
268+
}
269+
230270
(ValidationErrorBuilder Errors, InstanceRight RulesToHandle, List<RightInternal> RightsAppCantHandle) input = await SetUpDelegationOrRevokeRequest(request, cancellationToken);
271+
request.InstanceId = instanceId;
231272

232273
if (input.Errors.TryBuild(out var errorResult))
233274
{
@@ -239,7 +280,7 @@ public async Task<Result<AppsInstanceDelegationResponse>> Delegate(AppsInstanceD
239280
From = request.From,
240281
To = request.To,
241282
ResourceId = request.ResourceId,
242-
InstanceId = request.InstanceId,
283+
InstanceId = instanceId,
243284
InstanceDelegationMode = request.InstanceDelegationMode
244285
};
245286

src/apps/Altinn.AccessManagement/src/Altinn.AccessManagement.Core/Services/PolicyAdministrationPoint.cs

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public class PolicyAdministrationPoint : IPolicyAdministrationPoint
2828
private readonly IPolicyFactory _policyFactory;
2929
private readonly IDelegationMetadataRepository _delegationRepository;
3030
private readonly IDelegationChangeEventQueue _eventQueue;
31+
private readonly Microsoft.FeatureManagement.IFeatureManager _featureManager;
3132
private readonly int delegationChangeEventQueueErrorId = 911;
3233

3334
/// <summary>
@@ -38,13 +39,14 @@ public class PolicyAdministrationPoint : IPolicyAdministrationPoint
3839
/// <param name="delegationRepository">The delegation change repository (postgresql).</param>
3940
/// <param name="eventQueue">The delegation change event queue service to post events for any delegation change.</param>
4041
/// <param name="logger">Logger instance.</param>
41-
public PolicyAdministrationPoint(IPolicyRetrievalPoint policyRetrievalPoint, IPolicyFactory policyFactory, IDelegationMetadataRepository delegationRepository, IDelegationChangeEventQueue eventQueue, ILogger<IPolicyAdministrationPoint> logger)
42+
public PolicyAdministrationPoint(IPolicyRetrievalPoint policyRetrievalPoint, IPolicyFactory policyFactory, IDelegationMetadataRepository delegationRepository, IDelegationChangeEventQueue eventQueue, ILogger<IPolicyAdministrationPoint> logger, Microsoft.FeatureManagement.IFeatureManager featureManager)
4243
{
4344
_prp = policyRetrievalPoint;
4445
_policyFactory = policyFactory;
4546
_delegationRepository = delegationRepository;
4647
_eventQueue = eventQueue;
4748
_logger = logger;
49+
_featureManager = featureManager;
4850
}
4951

5052
/// <inheritdoc/>
@@ -305,7 +307,18 @@ private static XacmlPolicy BuildInstanceRevokePolicy(XacmlPolicy delegationPolic
305307
/// <inheritdoc />
306308
public async Task<InstanceRight> TryWriteInstanceDelegationPolicyRules(InstanceRight rules, CancellationToken cancellationToken = default)
307309
{
308-
bool validPath = DelegationHelper.TryGetDelegationPolicyPathFromInstanceRule(rules, out string path);
310+
bool useEF = await _featureManager.IsEnabledAsync("AccessManagement.InstanceDelegation.EF");
311+
bool validPath;
312+
string path;
313+
314+
if (useEF)
315+
{
316+
validPath = DelegationHelper.TryGetNewDelegationPolicyPathFromInstanceRule(rules, out path);
317+
}
318+
else
319+
{
320+
validPath = DelegationHelper.TryGetDelegationPolicyPathFromInstanceRule(rules, out path);
321+
}
309322

310323
if (validPath)
311324
{
@@ -356,7 +369,27 @@ public async Task<InstanceRight> TryWriteInstanceRevokePolicyRules(InstanceRight
356369
}
357370
catch (Exception ex)
358371
{
359-
bool validPath = DelegationHelper.TryGetDelegationPolicyPathFromInstanceRule(rules, out string path);
372+
bool useEF = false;
373+
bool validPath;
374+
string path;
375+
376+
try
377+
{
378+
useEF = await _featureManager.IsEnabledAsync("AccessManagement.InstanceDelegation.EF");
379+
}
380+
catch (Exception)
381+
{
382+
}
383+
384+
if (useEF)
385+
{
386+
validPath = DelegationHelper.TryGetNewDelegationPolicyPathFromInstanceRule(rules, out path);
387+
}
388+
else
389+
{
390+
validPath = DelegationHelper.TryGetDelegationPolicyPathFromInstanceRule(rules, out path);
391+
}
392+
360393
if (validPath)
361394
{
362395
_logger.LogError(ex, "An exception occured while processing authorization rules for delegation on delegation policy path: {path}", path);

src/apps/Altinn.AccessManagement/src/Altinn.AccessMgmt.Core/HostedServices/Services/SingleInstanceRightSyncService.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ public async Task SyncSingleInstanceRights(ILease lease, CancellationToken cance
141141
CreateInstanceUrnFromInstanceIdAndPartyId(item.InstanceId, party.PartyId),
142142
item.InstanceDelegationChangeId,
143143
values,
144+
party.PartyId,
144145
cancellationToken);
145146

146147
if (adds == 0)
@@ -273,6 +274,7 @@ public async Task SyncFailedSingleInstanceRights(CancellationToken cancellationT
273274
CreateInstanceUrnFromInstanceIdAndPartyId(element.InstanceId, party.PartyId),
274275
element.InstanceDelegationChangeId,
275276
values,
277+
party.PartyId,
276278
cancellationToken);
277279

278280
if (adds == 0)

0 commit comments

Comments
 (0)