Skip to content

Commit d063944

Browse files
barnsonrobmen
authored andcommitted
Send all tables to extension decompilers.
Also fix Firewall decompiler to decompile all possible Firewall tables. Fixes wixtoolset/issues#9070
1 parent 5fddbd9 commit d063944

File tree

6 files changed

+98
-19
lines changed

6 files changed

+98
-19
lines changed

src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,39 @@ public void RoundtripAttributesAreCorrectWhenMultipleNestedPropertiesAreUsed()
621621
}, locals.ToArray());
622622
}
623623

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+
624657
private static void Build(string[] args)
625658
{
626659
var result = WixRunner.Execute(args);
Binary file not shown.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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>
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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>

src/ext/Firewall/wixext/FirewallDecompiler.cs

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ namespace WixToolset.Firewall
44
{
55
using System;
66
using System.Collections.Generic;
7-
using System.Reflection;
8-
using System.Security;
97
using System.Xml.Linq;
108
using WixToolset.Data;
119
using WixToolset.Data.WindowsInstaller;
@@ -83,7 +81,7 @@ private void DecompileWixFirewallExceptionTable(Table table)
8381
string[] addresses = ((string)row[2]).Split(',');
8482
if (addresses.Length == 1)
8583
{
86-
switch(addresses[0])
84+
switch (addresses[0])
8785
{
8886
case "*":
8987
firewallException.Add(new XAttribute("Scope", "any"));
@@ -482,20 +480,25 @@ private static XAttribute AttributeIfNotNull(string name, bool value)
482480
/// <param name="tables">Collection of all tables.</param>
483481
private void FinalizeFirewallExceptionTable(TableIndexedCollection tables)
484482
{
485-
if (tables.TryGetTable("Wix5FirewallException", out var firewallExceptionTable))
483+
var possibleTableNames = new List<string>() { "WixFirewallException", "Wix4FirewallException", "Wix5FirewallException", };
484+
485+
foreach (var tableName in possibleTableNames)
486486
{
487-
foreach (var row in firewallExceptionTable.Rows)
487+
if (tables.TryGetTable(tableName, out var firewallExceptionTable))
488488
{
489-
var xmlConfig = this.DecompilerHelper.GetIndexedElement(row);
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
489+
foreach (var row in firewallExceptionTable.Rows)
497490
{
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+
}
499502
}
500503
}
501504
}

src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2852,15 +2852,16 @@ private void DecompileTables(WindowsInstallerData output)
28522852
break;
28532853

28542854
default:
2855-
if (this.ExtensionsByTableName.TryGetValue(table.Name, out var extension))
2856-
{
2857-
extension.TryDecompileTable(table);
2858-
}
2859-
else if (!this.SuppressCustomTables)
2855+
{
2856+
var decompiled = this.Extensions.FirstOrDefault(x => x.TryDecompileTable(table)) != null;
2857+
2858+
if (!decompiled && !this.SuppressCustomTables)
28602859
{
28612860
this.DecompileCustomTable(table);
28622861
}
2862+
28632863
break;
2864+
}
28642865
}
28652866
}
28662867
}

0 commit comments

Comments
 (0)