SDK compatibility matrix: UNS cases denied against the master server since #808 (fixture UNS folder has no ACL placement) #888
Reference in New Issue
Block a user
Delete Branch "%!s()"
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?
Found while adding the #880 cases to the separate-process SDK compatibility matrix (
scripts/validation/opcua-sdk-compatibility, #782), 2026-11-12.Symptom: every client that runs against the candidate (current master) server now fails the UNS cases with
BadUserAccessDenied. That covers the SDK 1.5 Shared client, the SDK 2 Shared client and the SDK 2 driver. The affected cases areraw-UNS-URI-browse,scalar-read-write-ns-3andtyped-array-read-write-ns-3in the Shared legs, anddriver-raw-UNS-URI-scalar-and-array-readin the driver leg. All of these pass against the SDK 1.5 baseline server (83ed880e), and the raw-namespace cases pass everywhere. The 2026-11-10 evidence run passed them against the candidate at the time.Likely cause (fixture, not product): the matrix server builds its UNS nodes ad hoc (
EnsureFolder("Eq", …, Uns)plusEq/ScalarandEq/Vector). It applies a Cluster-scope grant with an empty UNS path map (ProcessHost.Serve). After #808 (af5c9744,e39a1250),DataPlaneAuthorizer.TryPlaceUnsSubjectfails closed for a folder, or a node a folder owns, that has no placement in the authority snapshot. It does not fall back to the realm or the cluster, so even a Cluster grant denies. That is by design for production, where every UNS node comes from the deployment artifact. The fixture just never placed its folder.Fix options: give the fixture's
Eqfolder a UNS placement in theDataPlaneAuthorityState.Applycall, or run the matrix withOPCUA_MATRIX_ACL=offfor UNS cases and keep one ACL-on raw case. The first keeps real ACL coverage.Not caused by #880. That change touches only client code (
Client.Shared,Driver.OpcUaClient.Session), and the server code under test is identical. Evidence:scripts/validation/opcua-sdk-compatibility/evidence/2026-11-12-880/.Fixed in lmxopcua master
1e1fad76(fixture only, no server authorization code touched).ProcessHost.cs now passes unsFolderScopes (Eq -> path [uns, Eq], id chain [Eq]) and tagReferencingEquipment (native alarm -> Eq) into DataPlaneAuthorityState.Apply, as a deployed generation does (under #if SDK2, since the 1.5 baseline host predates #808). Negative control added: an unplaced UNS folder "Unplaced" with a variable; the Shared client leg requires its read to be BadUserAccessDenied against the #808+ server with ACL on (and not denied with ACL off / on the 1.5 baseline).
Local runs (baseline =
83ed880epublished from a fresh worktree):