feat(admin): add safe processing monitor and operation correlation

This commit is contained in:
cesnimda
2026-10-28 19:31:32 +01:00
parent 1f87301ee9
commit d52403dba8
19 changed files with 1064 additions and 6 deletions
@@ -106,13 +106,37 @@ public sealed class AiPrivacyPolicyTests
Assert.Equal("strategy.snapshot", capture.TaskType);
}
[Fact]
public async Task Correlation_comes_only_from_the_actual_operation_scope_for_all_sidecar_paths()
{
await using var fixture = await Fixture.CreateAsync(adminEnabled: false);
var execution = new AiOperationExecutionScope();
var capture = new CaptureHandler();
using var client = new HttpClient(new AiPrivacyHeaderHandler(new HttpContextAccessor(), fixture.Policy, execution) { InnerHandler = capture });
var id = Guid.NewGuid();
var lease = new UserOperationLease(id, "user-1", "lease", "cv.process", "local_only", "cv_extraction_run", "1", 1, null);
using (execution.Use(new(lease, "local_only")))
{
using var request = new HttpRequestMessage(HttpMethod.Post, "http://ai-service/cv-import/extract");
request.Headers.Add("X-Operation-Id", "SECRET_untrusted_header");
await client.SendAsync(request);
Assert.Equal(id.ToString("D"), capture.Correlation);
}
using var ordinary = new HttpRequestMessage(HttpMethod.Get, "http://ai-service/health");
ordinary.Headers.Add("X-Operation-Id", "SECRET_untrusted_header");
await client.SendAsync(ordinary);
Assert.Null(capture.Correlation);
}
private sealed class CaptureHandler : HttpMessageHandler
{
public string? ExternalAllowed { get; private set; }
public string? TaskType { get; private set; }
public string? Correlation { get; private set; }
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
Correlation = request.Headers.TryGetValues("X-Operation-Id", out var correlation) ? correlation.Single() : null;
ExternalAllowed = request.Headers.TryGetValues(AiPrivacyPolicy.ExternalAllowedHeader, out var values)
? values.Single()
: null;