aboutsummaryrefslogtreecommitdiff
path: root/src/ext/Firewall
diff options
context:
space:
mode:
Diffstat (limited to 'src/ext/Firewall')
-rw-r--r--src/ext/Firewall/README.md54
-rw-r--r--src/ext/Firewall/firewall_t.proj6
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs41
-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/ext/Firewall/wixext/WixToolset.Firewall.wixext.csproj5
8 files changed, 161 insertions, 18 deletions
diff --git a/src/ext/Firewall/README.md b/src/ext/Firewall/README.md
index be5801da..eac3acf9 100644
--- a/src/ext/Firewall/README.md
+++ b/src/ext/Firewall/README.md
@@ -1,2 +1,52 @@
1# Firewall.wixext 1# WixToolset.Firewall.wixext - Firewall WiX Toolset Extension
2WixToolset.Firewall.wixext - Firewall WiX Toolset Extension 2
3This WiX Extension provides support for configuring Windows Firewall.
4
5[Web Site][web] | [Documentation][docs] | [Issue Tracker][issues] | [Discussions][discussions]
6
7
8## Open Source Maintenance Fee
9
10To ensure the long-term sustainability of this project, users of this package who generate revenue must pay an [Open Source Maintenance Fee][osmf]. While the source code is freely available under the terms of the [LICENSE][license], this package and other aspects of the project require [adherence to the Open Source Maintenance Fee EULA][eula].
11
12To pay the Maintenance Fee, [become a Sponsor](https://github.com/sponsors/wixtoolset).
13
14
15## Getting started
16
17Add the WiX Extension as a PackageReference to your .wixproj:
18
19```
20<Project Sdk="WixToolset.Sdk/7.0.0">
21 <ItemGroup>
22 <PackageReference Include="WixToolset.Firewall.wixext" Version="7.0.0" />
23 </ItemGroup>
24</Project>
25```
26
27Then add the extension's namespace:
28
29```
30<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
31 xmlns:fw="http://wixtoolset.org/schemas/v4/wxs/firewall">
32
33 ..
34</Wix>
35```
36
37## Additional resources
38
39* [WiX Website][web]
40* [WiX Documentation][docs]
41* [WiX Issue Tracker][issues]
42* [WiX Discussions][discussions]
43
44
45[web]: https://www.firegiant.com/wixtoolset/
46[docs]: https://docs.firegiant.com/wixtoolset/
47[issues]: https://github.com/wixtoolset/issues/issues
48[discussions]: https://github.com/orgs/wixtoolset/discussions
49[sdk]: https://www.nuget.org/packages/WixToolset.Sdk/
50[osmf]: https://opensourcemaintenancefee.org/
51[license]: https://github.com/wixtoolset/wix/blob/main/LICENSE.TXT
52[eula]: https://github.com/wixtoolset/wix/blob/main/OSMFEULA.txt
diff --git a/src/ext/Firewall/firewall_t.proj b/src/ext/Firewall/firewall_t.proj
index 72128805..f2cee0a0 100644
--- a/src/ext/Firewall/firewall_t.proj
+++ b/src/ext/Firewall/firewall_t.proj
@@ -3,7 +3,7 @@
3 3
4<Project Sdk="Microsoft.Build.Traversal"> 4<Project Sdk="Microsoft.Build.Traversal">
5 <ItemGroup> 5 <ItemGroup>
6 <ProjectReference Include="test\WixToolsetTest.Firewall\WixToolsetTest.Firewall.csproj" Targets="Test" /> 6 <ProjectReference Include="test\WixToolsetTest.Firewall\WixToolsetTest.Firewall.csproj" />
7 <ProjectReference Include="wixext\WixToolset.Firewall.wixext.csproj" Targets="Pack" Properties="NoBuild=true" /> 7 <ProjectReference Include="wixext\WixToolset.Firewall.wixext.csproj" Targets="Pack" Properties="NoBuild=true" />
8 </ItemGroup> 8 </ItemGroup>
9 9
@@ -14,4 +14,8 @@
14 14
15 <Delete Files="$(ArtifactsFolder)WixToolset.Firewall.wixext.*.nupkg" /> 15 <Delete Files="$(ArtifactsFolder)WixToolset.Firewall.wixext.*.nupkg" />
16 </Target> 16 </Target>
17
18 <Target Name="WixTest">
19 <MSBuild Projects="test\WixToolsetTest.Firewall\WixToolsetTest.Firewall.csproj" Targets="Test" />
20 </Target>
17</Project> 21</Project>
diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs b/src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs
index 4b9aecd7..3be8af0e 100644
--- a/src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs
+++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs
@@ -1,7 +1,12 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. 1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2 2
3using Microsoft.VisualStudio.TestTools.UnitTesting;
4
5[assembly: Parallelize(Scope = ExecutionScope.MethodLevel)]
6
3namespace WixToolsetTest.Firewall 7namespace WixToolsetTest.Firewall
4{ 8{
9 using System;
5 using System.Data; 10 using System.Data;
6 using System.IO; 11 using System.IO;
7 using System.Linq; 12 using System.Linq;
@@ -621,6 +626,39 @@ namespace WixToolsetTest.Firewall
621 }, locals.ToArray()); 626 }, locals.ToArray());
622 } 627 }
623 628
629 [TestMethod]
630 public void CanDecompileWix4FirewallPackage()
631 {
632 var folder = TestData.Get(@"TestData\DecompileWix4Firewall");
633 var output = Path.Combine(folder, "DecompiledWix4Firewall.xml");
634
635 var result = WixRunner.Execute(
636 "msi",
637 "decompile",
638 "-ext", Path.GetFullPath(typeof(FirewallExtensionFactory).Assembly.Location),
639 Path.Combine(folder, "Firewall4.msi"),
640 "-o", output
641 );
642 result.AssertSuccess();
643
644 var doc = XDocument.Load(output);
645 var actual = doc.Descendants()
646 .Where(e => e.Name.Namespace == "http://wixtoolset.org/schemas/v4/wxs/firewall")
647 .Select(fe => new { Name = fe.Name.LocalName, Attributes = fe.Attributes().Select(a => $"{a.Name.LocalName}={a.Value}").ToArray() })
648 .ToArray();
649
650 WixAssert.CompareLineByLine(new[]
651 {
652 "FirewallException",
653 "RemoteAddress",
654 "RemoteAddress",
655 "RemoteAddress",
656 "RemoteAddress",
657 "RemoteAddress",
658 "FirewallException",
659 }, actual.Select(a => a.Name).ToArray());
660 }
661
624 private static void Build(string[] args) 662 private static void Build(string[] args)
625 { 663 {
626 var result = WixRunner.Execute(args); 664 var result = WixRunner.Execute(args);
@@ -654,8 +692,9 @@ namespace WixToolsetTest.Firewall
654 var folder = TestData.Get(@"TestData", path); 692 var folder = TestData.Get(@"TestData", path);
655 var build = new Builder(folder, typeof(FirewallExtensionFactory), new[] { folder }); 693 var build = new Builder(folder, typeof(FirewallExtensionFactory), new[] { folder });
656 var output = Path.Combine(folder, $"Firewall{ruleName}.xml"); 694 var output = Path.Combine(folder, $"Firewall{ruleName}.xml");
695 var isOfficialBuild = !String.IsNullOrEmpty(Environment.GetEnvironmentVariable("WixOfficialBuild"));
657 696
658 build.BuildAndDecompileAndBuild(Build, Decompile, output, validate: true); 697 build.BuildAndDecompileAndBuild(Build, Decompile, output, validate: isOfficialBuild);
659 698
660 var doc = XDocument.Load(output); 699 var doc = XDocument.Load(output);
661 var actual = doc.Descendants() 700 var actual = doc.Descendants()
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/ext/Firewall/wixext/WixToolset.Firewall.wixext.csproj b/src/ext/Firewall/wixext/WixToolset.Firewall.wixext.csproj
index 25322dc4..f9032032 100644
--- a/src/ext/Firewall/wixext/WixToolset.Firewall.wixext.csproj
+++ b/src/ext/Firewall/wixext/WixToolset.Firewall.wixext.csproj
@@ -7,6 +7,7 @@
7 <RootNamespace>WixToolset.Firewall</RootNamespace> 7 <RootNamespace>WixToolset.Firewall</RootNamespace>
8 <Description>WiX Toolset Firewall Extension</Description> 8 <Description>WiX Toolset Firewall Extension</Description>
9 <Title>WiX Toolset Firewall Extension</Title> 9 <Title>WiX Toolset Firewall Extension</Title>
10 <PackageReadmeFile>README.md</PackageReadmeFile>
10 <DebugType>embedded</DebugType> 11 <DebugType>embedded</DebugType>
11 </PropertyGroup> 12 </PropertyGroup>
12 13
@@ -16,6 +17,10 @@
16 <EmbeddedResource Include="$(OutputPath)..\firewall.wixlib" /> 17 <EmbeddedResource Include="$(OutputPath)..\firewall.wixlib" />
17 </ItemGroup> 18 </ItemGroup>
18 19
20 <ItemGroup>
21 <None Include="..\README.md" Pack="true" PackagePath="\" />
22 </ItemGroup>
23
19 <ItemGroup Condition=" '$(NCrunch)'=='' "> 24 <ItemGroup Condition=" '$(NCrunch)'=='' ">
20 <ProjectReference Include="..\wixlib\firewall.wixproj" ReferenceOutputAssembly="false" SkipGetTargetFrameworkProperties="true" /> 25 <ProjectReference Include="..\wixlib\firewall.wixproj" ReferenceOutputAssembly="false" SkipGetTargetFrameworkProperties="true" />
21 </ItemGroup> 26 </ItemGroup>