From fddc154029b838c2fd83a2eee09d53468dd4cf08 Mon Sep 17 00:00:00 2001 From: Bob Arnson Date: Mon, 19 May 2025 22:17:08 -0400 Subject: Send all tables to extension decompilers. Also fix Firewall decompiler to decompile all possible Firewall tables. Fixes https://github.com/wixtoolset/issues/issues/9070 --- .../FirewallExtensionFixture.cs | 33 +++++++++++++++++++ .../TestData/DecompileWix4Firewall/Firewall4.msi | Bin 0 -> 196608 bytes .../ReferenceSource/Firewall4.wixproj | 6 ++++ .../ReferenceSource/Firewall4.wxs | 36 +++++++++++++++++++++ src/ext/Firewall/wixext/FirewallDecompiler.cs | 31 ++++++++++-------- 5 files changed, 92 insertions(+), 14 deletions(-) create mode 100644 src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/DecompileWix4Firewall/Firewall4.msi create mode 100644 src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/DecompileWix4Firewall/ReferenceSource/Firewall4.wixproj create mode 100644 src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/DecompileWix4Firewall/ReferenceSource/Firewall4.wxs (limited to 'src/ext') diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs b/src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs index 4b9aecd7..9b4cb2b1 100644 --- a/src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs +++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs @@ -621,6 +621,39 @@ namespace WixToolsetTest.Firewall }, locals.ToArray()); } + [TestMethod] + public void CanDecompileWix4FirewallPackage() + { + var folder = TestData.Get(@"TestData\DecompileWix4Firewall"); + var output = Path.Combine(folder, "DecompiledWix4Firewall.xml"); + + var result = WixRunner.Execute( + "msi", + "decompile", + "-ext", Path.GetFullPath(typeof(FirewallExtensionFactory).Assembly.Location), + Path.Combine(folder, "Firewall4.msi"), + "-o", output + ); + result.AssertSuccess(); + + var doc = XDocument.Load(output); + var actual = doc.Descendants() + .Where(e => e.Name.Namespace == "http://wixtoolset.org/schemas/v4/wxs/firewall") + .Select(fe => new { Name = fe.Name.LocalName, Attributes = fe.Attributes().Select(a => $"{a.Name.LocalName}={a.Value}").ToArray() }) + .ToArray(); + + WixAssert.CompareLineByLine(new[] + { + "FirewallException", + "RemoteAddress", + "RemoteAddress", + "RemoteAddress", + "RemoteAddress", + "RemoteAddress", + "FirewallException", + }, actual.Select(a => a.Name).ToArray()); + } + private static void Build(string[] args) { var result = WixRunner.Execute(args); diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/DecompileWix4Firewall/Firewall4.msi b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/DecompileWix4Firewall/Firewall4.msi new file mode 100644 index 00000000..1dde5df4 Binary files /dev/null and b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/DecompileWix4Firewall/Firewall4.msi differ diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/DecompileWix4Firewall/ReferenceSource/Firewall4.wixproj b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/DecompileWix4Firewall/ReferenceSource/Firewall4.wixproj new file mode 100644 index 00000000..0098d7ac --- /dev/null +++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/DecompileWix4Firewall/ReferenceSource/Firewall4.wixproj @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/DecompileWix4Firewall/ReferenceSource/Firewall4.wxs b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/DecompileWix4Firewall/ReferenceSource/Firewall4.wxs new file mode 100644 index 00000000..8a89ad6c --- /dev/null +++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/DecompileWix4Firewall/ReferenceSource/Firewall4.wxs @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/Firewall/wixext/FirewallDecompiler.cs b/src/ext/Firewall/wixext/FirewallDecompiler.cs index 4fafc0a0..dbfc882e 100644 --- a/src/ext/Firewall/wixext/FirewallDecompiler.cs +++ b/src/ext/Firewall/wixext/FirewallDecompiler.cs @@ -4,8 +4,6 @@ namespace WixToolset.Firewall { using System; using System.Collections.Generic; - using System.Reflection; - using System.Security; using System.Xml.Linq; using WixToolset.Data; using WixToolset.Data.WindowsInstaller; @@ -83,7 +81,7 @@ namespace WixToolset.Firewall string[] addresses = ((string)row[2]).Split(','); if (addresses.Length == 1) { - switch(addresses[0]) + switch (addresses[0]) { case "*": firewallException.Add(new XAttribute("Scope", "any")); @@ -482,20 +480,25 @@ namespace WixToolset.Firewall /// Collection of all tables. private void FinalizeFirewallExceptionTable(TableIndexedCollection tables) { - if (tables.TryGetTable("Wix5FirewallException", out var firewallExceptionTable)) + var possibleTableNames = new List() { "WixFirewallException", "Wix4FirewallException", "Wix5FirewallException", }; + + foreach (var tableName in possibleTableNames) { - foreach (var row in firewallExceptionTable.Rows) + if (tables.TryGetTable(tableName, out var firewallExceptionTable)) { - var xmlConfig = this.DecompilerHelper.GetIndexedElement(row); - - var componentId = row.FieldAsString(8); - if (this.DecompilerHelper.TryGetIndexedElement("Component", componentId, out var component)) - { - component.Add(xmlConfig); - } - else + foreach (var row in firewallExceptionTable.Rows) { - this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, firewallExceptionTable.Name, row.GetPrimaryKey(), "Component_", componentId, "Component")); + var xmlConfig = this.DecompilerHelper.GetIndexedElement(row); + + var componentId = row.FieldAsString(8); + if (this.DecompilerHelper.TryGetIndexedElement("Component", componentId, out var component)) + { + component.Add(xmlConfig); + } + else + { + this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, firewallExceptionTable.Name, row.GetPrimaryKey(), "Component_", componentId, "Component")); + } } } } -- cgit v1.2.3-55-g6feb