Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
235 commits
Select commit Hold shift + click to select a range
7a54171
Fix client session reconnect recovery
marcschier Sep 17, 2026
c37ed11
Harden managed session recovery state
marcschier Sep 17, 2026
95c9572
Fix server audit, history, event, and session cleanup
marcschier Sep 17, 2026
f825214
Avoid blocking monitored node disposal
marcschier Sep 17, 2026
a6cc9b7
Bound server browse and diagnostics cleanup waits
marcschier Sep 17, 2026
2894177
Close subscription and authentication authorization gaps
marcschier Sep 17, 2026
80aeb13
Recover managed sessions after transport loss
marcschier Sep 17, 2026
9b087e2
Refresh managed session redundancy state
marcschier Sep 17, 2026
4fd8698
Gate managed session services by connection state
marcschier Sep 17, 2026
e589805
Fix secure channel reconnect and issued token protection
marcschier Sep 17, 2026
988c0b9
Harden managed client identity and redundancy recovery
marcschier Sep 17, 2026
eadd5f8
Reset subscription generations and bound content filters
marcschier Sep 17, 2026
69aae15
Prevent lock-held notification backpressure and startup auth gap
marcschier Sep 17, 2026
6e2fb0d
Complete record context binding and endpoint validation
marcschier Sep 17, 2026
6826c16
Fix managed subscription recovery handling
marcschier Sep 17, 2026
e313023
Fix client audit findings
marcschier Sep 17, 2026
c9ac306
Fix client audit regression tests
marcschier Sep 17, 2026
6f65269
Fix audit findings S1-2 S1-4 S1-5
marcschier Sep 17, 2026
e6ef8c4
Fix server audit recovery findings
marcschier Sep 17, 2026
eba18bf
Correct AddNodes type validation tests
marcschier Sep 17, 2026
a382069
Fix core transport and filter audit regressions
marcschier Sep 17, 2026
47970ec
Fix TCP reconnect nonce and response retention audits
marcschier Sep 17, 2026
626c771
Serialize shared store lease election attempts
marcschier Sep 17, 2026
6dc60e2
Preserve managed channel certificate and reverse connection state
marcschier Sep 17, 2026
28bfea3
Fix certificate validation flags and private key storage
marcschier Sep 17, 2026
fa7d984
Fix core encrypted secret handling and token lifetime leaks
marcschier Sep 17, 2026
c00f37c
Complete core filter and certificate rotation fixes
marcschier Sep 17, 2026
4a9ff2b
Finish file binding and pending key lifecycle fixes
marcschier Sep 17, 2026
8e49a1e
Fix condition IDs and reactivation bypass propagation
marcschier Sep 17, 2026
c271b7a
Fix server role and credential audit findings
marcschier Sep 17, 2026
600f97f
Fix historian paging and capture audit findings
marcschier Sep 17, 2026
bc7c7b6
Fix tier-two server aggregate, alias, and state transitions
marcschier Sep 17, 2026
788d638
Fix server session and reverse connect audit findings
marcschier Sep 17, 2026
6e7c4f1
Fix server subscription and audit handling
marcschier Sep 17, 2026
700cf55
Fix historian annotation timestamps and retention
marcschier Sep 17, 2026
86b1404
Fix genuine Historian regressions surfaced by focused test run
marcschier Sep 17, 2026
1bf6d4f
Fix S7-6: log HistoryUpdate inserts into modified history
marcschier Sep 17, 2026
c00bd77
Dispose issued token encrypted secrets
marcschier Sep 17, 2026
73c05ac
Address pull request review feedback
marcschier Sep 18, 2026
c41bf36
Fix contextual key ring ownership
marcschier Sep 18, 2026
0aa0fdd
Enforce diagnostics owner authorization
marcschier Sep 18, 2026
064cad2
Fix client subscription lifecycle and backpressure
marcschier Sep 18, 2026
853281b
Fix server subscription queue and transfer diagnostics
marcschier Sep 18, 2026
921161b
Fix historian registry provider lifetime tracking
marcschier Sep 18, 2026
81118dd
Verify historian audit and aggregate regressions
marcschier Sep 18, 2026
90c2a06
Fix resource and server utility regressions
marcschier Sep 18, 2026
e053ddd
Bound server diagnostics and request work
marcschier Sep 18, 2026
3a1336f
Synchronize bounded server event queue
marcschier Sep 18, 2026
911560d
Preserve secure channel audit failures
marcschier Sep 18, 2026
e5a3d4d
Close subscription transfer and queue regression gaps
marcschier Sep 18, 2026
79b8572
Fix JWKS snapshot ownership and refresh throttling
marcschier Sep 18, 2026
57a8935
Fence session identity refreshes and peer lockouts
marcschier Sep 18, 2026
4b662e1
Harden key credential rotation and proof replay
marcschier Sep 18, 2026
1f9e701
Persist user management metadata
marcschier Sep 18, 2026
a6c5bcc
Fix lease and mirrored continuation cleanup
marcschier Sep 18, 2026
5abd698
Persist durable subscription owner state
marcschier Sep 18, 2026
a170710
Strengthen durable lifetime and restart tests
marcschier Sep 18, 2026
9060832
Fix protected persistence recovery contexts
marcschier Sep 18, 2026
20f6d4d
Fix transport lifetime and cancellation handling
marcschier Sep 18, 2026
77cc4eb
Make buffer limiter wakeups lossless
marcschier Sep 18, 2026
fca9184
Restore reverse connection after callback failure
marcschier Sep 18, 2026
fce296f
Merge branch 'master' into fix/bug-audit-tier1-tier2
marcschier Sep 18, 2026
a9949d7
Preserve in-progress PR review API and readability corrections
marcschier Sep 18, 2026
42c11ef
Handle null-string event filter casts as logged conversion failures
marcschier Sep 18, 2026
4754439
Evaluate filter dependencies and RelatedTo chains without recursive s…
marcschier Sep 18, 2026
164b8c0
Walk browse paths iteratively and honor unlimited continuation quotas
marcschier Sep 18, 2026
e096110
Validate each fresh event history read independently of continuation …
marcschier Sep 18, 2026
965882e
Expose awaitable monitored-node draining and use it as the delivery b…
marcschier Sep 18, 2026
2184e0f
Retain review permission and inverse-reference regression cases
marcschier Sep 18, 2026
db9584d
Address review ownership checks and idempotent inverse references
marcschier Sep 18, 2026
a2ce60b
Balance component references per monitored item and avoid data-item l…
marcschier Sep 18, 2026
f7d3525
Address event-source retry and failed-subscription review feedback
marcschier Sep 18, 2026
73be1fb
Isolate reviewed event receiver failures while retaining cancellation
marcschier Sep 18, 2026
6292e08
Fix lease renewal supersession and immediate expiry notifications
marcschier Sep 18, 2026
3d9190d
Preserve monotonic expiry when rereading an unchanged local lease
marcschier Sep 18, 2026
b6ce72b
Require full-key record contexts and preserve owned plaintext buffers
marcschier Sep 18, 2026
7c83a2f
Fix sessionless decoding with an empty server URI context
marcschier Sep 18, 2026
21d0071
Transfer owned key-agreement nonces during TCP reconnect
marcschier Sep 18, 2026
d09f185
Serialize nonce ownership changes with channel disposal
marcschier Sep 18, 2026
9527656
Bind buffer limiter wakeups to current renter registrations
marcschier Sep 18, 2026
e4ea663
Preserve explicit legacy trace categories without decoding numeric ev…
marcschier Sep 18, 2026
660500d
Close failed early reconnect handoffs and retain their audit certificate
marcschier Sep 18, 2026
dd399d4
Await receive-loop retirement before reusing a transport in its test …
marcschier Sep 18, 2026
c453c36
Document all transport listener interface parameters and handoff results
marcschier Sep 18, 2026
f4101d0
Fix historian raw page limits and remaining open-ended quotas
marcschier Sep 18, 2026
24d9366
Preserve annotation identities, paging quotas and update result posit…
marcschier Sep 18, 2026
17e5819
Recover historian capture after provider failures and resolve stored …
marcschier Sep 18, 2026
cc90033
Use wall-clock historian retention and bounded indexed modification h…
marcschier Sep 18, 2026
ced0448
Document historian paging, retention and annotation provider contracts
marcschier Sep 18, 2026
30ecb20
Keep historian capture token resources alive through shutdown completion
marcschier Sep 18, 2026
3eff76e
Cite normative historian count limits and distinguish storage policies
marcschier Sep 18, 2026
fde8b38
Fix subscription callback scope and review fixture contracts
marcschier Sep 18, 2026
21737b9
Retire subscription generations atomically and drain ingress safely
marcschier Sep 18, 2026
c889e93
Keep classic subscription sequence cursors monotonic across rollover
marcschier Sep 18, 2026
798db50
Preserve server subscription notifications and transactional cleanup
marcschier Sep 18, 2026
7adc6c6
fix(server): roll back cancelled session creation without cancellation
marcschier Sep 18, 2026
1cbd85c
fix(identity): replace authenticator keys while isolating JWT issuers
marcschier Sep 18, 2026
184aab9
fix(identity): preserve authentication rejection before fail-closed f…
marcschier Sep 18, 2026
4c72e7c
fix(identity): collect retired JWKS keys without invalidating readers
marcschier Sep 18, 2026
311a7de
fix(tls): enforce endpoint hostname in every sibling channel callback
marcschier Sep 18, 2026
b77f91c
fix(identity): bind every HTTP and WSS lockout to its observed peer
marcschier Sep 18, 2026
8d6a3f7
fix(server): give service-level providers exclusive publication owner…
marcschier Sep 18, 2026
0fe7c82
fix(server): preserve programmatic reverse connections on config reload
marcschier Sep 18, 2026
1ded45d
fix(identity): bind key-credential acquisition to the target server a…
marcschier Sep 18, 2026
d9df0ed
fix(roles): delete only the removed binding generation and owned node
marcschier Sep 18, 2026
d1e37c2
Preserve shared alarm notifier ownership and browsable hierarchy
marcschier Sep 18, 2026
1df683e
Fix CBC secret decryption hook and explicit None policy no-ops
marcschier Sep 18, 2026
fd64030
Dispose issued-token temporary nonce and filtered issuer ownership
marcschier Sep 18, 2026
08b6827
Preserve inherited private-key ACLs and verify safe permission fallbacks
marcschier Sep 18, 2026
5fcb553
Release RSA-DH nonce state when disposing issued-token temporaries
marcschier Sep 18, 2026
27ea6b1
Document raw ECC platform requirements and test capability contracts
marcschier Sep 18, 2026
41f9c43
Accept peer credential nonces and strictly validate CBC secret padding
marcschier Sep 18, 2026
f6d689c
Reject untrusted mutation rights in existing PKI permission fallbacks
marcschier Sep 18, 2026
124417a
Make pending certificate key claims transactional and non-consuming a…
marcschier Sep 18, 2026
4533b19
Fix downlevel policy initialization and timed-wait cancellation durin…
marcschier Sep 18, 2026
0a9deae
Finish subscription interface contracts and bounded recovery work
marcschier Sep 18, 2026
161aec8
Fix directory provider semantics and bound-file registration lifecycle
marcschier Sep 18, 2026
1b9c152
Share canonical file ownership and bound retained handle state
marcschier Sep 18, 2026
bf523b6
Protect completed binding registrations during failed initialization
marcschier Sep 18, 2026
1ef6866
Preserve alias snapshots and opt into bounded observable refresh
marcschier Sep 18, 2026
304c48d
Preserve positive alias timeout budgets on .NET Framework
marcschier Sep 18, 2026
b787913
Preserve literal Windows extended-path file identities
marcschier Sep 18, 2026
a151c47
fix(identity): commit user flags with credentials and roll back faile…
marcschier Sep 18, 2026
38f6e8c
fix(identity): reset passwords and metadata in one durable transaction
marcschier Sep 18, 2026
324b6a7
fix(identity): commit password changes with their required-change flag
marcschier Sep 18, 2026
7db0e96
test(identity): verify durable failure recovery and one-write metadat…
marcschier Sep 18, 2026
45dd101
docs(identity): complete storage and Web API XML contracts
marcschier Sep 18, 2026
36481a1
Fix authenticated token comparison for PR #4503 review 100
marcschier Sep 18, 2026
e9a40df
Honor inherited user token encryption in PR #4503 review 36
marcschier Sep 18, 2026
c78e0d8
Acquire provider identity after discovery for PR #4503 review 1
marcschier Sep 18, 2026
c705b09
Scope discovery and encoding context to reconnect for PR #4503
marcschier Sep 18, 2026
0db90cb
Retain traversal visited state for PR #4503 review 39
marcschier Sep 18, 2026
da0c28a
Only reject unresolved state children for PR #4503 review 92
marcschier Sep 18, 2026
a58f066
Isolate dictionary namespace lookup for PR #4503 review 91
marcschier Sep 18, 2026
7fd041a
Bound pooled session replacement and teardown for PR #4503 review 30
marcschier Sep 18, 2026
427997f
Bound best-effort redundancy refresh for PR #4503 reviews 35 and 52
marcschier Sep 18, 2026
085e4a4
Rearm exhausted and manual session recovery for PR #4503 review 53
marcschier Sep 18, 2026
b3f8201
Refresh peer certificates and failed endpoint caches for PR #4503
marcschier Sep 18, 2026
ff6a7b4
Apply certificate rotation per shared channel type for review 94
marcschier Sep 18, 2026
0aec75b
Scope recovery sends without replacing shared leases for reviews 70 a…
marcschier Sep 18, 2026
81be750
Release recovery ownership before callback-dependent restoration for …
marcschier Sep 18, 2026
de2ad1f
Preserve final client recovery contract and regression refinements af…
marcschier Sep 18, 2026
013435d
Format PR changes and complete interface contracts with verified inte…
marcschier Sep 18, 2026
8a02bc4
Bound role reconciliation and drain it before address-space teardown
marcschier Sep 18, 2026
44df596
Make alias refresh test behavior publication atomic with startup reco…
marcschier Sep 18, 2026
4dae37d
Preserve revalidation ownership through shutdown and correct responsi…
marcschier Sep 18, 2026
ab686cc
Complete formatter verification and preserve downlevel policy and lif…
marcschier Sep 18, 2026
4ad6908
Preserve configured TLS DNS names in generated certificate identities
marcschier Sep 18, 2026
2d2d675
Provide the real structure hierarchy in WoT write regression fixtures
marcschier Sep 18, 2026
41f0358
Align reverse WSS fixture endpoints with the client certificate identity
marcschier Sep 18, 2026
9945b48
Align server CI fixtures with validated runtime contracts
marcschier Sep 18, 2026
213f04b
Normalize URI scheme casing before collecting TLS certificate names
marcschier Sep 18, 2026
3fef8f3
Use a collection expression for concurrent deletion tasks
marcschier Sep 18, 2026
82116a2
Finish server fixture analyzer cleanliness
marcschier Sep 18, 2026
e9aafd5
fix(server): make certificate alarm roots event subscribable
marcschier Sep 18, 2026
ea6fd99
fix(samples): retain one continuous pump notifier path
marcschier Sep 18, 2026
3085eb2
test(history): share the provider retention clock
marcschier Sep 18, 2026
72b42ea
test(history): preserve alarm publishes across idle periods
marcschier Sep 18, 2026
ec8b0f9
test(server): pin residual aggregate oracle retention clock
marcschier Sep 18, 2026
b486a2c
Exercise lifecycle recovery with a valid variable type definition
marcschier Sep 18, 2026
880e5ba
Fix resolver validation and managed-session compliance initialization
marcschier Sep 18, 2026
29b1cc8
Publish reconnect completion after releasing cycle ownership
marcschier Sep 18, 2026
6b0042c
Assert ECC policy availability for supported target frameworks
marcschier Sep 18, 2026
05f9f96
Keep server crypto ownership tests valid on downlevel targets
marcschier Sep 18, 2026
67626b7
Fix final RCS1090 in configuration builder regression test
marcschier Sep 18, 2026
522efb3
Document client channel manager operation results
marcschier Sep 18, 2026
c28b814
test(server): align history routing fixtures with retention clock
marcschier Sep 18, 2026
16fea59
style: satisfy full info-level checks for CI event fixes
marcschier Sep 18, 2026
e1bc3ac
Finish merged-context server test analyzer verification
marcschier Sep 18, 2026
4b6e120
Fail closed on aborted and incomplete TRX runs
marcschier Sep 19, 2026
57ed02b
Synchronize migration references and document extended Windows file i…
marcschier Sep 19, 2026
0d9d936
Correct durable lifetime tests to expect overflow-free hour conversion
marcschier Sep 19, 2026
8daf7f0
Keep shutdown cancellation from marking the session peer unresponsive
marcschier Sep 19, 2026
82dc22b
Take an atomic channel snapshot before listener disposal
marcschier Sep 19, 2026
58403ee
Capture the publish worker before shutdown clears its owner reference
marcschier Sep 19, 2026
474c69d
Await the existing asynchronous retired-generation cleanup assertion
marcschier Sep 19, 2026
1a048ff
Retry one transient alias snapshot timeout before initial materializa…
marcschier Sep 19, 2026
d08a949
Allocate OPC UA and Raft test ports from one distinct batch
marcschier Sep 19, 2026
a2566b3
Make the strict TRX completion policy explicit
marcschier Sep 19, 2026
6106048
Fail closed when key-ring members cannot transfer plaintext ownership
marcschier Sep 19, 2026
6e3ec5a
Keep subscription ownership cleanup independent of remote timeout
marcschier Sep 19, 2026
3a36e14
Keep alias refresh worker alive after nonfatal store failures
marcschier Sep 19, 2026
2ead093
Preserve historian start bounds and bound transaction projection
marcschier Sep 19, 2026
548d2ec
Keep password hashing and persistence off authentication reader locks
marcschier Sep 19, 2026
86afa36
Fix late PR4503 client recovery and failover regressions
marcschier Sep 19, 2026
0be7e92
Document test-data callback contracts covered by the interface audit
marcschier Sep 19, 2026
c773d7a
Fix asynchronous initial values and server event fan-out
marcschier Sep 19, 2026
baa9c77
Preserve null-success root event callback results
marcschier Sep 19, 2026
e4d0687
Prevent retired sampling items from being re-registered by modification
marcschier Sep 19, 2026
bda6d8e
Sequence peer discovery tests before advancing the shared fake clock
marcschier Sep 19, 2026
1d0be0f
Restore RelatedTo subtype inclusion defaults
marcschier Sep 20, 2026
18c3f76
Keep dynamic key-credential nodes out of the standard namespace
marcschier Sep 20, 2026
01096e7
Fail fast on audience-less key-credential bridge tokens
marcschier Sep 20, 2026
f7dce92
Unregister the new node when a remote parent reference fails
marcschier Sep 20, 2026
085fd96
Restrict an existing private key file before rewriting it
marcschier Sep 20, 2026
cd7bd4e
Keep delivering events whose permission check is Uncertain
marcschier Sep 20, 2026
e9e3d7c
Reset the event-source retry back-off after a successful start
marcschier Sep 20, 2026
9bb5696
Release the trimmed issuer chain after encrypting a user token
marcschier Sep 20, 2026
da0d59c
Accept later legal sequence-number rollovers on long-lived channels
marcschier Sep 20, 2026
bac260a
Abort parked publish attempts when quiescing for a recreate
marcschier Sep 20, 2026
6ad1ecf
Harden the identity-provider path for the initial connect
marcschier Sep 20, 2026
8fa5b38
Make the server-redundancy refresh bounds configurable
marcschier Sep 20, 2026
36c0567
Remove 2.0-only obsolete shims instead of carrying them
marcschier Sep 20, 2026
6adf588
Document the current state instead of the delta from 1.5.378
marcschier Sep 20, 2026
7df1d5c
Update the reflective ManagedSession constructor lookups
marcschier Sep 20, 2026
a08f0c1
State the remaining 1.5-era feature notes as current behaviour
marcschier Sep 20, 2026
5d4d13d
Consult the identity provider when there is no identity to defer to
marcschier Sep 20, 2026
845d073
Move user metadata into IUserDatabase and drop the optional capability
marcschier Sep 21, 2026
5bb7ed3
Make the #4508 guard reliable and the suppression window observable
marcschier Sep 21, 2026
bec2b5d
Fix Azure 18422 test regressions
marcschier Sep 21, 2026
a9f967f
Address review feedback on test interface docs
marcschier Sep 21, 2026
5f4326e
Bound managed-session recovery and preserve publish workers
marcschier Sep 21, 2026
e961218
Address #4516 review feedback on recovery contracts and documentation
marcschier Sep 22, 2026
7221912
Merge master and preserve bounded recovery review fixes
marcschier Sep 22, 2026
97e0894
Fix session-test memory growth from retained browse output
marcschier Sep 22, 2026
e1cf6c3
Clarify isolated attachment cleanup for #4516 review feedback
marcschier Sep 23, 2026
2b6877d
Address audit findings across recovery, certificates and server services
marcschier Sep 23, 2026
fde6026
Fix recovery, lifecycle and WSS review follow-ups
marcschier Sep 23, 2026
6edfb60
Align integration tests with audited history and alias contracts
marcschier Sep 23, 2026
812120b
Bound upstream retries in WoT mapped-read failure test
marcschier Sep 23, 2026
3513fdf
Coordinate automatic subscription updates with session recovery
marcschier Sep 23, 2026
e71b5f7
Merge branch 'master' into fix/4514-4515-bounded-recovery
marcschier Sep 23, 2026
b449f54
Preserve peer-discovery cancellation and recovery test ordering
marcschier Sep 23, 2026
c985f8b
Keep trust-list summary counts separate from serialized identifiers
marcschier Sep 23, 2026
4963719
Preserve virtual-node errors without aborting service batches
marcschier Sep 24, 2026
3c00b4a
Merge branch 'master' into fix/4514-4515-bounded-recovery
marcschier Sep 24, 2026
c5186d9
Drain synchronous node-manager operations before disposal
marcschier Sep 24, 2026
f425376
Preserve transferred notifications until republish completes
marcschier Sep 24, 2026
cd43b83
Fix review feedback and readiness generation handoff
marcschier Sep 24, 2026
80303c4
Merge master transport lifetime changes into bounded recovery fixes
marcschier Sep 25, 2026
8b15ea6
Merge latest master into recovery hardening branch
marcschier Sep 25, 2026
02a4507
Fix terminal recovery handover and supplied-channel ownership
marcschier Sep 25, 2026
1cd1f20
Align server CI tests with bounded cleanup and browse errors
marcschier Sep 25, 2026
43079e2
Merge branch 'master' into fix/4514-4515-bounded-recovery
marcschier Sep 25, 2026
a13afa6
Fence stale lease-election failures behind newer confirmations
marcschier Sep 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 11 additions & 13 deletions docs/AliasNames.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,8 @@ registries. The opt-in
`IOpcUaServerBuilder` in `Microsoft.Extensions.DependencyInjection`.
`AliasNameServerOptions` is in `Opc.Ua.Server.AliasNames`, and its
`MaterializeAliasNodes` property defaults to `false`.
`RefreshAliasNodesOnChange` separately defaults to `false`, preserving the
startup browse snapshot even when materialization is enabled.
`RefreshAliasNodesOnChange` separately defaults to `true`, keeping the
browse view current whenever materialization is enabled.

When enabled, the normal `ConfigurationNodeManager` materializes
registered standard-category aliases and their declared optional
Expand Down Expand Up @@ -232,26 +232,24 @@ Mutation calls are gated on a `SecurityAdmin` caller over a

Standard-category materialization is opt-in: servers that only need
`FindAlias` to answer from their store do not create alias instance
nodes. The created nodes are a snapshot taken at address-space creation
— aliases added or removed later through
`AddAliasesToCategory` / `DeleteAliasesFromCategory` change what
`FindAlias` returns and advance `LastChange`, but do not add or remove
`AliasNameType` nodes by default.
nodes. Once materialized, both standard and application-defined alias
nodes follow store changes by default. Aliases added or removed through
`AddAliasesToCategory` / `DeleteAliasesFromCategory` update queries,
advance `LastChange`, and schedule reconciliation of `AliasNameType`
nodes and their target references.

To keep an explicitly materialized browse view current, also set
`RefreshAliasNodesOnChange = true` on `AliasNameServerOptions` or
`AliasNameNodeManagerOptions`. This setting never overrides
`MaterializeAliasNodes = false`:
`RefreshAliasNodesOnChange` defaults to `true` on both `AliasNameServerOptions`
and `AliasNameNodeManagerOptions`. Set it to `false` explicitly to retain a
startup-only browse snapshot. It never overrides `MaterializeAliasNodes = false`:

```csharp
builder.ConfigureAliasNames(options =>
{
options.MaterializeAliasNodes = true;
options.RefreshAliasNodesOnChange = true;
});
```

Each opted-in host owns one background worker and at most one pending
Each live-materialization host owns one background worker and at most one pending
refresh signal. Category and ancestor notifications coalesce into a pass
over store roots. A completed query is applied only while its generation
is current; query failures leave existing nodes and references intact and
Expand Down
76 changes: 72 additions & 4 deletions docs/CertificateManager.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,20 @@ to replace those snapshots and invalidate cached validation results.
An explicit-only list can validate certificates without a `StorePath`;
store-management operations still require a configured backing store.

Set `CertificateValidationOptions.RecordRejectedCertificates = false` for
re-evaluating an existing connection without adding failures to the rejected
store. This changes only the recording side effect, not the trust decision.
New-connection validation records rejected certificates by default.
An admitted validation preserves its result, including URI and hostname errors,
if the manager shuts down before rejected-store recording can begin. Recording
is skipped once shutdown closes writer admission; explicitly requesting
`RejectCertificateAsync` after disposal still fails.

Concatenated certificate blobs are framed by their outer DER sequences, with at
most 16 certificates. Framing does not interpret the signature algorithm;
native import and certificate validation determine whether each certificate is
supported and acceptable, including PSS and EdDSA signatures.

**Inline issuer revocation policy:** when an inline issuer's list has a backing
store that checks CRLs, `RejectUnknownRevocationStatus = true` rejects
`BadCertificateRevocationUnknown` (or `BadCertificateIssuerRevocationUnknown`)
Expand Down Expand Up @@ -198,6 +212,29 @@ await manager.UpdateApplicationCertificateAsync(
issuerChain);
```

Certificate-change notifications borrow their certificate and issuer-chain
handles for the synchronous notification. An observer that queues work must
take independent references before returning and release them after processing.
The built-in client rotation pump does this for pending, replaced and processed
notifications.

#### Certificates for SecurityMode None

On `SecurityMode.None` endpoints, encrypted username or issued-token policies
use an RSA application certificate compatible with every advertised encrypted
token policy. The selected certificate is also used for `CreateSession`, restored-session certificate
resolution and certificate-deletion protection. An ECC-first application
certificate list does not change this selection.
Generic RSA-family certificate types, including `ApplicationCertificateType`,
are accepted only when the certificate has an actual RSA public key within every
applicable token policy's key-size bounds.

An unspecified encrypted token policy defaults to `Basic256Sha256`. If no
compatible RSA certificate exists, the server omits that policy and logs a
configuration error; it never substitutes ECC or RSA_DH on a None endpoint.
Anonymous, X.509 and explicitly unencrypted token policies retain their existing
semantics. This follows [OPC 10000-4, 7.41](https://reference.opcfoundation.org/specs/OPC-10000-4/7.41.md).

#### Server-Side Certificate Rotation via Push (OPC UA Part 12 §7.10.9)

When a client rotates a server's application certificate through the standard `ServerConfiguration.UpdateCertificate` + `ServerConfiguration.ApplyChanges` push flow, the server must — once the `ApplyChanges` response has been delivered — force the SecureChannels that were negotiated against the old certificate to renegotiate. The session (and any subscriptions) stay alive so the client's reconnect logic can transfer them onto a fresh channel.
Expand All @@ -209,6 +246,10 @@ The stack implements this contract in two pieces:

Tests and hosts that need deterministic timing can await the deferred work via `IConfigurationNodeManager.DrainPendingApplyChangesAsync(CancellationToken)`.

The commit installs the key-bearing certificate in the live registry before
that deferred reload. Signing and token decryption can use the new key during
the response-flush grace period, including when the commit fills an empty slot.

Custom transport listeners opt into the renegotiate hook by implementing the capability interface:

```csharp
Expand Down Expand Up @@ -238,6 +279,20 @@ Server-base subclasses that want to observe rotation in custom ways can still su

The effect fan-out runs after the same grace/flush boundary as certificate rotation and is awaitable through `IConfigurationNodeManager.DrainPendingApplyChangesAsync(CancellationToken)`.

Both TCP listeners retain the complete peer chain validated at
`OpenSecureChannel`, including intermediates supplied only by the client.
Their `ITransportListenerPeerCertificateChainRotation` capability passes an
owned chain snapshot to `CloseChannelsForUntrustedPeerChainsAsync`. The default
effect handler prefers this capability and validates without writing to the
rejected store. An unrelated trust addition therefore does not misclassify a
peer whose intermediate is absent from the server's issuer store; removal of
its trust anchor still closes the affected channel.

Custom transports should implement the chain-aware capability when peers can
supply intermediates. The leaf-only capability below remains supported as a
compatibility fallback. A chain snapshot must remain alive until its predicate
finishes, even if the channel closes concurrently.

Two seams make this behaviour injectable and testable:

1. **`ITransportListenerPeerCertificateRotation`** — an optional capability interface on `ITransportListener` (sibling to `ITransportListenerCertificateRotation`). Each implementing listener advertises the single TrustList scope it validates its peer certificates against through `PeerCertificateTrustListScope`, and a committed change is routed to it **only** when the change targets that scope — so an `opc.tcp` listener is never re-validated or closed against the HTTPS store, and vice versa. Both `opc.tcp` listeners — the raw-socket `TcpTransportListener` and the Kestrel-hosted `KestrelTcpTransportListener` — implement it with the `Peers` scope, re-validating each tracked channel's client certificate through a caller-supplied async predicate and force-closing only the channels that fail (listener socket stays bound). The UA-HTTPS listener deliberately does **not** implement this capability (see the HTTPS bullet above). Custom transports opt in the same way:
Expand All @@ -263,6 +318,8 @@ Two seams make this behaviour injectable and testable:

2. **`IPushConfigurationTrustListEffectHandler`** — the injectable provider that performs the two effects above. `ConfigurationNodeManager` builds a `PushConfigurationTrustListEffectContext` (the committed effects plus the live transport listeners, session manager, certificate validator and a session-close delegate) and dispatches it to the handler after the grace boundary. A default `PushConfigurationTrustListEffectHandler` is created automatically; hosts can register their own through DI (`services.TryAddSingleton<IPushConfigurationTrustListEffectHandler, ...>()`) or pass one to `MainNodeManagerFactory` / `ConfigurationNodeManager` directly.

The default handler's SecureChannel renegotiation summary logs only the aggregate number of affected channels, not their identifiers or certificate contents.

#### Origin-Independent Enforcement of Trust-Material Changes

The effect fan-out above is not limited to changes committed through `ApplyChanges`. Two additional mechanisms guarantee that a trust-material change — most importantly a CRL that revokes a connected client's certificate — takes effect immediately instead of at the client's next security-token renewal (default lifetime: one hour):
Expand Down Expand Up @@ -393,7 +450,7 @@ times out. Partial TrustList commits use the same policy to restore their
stores. Rollback failures are reported explicitly and do not replace the
original commit failure with success.

`DeleteCertificate`'s endpoint-reference safety check (§7.10.7: "Certificates that are referenced by EndpointDescriptions shall not be deleted. This determination happens when ApplyChanges is called.") resolves the exact certificate each active `EndpointDescription` presents **from the active certificate registry** — keyed by the endpoint's `SecurityPolicyUri`, exactly as the channel handshake resolves the presented certificate — and rejects the transaction with `Bad_InvalidState` at `ApplyChanges` if the deleted certificate is still referenced. Resolving from the live registry (rather than the `EndpointDescription.ServerCertificate` blob captured when the endpoints were created) ensures a certificate that was rotated after startup is still protected. A delete that is superseded within the same transaction by a `CreateSelfSignedCertificate`/`UpdateCertificate` for the same slot coalesces to the later operation (§7.10.2 ordered-queue semantics), so replacing a referenced certificate in one transaction remains allowed. A conservative net "last remaining certificate" check still runs at staging time for immediate feedback.
`DeleteCertificate`'s endpoint-reference safety check (§7.10.7: "Certificates that are referenced by EndpointDescriptions shall not be deleted. This determination happens when ApplyChanges is called.") resolves the exact certificate each active `EndpointDescription` presents **from the active certificate registry**, using its security policy and, on None endpoints, its encrypted user-token policies. It rejects the transaction with `Bad_InvalidState` at `ApplyChanges` if the deleted certificate is still referenced. Resolving from the live registry (rather than the `EndpointDescription.ServerCertificate` blob captured when the endpoints were created) ensures a certificate that was rotated after startup is still protected. A delete that is superseded within the same transaction by a `CreateSelfSignedCertificate`/`UpdateCertificate` for the same slot coalesces to the later operation (§7.10.2 ordered-queue semantics), so replacing a referenced certificate in one transaction remains allowed. A conservative net "last remaining certificate" check still runs at staging time for immediate feedback.

#### Certificate-Expiration and TrustList-Staleness Alarms (OPC UA Part 12 §7.8.3)

Expand Down Expand Up @@ -485,6 +542,10 @@ owns the standard concerns and only delegates the actual reset to the injected
credentials may no longer work, waits the grace period, and only then invokes
the provider. The deferred reset honors the server shutdown token, so a server
that stops while the reset is pending abandons it cleanly.
- Coalesces concurrent reset requests. Once an in-place reset finishes, fails,
or is cancelled by the provider, the previous status and shutdown fields are
restored before the reset completes. A real server shutdown or a subsequent
fault state is never replaced by that restoration.

```csharp
public sealed class MyResetProvider : IServerConfigurationResetProvider
Expand Down Expand Up @@ -673,18 +734,25 @@ manager.RegisterTrustList(
using ICertificateStore trustedStore = manager.OpenTrustedStore(TrustListIdentifier.Peers);
using CertificateCollection certs = await trustedStore.EnumerateAsync();

// Transactional trust-list update (atomic commit/rollback)
// Stage a trust-list update
await using ITrustListTransaction tx = await manager.BeginUpdateAsync(TrustListIdentifier.Peers);
await tx.AddTrustedCertificateAsync(newTrustedCert);
await tx.RemoveTrustedCertificateAsync(oldThumbprint);
await tx.CommitAsync(); // Atomic apply; disposing without commit rolls back
await tx.CommitAsync(); // Disposing before commit discards staged changes

// Read/write trust-list as a blob (GDS Push Management)
TrustListData data = await manager.ReadTrustListAsync(TrustListIdentifier.Peers);
await manager.WriteTrustListAsync(TrustListIdentifier.Peers, data);
```

> **Note:** `ITrustListTransaction`/`BeginUpdateAsync` above is a local, in-process API on `CertificateManager` for application code that wants an atomic trust-list edit. It is unrelated to the OPC UA PushManagement transaction model (`ApplyChanges`/`CancelChanges`, see *PushManagement Transactions* above), which is driven remotely by a Client over the `ServerConfiguration` address space and governs `TrustList`/`ServerConfiguration` Methods called through `ConfigurationNodeManager`.
The last staging operation wins for each trusted/issuer certificate thumbprint
(case-insensitive) and each identical CRL encoding. Remove-then-add performs a
real replacement, including when the certificate is already present. Required
issuer-store configuration is checked before any trusted-certificate or CRL
write. A later backing-store failure can still leave partial writes; affected
validation caches are invalidated in that case.

> **Note:** `ITrustListTransaction`/`BeginUpdateAsync` above is a local, in-process staging API on `CertificateManager`. It is unrelated to the OPC UA PushManagement transaction model (`ApplyChanges`/`CancelChanges`, see *PushManagement Transactions* above), which is driven remotely by a Client over the `ServerConfiguration` address space and governs `TrustList`/`ServerConfiguration` Methods called through `ConfigurationNodeManager`.

### Interfaces Reference

Expand Down
Loading
Loading