Commit Graph
2234 Commits
Author SHA1 Message Date
romanett e767524854 fix some CTT Tests, raise SemanticChangeEvent, fix netstandard 2.1 CI (#3700)
* fix some CTT Tests, fix netstandard 2.1 CI by using net 10 targets instead of net 8

* fix test

* Add semantic change event

* fix valueastext

* add semantic change integration test SemanticChangeNotificationTestAsync
2026-04-28 14:19:56 +02:00
Copilotandromanett 8e01f836c9 Fix SessionReconnectHandler infinite loop when server restarts with changed endpoint configuration (#3708)
* Initial plan

* Fix reconnect handler: fall back to best available endpoint when original endpoint is removed from server

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/926282f4-5820-4713-8cb1-53979807fc2f

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Fix warning message string concatenation in UpdateEndpointFromServerAsync

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/926282f4-5820-4713-8cb1-53979807fc2f

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>
2026-04-28 14:19:32 +02:00
Anatoly Kochnev 84161c120c [Client] Fixed excessive tasks spawning during session connection loss (#3707)
Added checks for Session.KeepAliveStopped before trying to execute Publish for subscriptions.
2026-04-27 14:50:27 +02:00
Marc Schier 94653f1aee Add a MCP server that enables LLM/Copilot to be a OPC UA client (#3701)
* Opc ua client Mcp Server
* fix for #3699
2026-04-24 19:03:45 +02:00
Marc Schier 939764b5a7 Tests for cp null vs empty (#3703) 2026-04-24 18:41:19 +02:00
Marc Schier 39fa3030fa Add a fluent api for server, a sample and generate node managers to use with it. (#3684)
* Add source-generated NodeManagers and fluent wiring API

Adds a fluent INodeManagerBuilder API for wiring per-node callbacks and a model-aware source generator that emits a partial CustomNodeManager2 plus an INodeManagerFactory for each design file.

Opt-in is per class via [Opc.Ua.Server.Fluent.NodeManager] on a partial class (recommended) or project-wide via the ModelSourceGeneratorGenerateNodeManager MSBuild property (legacy). The attribute supports NamespaceUri / Design selectors for multi-design projects and a GenerateFactory toggle. Diagnostics MODELGEN010 / MODELGEN011 surface unmatched bindings and non-partial classes.

Adds the ConsoleBoilerServer NativeAOT sample driving the new pipeline end-to-end with Microsoft.Extensions.Logging.Console and updated docs in Docs/SourceGeneratedNodeManagers.md.

* Add BoilerServer AOT smoke test

Verifies the source-generated Boiler.BoilerNodeManagerFactory loads
the boiler address space, registers its namespace, and dispatches the
fluent OnRead callbacks wired in BoilerNodeManager.Configure.cs.
All 3 new tests pass in JIT mode and against the NativeAOT-published
binary; total Aot.Tests suite: 71/71 pass.
2026-04-22 16:45:07 +02:00
Marc Schier d14cd10a86 Model dependency annotations using source generator + flaky test fixes (#3687)
* Fix publish/dispose race that hangs Client tests

Subscription.Dispose pre-disposed m_publishTimer and m_messageWorkerCts
before calling ResetPublishTimerAndWorkerState, causing Cancel() to throw
ObjectDisposedException and leaving the publish worker stuck. Removed the
duplicate disposal so the reset method is the single owner of those resources,
and guarded Cancel/Dispose with try/catch ObjectDisposedException for defense
in depth.

Session.OnPublishComplete could run after Session.Dispose disposed
m_reconnectLock, throwing ObjectDisposedException from SemaphoreSlim.Wait()
and re-arming via the throttle path indefinitely. Added an early Disposed
guard, wrapped Wait/Release in try/catch ObjectDisposedException, and added
a Disposed guard in QueueBeginPublish so the throttle cannot reschedule
publishes after disposal.

Fixes the macOS net10.0 hang seen in Azure pipeline build 13257
(TransferSubscriptionAsync, ReconnectWithSavedSessionSecretsAsync).

* fix lockout test and use UserName token for SuccessfulAuthenticationClearsFailedAttempts test

After c1e11b1ab made anonymous activations no-op for clearing the lockout
counter, the test must use a real (non-anonymous) credential to demonstrate
that successful authentication resets failed attempts. Use user1/password
with PolicyId=1 (UserName_1 in the reference server config).

* Fix DirectoryCertificateStore cache staleness across instances

When two DirectoryCertificateStore instances point at the same directory (e.g. a CertificateValidator's internal store and a separate store opened by a caller), the directory LastWriteTimeUtc seen by one DirectoryInfo handle does not reliably reflect modifications made through another handle on Windows, even after Refresh(). The mtime-based cache check therefore returned stale entries indefinitely, causing VerifyRejectedCertsDoNotOverflowStoreAsync to flake when the test fixture's RejectedStore failed to observe deletes performed by the validator's internal store.

Add a cheap on-disk file count cross-check in the cache-hit branch: if the count of cert files on disk does not match the cached entry count, force a reload. This avoids re-parsing every certificate when nothing has changed but reliably detects external modifications.

* test: fix keep-alive mock to return Int32 ServerState

The mock for the Server_ServerStatus_State read returned new Variant(0u)
(UInt32). The keep-alive worker expects Int32 (ServerState enum is
wire-encoded as Int32), so ClientBase.ValidateDataValue logged a
BadTypeMismatch warning on every keep-alive throughout the test run.

Real servers always emit Int32 for enum variables (BinaryEncoder
downgrades the enum encoding byte to Int32), so the warning was purely a
test-mock artifact. Switch the mock to new Variant((int)ServerState.Running)
to eliminate the spurious warnings.

* Source generator: emit and consume ModelDependencyAttribute. Emit one [assembly: ModelDependencyAttribute(...)] per model the
  generated assembly emits and per upstream model it transitively
  consumes (new ModelDependencyGenerator in
  Tools/Opc.Ua.SourceGeneration.Core).
* Replace the unused PEReader-based ReferenceMetadataScanner with a
  Roslyn IAssemblySymbol.GetAttributes() scan
  (ReferencedModelDependencyScanner in
  Tools/Opc.Ua.SourceGeneration). Hooks the per-symbol incremental
  cache, works for both PortableExecutableReference and
  CompilationReference, AOT-safe.
* Wire the scanner result through ModelSourceGenerator into
  ModelCompilation. The reduced URI-keyed map is passed to the public
  Generators.GenerateCode extension methods.
* NodesetFileCollection.GetDesignFileListForModel now consults the
  referenced-model map, so transitive nodeset dependencies that are
  satisfied by a referenced assembly no longer raise the
  missing-dependency error.
* Override resolution: when a local AdditionalFile and a referenced
  assembly both declare the same model URI under the same C# prefix
  the local generation is silently skipped (avoids CS0101); different
  prefixes still generate so downstream consumers can intentionally
  override types under a different namespace.
* New diagnostics MODELGEN010 (override skipped) and MODELGEN012
  (multiple referenced assemblies provide same model URI -> tie-break
  on highest version+publication date).
* Bump asserted GeneratedSources counts in ModelGeneratorTests for the
  new *.ModelDependencies.g.cs files (one per generated model).
* Fix unrelated CS1574 broken cref in NodeId.TryParseLongForm xmldoc
  that was blocking the Opc.Ua.Types build.
* Document the new flow in Docs/ModelDependencies.md.
* tests for ModelDependencyAttribute flow

* Refactor recently added "parsing" constructors to ParseLongForm static method. Method delegates to Parse(IServiceMessageContext)

NodeId, ExpandedNodeId and QualifiedName ParseLongForm overloads are now thin wrappers around Parse(context, options) using NodeIdParsingOptions with RequireResolvedUris=true and updateTables=false. Adds the FallbackToStringIdentifier opt-in to preserve the legacy lenient quirk for callers that need it (off by default for strict parity).

Tests for the refactored long-form parsers were added to the existing per-type test fixtures.

* Update nuget dependencies to latest
2026-04-22 10:15:12 +02:00
Copilotandromanett 1ae147d9b7 [PubSub] Fix exceptions logged on graceful MqttPubSubConnection stop (#3691)
* Fix exceptions when stopping MqttPubSubConnection gracefully

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/df13266f-4a49-4760-a6e8-785434400b0f

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>
2026-04-22 10:11:49 +02:00
Marc Schier 09e44453a4 Generate type safe (method) proxies for ObjectTypes inside models (#3685)
Add interop test agent

The new stack-pass ObjectMethodProxyGenerator emits proxies that derive
from Opc.Ua.ObjectTypeClient and reference Session.MessageContext.NamespaceUris.
Neither type exists in the in-memory test compilation, which only references
Opc.Ua.Types.dll. Moving ObjectTypeClient to Opc.Ua.Types would cascade ISessionClient,
IClientBase, ITransportChannel and the generated service interfaces with it, so the
type stays in Opc.Ua.Core and we add a minimal stub to OpcUaCoreStubs instead.

Wire Microsoft.Extensions.Options 10.0.5 + DependencyInjection.Abstractions 10.0.5 into Directory.Packages.props and the Gds.Client.Common project to enable upcoming options-driven configuration work.

 Modernize Opc.Ua.Gds.Client.Common (DI, options, interfaces, async dispose)
2026-04-22 05:59:06 +02:00
Copilotandromanett b7061ae187 Fix: Cannot call method within the ObjectType of the objectId (#3692)
* Initial plan

* Fix method call on ObjectType hierarchy per OPC UA spec Part 4 section 5.12.2.2

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/a45b9718-fd5a-4a0e-8f79-233aaaa8532c

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Add explanatory comment to maxHierarchyDepth constant in FindMethodInTypeHierarchy

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/a45b9718-fd5a-4a0e-8f79-233aaaa8532c

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>
2026-04-22 05:49:46 +02:00
319ea88726 [Server/Client] Support RSAEncryptedSecret format and unify EncryptedSecret RSA/ECC API with legacy .NET and test compatibility (#3678)
* Initial plan

* feat(server): support RSAEncryptedSecret username token decryption

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/f79e2eec-5b14-4ffb-8ee0-2906a95e56fd

Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>

* test: add RSAEncryptedSecret username token coverage and harden parsing

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/f79e2eec-5b14-4ffb-8ee0-2906a95e56fd

Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>

* feat(client): use RSAEncryptedSecret for long username passwords

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/4b5a3cbb-9110-4fe5-907d-7b8ffccf2a16

Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>

* fix(core): add framework-compatible zeroing and SHA1 hash helpers

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/732365b9-45fe-4c20-bfa9-b6b7dc9ad4e4

Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>

* fix(core): tighten crypto helper compatibility guards

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/732365b9-45fe-4c20-bfa9-b6b7dc9ad4e4

Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>

* chore(core): simplify zero-memory preprocessor guard

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/732365b9-45fe-4c20-bfa9-b6b7dc9ad4e4

Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>

* test(core): add legacy-framework crypto polyfills in username token tests

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/87851fe9-59ab-453b-a0a7-7cb3134e4e0d

Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>

* chore(test): rename RNG local for readability

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/87851fe9-59ab-453b-a0a7-7cb3134e4e0d

Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>

* refactor(core): move RSAEncryptedSecret handling into EncryptedSecret

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/1a47ef6e-03ba-413c-8aee-1c03f870d3fe

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* chore(core): polish EncryptedSecret RSA refactor review items

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/1a47ef6e-03ba-413c-8aee-1c03f870d3fe

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* refactor(core): add RSA EncryptedSecret factory and clarify timestamp guard

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/1a47ef6e-03ba-413c-8aee-1c03f870d3fe

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* refactor(core): unify EncryptedSecret API for RSA and ECC

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/09578bca-fa2d-4916-8bd3-8d68470e91e1

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* refactor(core): add unified TryDecrypt handling and ECC failure test

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/09578bca-fa2d-4916-8bd3-8d68470e91e1

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* chore(core): refine unified TryDecrypt exception handling

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/09578bca-fa2d-4916-8bd3-8d68470e91e1

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* docs(core): clarify unified EncryptedSecret API behavior

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/09578bca-fa2d-4916-8bd3-8d68470e91e1

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* chore(core): improve ECC decrypt diagnostics and docs

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/09578bca-fa2d-4916-8bd3-8d68470e91e1

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* chore(core): polish unified API wording and ECC test naming

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/09578bca-fa2d-4916-8bd3-8d68470e91e1

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* chore(core): remove TryDecrypt magic number and simplify ECC error text

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/09578bca-fa2d-4916-8bd3-8d68470e91e1

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* chore(core): consolidate TryDecrypt catches with exception filter

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/09578bca-fa2d-4916-8bd3-8d68470e91e1

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>
Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>
2026-04-21 05:03:00 +02:00
Randy Armstrong 36c936a361 Update SourceGenerator dependencies resolution mechanism. (#3680) 2026-04-20 17:31:18 +02:00
Marc Schier 38227cbeab Fix boolean default should be false instead of true (#3679)
* Fix boolean default should be false instead of true
* Update MigrationGuide for boolean default value changes

Clarified the impact of the boolean default value change and updated the migration guide to reflect the correct initialization requirements.
2026-04-20 16:40:43 +02:00
Copilot cacf03fffc XmlDecoder/XmlParser: throw BadDecodingError for empty/non-element enumerated arrays (#3677)
* Fix XmlDecoder empty enumerated array handling
* Fix XmlParser empty enumerated array handling
2026-04-20 15:07:45 +02:00
Copilotandmarcschier 6ee858d0ba Remove duplicate GDS type registration commit in server startup path (#3676)
* Initial plan

* Remove duplicate GDS type registration and add startup coverage test

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/86388b62-268b-4598-ab31-ddd820d414dc

Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>
2026-04-19 16:25:26 +02:00
Marc Schier 26a0b21881 Replace session state encoder with IEncodable generation using source generators (#3673)
* Replace SessionStateEncoder with IEncodeable on session/subscription models

- Source-gen [DataType]/[DataTypeField] on: MonitoredItemOptions, MonitoredItemState,
  SubscriptionOptions, SubscriptionState (auto-generated Encode/Decode/IsEqual/Clone)
- Manual IEncodeable on: SessionOptions, SessionState, SessionConfiguration
  (ConfiguredEndpoint and IUserIdentity require manual encoding)
- Delete SessionStateEncoder.cs (488 lines removed)
- Remove [DataContract]/[DataMember]/[KnownType]/[CollectionDataContract] attributes
- Remove JsonSerializerContext classes
- Change init -> set, byte[] -> ByteString, DateTime -> DateTimeUtc
- MonitoredItems: ArrayOf<MonitoredItemState> with StructureHandling.Inline
- Subscriptions: ArrayOf<SubscriptionState>

* Source generator: support partial init properties with backing fields

Add IsInitOnly detection to the [DataType] source generator so that
partial properties with init-only setters can be used in IEncodeable types.

For each init-only partial property, the generator:
- Emits a private backing field (__PropertyName)
- Emits the partial property implementation (get => __field; init => __field = value)
- Uses the backing field in Decode() instead of the property
- Skips simple init-only fields in Clone() (record 'with' already copies them)
Detection uses both IPropertySymbol.SetMethod.IsInitOnly and syntax-tree
fallback (SyntaxKind.InitAccessorDeclaration) for partial definitions.
* docs: add partial init properties and session state migration sections

- SourceGeneratedDataTypes.md: new 'Partial Init Properties' section
  documenting backing field generation for init-only partial properties
- MigrationGuide.md: new 'Session State Persistence' section covering
2026-04-19 13:39:01 +02:00
Marc SchierandCopilot c71f2e7733 Fix source generator generated structures with optional fields (#3674)
Split validator load/validate; split DesignFileCollection Targets/Dependencies

ModelDesignValidator.LoadNodes now skips ValidateDictionary when a model is loaded purely as a dependency. The flag is plumbed through LoadModelDesign and LoadDesignFile; the dep loop in ValidateModel passes false, the primary target passes true. This lets callers supply unrelated or reverse dependencies (deps that import the target) without triggering premature validation failures.

DesignFileCollection exposes Targets + Dependencies; generators and tests updated. MergeNamespace preserves FilePath across PublicationDate-based replacement so later loads can still find the source file. Tester simplified to treat every other xml/csv pair as a dependency of each target.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-17 22:36:53 +02:00
Marc SchierandCopilot 34ed5716c0 Add structure-backed OptionSet DataType support in ComplexTypeSystem (#3672)
Concrete sub-types of the abstract OptionSet DataType (i=12755, e.g. AccessRights, CarExtras, OptionSetBase) were silently skipped by ComplexTypeSystem.LoadBaseStructureDataTypesAsync when only an EnumDefinition or OptionSetValues property was available. This change registers them with a new runtime class Opc.Ua.Encoders.OptionSet that reuses the generated Opc.Ua.OptionSet wire format (Value/ValidBits ByteStrings) and self-registers via IEncodeableType.

Key changes:

- New Stack/Opc.Ua/Types/OptionSet.cs with EnumDefinition-driven bit accessors (by name and index), GetSetFieldNames helper, and a fixed ByteLength derived from the highest declared bit per OPC UA Part 3 paragraph 8.40 / 3.2.8. SetBit throws ArgumentOutOfRangeException outside that range and always materializes Value/ValidBits to the fixed length.

- New AddOptionSetType entry point on IComplexTypeBuilder (source-breaking addition for custom implementations); DefaultComplexTypeBuilder implements it. The Reflection.Emit ComplexTypeBuilder throws NotSupportedException.

- ComplexTypeSystem detects OptionSet descendants via a HasSubtype walk and resolves the EnumDefinition from DataTypeDefinition or the OptionSetValues property fallback before the old skip path.

- Removed stale V1.04 OptionSet limitation remark from ComplexTypeSystem.

- 10 unit tests in Tests/Opc.Ua.Client.Tests/ComplexTypes/DefaultOptionSetTests.cs covering factory registration, bit accessors, binary round-trip via ExtensionObject, hand-crafted Part 6 wire format, Clone/CreateInstance semantics, and the ByteLength invariant.

- Live-verified against opc.tcp://DESKTOP-BGFJS91:48010 (UA C++ SDK demo): AccessRights/CarExtras/OptionSetBase now appear in the registered custom-type list; no skip-log entries; LoadAsync(throwOnError:true) returns true.

- Docs/ComplexTypes.md Known Limitations reworded; Docs/MigrationGuide.md gains an OptionSet DataType support subsection.

UInteger-backed OptionSet DataTypes remain intentionally opaque (carried as their unsigned integer in a Variant).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-17 21:16:55 +02:00
Marc Schier 6c8c1a6d29 Enable dispose analyzers CA2000 and CA2213 and fix all issues (#3670) 2026-04-17 13:39:34 +02:00
d1883832e1 Secure channel enhancements 2025 11 (Take 3) (#3665)
* merged security changes

* Tailor SecurityPolicyUri for format expected in s_securityPolicyUriToInfo

* Enhance security policy handling and key computation logic

* Merge SecurityEnhancements.

* Add support for SessionTransferToken. Removed obsolete SoftwareCertificate code.

* Fix NonceLength for None.

* Add support for RSA_DH, more fixes from IOP testings.

* Finish implementation of SecureChannelEnhancements.

* Rename EccUtils.cs to CryptoUtils.cs

* Address feedback from reviewers.

* Fix CoPilot flagged spelling errors.

* Rename EccUtils to CryptoUtils

* Update version from 1.5.378-preview to 1.5.378

* Fix unit tests.

* Allow SignatureData.Algorithm to be NULL or Empty.

* Fix issue with BrainPool_p256r1_ChaChaPoly

* Fix RSA_DH_AesGcm

* Fix OSC/padding by deriving HMAC keys, tightening symmetric size math, and correcting ECC_brainpoolP384r1/Basic128Rsa15 IV, signature, padding, and nonce parameters.

* Policies without asymmetric encryption (ECC) return the plaintext when encrypting user tokens; this prevents null payloads from causing BadIdentityTokenInvalid.

* Reserve outer CBC padding for avoiding SymetricEncryptAndSign->AddPadding to overwrite next fields (signature)

* Nonce stored as byte array in SessionConfiguration; Sesion snapshot restores ServerNonce and reconstructs ECC ephemeral key Nonce from bytes and policy

* Added _AesGcm and _ChaChaPoly variants to BuildSupportedSecurityPolicies() for all six ECC certificate types (nistP256, nistP384, brainpoolP256r1, brainpoolP384r1, curve25519, curve448) to SecurityConfiguration. Added Sign and SignAndEncrypt endpoints for the four ECC AesGcm/ChaChaPoly policy pairs (nistP256, nistP384, brainpoolP256r1, brainpoolP384r1) to ServerFixture.

* make ephemeralKeyPolicyUri nullable

* GenerateSecret also for NET7 and NET8

* Adjust Basic128Rsa15 policy properties for backword compatibility

* Exclude unsuported AEAD policies from .NET Framework client tests

* Addapt to new changes (still build fail)

* Addapt code to make it compile

* Fixed failing build on net48 (by ignoring potential null ref which is not reported on other newer targets)

* Preserve the certificate reference in Clone() so copied handlers can still sign

* Remove extra code and addapt to existing master configuration settings

* Filter *_AesGcm and *_ChaChaPoly security policies based on actual runtime support, so unsupported AEAD policies are not advertised or selected on older frameworks

* Expand ECC/RSA policy test coverage and keep Basic128Rsa15 nonce length backward-compatible

* Fix ReconnectSessionOnAlternateChannel _AES and _ChaCha policies

* Fixed IgnoreIfPolicyNotAdvertised so it now fetches endpoints on-demand (instead of relying on Endpoints being preloaded by earlier tests), which avoids false ignores when running tests directlyy

* Merge with commit 5e627f2ca1 from secure-channel-enhancements-2025-11 branch

* minor log mesatge formating

* Fix ClientLockoutTests

* Add ServerFixture policies upfront only if framework and runtime capability supports them

* A few cosmetic/config changes as review sugested

* Moved the session/security handling from StandardServer into a dedicated helper

* use X509IdentityTokenHandler from secure-channel-enhancements-2025-11

* Removed unused Opc.Ua.Types.UnitTests.csproj

* test(client): fix Basic128Rsa15 reconnect token-policy coverage

Advertise an explicit Basic128Rsa15 user token policy in the test fixture and tighten the reconnect test preconditions for non-advertised policies.

* test(client): fix session nonce persistence test helpers

Replace the generic reflection helpers in SessionTests with explicit client/server nonce accessors that match the actual field types.

Add a short Session comment to explain why client and server nonces currently use different representations.

* Merge branch 'master' into secure-channel-enhancements-2025-11-merge5

Merge with latest master and fix conflicts.

* Removed unused Opc.Ua.Types.UnitTests.csproj

* test(client): fix Basic128Rsa15 reconnect token-policy coverage

Advertise an explicit Basic128Rsa15 user token policy in the test fixture and tighten the reconnect test preconditions for non-advertised policies.

* test(client): fix session nonce persistence test helpers

Replace the generic reflection helpers in SessionTests with explicit client/server nonce accessors that match the actual field types.

Add a short Session comment to explain why client and server nonces currently use different representations.

* Build fixes

* Fix build

* update

* Minor updates

* Fix tests

* Add code to check all Endpoints.

* Update Design files to 1.05.7

* Run code fixers, add missing docs

* Fix build

* Revert removal of using

* Increase build timeout

---------

Co-authored-by: mrsuciu <Mircea-Adrian.Suciu@Softing.com>
Co-authored-by: Randy Armstrong <randy@sparhawksoftware.com>
2026-04-16 18:56:42 +00:00
KarenKrill fc21f2df8c Fixed timer leaks in ChannelAsyncOperation.EndAsync (#3669)
* Fixed timer leaks in ChannelAsyncOperation.EndAsync (added delay task cancellation)

* Added WaitAsync with timeout PolyFill extension for versions <= .NET 6.0

* The ChannelAsyncOperation.EndAsync has been unified across all .NET versions using polyfills for older versions (< .NET 6.0)

* Fixed missing "using" operator
2026-04-16 17:58:24 +02:00
Marc Schier abc813f56c Support UANodeset export / import under AOT (#3667) 2026-04-15 13:38:52 +02:00
f6eb72e9bb docs: document three approaches for decoding ComplexTypes from OPC UA servers (#3664)
Document three approaches for working with custom OPC UA types in ComplexTypes.md

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/40780404-d86e-40c1-b099-e2400be745a4

Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>
Co-authored-by: Marc Schier <marcschier@hotmail.com>
2026-04-15 07:36:30 +02:00
Marc Schier 64ca85fce3 Increase code coverage across solution (#3662)
Add additional tests to increase code coverage across the solution
2026-04-14 13:32:10 +02:00
Marc Schier fd41681f4b Add support to publish OPC UA applications as Native AOT (#3633)
* make most ptojects aot compatible
* Remove newtonsoft
* Migrate all projects from Mono.Options to System.CommandLine 2.0.5
* Fix array clone
* Replace serializers for storage using new attribute driven  type geberator
* Add new AOT integration tests covering all functional areas
* Documentation updates
2026-04-13 20:52:29 +02:00
Copilotandromanett 4a0df19737 Improve runtime of Client Tests via fixture-level parallelization and fix parallel test isolation (#3655)
* Initial plan

* Add parallelization to client tests: extract transfer/reconnect tests, add Parallelizable attributes

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/7c095546-89fb-4661-b7df-873e74fb5b72

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Fix iteration counter message in TransferSubscriptionDebugAsync

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/7c095546-89fb-4661-b7df-873e74fb5b72

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Fix test isolation: thread-safe port allocation and retryStartServer bug

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/8f93f916-5ad8-4d07-925b-5394f1526eea

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Add max retry limit to GetNextFreeIPPort and clarify port<=0 condition comment

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/8f93f916-5ad8-4d07-925b-5394f1526eea

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Fix parallel test isolation: remove port registry, broader ConnectAsync retry

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/2db03a79-d996-4dd1-a570-8105197f6713

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Fix parallel HTTPS test isolation: replace static Startup.Listener singleton with per-port ConcurrentDictionary

Root cause: HttpsTransportListener.Startup.Listener was a static singleton that was overwritten
each time a new HTTPS server started. With parallel fixture execution (ClientTest, ClientBatchTest,
NodeCacheAsyncTest etc. all running their https/opc.https instances simultaneously), the last
server to start captured the global Listener. Requests arriving at any earlier server's Kestrel
instance were then dispatched to the wrong listener, causing BadServerHalted / NullReferenceException
cascade failures.

Fix: Replace Startup.Listener (static singleton) with Startup.Listeners (ConcurrentDictionary<int,
HttpsTransportListener> keyed by port). Start() registers the listener by port; Dispose() removes it.
The Kestrel middleware now routes each request to the correct listener using context.Connection.LocalPort.

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/a2a66689-1c27-4834-ab0b-32a2a0974fd6

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Add defensive try-catch in Dispose for Listeners.TryRemove per code review

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/a2a66689-1c27-4834-ab0b-32a2a0974fd6

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Remove static Startup.Listeners; inject HttpsTransportListener via IWebHostBuilder DI

Register the listener instance in the web host DI container via
IWebHostBuilder.ConfigureServices(services => services.AddSingleton(this)).
Startup.Configure receives it as a method-injected parameter, eliminating all
static state from the Startup class.

Constructor injection was considered but doesn't work on .NET 8+ where HostBuilder
activates Startup from the host-level service provider, which does not include
services registered via IWebHostBuilder.ConfigureServices. Method injection in
Configure() always resolves from the web-host app container, working correctly on
all target frameworks.

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/108c8840-5555-4c12-83fd-91ed0990d531

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>
2026-04-08 13:18:52 +02:00
7824e6fdeb Enhance role-based access control and add permission tests (#3653)
* Enhance role-based access control and add permission tests

- Improve ValidateRolePermissions logic and add ILogger support for detailed access denial logging
- Expand default roles (add AuthenticatedUser, TrustedApplication)
- Refine RoleBasedIdentity to merge roles and avoid duplicates
- Set UserIdentity default GrantedRoleIds to Anonymous
- Fix MasterNodeManager PrepareValidationCache
- Add comprehensive unit tests for role permission validation and logging

* Fix GDS self-admin role: restore NodeId.Null in GrantedRoleIds for ApplicationSelfAdmin

The RoleBasedIdentity constructor was filtering out roles with null RoleIds
(!role.RoleId.IsNull), which broke the GDS ApplicationSelfAdmin mechanism.
The GDS OnAddSelfAdminUserRolePermissions relies on GrantedRoleIds.Contains(NodeId.Null)
to detect self-admin users (since GdsRole.ApplicationSelfAdmin has RoleId = ExpandedNodeId.Null).

Also remove unused System.Data using statement.

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/3db86efa-c6d6-4e63-947f-156a88210b58

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* fix build

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>
2026-04-08 13:13:43 +02:00
3826c47ca9 [Server] Assign TrustedApplication role automatically per OPC UA Part 3 4.9 Roles (#3652)
* feat: add TrustedApplication role assignment per OPC UA Part 3 §4.9

- Add Role.TrustedApplication static property to RoleBasedIdentity.cs
- Add SessionManager.AddMandatoryRoles protected virtual method that assigns
  TrustedApplication role when session has a ClientCertificate and uses
  MessageSecurityMode.Sign or SignAndEncrypt (per OPC UA Part 3 §4.9)
- Call AddMandatoryRoles in ActivateSessionAsync after identity resolution
- Add ObjectIds.WellKnownRole_TrustedApplication to s_kWellKnownRoles in
  DiagnosticsNodeManager.cs
- Add TrustedApplicationRoleTests.cs with 7 unit tests (mock-based) and
  1 integration test covering positive and negative cases

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/86ac791b-5af2-48c6-96f9-19838dfbbde0

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* fix: update test assertion messages to use 'should' phrasing per codebase conventions

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/86ac791b-5af2-48c6-96f9-19838dfbbde0

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* fix: traverse identity chain in GDS AuthorizationHelper for wrapped RoleBasedIdentity

The TrustedApplication role wraps effectiveIdentity in a new RoleBasedIdentity,
which broke GDS SelfAdmin privilege checks that did `is GdsRoleBasedIdentity`.

- Add InnerIdentity property to RoleBasedIdentity to expose the wrapped inner identity
- Update both CheckSelfAdminPrivilege overloads in AuthorizationHelper to traverse
  the identity chain, so GdsRoleBasedIdentity is found even when wrapped

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/e913ca94-56cf-49d4-a823-fe5861aea8aa

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* refactor: use WithAdditionalRoles virtual method to preserve identity type when adding mandatory roles

- InnerIdentity on RoleBasedIdentity is now protected (not public)
- Add public virtual WithAdditionalRoles() to RoleBasedIdentity so subclasses
  can preserve their concrete type when additional roles are layered on
- GdsRoleBasedIdentity overrides WithAdditionalRoles to return a new
  GdsRoleBasedIdentity with ApplicationId preserved
- SessionManager.AddMandatoryRoles calls WithAdditionalRoles when the identity
  is already a RoleBasedIdentity, so GdsRoleBasedIdentity stays as-is
- AuthorizationHelper reverted to original simple 'is GdsRoleBasedIdentity'
  check (no chain traversal needed)

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/c2854f1f-e220-43d9-aa10-c2c4dca59fd6

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* fix: treat BadRequestInterrupted as expected transient error in ConnectionStabilityTest

During secure channel renewal with a short token lifetime (10s), in-flight
write requests can be interrupted with BadRequestInterrupted. This is expected
behavior during the channel transition and should not count as a test failure.
Added a specific catch clause for ServiceResultException with BadRequestInterrupted
that logs it as informational rather than adding to the error list.

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/d58e5ecd-34de-4a6f-b060-ad6f804f8a7d

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>
Co-authored-by: Roman Ettlinger <romanett98@gmail.com>
2026-04-08 08:17:24 +02:00
Copilotandromanett edbbfa3532 Add tests for ServerBase with multiple IP addresses on the same port & improve CI Stability (#3650)
* Add tests for server with multiple IP addresses on same port

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/adce15e6-8c71-4ba9-8581-cb526b274dfe

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Fix flaky RequestQueueTests by using separate CancellationTokenSources per wait

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/85e9cbc6-7d42-4e6b-8cbe-725b732c72a2

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Fix flaky VerifyRejectedCertsDoNotOverflowStoreAsync test

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/a75f2420-077e-4022-8f73-17b52d6de841

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Fix race in RequestQueueTests: await req3 completion before asserting status code

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/43e310a1-bcf1-45fd-84f1-f5266b1e855d

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Fix flaky TransferSubscriptionOnlyAsync(DisconnectedRepublishDelayedAck): poll for republished notifications and use GreaterThanOrEqualTo assertion

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/266c66da-e8dc-450f-925a-e3c1c50100b3

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Fix ShortHaulStabilityTestAsync: wait for initial subscription notifications before starting writes, reset counters for clean measurement window

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/44e73c6c-3620-4e88-9f4c-852a9fe58d94

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Fix TransferSubscriptionOnlyAsync(DisconnectedRepublishDelayedAck,False,False): extend republish polling to all sendInitialValues combinations

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/e5775ceb-1441-4bef-a9b7-7e80d5a9fb72

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Fix TransferSubscriptionOnlyAsync(DisconnectedRepublishDelayedAck,False,*): restrict republish poll and expected count to sendInitialValues=True

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/dbee6fa2-6ea3-4086-b36e-263288cfdf31

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

* Fix RequestQueue race: increment m_totalThreadCount before Task.Run to prevent spurious worker spawning

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/380346b7-7b31-4390-9438-3725028a0831

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>
2026-04-07 12:45:02 +02:00
f859245ebe Add unit tests for Server Subscription and Session handling (#3639)
* Add comprehensive unit tests for Server Subscription and Session handling

- SubscriptionLifecycleTests.cs: 46 tests covering subscription lifecycle
  (constructor, modify, publish mode, queue overflow, session closed,
  publish timeout, republish, durable subscriptions, triggering, etc.)
- SessionExtendedTests.cs: 29 tests covering session operations
  (expiry, channel validation, locale updates, continuation points,
  diagnostics, ValidateRequest, etc.)

All 578 tests pass (503 existing + 75 new).

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>
Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/d28cf5ce-a461-4e95-b23f-689ec5f5113b

* Remove all #region/#endregion directives from new test files

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/a845e70e-0caa-4ed9-b694-c696b38b7e73

Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>

* Fix net472 build: replace ValueTask.CompletedTask with default(ValueTask)

Agent-Logs-Url: https://github.com/OPCFoundation/UA-.NETStandard/sessions/36d75700-6e4a-4183-909a-95215e97932d

Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>

* merge

* cleanup

* fix

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>
Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>
Co-authored-by: Roman Ettlinger <romanett98@gmail.com>
2026-03-31 10:13:52 +02:00
dependabot[bot] 189a6c7c83 Bump codecov/codecov-action from 5 to 6 (#3645)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5 to 6.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v5...v6)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-31 10:13:37 +02:00
romanett 23f10d89ee [Server] Introduce RequestLifetime for request handling and cancellation (#3643)
Use RequestLifetime throughout the server stack for unified request lifetime and cancellation management. Update all service method signatures, OperationContext, and request processing logic to use RequestLifetime, enabling precise tracking of cancellation reasons with UA StatusCodes. Remove obsolete synchronous request handling and legacy delegates. Update code generation, tests, and interfaces to support the new model. This change improves cancellation, timeout, and abort handling, and prepares the server for advanced request management features.
2026-03-30 13:17:19 +02:00
dependabot[bot] e8e90ca9f4 Bump NUnit3TestAdapter from 6.1.0 to 6.2.0 (#3634)
---
updated-dependencies:
- dependency-name: NUnit3TestAdapter
  dependency-version: 6.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-27 15:00:44 +01:00
Johann Gail 56cb0daf49 Use the cancelation token, where available (#3636) 2026-03-27 14:59:49 +01:00
jnsjll 60278e5aea Consider WriterGroups in MQTT KeepAlive calculation (#3616) 2026-03-27 08:14:10 +01:00
jnsjll 77705f1dca Add support for certificate based MQTT authentication (#3610)
* Add support for certificate based MQTT authentication

* MQTTS tests: modernization of test assertions
2026-03-20 17:27:56 +01:00
romanett 66f44396ff [Server] Improve Request Queue, fix Event handling, add Tests (#3611)
- implement RequestQueue using Channels
- add event load test
- add event integration test verifying event from server object is received
- fix Client Reconnect Test
- fix DiagnosticsNodeManager not creating RootNotifier for Server object
- add Benchmarks for MonitoredItem.QueueEvent
- add serveral UnitTest for DiagnosticsNodeManager
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>
Co-authored-by: Marc Schier <marcschier@users.noreply.github.com>
2026-03-20 08:09:51 +01:00
Copilotandmarcschier 4c78751f67 Fix missing FactoryBuilder.Commit() in dictionary-based complex type loading paths (#3630)
* Fix missing Commit() after LoadDictionaryDataTypesAsync in ComplexTypeSystem

Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com>
2026-03-19 21:10:06 +01:00
Marc Schier 5a1e547250 Code cleanup and modernization of test assertions to comply with project standards. (#3631) 2026-03-19 21:09:40 +01:00
Cristi PogaceanandMarc Schier b8856c9541 fix(SubscriptionManager): replace List with ConcurrentDictionary for abandoned subscriptions (#3617) (#3618)
* fix(SubscriptionManager): replace List with ConcurrentDictionary for abandoned subscriptions (#3612)

* replace the semaphore-protected `List<ISubscription>` used for abandoned subscriptions with a `readonly ConcurrentDictionary<uint, ISubscription>`, eliminating three separate lock acquisitions in `SessionClosed`, `DeleteSubscription`, and the publish loop
* add `DeleteAbandonedSubscriptionsConcurrentlyAsync` integration test to cover the concurrent-delete scenario.

* Fix build

---------

Co-authored-by: Marc Schier <marcschier@hotmail.com>
2026-03-18 15:14:15 +01:00
Marc Schier 03777ecb09 New Json decoder/encoders, array/matrix abstractions, ByteString, and more. (#3619)
- **Collections overhaul** — new/rewritten collection types (`ArrayOf`, `Collections` commits)
- **`Variant` builder/accessor** — new APIs for constructing and accessing Variants
- **`NodeId` operators made explicit** — breaking change for implicit conversions
- **Version bumped to 1.6** with preview build support
- **NumericRange** uses Variant
- **object** type accessors and general usage removed.

### 🏗️ Infrastructure
- Build config updated; `.NET 10` targeting
- InternalsVisibleTo moved to `.csproj`
- Pipeline/CI adjustments
2026-03-18 12:23:30 +01:00
Rico Suter eae41a55ac Fix memory leak from undisposed sockets and event handler retention during server restart (#3608)
* Fix memory leak from undisposed sockets and retained event handlers during server restart

When an OPC UA server is stopped and restarted in-process, TcpServerChannel
instances were never garbage collected because UaSCBinaryChannel.Dispose() did
not close the underlying socket. Pending ReceiveAsync operations kept the
channels pinned via SocketAsyncEngine, causing a steady heap growth per cycle.

Changes:
- Close socket in UaSCBinaryChannel.Dispose() to cancel pending async I/O
- Unsubscribe CertificateValidator.CertificateUpdate in StandardServer.Dispose()
- Unsubscribe ConfigurationWatcher.Changed in StandardServer.Dispose()
- Unsubscribe ConnectionStatusChanged from TransportListeners in ServerBase.Dispose()

Verified over 786 restart cycles with stable heap.

* Remove verbose comment

* Remove redundant event unsubscribe before dispose

* Remove duplicate CertificateUpdate unsubscribe (already existed in master)
2026-03-11 13:29:42 +01:00
Marc Schier cff3743c33 Update build configuration to latest (#3607) 2026-03-10 19:41:00 +01:00
Joost Molenkamp 56486efcdb Fix numeric range equality (#3600)
* test(numeric-range): add failing test

* fix(numeric-range): include sub ranges in equality check

* test(numeric-range): add tests for coverage
2026-03-10 07:31:35 +01:00
Copilotandromanett 562f71cf0d [Server] Use HiResClock for time interval calculations to avoid system clock sensitivity (#3594)
* Initial plan

* Fix time interval calculations to use HiResClock instead of DateTime.UtcNow

Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: romanett <7413710+romanett@users.noreply.github.com>
2026-03-10 06:57:29 +01:00
KircMax 36dc85b525 reuse usertokenpolicy used in connect for Reconnect / "ReactivateSession" (#3581)
* reuse usertokenpolicy

* change assert not null to assert ignore when null

* reportauditevent -> Utils.Clone(session?.IdentityToken?.Token)

* use standard credentials

* only assign to endpoint when not null, in UpdateSession -> also update m_userTokenSecurityPolicyUri, change endpoint configuration only on cloned object

* keep using m_userTokenSecurityPolicyUri in Encrypt

* use 'cleaner clone'
2026-03-10 06:55:47 +01:00
romanett a255facf68 [Server] Implement DiagnosticsNodeManager using AsyncCustomNodemanager (#3595)
* Refactor MonitoredItem.ValueChanged & cert validation

Refactored MonitoredItem.ValueChanged for correctness, performance, and comprehensive test coverage, including improved deadband and array handling. Rewrote equality logic for Variants and arrays. Made certificate validation thread-safe using ConcurrentDictionary and proper semaphore usage. Added extensive unit tests and benchmarks for value change detection.

* Implement DiagnosticsNodeManager using AsyncCustomNodeManager

* Implement CoreNodeManager using AsyncCustomNodeManager
2026-03-09 21:13:36 +01:00
Joost Molenkamp 25a4882145 Fix non enumerable generic type info construction (#3597)
* test(type-info): add failing test

* fix(type-info): require IEnumerable implementation before treating generic type as array

* test(type-info): add test for coverage
2026-03-09 21:12:49 +01:00
KircMax d7d870d28b Add Testcase for EncodeDataValueWithoutValueProperty (#3579)
* add EncodeDataValueWithoutValueProperty

* adjust de and encoder for datavalue -> always handle sourcepico, etc.

* extend EncodeDataValueWithoutValueProperty test

* nullhandling is needed

* keep declaration as it was

* keep binarydecoder, adjust the test case

* add spec. comment

* keep binaryencoder
2026-03-06 20:31:52 +01:00
KircMax 6ea5902f3e fix client session error code for Endpoint does not support usertoken - BadIdentityTokenInvalid instead of rejected (#3591)
* fix client session error code for Endpoint does not support the user identity type provided.

* further places of BadIdentityTokenRejected

* adjust test expectation
2026-03-06 20:22:41 +01:00