Skip to content

Commit a3be03e

Browse files
committed
Preserve messaging JSON and repair authorization operation checks
Keep original queue and topic payload/header text through existing bounded JSON validation. Consume the published Communication 10.3.11 failure-serialization repair. Keep complete lifetime-bound record checks, current policy CAS, native MCP 401 boundaries, original issuer replay, explicit scoped lifecycle data grants and verified cursor continuations. Strengthen existing exact-byte quota and cold-reopen controls without adding test cases. Validation: full Debug build with warnaserror (0 warnings/errors), canonical format verification, governance, 8 focused topic/queue units and 4 whole sensitive-data cluster cases passed. Full module qualification remains open; the original two-of-three silo loss case conflicts with the selected membership quorum and awaits owner topology direction.
1 parent 466fb03 commit a3be03e

53 files changed

Lines changed: 386 additions & 104 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎Directory.Packages.props‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
<PackageVersion Include="ZoneTree" Version="2.0.2" />
1111
<PackageVersion Include="ZoneTree.Analytics" Version="1.0.2" />
1212
<PackageVersion Include="ZoneTree.FullTextSearch" Version="1.1.0" />
13-
<PackageVersion Include="ManagedCode.Communication" Version="10.3.10" />
14-
<PackageVersion Include="ManagedCode.Communication.AspNetCore" Version="10.3.10" />
15-
<PackageVersion Include="ManagedCode.Communication.Orleans" Version="10.3.10" />
13+
<PackageVersion Include="ManagedCode.Communication" Version="10.3.11" />
14+
<PackageVersion Include="ManagedCode.Communication.AspNetCore" Version="10.3.11" />
15+
<PackageVersion Include="ManagedCode.Communication.Orleans" Version="10.3.11" />
1616
<PackageVersion Include="ManagedCode.TimeSeries" Version="10.1.2" />
1717
<PackageVersion Include="ManagedCode.Storage.FileSystem" Version="10.1.5" />
1818
<PackageVersion Include="ManagedCode.Storage.Server" Version="10.1.5" />

‎src/KeyLoad.Core/Messaging/Commands/MessagingCommandsTopicPublishReads.cs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ internal static TopicPublicationProgress AppendTopicEvents(this DatabaseEngine e
7070
var idKey = KeySpace.Partition(TopicEventIdKeySpace, source.Partition, source.Resource, source.Generation, item.EventId);
7171
var data = item with
7272
{
73-
PayloadJson = JsonData.Validate(item.PayloadJson, engine.Limits),
74-
HeadersJson = JsonData.Validate(item.HeadersJson, engine.Limits)
73+
PayloadJson = JsonData.ValidateContent(item.PayloadJson, engine.Limits),
74+
HeadersJson = JsonData.ValidateContent(item.HeadersJson, engine.Limits)
7575
};
7676
if (tx.ReadOwnedValue(EventStreamsCommandsTopicRetentionCommands.PurgedTopicIdentityKey(source, item.EventId)) is { } purgedBytes)
7777
{

‎src/KeyLoad.Core/Messaging/Execution/MessagingExecutionMessaging.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ internal static MutationReceipt Enqueue(this DatabaseEngine engine, IAtomicTrans
6666
engine.Authorization.RequireFieldWrite(principal, resource with { FieldPolicies = resource.HeaderPolicies }, policy.Path);
6767
}
6868

69-
var body = new MessageBody(message.MessageId, JsonData.Validate(message.PayloadJson, engine.Limits), JsonData.Validate(message.HeadersJson, engine.Limits), message.OrderingKey, JsonData.Fingerprint(message));
69+
var body = new MessageBody(message.MessageId, JsonData.ValidateContent(message.PayloadJson, engine.Limits), JsonData.ValidateContent(message.HeadersJson, engine.Limits), message.OrderingKey, JsonData.Fingerprint(message));
7070
PersistEnqueuedMessage(tx, lane, message, resource, body, now);
7171
return new(MessagingCommandsQueueSweepTransitions.EnqueueReceiptKind, message.Queue, message.MessageId, MessagingSingleElementCount);
7272
}

‎tests/KeyLoad.IntegrationTests/Authorization/Assertions/Catalog/DiscoveryAuthorityValues.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace KeyLoad.IntegrationTests.Features.Authorization;
88
internal static class DiscoveryAuthorityValues
99
{
1010
internal static DocumentResult Expected(DiscoveryAuthorityState state)
11-
=> new(state.Scenario.Reference, McpCallerProtocol.FirstRevision, McpDocumentProtocol.InitialJson, false, []);
11+
=> new(state.Scenario.StoredReference, McpCallerProtocol.FirstRevision, McpDocumentProtocol.InitialJson, false, []);
1212

1313
internal static async Task<Guid> FirstAsync(McpOfficialClient session, DiscoveryAuthorityState state, CancellationToken token)
1414
{

‎tests/KeyLoad.IntegrationTests/Authorization/Assertions/Credentials/Bootstrap/ConcurrentPrincipalAuthorityAssertions.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,5 @@ internal static async Task FollowingAsync(McpOfficialClient firstClient, McpOffi
4141
}
4242

4343
private static DocumentResult Expected(McpDocumentScenario scenario)
44-
=> new(scenario.Reference, McpCallerProtocol.FirstRevision, McpDocumentProtocol.InitialJson, false, []);
44+
=> new(scenario.StoredReference, McpCallerProtocol.FirstRevision, McpDocumentProtocol.InitialJson, false, []);
4545
}

‎tests/KeyLoad.IntegrationTests/Authorization/Assertions/Credentials/Bootstrap/InitialCredentialAuthorityValues.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace KeyLoad.IntegrationTests.Features.Authorization;
77
internal static class InitialCredentialAuthorityValues
88
{
99
private static DocumentResult Expected(InitialCredentialAuthorityState state)
10-
=> new(state.Seed.Scenario.Reference, McpCallerProtocol.FirstRevision, McpDocumentProtocol.InitialJson, false, []);
10+
=> new(state.Seed.Scenario.StoredReference, McpCallerProtocol.FirstRevision, McpDocumentProtocol.InitialJson, false, []);
1111

1212
internal static async Task HealthyAsync(global::KeyLoad.Client.KeyLoadClient root, global::KeyLoad.Client.KeyLoadClient reader, McpOfficialClient session,
1313
InitialCredentialAuthorityState state, CancellationToken token)

‎tests/KeyLoad.IntegrationTests/Authorization/Assertions/Credentials/Bootstrap/InitialPrincipalEpochClusterValues.cs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ internal static async Task<string> ImageAsync(RequestCqrsClusterCallers root, In
2626
await ServerFailureObserver.ObserveAsync(async () =>
2727
{
2828
document = await McpCallerAssertions.SdkSuccessAsync(await root.Sdk.GetAsync(state.Reference, token));
29-
await SqlClusterProtocol.EqualAsync(new DocumentReadResult(new(state.Reference, revision,
29+
await SqlClusterProtocol.EqualAsync(new DocumentReadResult(new(state.StoredReference, revision,
3030
revision == 1L ? "{\"value\":0}" : "{\"value\":7}", false, [])), document);
3131
}, failures);
3232
await ServerFailureObserver.ObserveAsync(async () =>
@@ -58,7 +58,7 @@ await ServerFailureObserver.ObserveAsync(async () =>
5858
internal static async Task DocumentAsync(RequestCqrsClusterCallers reader, InitialPrincipalEpochClusterState state,
5959
long revision, CancellationToken token)
6060
{
61-
var expected = new DocumentReadResult(new(state.Reference, revision, revision == 1L ? "{\"value\":0}" : "{\"value\":7}", false, []));
61+
var expected = new DocumentReadResult(new(state.StoredReference, revision, revision == 1L ? "{\"value\":0}" : "{\"value\":7}", false, []));
6262
await SqlClusterProtocol.EqualAsync(expected, await McpCallerAssertions.SdkSuccessAsync(await reader.Sdk.GetAsync(state.Reference, token)));
6363
await SqlClusterProtocol.EqualAsync(expected, (await McpCallerAssertions.SuccessAsync<DocumentReadResult>(
6464
await reader.Mcp.CallAsync(McpCallerTools.DocumentsGet, new GetDocumentRequest(state.Reference), token))).Value);

‎tests/KeyLoad.IntegrationTests/Authorization/Assertions/Credentials/Verification/CanceledCredentialAuthorityAssertions.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ internal static async Task HealthyAsync(KeyLoadClient reader, McpOfficialClient
3030
}
3131

3232
private static DocumentResult Expected(McpDocumentScenario scenario)
33-
=> new(scenario.Reference with { Lifetime = scenario.Lifetime }, McpCallerProtocol.FirstRevision,
33+
=> new(scenario.StoredReference, McpCallerProtocol.FirstRevision,
3434
McpDocumentProtocol.InitialJson, false, []);
3535
}
3636

‎tests/KeyLoad.IntegrationTests/Authorization/Assertions/Eventing/EventingRequiredClaimClusterCurrent.cs‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@ internal static class EventingRequiredClaimClusterCurrent
1111
internal static async Task<string> ImageAsync(RequestCqrsClusterCallers root, EventingRequiredClaimClusterState state, CancellationToken token)
1212
{
1313
var input = state.Input;
14-
var expected = state.Completed ? RequiredProcessingPolicyClusterValues.Expected(input, "first", 1, false)
15-
: new MessageInspection(new("first", MessageState.Ready, 0, 1L, 1L, null, null), input.Payload, input.Headers);
14+
var expected = state.Claimed is null
15+
? new MessageInspection(new("first", MessageState.Ready, 0, 1L, 1L, null, null), input.Payload, input.Headers)
16+
: RequiredProcessingPolicyClusterValues.Expected(input, "first", state.Completed ? 1 : 0, false);
1617
var message = await McpCallerAssertions.SdkSuccessAsync(await root.Sdk.InspectAsync(new(input.Lane, "first"), token));
1718
await SqlClusterProtocol.EqualAsync(new MessageInspectionResult(expected), message);
1819
var document = await McpCallerAssertions.SdkSuccessAsync(await root.Sdk.GetAsync(input.Reference("first"), token));
1920
await SqlClusterProtocol.EqualAsync(new DocumentReadResult(state.Completed
20-
? new(input.Reference("first"), 1L, RequiredProcessingPolicyClusterState.EffectJson("first"), false, []) : null), document);
21+
? new(input.StoredReference("first"), 1L, RequiredProcessingPolicyClusterState.EffectJson("first"), false, []) : null), document);
2122
var outbox = await McpCallerAssertions.SdkSuccessAsync(await root.Sdk.OutboxStatusAsync(input.Partition, token));
2223
var count = state.Completed ? 2L : 1L;
2324
await Assert.That(outbox.Head.Tail).IsEqualTo(count);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using KeyLoad.IntegrationTests.Features.ClientApi;
2+
using KeyLoad.IntegrationTests.Features.Messaging;
3+
using KeyLoad.IntegrationTests.Features.OrleansExecution;
4+
using KeyLoad.IntegrationTests.Features.QueryExecution;
5+
6+
namespace KeyLoad.IntegrationTests.Features.Authorization;
7+
8+
internal static class EventingRequiredClaimClusterReceive
9+
{
10+
internal static Task AcceptProbeAsync(RequestCqrsClusterCallers root, RequestCqrsClusterCallers reader,
11+
EventingRequiredClaimClusterState state, CancellationToken token)
12+
=> EventingRequiredClaimClusterCurrent.ObserveAsync(root, state, async () =>
13+
{
14+
var actual = await McpCallerAssertions.SdkSuccessAsync(await reader.Sdk.ReceiveAsync(state.EpochProbe, token));
15+
await Assert.That(actual.RequestId).IsEqualTo(state.EpochProbe.RequestId);
16+
await Assert.That(actual.Deliveries).IsEmpty();
17+
await Assert.That(actual.Token.Incarnation).IsEqualTo(state.Input.Producers[0].Receipt.Token.Incarnation);
18+
await Assert.That(actual.Token.AtomicPartitionId).IsEqualTo(state.Input.Partition.AtomicPartitionId);
19+
await Assert.That(actual.Token.Position).IsGreaterThan(state.Input.Producers[0].Receipt.Token.Position);
20+
state.EpochReceipt = actual;
21+
}, token);
22+
23+
internal static async Task ReplayAsync(RequestCqrsClusterCallers root, RequestCqrsClusterCallers reader,
24+
EventingRequiredClaimClusterState state, ReceiveRequest request, ReceiveResult expected, CancellationToken token)
25+
{
26+
for (var route = 0; route < 4; route++)
27+
{
28+
await EventingRequiredClaimClusterCurrent.ObserveAsync(root, state, async () =>
29+
await SqlClusterProtocol.EqualAsync(expected, await QueueLifecyclePublicRoutes.CallAsync(reader, route,
30+
state.Input.Partition, McpCallerTools.MessagesReceive, request, () => reader.Sdk.ReceiveAsync(request, token), token)), token);
31+
}
32+
}
33+
}

0 commit comments

Comments
 (0)