aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Arnson <bob@firegiant.com>2025-05-19 22:17:08 -0400
committerRob Mensching <rob@firegiant.com>2025-05-28 18:04:34 -0700
commitd0639445af3b754019fa60e380b59e2857956fd9 (patch)
treed8c9bdb054bb3ff0bd35f368c4ce5fa47d02750b
parent5fddbd9e9449d64f405acad0ea285e5889224eac (diff)
downloadwix601.tar.gz
wix601.tar.bz2
wix601.zip
Send all tables to extension decompilers.wix601
Also fix Firewall decompiler to decompile all possible Firewall tables. Fixes https://github.com/wixtoolset/issues/issues/9070
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs33
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/DecompileWix4Firewall/Firewall4.msibin0 -> 196608 bytes
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/DecompileWix4Firewall/ReferenceSource/Firewall4.wixproj6
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/DecompileWix4Firewall/ReferenceSource/Firewall4.wxs36
-rw-r--r--src/ext/Firewall/wixext/FirewallDecompiler.cs31
-rw-r--r--src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs11
6 files changed, 98 insertions, 19 deletions
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
621 }, locals.ToArray()); 621 }, locals.ToArray());
622 } 622 }
623 623
624 [TestMethod]
625 public void CanDecompileWix4FirewallPackage()
626 {
627 var folder = TestData.Get(@"TestData\DecompileWix4Firewall");
628 var output = Path.Combine(folder, "DecompiledWix4Firewall.xml");
629
630 var result = WixRunner.Execute(
631 "msi",
632 "decompile",
633 "-ext", Path.GetFullPath(typeof(FirewallExtensionFactory).Assembly.Location),
634 Path.Combine(folder, "Firewall4.msi"),
635 "-o", output
636 );
637 result.AssertSuccess();
638
639 var doc = XDocument.Load(output);
640 var actual = doc.Descendants()
641 .Where(e => e.Name.Namespace == "http://wixtoolset.org/schemas/v4/wxs/firewall")
642 .Select(fe => new { Name = fe.Name.LocalName, Attributes = fe.Attributes().Select(a => $"{a.Name.LocalName}={a.Value}").ToArray() })
643 .ToArray();
644
645 WixAssert.CompareLineByLine(new[]
646 {
647 "FirewallException",
648 "RemoteAddress",
649 "RemoteAddress",
650 "RemoteAddress",
651 "RemoteAddress",
652 "RemoteAddress",
653 "FirewallException",
654 }, actual.Select(a => a.Name).ToArray());
655 }
656
624 private static void Build(string[] args) 657 private static void Build(string[] args)
625 { 658 {
626 var result = WixRunner.Execute(args); 659 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
--- /dev/null
+++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/DecompileWix4Firewall/Firewall4.msi
Binary files 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 @@
1<Project Sdk="WixToolset.Sdk/4.0.6">
2 <ItemGroup>
3 <PackageVersion Update="WixToolset.Firewall.wixext" Version="4.0.6" />
4 <PackageReference Include="WixToolset.Firewall.wixext" />
5 </ItemGroup>
6</Project> \ 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 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
2 xmlns:fw="http://wixtoolset.org/schemas/v4/wxs/firewall">
3 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
4 <MajorUpgrade DowngradeErrorMessage="(DowngradeError)" />
5 <MediaTemplate EmbedCab="yes" />
6
7 <Feature Id="FAll">
8 <ComponentGroupRef Id="ProductComponents" />
9 </Feature>
10 </Package>
11
12 <Fragment>
13 <StandardDirectory Id="ProgramFilesFolder">
14 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
15 </StandardDirectory>
16 </Fragment>
17
18 <Fragment>
19 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
20 <Component>
21 <File Name="fw.exe" Source="$(sys.SOURCEFILEPATH)">
22 <Shortcut Id="FwShortcut" Directory="INSTALLFOLDER" Name="Firewall" />
23 <fw:FirewallException Id="ExampleFirewall" Description="An app-based firewall exception" Name="ExampleApp" Port="42">
24 <fw:RemoteAddress Value="Defaultgateway" />
25 <fw:RemoteAddress Value="DHCP" />
26 <fw:RemoteAddress Value="DNS" />
27 <fw:RemoteAddress Value="255.255.255.0" />
28 <fw:RemoteAddress Value="1.1.1.1-2.2.2.2" />
29 </fw:FirewallException>
30 </File>
31
32 <fw:FirewallException Description="A port-based firewall exception" Name="ExamplePort" Port="42" Outbound="yes" Scope="localSubnet" />
33 </Component>
34 </ComponentGroup>
35 </Fragment>
36</Wix>
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
4{ 4{
5 using System; 5 using System;
6 using System.Collections.Generic; 6 using System.Collections.Generic;
7 using System.Reflection;
8 using System.Security;
9 using System.Xml.Linq; 7 using System.Xml.Linq;
10 using WixToolset.Data; 8 using WixToolset.Data;
11 using WixToolset.Data.WindowsInstaller; 9 using WixToolset.Data.WindowsInstaller;
@@ -83,7 +81,7 @@ namespace WixToolset.Firewall
83 string[] addresses = ((string)row[2]).Split(','); 81 string[] addresses = ((string)row[2]).Split(',');
84 if (addresses.Length == 1) 82 if (addresses.Length == 1)
85 { 83 {
86 switch(addresses[0]) 84 switch (addresses[0])
87 { 85 {
88 case "*": 86 case "*":
89 firewallException.Add(new XAttribute("Scope", "any")); 87 firewallException.Add(new XAttribute("Scope", "any"));
@@ -482,20 +480,25 @@ namespace WixToolset.Firewall
482 /// <param name="tables">Collection of all tables.</param> 480 /// <param name="tables">Collection of all tables.</param>
483 private void FinalizeFirewallExceptionTable(TableIndexedCollection tables) 481 private void FinalizeFirewallExceptionTable(TableIndexedCollection tables)
484 { 482 {
485 if (tables.TryGetTable("Wix5FirewallException", out var firewallExceptionTable)) 483 var possibleTableNames = new List<string>() { "WixFirewallException", "Wix4FirewallException", "Wix5FirewallException", };
484
485 foreach (var tableName in possibleTableNames)
486 { 486 {
487 foreach (var row in firewallExceptionTable.Rows) 487 if (tables.TryGetTable(tableName, out var firewallExceptionTable))
488 { 488 {
489 var xmlConfig = this.DecompilerHelper.GetIndexedElement(row); 489 foreach (var row in firewallExceptionTable.Rows)
490
491 var componentId = row.FieldAsString(8);
492 if (this.DecompilerHelper.TryGetIndexedElement("Component", componentId, out var component))
493 {
494 component.Add(xmlConfig);
495 }
496 else
497 { 490 {
498 this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, firewallExceptionTable.Name, row.GetPrimaryKey(), "Component_", componentId, "Component")); 491 var xmlConfig = this.DecompilerHelper.GetIndexedElement(row);
492
493 var componentId = row.FieldAsString(8);
494 if (this.DecompilerHelper.TryGetIndexedElement("Component", componentId, out var component))
495 {
496 component.Add(xmlConfig);
497 }
498 else
499 {
500 this.Messaging.Write(WarningMessages.ExpectedForeignRow(row.SourceLineNumbers, firewallExceptionTable.Name, row.GetPrimaryKey(), "Component_", componentId, "Component"));
501 }
499 } 502 }
500 } 503 }
501 } 504 }
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs b/src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs
index ebf0ae8c..7e28df5d 100644
--- a/src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs
+++ b/src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs
@@ -2852,15 +2852,16 @@ namespace WixToolset.Core.WindowsInstaller.Decompile
2852 break; 2852 break;
2853 2853
2854 default: 2854 default:
2855 if (this.ExtensionsByTableName.TryGetValue(table.Name, out var extension)) 2855 {
2856 { 2856 var decompiled = this.Extensions.FirstOrDefault(x => x.TryDecompileTable(table)) != null;
2857 extension.TryDecompileTable(table); 2857
2858 } 2858 if (!decompiled && !this.SuppressCustomTables)
2859 else if (!this.SuppressCustomTables)
2860 { 2859 {
2861 this.DecompileCustomTable(table); 2860 this.DecompileCustomTable(table);
2862 } 2861 }
2862
2863 break; 2863 break;
2864 }
2864 } 2865 }
2865 } 2866 }
2866 } 2867 }