From 0b3381007cb201d5ee28aa80990cd14a1c376f18 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Tue, 16 Mar 2021 14:48:48 -0700 Subject: Centralize disallow inner text handling in ParseHalper Fixes wixtoolset/issues#6237 --- src/WixToolset.Core/Compiler.cs | 6 +--- src/WixToolset.Core/CompilerCore.cs | 14 +++----- src/WixToolset.Core/Compiler_EmbeddedUI.cs | 4 +-- src/WixToolset.Core/Compiler_Package.cs | 22 +++---------- src/WixToolset.Core/Compiler_UI.cs | 10 ++---- .../ExtensibilityServices/ParseHelper.cs | 37 +++++++++++++++++++--- 6 files changed, 48 insertions(+), 45 deletions(-) diff --git a/src/WixToolset.Core/Compiler.cs b/src/WixToolset.Core/Compiler.cs index 22f0df8f..d751dde0 100644 --- a/src/WixToolset.Core/Compiler.cs +++ b/src/WixToolset.Core/Compiler.cs @@ -3399,8 +3399,6 @@ namespace WixToolset.Core win64 = true; } - this.Core.VerifyNoInnerText(sourceLineNumbers, node); - // if we have an in-lined Script CustomAction ensure no source or target attributes were provided if (inlineScript) { @@ -4125,7 +4123,7 @@ namespace WixToolset.Core } } - this.Core.VerifyNoInnerText(sourceLineNumbers, node); + this.Core.InnerTextDisallowed(node); if (null == columnName) { @@ -5365,8 +5363,6 @@ namespace WixToolset.Core } } - this.Core.VerifyNoInnerText(sourceLineNumbers, node); - if (CompilerConstants.IntegerNotSet == id) { this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Id")); diff --git a/src/WixToolset.Core/CompilerCore.cs b/src/WixToolset.Core/CompilerCore.cs index ec22a8ec..d737b359 100644 --- a/src/WixToolset.Core/CompilerCore.cs +++ b/src/WixToolset.Core/CompilerCore.cs @@ -206,6 +206,11 @@ namespace WixToolset.Core return false; } + internal void InnerTextDisallowed(XElement element) + { + this.parseHelper.InnerTextDisallowed(element); + } + /// /// Verifies that a filename is ambiguous. /// @@ -1103,15 +1108,6 @@ namespace WixToolset.Core return this.parseHelper.ScheduleActionSymbol(this.ActiveSection, sourceLineNumbers, access, sequence, actionName, condition, beforeAction, afterAction, overridable); } - internal void VerifyNoInnerText(SourceLineNumber sourceLineNumbers, XElement element) - { - var innerText = Common.GetInnerText(element); - if (!String.IsNullOrWhiteSpace(innerText)) - { - this.messaging.Write(ErrorMessages.IllegalInnerText(sourceLineNumbers, element.Name.LocalName, innerText)); - } - } - private static string CreateValueList(ValueListKind kind, IEnumerable values) { // Ideally, we could denote the list kind (and the list itself) directly in the diff --git a/src/WixToolset.Core/Compiler_EmbeddedUI.cs b/src/WixToolset.Core/Compiler_EmbeddedUI.cs index ca658962..ede03933 100644 --- a/src/WixToolset.Core/Compiler_EmbeddedUI.cs +++ b/src/WixToolset.Core/Compiler_EmbeddedUI.cs @@ -80,8 +80,6 @@ namespace WixToolset.Core } } - this.Core.VerifyNoInnerText(sourceLineNumbers, node); - if (null == id) { id = this.Core.CreateIdentifier("mec", source, type.ToString()); @@ -92,6 +90,8 @@ namespace WixToolset.Core this.Core.Write(ErrorMessages.ExpectedAttributes(sourceLineNumbers, node.Name.LocalName, "BinarySource", "FileSource", "PropertySource")); } + this.Core.ParseForExtensionElements(node); + if (!this.Core.EncounteredError) { this.Core.AddSymbol(new MsiEmbeddedChainerSymbol(sourceLineNumbers, id) diff --git a/src/WixToolset.Core/Compiler_Package.cs b/src/WixToolset.Core/Compiler_Package.cs index 1dac5399..dfd7d9e4 100644 --- a/src/WixToolset.Core/Compiler_Package.cs +++ b/src/WixToolset.Core/Compiler_Package.cs @@ -1157,8 +1157,6 @@ namespace WixToolset.Core } } - this.Core.VerifyNoInnerText(sourceLineNumbers, node); - if (null == sddl) { this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Sddl")); @@ -1447,8 +1445,6 @@ namespace WixToolset.Core this.Core.Write(ErrorMessages.CannotAuthorSpecialProperties(sourceLineNumbers, id.Id)); } - this.Core.VerifyNoInnerText(sourceLineNumbers, node); - if ("ErrorDialog" == id.Id) { this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.Dialog, value); @@ -1473,6 +1469,8 @@ namespace WixToolset.Core } } + this.Core.InnerTextDisallowed(node); + // see if this property is used for appSearch var signatures = this.ParseSearchSignatures(node); @@ -1986,8 +1984,6 @@ namespace WixToolset.Core } } - this.Core.VerifyNoInnerText(sourceLineNumbers, node); - this.Core.ParseForExtensionElements(node); return null == value ? multiStringValue ?? "[~]" : String.Concat(value, "[~]", multiStringValue); @@ -2547,8 +2543,6 @@ namespace WixToolset.Core } } - this.Core.VerifyNoInnerText(childSourceLineNumbers, node); - if (customAction && "Custom" == actionName) { this.Core.Write(ErrorMessages.ExpectedAttribute(childSourceLineNumbers, child.Name.LocalName, "Action")); @@ -2637,6 +2631,8 @@ namespace WixToolset.Core } } } + + this.Core.InnerTextDisallowed(node); } @@ -3012,8 +3008,6 @@ namespace WixToolset.Core } } - this.Core.VerifyNoInnerText(sourceLineNumbers, node); - if (privilege == null) { this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Name")); @@ -3375,8 +3369,6 @@ namespace WixToolset.Core } } - this.Core.VerifyNoInnerText(sourceLineNumbers, node); - if (argument == null) { this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Value")); @@ -3715,8 +3707,6 @@ namespace WixToolset.Core } } - this.Core.VerifyNoInnerText(sourceLineNumbers, node); - if (null == id) { this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Id")); @@ -3824,8 +3814,6 @@ namespace WixToolset.Core } } - this.Core.VerifyNoInnerText(sourceLineNumbers, node); - if (null == id) { this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Id")); @@ -4304,8 +4292,6 @@ namespace WixToolset.Core } } - this.Core.VerifyNoInnerText(sourceLineNumbers, node); - if (String.IsNullOrEmpty(key)) { this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Key")); diff --git a/src/WixToolset.Core/Compiler_UI.cs b/src/WixToolset.Core/Compiler_UI.cs index 5cc9b5a0..d712ec91 100644 --- a/src/WixToolset.Core/Compiler_UI.cs +++ b/src/WixToolset.Core/Compiler_UI.cs @@ -700,8 +700,6 @@ namespace WixToolset.Core this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Action")); } - this.Core.VerifyNoInnerText(sourceLineNumbers, node); - this.Core.ParseForExtensionElements(node); if (!this.Core.EncounteredError) @@ -748,8 +746,6 @@ namespace WixToolset.Core } } - this.Core.VerifyNoInnerText(sourceLineNumbers, node); - if (null == id) { id = this.Core.CreateIdentifier("txt", text); @@ -1425,7 +1421,7 @@ namespace WixToolset.Core } } - this.Core.VerifyNoInnerText(sourceLineNumbers, node); + this.Core.InnerTextDisallowed(child); if (!String.IsNullOrEmpty(text) && null != sourceFile) { @@ -1443,6 +1439,8 @@ namespace WixToolset.Core } } + this.Core.InnerTextDisallowed(node); + // If the radio buttons have icons, then we need to add the icon attribute. switch (radioButtonsType) { @@ -1694,8 +1692,6 @@ namespace WixToolset.Core } } - this.Core.VerifyNoInnerText(sourceLineNumbers, node); - if (null == control) { this.Core.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, node.Name.LocalName, "Control")); diff --git a/src/WixToolset.Core/ExtensibilityServices/ParseHelper.cs b/src/WixToolset.Core/ExtensibilityServices/ParseHelper.cs index 8e9f48c4..a9a0fa9d 100644 --- a/src/WixToolset.Core/ExtensibilityServices/ParseHelper.cs +++ b/src/WixToolset.Core/ExtensibilityServices/ParseHelper.cs @@ -6,6 +6,8 @@ namespace WixToolset.Core.ExtensibilityServices using System.Collections.Generic; using System.Diagnostics; using System.Globalization; + using System.Linq; + using System.Xml; using System.Xml.Linq; using WixToolset.Data; using WixToolset.Data.Symbols; @@ -642,6 +644,19 @@ namespace WixToolset.Core.ExtensibilityServices return value?.Trim(); } + public void InnerTextDisallowed(XElement element) + { + if (element.Nodes().Any(n => XmlNodeType.Text == n.NodeType || XmlNodeType.CDATA == n.NodeType)) + { + var innerText = Common.GetInnerText(element); + if (!String.IsNullOrWhiteSpace(innerText)) + { + var sourceLineNumbers = this.GetSourceLineNumbers(element); + this.Messaging.Write(ErrorMessages.IllegalInnerText(sourceLineNumbers, element.Name.LocalName, innerText)); + } + } + } + public bool IsValidIdentifier(string value) { return Common.IsIdentifier(value); @@ -714,17 +729,31 @@ namespace WixToolset.Core.ExtensibilityServices public void ParseForExtensionElements(IEnumerable extensions, Intermediate intermediate, IntermediateSection section, XElement element) { - foreach (var child in element.Elements()) + var checkInnerText = false; + + foreach (var child in element.Nodes()) { - if (element.Name.Namespace == child.Name.Namespace) + if (child is XElement childElement) { - this.UnexpectedElement(element, child); + if (element.Name.Namespace == childElement.Name.Namespace) + { + this.UnexpectedElement(element, childElement); + } + else + { + this.ParseExtensionElement(extensions, intermediate, section, element, childElement); + } } else { - this.ParseExtensionElement(extensions, intermediate, section, element, child); + checkInnerText = true; } } + + if (checkInnerText) + { + this.InnerTextDisallowed(element); + } } public WixActionSymbol ScheduleActionSymbol(IntermediateSection section, SourceLineNumber sourceLineNumbers, AccessModifier access, SequenceTable sequence, string actionName, string condition, string beforeAction, string afterAction, bool overridable = false) -- cgit v1.2.3-55-g6feb