Phase 6.2 Stream C follow-up - wire AuthorizationGate into DriverNodeManager Read/Write/HistoryRead #94
Reference in New Issue
Block a user
Delete Branch "phase-6-2-stream-c-dispatch-wiring-followup"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes release blocker #1 from
docs/v2/v2-release-readiness.md— the Phase 6.2 evaluator is now called by real dispatch paths instead of being dead code.Summary
NodeScopeResolver— Phase 1 flat scope (ClusterId + TagId). Cluster-level ACLs cascade per decision #129; finer-grained resolution is Stream C.12 follow-up.WriteAuthzPolicy.ToOpcUaOperation(classification)— maps driver-reported SecurityClassification to OpcUaOperation Write{Operate/Tune/Configure}.DriverNodeManager:AuthorizationGate+NodeScopeResolver; both null preserves pre-Phase-6.2 dispatch for existing tests.OnReadValuecalls gate before invoker; denied reads return BadUserAccessDenied without hitting the driver.OnWriteValueadds additive gate check alongside existing WriteAuthzPolicy classification-vs-roles check.WriteAccessDeniedhelper surfaces BadUserAccessDenied in the result slot.fullRef == null(notifier / driver-root reads are cluster-wide; scope shape for those is a separate follow-up).OtOpcUaServer+OpcUaApplicationHost: thread gate + resolver as optional params (same pattern as DriverResiliencePipelineBuilder).OpcUaApplicationHostwith anAuthorizationGate(StrictMode: true)once ACL data is seeded. Lax default during rollout keeps older deployments working.Test plan
dotnet test: 1164 passing (was 1159, +5).🤖 Generated with Claude Code