From 3efe3f3a8682f333741b3c52e10eea2297f43dc9 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Thu, 9 Mar 2023 03:43:57 -0800 Subject: Prevent direct references to platform neutral WixUI Fixes 7265 --- .../TestData/InvalidUIRef/Package.wxs | 23 ++++++ .../test/WixToolsetTest.UI/UIExtensionFixture.cs | 68 ++++++++++++------ src/ext/UI/wixext/UICompiler.cs | 1 - src/ext/UI/wixlib/WixUI_Advanced.wxs | 26 +++---- src/ext/UI/wixlib/WixUI_FeatureTree.wxs | 22 +++--- src/ext/UI/wixlib/WixUI_InstallDir.wxs | 26 +++---- src/ext/UI/wixlib/WixUI_Minimal.wxs | 22 +++--- src/ext/UI/wixlib/WixUI_Mondo.wxs | 26 +++---- src/ext/UI/wixlib/ui.v3.ncrunchproject | 5 ++ src/wix/WixToolset.Converters/WixConverter.cs | 2 +- .../WixToolsetTest.Converters/ConverterFixture.cs | 37 ---------- .../UIExtensionFixture.cs | 82 ++++++++++++++++++++++ 12 files changed, 218 insertions(+), 122 deletions(-) create mode 100644 src/ext/UI/test/WixToolsetTest.UI/TestData/InvalidUIRef/Package.wxs create mode 100644 src/ext/UI/wixlib/ui.v3.ncrunchproject (limited to 'src') diff --git a/src/ext/UI/test/WixToolsetTest.UI/TestData/InvalidUIRef/Package.wxs b/src/ext/UI/test/WixToolsetTest.UI/TestData/InvalidUIRef/Package.wxs new file mode 100644 index 00000000..3cf78b3a --- /dev/null +++ b/src/ext/UI/test/WixToolsetTest.UI/TestData/InvalidUIRef/Package.wxs @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs b/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs index e1f18be5..7f9b7313 100644 --- a/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs +++ b/src/ext/UI/test/WixToolsetTest.UI/UIExtensionFixture.cs @@ -2,11 +2,10 @@ namespace WixToolsetTest.UI { - using System; using System.IO; using System.Linq; - using WixInternal.TestSupport; using WixInternal.Core.TestPackage; + using WixInternal.TestSupport; using WixToolset.Data.WindowsInstaller; using WixToolset.UI; using Xunit; @@ -16,8 +15,8 @@ namespace WixToolsetTest.UI [Fact] public void CanBuildUsingWixUIAdvanced() { - var folder = TestData.Get(@"TestData\WixUI_Advanced"); - var bindFolder = TestData.Get(@"TestData\data"); + var folder = TestData.Get(@"TestData", "WixUI_Advanced"); + var bindFolder = TestData.Get(@"TestData", "data"); var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder }); var results = build.BuildAndQuery(Build, "Binary", "Dialog", "CustomAction", "ControlEvent"); @@ -52,8 +51,8 @@ namespace WixToolsetTest.UI [Fact] public void CanBuildUsingWixUIAdvancedX64() { - var folder = TestData.Get(@"TestData\WixUI_Advanced"); - var bindFolder = TestData.Get(@"TestData\data"); + var folder = TestData.Get(@"TestData", "WixUI_Advanced"); + var bindFolder = TestData.Get(@"TestData", "data"); var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder }); var results = build.BuildAndQuery(BuildX64, "Binary", "Dialog", "CustomAction", "ControlEvent"); @@ -88,8 +87,8 @@ namespace WixToolsetTest.UI [Fact] public void CanBuildUsingWixUIAdvancedARM64() { - var folder = TestData.Get(@"TestData\WixUI_Advanced"); - var bindFolder = TestData.Get(@"TestData\data"); + var folder = TestData.Get(@"TestData", "WixUI_Advanced"); + var bindFolder = TestData.Get(@"TestData", "data"); var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder }); var results = build.BuildAndQuery(BuildARM64, "Binary", "Dialog", "CustomAction", "ControlEvent"); @@ -124,8 +123,8 @@ namespace WixToolsetTest.UI [Fact] public void CanBuildUsingWixUIFeatureTree() { - var folder = TestData.Get(@"TestData\WixUI_FeatureTree"); - var bindFolder = TestData.Get(@"TestData\data"); + var folder = TestData.Get(@"TestData", "WixUI_FeatureTree"); + var bindFolder = TestData.Get(@"TestData", "data"); var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder }); var results = build.BuildAndQuery(BuildX64, "Binary", "Dialog", "CustomAction", "ControlEvent"); @@ -155,8 +154,8 @@ namespace WixToolsetTest.UI [Fact] public void CanBuildUsingWixUIInstallDir() { - var folder = TestData.Get(@"TestData\WixUI_InstallDir"); - var bindFolder = TestData.Get(@"TestData\data"); + var folder = TestData.Get(@"TestData", "WixUI_InstallDir"); + var bindFolder = TestData.Get(@"TestData", "data"); var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder }); var results = build.BuildAndQuery(Build, "Binary", "Dialog", "CustomAction", "Property", "ControlEvent"); @@ -191,8 +190,8 @@ namespace WixToolsetTest.UI [Fact] public void CanBuildUsingWixUIMinimal() { - var folder = TestData.Get(@"TestData\WixUI_Minimal"); - var bindFolder = TestData.Get(@"TestData\data"); + var folder = TestData.Get(@"TestData", "WixUI_Minimal"); + var bindFolder = TestData.Get(@"TestData", "data"); var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder }); var results = build.BuildAndQuery(Build, "Binary", "Dialog", "CustomAction", "ControlEvent"); @@ -220,8 +219,8 @@ namespace WixToolsetTest.UI [Fact] public void CanBuildUsingWixUIMinimalInKazakh() { - var folder = TestData.Get(@"TestData\WixUI_Minimal"); - var bindFolder = TestData.Get(@"TestData\data"); + var folder = TestData.Get(@"TestData", "WixUI_Minimal"); + var bindFolder = TestData.Get(@"TestData", "data"); var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder }); var results = build.BuildAndQuery(BuildInKazakh, "Dialog"); @@ -232,8 +231,8 @@ namespace WixToolsetTest.UI [Fact] public void CanBuildUsingWixUIMinimalAndReadPdb() { - var folder = TestData.Get(@"TestData\WixUI_Minimal"); - var bindFolder = TestData.Get(@"TestData\data"); + var folder = TestData.Get(@"TestData", "WixUI_Minimal"); + var bindFolder = TestData.Get(@"TestData", "data"); using (var fs = new DisposableFileSystem()) { @@ -258,8 +257,8 @@ namespace WixToolsetTest.UI [Fact] public void CanBuildUsingWixUIMondo() { - var folder = TestData.Get(@"TestData\WixUI_Mondo"); - var bindFolder = TestData.Get(@"TestData\data"); + var folder = TestData.Get(@"TestData", "WixUI_Mondo"); + var bindFolder = TestData.Get(@"TestData", "data"); var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder }); var results = build.BuildAndQuery(Build, "Binary", "Dialog", "CustomAction", "ControlEvent"); @@ -292,8 +291,8 @@ namespace WixToolsetTest.UI [Fact] public void CanBuildUsingWixUIMondoLocalized() { - var folder = TestData.Get(@"TestData\WixUI_Mondo"); - var bindFolder = TestData.Get(@"TestData\data"); + var folder = TestData.Get(@"TestData", "WixUI_Mondo"); + var bindFolder = TestData.Get(@"TestData", "data"); var build = new Builder(folder, typeof(UIExtensionFactory), new[] { bindFolder }); var results = build.BuildAndQuery(BuildInGerman, "Control"); @@ -303,6 +302,31 @@ namespace WixToolsetTest.UI }, results.Where(s => s.StartsWith("Control:ErrorDlg\tY")).Select(s => s.Split('\t')[9]).ToArray()); } + [Fact] + public void CannotBuildWithV3LikeUIRef() + { + var folder = TestData.Get(@"TestData", "InvalidUIRef"); + + using (var fs = new DisposableFileSystem()) + { + var intermediateFolder = fs.GetFolder(); + var outputPath = Path.Combine(intermediateFolder, "bin", "test.msi"); + + var args = new[] + { + "build", + Path.Combine(folder, "Package.wxs"), + "-ext", typeof(UIExtensionFactory).Assembly.Location, + "-intermediateFolder", intermediateFolder, + "-o", outputPath, + }; + + var results = WixRunner.Execute(args); + var message = results.Messages.Single(); + Assert.Equal("The identifier 'WixUI:WixUI_Mondo' is inaccessible due to its protection level.", message.ToString()); + } + } + private static void Build(string[] args) { var result = WixRunner.Execute(args) diff --git a/src/ext/UI/wixext/UICompiler.cs b/src/ext/UI/wixext/UICompiler.cs index 8b527454..5f2751c9 100644 --- a/src/ext/UI/wixext/UICompiler.cs +++ b/src/ext/UI/wixext/UICompiler.cs @@ -87,7 +87,6 @@ namespace WixToolset.UI else { var platform = this.Context.Platform == Platform.ARM64 ? "A64" : this.Context.Platform.ToString(); - this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.WixUI, id); this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, SymbolDefinitions.WixUI, $"{id}_{platform}"); if (installDirectory != null) diff --git a/src/ext/UI/wixlib/WixUI_Advanced.wxs b/src/ext/UI/wixlib/WixUI_Advanced.wxs index 1aabbf96..bab05ec9 100644 --- a/src/ext/UI/wixlib/WixUI_Advanced.wxs +++ b/src/ext/UI/wixlib/WixUI_Advanced.wxs @@ -1,7 +1,5 @@ - - + + + + + + + + + + + + @@ -46,7 +56,7 @@ Todo: - + @@ -115,14 +125,4 @@ Todo: - - - - - - - - - - diff --git a/src/ext/UI/wixlib/WixUI_FeatureTree.wxs b/src/ext/UI/wixlib/WixUI_FeatureTree.wxs index e50839d3..6b9b1cf3 100644 --- a/src/ext/UI/wixlib/WixUI_FeatureTree.wxs +++ b/src/ext/UI/wixlib/WixUI_FeatureTree.wxs @@ -1,7 +1,5 @@ - - + - + + + + + + + + + + @@ -65,12 +73,4 @@ Patch dialog sequence: - - - - - - - - diff --git a/src/ext/UI/wixlib/WixUI_InstallDir.wxs b/src/ext/UI/wixlib/WixUI_InstallDir.wxs index 10b32ce8..e3c171df 100644 --- a/src/ext/UI/wixlib/WixUI_InstallDir.wxs +++ b/src/ext/UI/wixlib/WixUI_InstallDir.wxs @@ -1,7 +1,5 @@ - - + - + + + + + + + + + + + + @@ -72,14 +82,4 @@ Patch dialog sequence: - - - - - - - - - - diff --git a/src/ext/UI/wixlib/WixUI_Minimal.wxs b/src/ext/UI/wixlib/WixUI_Minimal.wxs index 6d1709c5..0c69d8f8 100644 --- a/src/ext/UI/wixlib/WixUI_Minimal.wxs +++ b/src/ext/UI/wixlib/WixUI_Minimal.wxs @@ -1,7 +1,5 @@ - - + - + + + + + + + + + + @@ -59,12 +67,4 @@ Patch dialog sequence: - - - - - - - - diff --git a/src/ext/UI/wixlib/WixUI_Mondo.wxs b/src/ext/UI/wixlib/WixUI_Mondo.wxs index 92890572..2f883b8b 100644 --- a/src/ext/UI/wixlib/WixUI_Mondo.wxs +++ b/src/ext/UI/wixlib/WixUI_Mondo.wxs @@ -1,7 +1,5 @@ - - + - + + + + + + + + + + + + @@ -74,14 +84,4 @@ Patch dialog sequence: - - - - - - - - - - diff --git a/src/ext/UI/wixlib/ui.v3.ncrunchproject b/src/ext/UI/wixlib/ui.v3.ncrunchproject new file mode 100644 index 00000000..319cd523 --- /dev/null +++ b/src/ext/UI/wixlib/ui.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/src/wix/WixToolset.Converters/WixConverter.cs b/src/wix/WixToolset.Converters/WixConverter.cs index 86664a9f..93e1692d 100644 --- a/src/wix/WixToolset.Converters/WixConverter.cs +++ b/src/wix/WixToolset.Converters/WixConverter.cs @@ -1687,7 +1687,7 @@ namespace WixToolset.Converters && value?.StartsWith("WixUI", StringComparison.OrdinalIgnoreCase) == true && this.OnInformation(ConverterTestType.CustomActionIdsIncludePlatformSuffix, element, "Custom action ids have changed in WiX v4 extensions to support platform-specific custom actions. For more information, see https://wixtoolset.org/docs/fourthree/#converting-custom-wixui-dialog-sets.")) { - // Just warn. + element.Attribute("Value").Value = value + "_$(sys.BUILDARCHSHORT)"; } } diff --git a/src/wix/test/WixToolsetTest.Converters/ConverterFixture.cs b/src/wix/test/WixToolsetTest.Converters/ConverterFixture.cs index 736229da..1705a1ed 100644 --- a/src/wix/test/WixToolsetTest.Converters/ConverterFixture.cs +++ b/src/wix/test/WixToolsetTest.Converters/ConverterFixture.cs @@ -542,42 +542,5 @@ namespace WixToolsetTest.Converters Assert.Equal(2, errors); WixAssert.CompareLineByLine(expected, actual); } - - [Fact] - public void WarnsOnWixUIDoActionControlEvents() - { - var parse = String.Join(Environment.NewLine, - "", - " ", - " ", - " ", - " ", - " ", - ""); - - var expected = new[] - { - "", - " ", - " ", - " ", - " ", - " ", - "", - }; - - var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo); - - var messaging = new MockMessaging(); - var converter = new WixConverter(messaging, 2, null, null); - - var errors = converter.ConvertDocument(document); - - var actual = UnformattedDocumentLines(document); - - Assert.Equal(2, errors); - Assert.Single(messaging.Messages.Where(m => m.Id == 65)); - WixAssert.CompareLineByLine(expected, actual); - } } } diff --git a/src/wix/test/WixToolsetTest.Converters/UIExtensionFixture.cs b/src/wix/test/WixToolsetTest.Converters/UIExtensionFixture.cs index 41a34f71..168751f4 100644 --- a/src/wix/test/WixToolsetTest.Converters/UIExtensionFixture.cs +++ b/src/wix/test/WixToolsetTest.Converters/UIExtensionFixture.cs @@ -3,6 +3,7 @@ namespace WixToolsetTest.Converters { using System; + using System.Linq; using System.Xml.Linq; using WixInternal.TestSupport; using WixToolset.Converters; @@ -55,5 +56,86 @@ namespace WixToolsetTest.Converters var actualLines = UnformattedDocumentLines(document); WixAssert.CompareLineByLine(expected, actualLines); } + + [Fact] + public void FixPrintCustomAction() + { + var parse = String.Join(Environment.NewLine, + "", + " ", + " ", + " ", + " ", + " 1", + " ", + " ", + " ", + " ", + ""); + + var expected = new[] + { + "", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "" + }; + + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo); + + var messaging = new MockMessaging(); + var converter = new WixConverter(messaging, 2, null, null); + + var errors = converter.ConvertDocument(document); + + var actual = UnformattedDocumentLines(document); + + WixAssert.CompareLineByLine(expected, actual); + Assert.Equal(4, errors); + } + + [Fact] + public void FixValidatePathCustomAction() + { + var parse = String.Join(Environment.NewLine, + "", + " ", + " ", + " ", + " ", + " ", + ""); + + var expected = new[] + { + "", + " ", + " ", + " ", + " ", + " ", + "", + }; + + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo); + + var messaging = new MockMessaging(); + var converter = new WixConverter(messaging, 2, null, null); + + var errors = converter.ConvertDocument(document); + + var actual = UnformattedDocumentLines(document); + + WixAssert.CompareLineByLine(expected, actual); + Assert.Single(messaging.Messages.Where(m => m.Id == 65)); + Assert.Equal(2, errors); + } } } -- cgit v1.2.3-55-g6feb