Harden audit privacy and admin modals
CI - Build & Verify / Build, Typecheck & Hygiene (push) Successful in 56s
CI - Build & Verify / Deploy to award.noveria.net (push) Successful in 1m5s

This commit is contained in:
AzuTear
2026-06-26 20:47:07 +02:00
parent aeade132f9
commit 9393d433fa
17 changed files with 741 additions and 315 deletions
+12 -6
View File
@@ -20,8 +20,9 @@ public static class AdminDashboardEndpoints
return group;
}
private static async Task<IResult> GetDashboard(AwardsDbContext db)
private static async Task<IResult> GetDashboard(AwardsDbContext db, HttpContext context)
{
var canViewAuditIp = CanViewAuditIp(context);
var currentSeason = await db.Seasons.AsNoTracking().FirstOrDefaultAsync(item => item.IsCurrent);
if (currentSeason is null)
{
@@ -68,7 +69,7 @@ public static class AdminDashboardEndpoints
item.Summary,
item.CreatedAt,
item.MetadataJson,
item.CreatedFromIp,
canViewAuditIp ? item.CreatedFromIp : null,
item.UserAgent))
.ToArrayAsync();
@@ -101,10 +102,12 @@ public static class AdminDashboardEndpoints
DateTimeOffset? from,
DateTimeOffset? to,
string? cursor,
AwardsDbContext db)
AwardsDbContext db,
HttpContext context)
{
var normalizedLimit = Math.Clamp(limit ?? 100, 1, 500);
var search = query?.Trim();
var canViewAuditIp = CanViewAuditIp(context);
var auditQuery = db.AdminAuditEntries.AsNoTracking();
if (!TryDecodeAuditCursor(cursor, out var decodedCursor))
@@ -122,8 +125,8 @@ public static class AdminDashboardEndpoints
EF.Functions.ILike(item.EntityId, pattern) ||
EF.Functions.ILike(item.Summary, pattern) ||
EF.Functions.ILike(item.MetadataJson, pattern) ||
EF.Functions.ILike(item.CreatedFromIp, pattern) ||
EF.Functions.ILike(item.UserAgent, pattern));
EF.Functions.ILike(item.UserAgent, pattern) ||
(canViewAuditIp && EF.Functions.ILike(item.CreatedFromIp, pattern)));
}
if (!string.IsNullOrWhiteSpace(admin))
@@ -176,7 +179,7 @@ public static class AdminDashboardEndpoints
item.Summary,
item.CreatedAt,
item.MetadataJson,
item.CreatedFromIp,
canViewAuditIp ? item.CreatedFromIp : null,
item.UserAgent))
.ToArrayAsync();
@@ -197,6 +200,9 @@ public static class AdminDashboardEndpoints
private static string EncodeAuditCursor(AdminAuditEntryDto entry) =>
$"{entry.CreatedAt.UtcTicks}:{entry.Id}";
private static bool CanViewAuditIp(HttpContext context) =>
AdminRoles.IsPrivilegedFullControlRole(context.GetCurrentSession()?.Role);
private static bool TryDecodeAuditCursor(string? cursor, out AuditCursor? decodedCursor)
{
decodedCursor = null;