diff options
author | Bob Arnson <bob@firegiant.com> | 2025-05-19 22:17:08 -0400 |
---|---|---|
committer | Rob Mensching <rob@firegiant.com> | 2025-05-28 18:04:34 -0700 |
commit | d0639445af3b754019fa60e380b59e2857956fd9 (patch) | |
tree | d8c9bdb054bb3ff0bd35f368c4ce5fa47d02750b | |
parent | 5fddbd9e9449d64f405acad0ea285e5889224eac (diff) | |
download | wix601.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
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 | } |