From d14c02d4ca6ee820b7111b789d9f904e0fd52804 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Tue, 15 Nov 2022 15:47:48 -0800 Subject: Fix when xmlns placed directly on PermissionEx This is NOT recommended in v4 and its converter will move namespaces to the root element, but WiX v3 allowed it so we'll continued to do so in v4. Fixes 7010 --- .../TestData/PermissionEx/PackageComponents.wxs | 9 ++++-- src/ext/Util/wixext/UtilCompiler.cs | 36 ++++++++++++---------- 2 files changed, 27 insertions(+), 18 deletions(-) (limited to 'src/ext') diff --git a/src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/PackageComponents.wxs b/src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/PackageComponents.wxs index 0634d7d4..09f0a724 100644 --- a/src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/PackageComponents.wxs +++ b/src/ext/Util/test/WixToolsetTest.Util/TestData/PermissionEx/PackageComponents.wxs @@ -1,4 +1,4 @@ - + @@ -15,7 +15,12 @@ - + + diff --git a/src/ext/Util/wixext/UtilCompiler.cs b/src/ext/Util/wixext/UtilCompiler.cs index 47f82ca6..96b2ee0a 100644 --- a/src/ext/Util/wixext/UtilCompiler.cs +++ b/src/ext/Util/wixext/UtilCompiler.cs @@ -1286,6 +1286,8 @@ namespace WixToolset.Util var bits = new BitArray(32); string user = null; + var validBitNames = new HashSet(UtilConstants.StandardPermissions.Concat(UtilConstants.GenericPermissions).Concat(UtilConstants.FolderPermissions)); + foreach (var attrib in element.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) @@ -1297,18 +1299,18 @@ namespace WixToolset.Util this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, UtilSymbolDefinitions.User, user); break; default: - var attribValue = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib); - if (!this.TrySetBitFromName(UtilConstants.StandardPermissions, attrib.Name.LocalName, attribValue, bits, 16)) + if (validBitNames.Contains(attrib.Name.LocalName)) { - if (!this.TrySetBitFromName(UtilConstants.GenericPermissions, attrib.Name.LocalName, attribValue, bits, 28)) + var attribValue = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib); + if (this.TrySetBitFromName(UtilConstants.StandardPermissions, attrib.Name.LocalName, attribValue, bits, 16) || + this.TrySetBitFromName(UtilConstants.GenericPermissions, attrib.Name.LocalName, attribValue, bits, 28) || + this.TrySetBitFromName(UtilConstants.FolderPermissions, attrib.Name.LocalName, attribValue, bits, 0)) { - if (!this.TrySetBitFromName(UtilConstants.FolderPermissions, attrib.Name.LocalName, attribValue, bits, 0)) - { - this.ParseHelper.UnexpectedAttribute(element, attrib); - break; - } + break; } } + + this.ParseHelper.UnexpectedAttribute(element, attrib); break; } } @@ -2477,6 +2479,8 @@ namespace WixToolset.Util break; } + var validBitNames = new HashSet(UtilConstants.StandardPermissions.Concat(UtilConstants.GenericPermissions).Concat(specialPermissions)); + foreach (var attrib in element.Attributes()) { if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) @@ -2500,18 +2504,18 @@ namespace WixToolset.Util user = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); break; default: - var attribValue = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib); - if (!this.TrySetBitFromName(UtilConstants.StandardPermissions, attrib.Name.LocalName, attribValue, bits, 16)) + if (validBitNames.Contains(attrib.Name.LocalName)) { - if (!this.TrySetBitFromName(UtilConstants.GenericPermissions, attrib.Name.LocalName, attribValue, bits, 28)) + var attribValue = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib); + if (this.TrySetBitFromName(UtilConstants.StandardPermissions, attrib.Name.LocalName, attribValue, bits, 16) || + this.TrySetBitFromName(UtilConstants.GenericPermissions, attrib.Name.LocalName, attribValue, bits, 28) || + this.TrySetBitFromName(specialPermissions, attrib.Name.LocalName, attribValue, bits, 0)) { - if (!this.TrySetBitFromName(specialPermissions, attrib.Name.LocalName, attribValue, bits, 0)) - { - this.ParseHelper.UnexpectedAttribute(element, attrib); - break; - } + break; } } + + this.ParseHelper.UnexpectedAttribute(element, attrib); break; } } -- cgit v1.2.3-55-g6feb