From a2740d5eb9e36b4bb627e0666210150ca614fba2 Mon Sep 17 00:00:00 2001 From: Buddhika Chathuranga Date: Mon, 11 May 2020 00:49:35 +0530 Subject: [PATCH] FromXML tweak to validate XML schema ValidateAndLoadXMLSchemaUpdated --- src/Core/WinSWCore/ServiceDescriptor.cs | 23 ++- src/Core/WinSWCore/XMLSchema.xsd | 137 +++++++++++++++++- src/Test/winswTests/ServiceDescriptorTests.cs | 6 +- 3 files changed, 156 insertions(+), 10 deletions(-) diff --git a/src/Core/WinSWCore/ServiceDescriptor.cs b/src/Core/WinSWCore/ServiceDescriptor.cs index 1627658..b9eee89 100755 --- a/src/Core/WinSWCore/ServiceDescriptor.cs +++ b/src/Core/WinSWCore/ServiceDescriptor.cs @@ -140,7 +140,28 @@ namespace winsw public static ServiceDescriptor FromXML(string xml) { var dom = new XmlDocument(); - dom.LoadXml(xml); + XmlReaderSettings settings = new XmlReaderSettings(); + Assembly a = Assembly.GetExecutingAssembly(); + + settings.ValidationType = ValidationType.Schema; + settings.ValidationEventHandler += new ValidationEventHandler((object sender, ValidationEventArgs e) => { + if (e.Severity == XmlSeverityType.Error) + { + throw new XmlException("[Error] XML validation - " + e.Message); + } + }); + + using (Stream schemaStream = a.GetManifestResourceStream("winsw.XMLSchema.xsd")) + { + using (XmlReader schemaReader = XmlReader.Create(schemaStream)) + { + settings.Schemas.Add(null, schemaReader); + } + } + + var reader = XmlReader.Create(new StringReader(xml), settings); + + dom.Load(reader); return new ServiceDescriptor(dom); } diff --git a/src/Core/WinSWCore/XMLSchema.xsd b/src/Core/WinSWCore/XMLSchema.xsd index aeede14..0e079b0 100644 --- a/src/Core/WinSWCore/XMLSchema.xsd +++ b/src/Core/WinSWCore/XMLSchema.xsd @@ -3,12 +3,137 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Test/winswTests/ServiceDescriptorTests.cs b/src/Test/winswTests/ServiceDescriptorTests.cs index b18e9e2..a9274d3 100644 --- a/src/Test/winswTests/ServiceDescriptorTests.cs +++ b/src/Test/winswTests/ServiceDescriptorTests.cs @@ -455,13 +455,13 @@ $@" jenkins "; - - var dom = new XmlDocument(); + XmlDocument dom = new XmlDocument(); dom.LoadXml(seedXml); + var serviceDescriptor = new ServiceDescriptor(dom); var reader = XmlReader.Create(new StringReader(seedXml)); - Assert.That(() => serviceDescriptor.ValidateAndLoadXmlSchema(reader), Throws.TypeOf()); + Assert.That(() => serviceDescriptor.ValidateAndLoadXmlSchema(reader), Throws.Exception.TypeOf()); } } }