diff --git a/Libraries/Opc.Ua.Client/Session.cs b/Libraries/Opc.Ua.Client/Session.cs index be24837d3..befe45c39 100644 --- a/Libraries/Opc.Ua.Client/Session.cs +++ b/Libraries/Opc.Ua.Client/Session.cs @@ -1295,11 +1295,8 @@ public void Save(string filePath) public void Save(Stream stream, IEnumerable subscriptions) { SubscriptionCollection subscriptionList = new SubscriptionCollection(subscriptions); - XmlWriterSettings settings = new XmlWriterSettings { - Indent = true, - OmitXmlDeclaration = false, - Encoding = Encoding.UTF8 - }; + XmlWriterSettings settings = Utils.DefaultXmlWriterSettings(); + using (XmlWriter writer = XmlWriter.Create(stream, settings)) { DataContractSerializer serializer = new DataContractSerializer(typeof(SubscriptionCollection)); @@ -1326,12 +1323,8 @@ public void Save(string filePath, IEnumerable subscriptions) public IEnumerable Load(Stream stream) { // secure settings - XmlReaderSettings settings = new XmlReaderSettings { - DtdProcessing = DtdProcessing.Prohibit, - XmlResolver = null, - ConformanceLevel = ConformanceLevel.Document, - CloseInput = true - }; + XmlReaderSettings settings = Utils.DefaultXmlReaderSettings(); + settings.CloseInput = true; using (XmlReader reader = XmlReader.Create(stream, settings)) { diff --git a/Libraries/Opc.Ua.PubSub/Configuration/UaPubSubConfigurationHelper.cs b/Libraries/Opc.Ua.PubSub/Configuration/UaPubSubConfigurationHelper.cs index 1543daa0d..a4d71a564 100644 --- a/Libraries/Opc.Ua.PubSub/Configuration/UaPubSubConfigurationHelper.cs +++ b/Libraries/Opc.Ua.PubSub/Configuration/UaPubSubConfigurationHelper.cs @@ -49,10 +49,7 @@ public static void SaveConfiguration(PubSubConfigurationDataType pubSubConfigura { Stream ostrm = File.Open(filePath, FileMode.Create, FileAccess.ReadWrite); - XmlWriterSettings settings = new XmlWriterSettings(); - - settings.Encoding = System.Text.Encoding.UTF8; - settings.Indent = true; + XmlWriterSettings settings = Utils.DefaultXmlWriterSettings(); settings.CloseOutput = true; using (XmlWriter writer = XmlDictionaryWriter.Create(ostrm, settings)) diff --git a/Stack/Opc.Ua.Core/Schema/UANodeSetHelpers.cs b/Stack/Opc.Ua.Core/Schema/UANodeSetHelpers.cs index 0ecd2e749..d12275874 100644 --- a/Stack/Opc.Ua.Core/Schema/UANodeSetHelpers.cs +++ b/Stack/Opc.Ua.Core/Schema/UANodeSetHelpers.cs @@ -54,12 +54,15 @@ public static UANodeSet Read(Stream istrm) /// The input stream. public void Write(Stream istrm) { - StreamWriter writer = new StreamWriter(istrm, Encoding.UTF8); + var setting = Utils.DefaultXmlWriterSettings(); + setting.CloseOutput = true; + + var writer = XmlWriter.Create(istrm, setting); try { XmlSerializer serializer = new XmlSerializer(typeof(UANodeSet)); - serializer.Serialize(writer, this); + serializer.Serialize(writer, this, null); } finally { diff --git a/Stack/Opc.Ua.Core/Stack/Configuration/ApplicationConfiguration.cs b/Stack/Opc.Ua.Core/Stack/Configuration/ApplicationConfiguration.cs index 78e8bf0f0..423bf99e7 100644 --- a/Stack/Opc.Ua.Core/Stack/Configuration/ApplicationConfiguration.cs +++ b/Stack/Opc.Ua.Core/Stack/Configuration/ApplicationConfiguration.cs @@ -407,12 +407,8 @@ public static string GetFilePathFromAppConfig(string sectionName) /// Calls GetType() on the current instance and passes that to the DataContractSerializer. public void SaveToFile(string filePath) { - XmlWriterSettings settings = new XmlWriterSettings() - { - Encoding = Encoding.UTF8, - Indent = true, - CloseOutput = true - }; + XmlWriterSettings settings = Utils.DefaultXmlWriterSettings(); + settings.CloseOutput = true; using (Stream ostrm = File.Open(filePath, FileMode.Create, FileAccess.ReadWrite)) using (XmlWriter writer = XmlDictionaryWriter.Create(ostrm, settings)) diff --git a/Stack/Opc.Ua.Core/Stack/Configuration/ConfiguredEndpoints.cs b/Stack/Opc.Ua.Core/Stack/Configuration/ConfiguredEndpoints.cs index ee7032b81..cff04c516 100644 --- a/Stack/Opc.Ua.Core/Stack/Configuration/ConfiguredEndpoints.cs +++ b/Stack/Opc.Ua.Core/Stack/Configuration/ConfiguredEndpoints.cs @@ -197,7 +197,7 @@ public static ConfiguredEndpointCollection Load(Stream istrm) } catch (Exception e) { - Utils.LogError(e, "Unexpected error loading ConfiguredEnpoints."); + Utils.LogError(e, "Unexpected error loading ConfiguredEndpoints."); throw; } } diff --git a/Stack/Opc.Ua.Core/Stack/Nodes/NodeSet.cs b/Stack/Opc.Ua.Core/Stack/Nodes/NodeSet.cs index c79ea4745..b451a13b0 100644 --- a/Stack/Opc.Ua.Core/Stack/Nodes/NodeSet.cs +++ b/Stack/Opc.Ua.Core/Stack/Nodes/NodeSet.cs @@ -64,10 +64,7 @@ public static NodeSet Read(Stream istrm) /// The input stream. public void Write(Stream istrm) { - XmlWriterSettings settings = new XmlWriterSettings(); - settings.Encoding = Encoding.UTF8; - settings.Indent = true; - XmlWriter writer = XmlWriter.Create(istrm, settings); + var writer = XmlWriter.Create(istrm, Utils.DefaultXmlWriterSettings()); try { diff --git a/Stack/Opc.Ua.Core/Stack/State/NodeState.cs b/Stack/Opc.Ua.Core/Stack/State/NodeState.cs index 334da8e4e..3a40d1aee 100644 --- a/Stack/Opc.Ua.Core/Stack/State/NodeState.cs +++ b/Stack/Opc.Ua.Core/Stack/State/NodeState.cs @@ -528,19 +528,14 @@ protected virtual void Export(ISystemContext context, Node node) /// The stream to write. public void SaveAsXml(ISystemContext context, Stream ostrm) { - ServiceMessageContext messageContext = new ServiceMessageContext(); + ServiceMessageContext messageContext = new ServiceMessageContext { + NamespaceUris = context.NamespaceUris, + ServerUris = context.ServerUris, + Factory = context.EncodeableFactory + }; - messageContext.NamespaceUris = context.NamespaceUris; - messageContext.ServerUris = context.ServerUris; - messageContext.Factory = context.EncodeableFactory; - - XmlWriterSettings settings = new XmlWriterSettings(); - - settings.Encoding = Encoding.UTF8; + XmlWriterSettings settings = Utils.DefaultXmlWriterSettings(); settings.CloseOutput = true; - settings.ConformanceLevel = ConformanceLevel.Document; - settings.Indent = true; - using (XmlWriter writer = XmlWriter.Create(ostrm, settings)) { XmlQualifiedName root = new XmlQualifiedName(this.SymbolicName, context.NamespaceUris.GetString(this.BrowseName.NamespaceIndex)); diff --git a/Stack/Opc.Ua.Core/Stack/State/NodeStateCollection.cs b/Stack/Opc.Ua.Core/Stack/State/NodeStateCollection.cs index b7778d692..8c57da24e 100644 --- a/Stack/Opc.Ua.Core/Stack/State/NodeStateCollection.cs +++ b/Stack/Opc.Ua.Core/Stack/State/NodeStateCollection.cs @@ -73,13 +73,8 @@ public void SaveAsNodeSet(ISystemContext context, Stream ostrm) nodeSet.Add(node, nodeTable.NamespaceUris, nodeTable.ServerUris); } - XmlWriterSettings settings = new XmlWriterSettings(); - - settings.Encoding = Encoding.UTF8; + XmlWriterSettings settings = Utils.DefaultXmlWriterSettings(); settings.CloseOutput = true; - settings.ConformanceLevel = ConformanceLevel.Document; - settings.Indent = true; - using (XmlWriter writer = XmlWriter.Create(ostrm, settings)) { DataContractSerializer serializer = new DataContractSerializer(typeof(NodeSet)); @@ -200,18 +195,14 @@ public void SaveAsXml(ISystemContext context, Stream ostrm) /// public void SaveAsXml(ISystemContext context, Stream ostrm, bool keepStreamOpen) { - XmlWriterSettings settings = new XmlWriterSettings(); - - settings.Encoding = Encoding.UTF8; + XmlWriterSettings settings = Utils.DefaultXmlWriterSettings(); settings.CloseOutput = !keepStreamOpen; - settings.ConformanceLevel = ConformanceLevel.Document; - settings.Indent = true; - - ServiceMessageContext messageContext = new ServiceMessageContext(); - messageContext.NamespaceUris = context.NamespaceUris; - messageContext.ServerUris = context.ServerUris; - messageContext.Factory = context.EncodeableFactory; + ServiceMessageContext messageContext = new ServiceMessageContext { + NamespaceUris = context.NamespaceUris, + ServerUris = context.ServerUris, + Factory = context.EncodeableFactory + }; using (XmlWriter writer = XmlWriter.Create(ostrm, settings)) { diff --git a/Stack/Opc.Ua.Core/Types/Encoders/XmlEncoder.cs b/Stack/Opc.Ua.Core/Types/Encoders/XmlEncoder.cs index 0e00d6eb1..5d7b1c08b 100644 --- a/Stack/Opc.Ua.Core/Types/Encoders/XmlEncoder.cs +++ b/Stack/Opc.Ua.Core/Types/Encoders/XmlEncoder.cs @@ -36,7 +36,7 @@ public XmlEncoder(IServiceMessageContext context) m_context = context; m_nestingLevel = 0; - XmlWriterSettings settings = new XmlWriterSettings(); + XmlWriterSettings settings = Utils.DefaultXmlWriterSettings(); settings.CheckCharacters = false; settings.ConformanceLevel = ConformanceLevel.Auto; settings.NamespaceHandling = NamespaceHandling.OmitDuplicates; diff --git a/Stack/Opc.Ua.Core/Types/Schemas/BinarySchemaValidator.cs b/Stack/Opc.Ua.Core/Types/Schemas/BinarySchemaValidator.cs index a4bf5f131..b6446c65c 100644 --- a/Stack/Opc.Ua.Core/Types/Schemas/BinarySchemaValidator.cs +++ b/Stack/Opc.Ua.Core/Types/Schemas/BinarySchemaValidator.cs @@ -86,11 +86,7 @@ public async Task Validate(string inputPath) /// public override string GetSchema(string typeName) { - XmlWriterSettings settings = new XmlWriterSettings(); - - settings.Encoding = Encoding.UTF8; - settings.Indent = true; - settings.IndentChars = " "; + XmlWriterSettings settings = Utils.DefaultXmlWriterSettings(); MemoryStream ostrm = new MemoryStream(); XmlWriter writer = XmlWriter.Create(ostrm, settings); diff --git a/Stack/Opc.Ua.Core/Types/Schemas/XmlSchemaValidator.cs b/Stack/Opc.Ua.Core/Types/Schemas/XmlSchemaValidator.cs index 1a2e3f7c2..8c507d1e1 100644 --- a/Stack/Opc.Ua.Core/Types/Schemas/XmlSchemaValidator.cs +++ b/Stack/Opc.Ua.Core/Types/Schemas/XmlSchemaValidator.cs @@ -114,11 +114,7 @@ public void Validate(Stream stream) /// public override string GetSchema(string typeName) { - XmlWriterSettings settings = new XmlWriterSettings(); - - settings.Encoding = Encoding.UTF8; - settings.Indent = true; - settings.IndentChars = " "; + XmlWriterSettings settings = Utils.DefaultXmlWriterSettings(); MemoryStream ostrm = new MemoryStream(); XmlWriter writer = XmlWriter.Create(ostrm, settings); diff --git a/Stack/Opc.Ua.Core/Types/Utils/Utils.cs b/Stack/Opc.Ua.Core/Types/Utils/Utils.cs index 5c52d3f21..3020caba4 100644 --- a/Stack/Opc.Ua.Core/Types/Utils/Utils.cs +++ b/Stack/Opc.Ua.Core/Types/Utils/Utils.cs @@ -2801,7 +2801,7 @@ public static string GetAssemblyBuildNumber() /// DtdProcessing Prohibited, XmlResolver disabled and /// ConformanceLevel Document. /// - internal static XmlReaderSettings DefaultXmlReaderSettings() + public static XmlReaderSettings DefaultXmlReaderSettings() { return new XmlReaderSettings() { DtdProcessing = DtdProcessing.Prohibit, @@ -2810,6 +2810,20 @@ internal static XmlReaderSettings DefaultXmlReaderSettings() }; } + /// + /// Returns a XmlWriterSetting with deterministic defaults across .NET versions. + /// + public static XmlWriterSettings DefaultXmlWriterSettings() + { + return new XmlWriterSettings() { + Encoding = Encoding.UTF8, + Indent = true, + ConformanceLevel = ConformanceLevel.Document, + IndentChars = " ", + CloseOutput = false, + }; + } + /// /// Safe version for assignment of InnerXml. /// diff --git a/Tests/Opc.Ua.Core.Tests/Security/Certificates/CertificateValidatorTest.cs b/Tests/Opc.Ua.Core.Tests/Security/Certificates/CertificateValidatorTest.cs index fa732300f..d71733f34 100644 --- a/Tests/Opc.Ua.Core.Tests/Security/Certificates/CertificateValidatorTest.cs +++ b/Tests/Opc.Ua.Core.Tests/Security/Certificates/CertificateValidatorTest.cs @@ -1117,6 +1117,7 @@ public async Task TestInvalidSignature(bool ca, bool trusted) /// Test if a key below min length is detected. /// [Theory] + [NonParallelizable] public async Task TestMinimumKeyRejected(bool trusted) { var cert = CertificateFactory.CreateCertificate(null, null, "CN=1k Key", null) @@ -1165,6 +1166,7 @@ public async Task TestMinimumKeyRejected(bool trusted) /// Test auto accept. /// [Theory] + [NonParallelizable] public async Task TestAutoAccept(bool trusted, bool autoAccept) { var cert = CertificateFactory.CreateCertificate(null, null, "CN=Test", null) diff --git a/Tests/Opc.Ua.Core.Tests/Types/Utils/UtilTests.cs b/Tests/Opc.Ua.Core.Tests/Types/Utils/UtilTests.cs index c22d9546f..3321792b1 100644 --- a/Tests/Opc.Ua.Core.Tests/Types/Utils/UtilTests.cs +++ b/Tests/Opc.Ua.Core.Tests/Types/Utils/UtilTests.cs @@ -268,6 +268,27 @@ public void BuiltInTypeOfSimpleDataTypes() } } + [Test] + public void ValidateXmlWriterSettings() + { + XmlWriterSettings settings = Utils.DefaultXmlWriterSettings(); + Assert.AreEqual(Encoding.UTF8, settings.Encoding); + Assert.AreEqual(false, settings.CloseOutput); + Assert.AreEqual(true, settings.Indent); + Assert.AreEqual(ConformanceLevel.Document, settings.ConformanceLevel); + Assert.AreEqual(false, settings.OmitXmlDeclaration); + Assert.AreEqual(" ", settings.IndentChars); + } + + [Test] + public void ValidateXmlReaderSettings() + { + XmlReaderSettings settings = Utils.DefaultXmlReaderSettings(); + Assert.AreEqual(DtdProcessing.Prohibit, settings.DtdProcessing); + //Assert.AreEqual(null, settings.XmlResolver); + Assert.AreEqual(ConformanceLevel.Document, settings.ConformanceLevel); + Assert.AreEqual(false, settings.CloseInput); + } #endregion }