Repository navigation
Expand file tree
/
Copy pathSearchIdentity.cs
More file actions
55 lines (49 loc) · 3.03 KB
/
Copy pathSearchIdentity.cs
File metadata and controls
55 lines (49 loc) · 3.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
using KeyLoad.Core.Search;
using KeyLoad.Storage;
using ManagedCode.Communication.Commands;
namespace KeyLoad.Core;
/// <summary>Executes SearchIdentity operations against the caller's database context.</summary>
public static class SearchIdentity
{
internal static Command<DatabaseCommand> CreateVerifiedBm25CorpusPublication(this DatabaseEngine engine, string administratorId, Bm25CorpusPublicationPhaseCommand phase, ReadExecutionBudget work)
{
ArgumentNullException.ThrowIfNull(phase) /* KLD0041: The BCL null guard accepts this existing reference through its object parameter without copying its contents. */;
ArgumentNullException.ThrowIfNull(work) /* KLD0041: The BCL null guard accepts this existing reference through its object parameter without copying its contents. */;
var evaluatedAt = engine.EvaluationClock.GetUtcNow();
return engine.Store.Read(raw =>
{
var view = work.CreateView(raw);
var administrator = engine.Principal(view, administratorId, evaluatedAt);
if (!administrator.ClusterAdministrator)
{
throw Errors.Fail(ErrorCode.PermissionDenied, Bm25CorpusProtocol.Administrator);
}
engine.RequireBm25Subject(view, administrator, phase, evaluatedAt);
return engine.CreatePreparedCommand(OperationKind.Bm25CorpusPublicationPhase, phase.CommandId, administrator.Id, evaluatedAt, phase, work, view) /* KLD0041: This admission preserves the Kind-selected native payload in the existing persisted command envelope. */;
});
}
internal static PrincipalRecord RequireBm25Subject(this DatabaseEngine engine, IKeyValueView view, PrincipalRecord administrator, Bm25CorpusPublicationPhaseCommand phase, DateTimeOffset evaluatedAt)
{
if (!administrator.ClusterAdministrator)
{
throw Errors.Fail(ErrorCode.PermissionDenied, Bm25CorpusProtocol.Administrator);
}
Bm25CorpusShape.RequirePhase(phase);
var current = phase.Current;
var principal = engine.Principal(view, current.PrincipalId, evaluatedAt);
engine.Authorization.Require(principal, current.Partition, current.Collection, Capability.Query | Capability.DocumentsRead);
var resource = engine.Resource(view, current.Partition, current.Collection, ResourceKind.Collection);
engine.Authorization.RequireFieldUse(principal, resource, current.Field);
if (principal.PolicyEpoch != current.PolicyEpoch)
{
throw Errors.Fail(ErrorCode.PermissionDenied, Bm25CorpusProtocol.Administrator);
}
return principal;
}
internal static void AuthorizeBm25CorpusPublication(this DatabaseEngine engine, IKeyValueView view, PrincipalRecord administrator, Command<DatabaseCommand> operation)
{
var phase = OperationProtocol.Payload<Bm25CorpusPublicationPhaseCommand>(operation);
OperationProtocol.RequireEnvelopeId(operation, phase.CommandId);
engine.RequireBm25Subject(view, administrator, phase, operation.Timestamp);
}
}