Skip to content

Commit 2b7749b

Browse files
feature(#6): this commit introduces security policy restrictions/checks so that reserved permissions cannot be created, preventing privilege escalation.
1 parent 52f26db commit 2b7749b

2 files changed

Lines changed: 17 additions & 4 deletions

File tree

Source/HttpsRichardy.Federation.Application/Handlers/Permission/PermissionCreationHandler.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
namespace HttpsRichardy.Federation.Application.Handlers.Permission;
22

3-
public sealed class PermissionCreationHandler(IPermissionCollection collection, IRealmProvider realmProvider) :
3+
public sealed class PermissionCreationHandler(IPermissionCollection collection, IPermissionNamespacePolicy policy, IRealmProvider realmProvider) :
44
IDispatchHandler<PermissionCreationScheme, Result<PermissionDetailsScheme>>
55
{
66
public async Task<Result<PermissionDetailsScheme>> HandleAsync(PermissionCreationScheme parameters, CancellationToken cancellation = default)
77
{
88
var realm = realmProvider.GetCurrentRealm();
9+
var result = await policy.EnsurePermissionIsAllowedAsync(realm, new() { Name = parameters.Name }, cancellation);
10+
11+
if (result.IsFailure)
12+
{
13+
return Result<PermissionDetailsScheme>.Failure(PermissionErrors.PermissionNameIsReserved);
14+
}
15+
916
var filters = PermissionFilters.WithSpecifications()
1017
.WithName(parameters.Name)
1118
.Build();
@@ -23,4 +30,4 @@ public async Task<Result<PermissionDetailsScheme>> HandleAsync(PermissionCreatio
2330

2431
return Result<PermissionDetailsScheme>.Success(PermissionMapper.AsResponse(createdPermission));
2532
}
26-
}
33+
}

Source/HttpsRichardy.Federation.Application/Handlers/Permission/PermissionUpdateHandler.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
namespace HttpsRichardy.Federation.Application.Handlers.Permission;
22

3-
public sealed class PermissionUpdateHandler(IPermissionCollection collection, IRealmProvider realmProvider) :
3+
public sealed class PermissionUpdateHandler(IPermissionCollection collection, IPermissionNamespacePolicy policy, IRealmProvider realmProvider) :
44
IDispatchHandler<PermissionUpdateScheme, Result<PermissionDetailsScheme>>
55
{
66
public async Task<Result<PermissionDetailsScheme>> HandleAsync(PermissionUpdateScheme parameters, CancellationToken cancellation = default)
@@ -18,10 +18,16 @@ public async Task<Result<PermissionDetailsScheme>> HandleAsync(PermissionUpdateS
1818
return Result<PermissionDetailsScheme>.Failure(PermissionErrors.PermissionDoesNotExist);
1919
}
2020

21+
var result = await policy.EnsurePermissionIsAllowedAsync(realm, new() { Name = parameters.Name }, cancellation);
22+
if (result.IsFailure)
23+
{
24+
return Result<PermissionDetailsScheme>.Failure(PermissionErrors.PermissionNameIsReserved);
25+
}
26+
2127
permission = PermissionMapper.AsPermission(parameters, permission, realm);
2228

2329
var updatedPermission = await collection.UpdateAsync(permission, cancellation: cancellation);
2430

2531
return Result<PermissionDetailsScheme>.Success(PermissionMapper.AsResponse(updatedPermission));
2632
}
27-
}
33+
}

0 commit comments

Comments
 (0)