@joebigelow / wix-1 / commits / 80e60476

change firewall extension table name to Wix5FirewallException

chris_bednarski committed Aug 26, 2023 at 18:51 UTC 80e604761b4f43b9b79a4878fcae360b071a7c35
15 files changed +552 -67
src/ext/Firewall/ca/firewall.cpp
+9 -9
@@ -3,7 +3,7 @@
3 #include "precomp.h"
4
5 LPCWSTR vcsFirewallExceptionQuery =
6 - L"SELECT `Name`, `RemoteAddresses`, `Port`, `Protocol`, `Program`, `Attributes`, `Profile`, `Component_`, `Description`, `Direction` FROM `Wix4FirewallException`";
6 + L"SELECT `Name`, `RemoteAddresses`, `Port`, `Protocol`, `Program`, `Attributes`, `Profile`, `Component_`, `Description`, `Direction` FROM `Wix5FirewallException`";
7 enum eFirewallExceptionQuery { feqName = 1, feqRemoteAddresses, feqPort, feqProtocol, feqProgram, feqAttributes, feqProfile, feqComponent, feqDescription, feqDirection };
8 enum eFirewallExceptionTarget { fetPort = 1, fetApplication, fetUnknown };
9 enum eFirewallExceptionAttributes { feaIgnoreFailures = 1 };
@@ -49,15 +49,15 @@ static UINT SchedFirewallExceptions(
49 ExitOnFailure(hr, "Failed to initialize");
50
51 // anything to do?
52 - if (S_OK != WcaTableExists(L"Wix4FirewallException"))
52 + if (S_OK != WcaTableExists(L"Wix5FirewallException"))
53 {
54 - WcaLog(LOGMSG_STANDARD, "Wix4FirewallException table doesn't exist, so there are no firewall exceptions to configure.");
54 + WcaLog(LOGMSG_STANDARD, "Wix5FirewallException table doesn't exist, so there are no firewall exceptions to configure.");
55 ExitFunction();
56 }
57
58 // query and loop through all the firewall exceptions
59 hr = WcaOpenExecuteView(vcsFirewallExceptionQuery, &hView);
60 - ExitOnFailure(hr, "Failed to open view on Wix4FirewallException table");
60 + ExitOnFailure(hr, "Failed to open view on Wix5FirewallException table");
61
62 while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
63 {
@@ -150,7 +150,7 @@ static UINT SchedFirewallExceptions(
150 {
151 hr = S_OK;
152 }
153 - ExitOnFailure(hr, "failure occured while processing Wix4FirewallException table");
153 + ExitOnFailure(hr, "failure occured while processing Wix5FirewallException table");
154
155 // schedule ExecFirewallExceptions if there's anything to do
156 if (pwzCustomActionData && *pwzCustomActionData)
@@ -159,16 +159,16 @@ static UINT SchedFirewallExceptions(
159
160 if (WCA_TODO_INSTALL == todoSched)
161 {
162 - hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackFirewallExceptionsInstall"), pwzCustomActionData, cFirewallExceptions * COST_FIREWALL_EXCEPTION);
162 + hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION5(L"RollbackFirewallExceptionsInstall"), pwzCustomActionData, cFirewallExceptions * COST_FIREWALL_EXCEPTION);
163 ExitOnFailure(hr, "failed to schedule firewall install exceptions rollback");
164 - hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ExecFirewallExceptionsInstall"), pwzCustomActionData, cFirewallExceptions * COST_FIREWALL_EXCEPTION);
164 + hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION5(L"ExecFirewallExceptionsInstall"), pwzCustomActionData, cFirewallExceptions * COST_FIREWALL_EXCEPTION);
165 ExitOnFailure(hr, "failed to schedule firewall install exceptions execution");
166 }
167 else
168 {
169 - hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"RollbackFirewallExceptionsUninstall"), pwzCustomActionData, cFirewallExceptions * COST_FIREWALL_EXCEPTION);
169 + hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION5(L"RollbackFirewallExceptionsUninstall"), pwzCustomActionData, cFirewallExceptions * COST_FIREWALL_EXCEPTION);
170 ExitOnFailure(hr, "failed to schedule firewall uninstall exceptions rollback");
171 - hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION(L"ExecFirewallExceptionsUninstall"), pwzCustomActionData, cFirewallExceptions * COST_FIREWALL_EXCEPTION);
171 + hr = WcaDoDeferredAction(CUSTOM_ACTION_DECORATION5(L"ExecFirewallExceptionsUninstall"), pwzCustomActionData, cFirewallExceptions * COST_FIREWALL_EXCEPTION);
172 ExitOnFailure(hr, "failed to schedule firewall uninstall exceptions execution");
173 }
174 }
src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs
+140 -20
@@ -18,17 +18,21 @@ namespace WixToolsetTest.Firewall
18 var folder = TestData.Get(@"TestData\UsingFirewall");
19 var build = new Builder(folder, typeof(FirewallExtensionFactory), new[] { folder });
20
21 - var results = build.BuildAndQuery(Build, "Wix4FirewallException", "CustomAction");
21 + var results = build.BuildAndQuery(Build, "Wix5FirewallException", "CustomAction");
22 WixAssert.CompareLineByLine(new[]
23 {
24 - "CustomAction:Wix4ExecFirewallExceptionsInstall_X86\t3073\tWix4FWCA_X86\tExecFirewallExceptions\t",
25 - "CustomAction:Wix4ExecFirewallExceptionsUninstall_X86\t3073\tWix4FWCA_X86\tExecFirewallExceptions\t",
26 - "CustomAction:Wix4RollbackFirewallExceptionsInstall_X86\t3329\tWix4FWCA_X86\tExecFirewallExceptions\t",
27 - "CustomAction:Wix4RollbackFirewallExceptionsUninstall_X86\t3329\tWix4FWCA_X86\tExecFirewallExceptions\t",
28 - "CustomAction:Wix4SchedFirewallExceptionsInstall_X86\t1\tWix4FWCA_X86\tSchedFirewallExceptionsInstall\t",
29 - "CustomAction:Wix4SchedFirewallExceptionsUninstall_X86\t1\tWix4FWCA_X86\tSchedFirewallExceptionsUninstall\t",
30 - "Wix4FirewallException:ExampleFirewall\tExampleApp\t*\t42\t6\t[#filNdJBJmq3UCUIwmXS8x21aAsvqzk]\t0\t2147483647\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tAn app-based firewall exception\t1",
31 - "Wix4FirewallException:fex70IVsYNnbwiHQrEepmdTPKH8XYs\tExamplePort\tLocalSubnet\t42\t6\t\t0\t2147483647\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tA port-based firewall exception\t2",
24 + "CustomAction:Wix5ExecFirewallExceptionsInstall_X86\t3073\tWix5FWCA_X86\tExecFirewallExceptions\t",
25 + "CustomAction:Wix5ExecFirewallExceptionsUninstall_X86\t3073\tWix5FWCA_X86\tExecFirewallExceptions\t",
26 + "CustomAction:Wix5RollbackFirewallExceptionsInstall_X86\t3329\tWix5FWCA_X86\tExecFirewallExceptions\t",
27 + "CustomAction:Wix5RollbackFirewallExceptionsUninstall_X86\t3329\tWix5FWCA_X86\tExecFirewallExceptions\t",
28 + "CustomAction:Wix5SchedFirewallExceptionsInstall_X86\t1\tWix5FWCA_X86\tSchedFirewallExceptionsInstall\t",
29 + "CustomAction:Wix5SchedFirewallExceptionsUninstall_X86\t1\tWix5FWCA_X86\tSchedFirewallExceptionsUninstall\t",
30 + "Wix5FirewallException:ExampleFirewall\tExampleApp\t*\t42\t6\t[#filNdJBJmq3UCUIwmXS8x21aAsvqzk]\t0\t2147483647\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tAn app-based firewall exception\t1",
31 + "Wix5FirewallException:fex_ZpDsnKyHlYiA24JHzvFxm3uLZ8\tExampleDefaultGatewayScope\tDefaultGateway\t4432\t6\t\t0\t2\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tdefaultGateway scope firewall exception\t1",
32 + "Wix5FirewallException:fex6bkfWwpiRGI.wVFx0T7W4LXIHxU\tExampleDHCPScope\tdhcp\t\t211\ttest.exe\t0\t4\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tDHCP scope firewall exception\t1",
33 + "Wix5FirewallException:fex70IVsYNnbwiHQrEepmdTPKH8XYs\tExamplePort\tLocalSubnet\t42\t6\t\t0\t2147483647\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tA port-based firewall exception\t2",
34 + "Wix5FirewallException:fexXxaXCXXFh.UxO_BjmZxi1B1du_Q\tExampleWINSScope\twins\t6573\t6\t\t0\t1\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tWINS scope firewall exception\t1",
35 + "Wix5FirewallException:fexxY71H2ZBkPalv7uid1Yy4qaA_lA\tExampleDNSScope\tdns\t356\t17\t\t0\t2147483647\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tDNS scope firewall exception\t1",
36 }, results);
37 }
38
@@ -38,17 +42,21 @@ namespace WixToolsetTest.Firewall
42 var folder = TestData.Get(@"TestData\UsingFirewall");
43 var build = new Builder(folder, typeof(FirewallExtensionFactory), new[] { folder });
44
41 - var results = build.BuildAndQuery(BuildARM64, "Wix4FirewallException", "CustomAction");
45 + var results = build.BuildAndQuery(BuildARM64, "Wix5FirewallException", "CustomAction");
46 WixAssert.CompareLineByLine(new[]
47 {
44 - "CustomAction:Wix4ExecFirewallExceptionsInstall_A64\t3073\tWix4FWCA_A64\tExecFirewallExceptions\t",
45 - "CustomAction:Wix4ExecFirewallExceptionsUninstall_A64\t3073\tWix4FWCA_A64\tExecFirewallExceptions\t",
46 - "CustomAction:Wix4RollbackFirewallExceptionsInstall_A64\t3329\tWix4FWCA_A64\tExecFirewallExceptions\t",
47 - "CustomAction:Wix4RollbackFirewallExceptionsUninstall_A64\t3329\tWix4FWCA_A64\tExecFirewallExceptions\t",
48 - "CustomAction:Wix4SchedFirewallExceptionsInstall_A64\t1\tWix4FWCA_A64\tSchedFirewallExceptionsInstall\t",
49 - "CustomAction:Wix4SchedFirewallExceptionsUninstall_A64\t1\tWix4FWCA_A64\tSchedFirewallExceptionsUninstall\t",
50 - "Wix4FirewallException:ExampleFirewall\tExampleApp\t*\t42\t6\t[#filNdJBJmq3UCUIwmXS8x21aAsvqzk]\t0\t2147483647\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tAn app-based firewall exception\t1",
51 - "Wix4FirewallException:fex70IVsYNnbwiHQrEepmdTPKH8XYs\tExamplePort\tLocalSubnet\t42\t6\t\t0\t2147483647\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tA port-based firewall exception\t2",
48 + "CustomAction:Wix5ExecFirewallExceptionsInstall_A64\t3073\tWix5FWCA_A64\tExecFirewallExceptions\t",
49 + "CustomAction:Wix5ExecFirewallExceptionsUninstall_A64\t3073\tWix5FWCA_A64\tExecFirewallExceptions\t",
50 + "CustomAction:Wix5RollbackFirewallExceptionsInstall_A64\t3329\tWix5FWCA_A64\tExecFirewallExceptions\t",
51 + "CustomAction:Wix5RollbackFirewallExceptionsUninstall_A64\t3329\tWix5FWCA_A64\tExecFirewallExceptions\t",
52 + "CustomAction:Wix5SchedFirewallExceptionsInstall_A64\t1\tWix5FWCA_A64\tSchedFirewallExceptionsInstall\t",
53 + "CustomAction:Wix5SchedFirewallExceptionsUninstall_A64\t1\tWix5FWCA_A64\tSchedFirewallExceptionsUninstall\t",
54 + "Wix5FirewallException:ExampleFirewall\tExampleApp\t*\t42\t6\t[#filNdJBJmq3UCUIwmXS8x21aAsvqzk]\t0\t2147483647\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tAn app-based firewall exception\t1",
55 + "Wix5FirewallException:fex_ZpDsnKyHlYiA24JHzvFxm3uLZ8\tExampleDefaultGatewayScope\tDefaultGateway\t4432\t6\t\t0\t2\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tdefaultGateway scope firewall exception\t1",
56 + "Wix5FirewallException:fex6bkfWwpiRGI.wVFx0T7W4LXIHxU\tExampleDHCPScope\tdhcp\t\t211\ttest.exe\t0\t4\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tDHCP scope firewall exception\t1",
57 + "Wix5FirewallException:fex70IVsYNnbwiHQrEepmdTPKH8XYs\tExamplePort\tLocalSubnet\t42\t6\t\t0\t2147483647\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tA port-based firewall exception\t2",
58 + "Wix5FirewallException:fexXxaXCXXFh.UxO_BjmZxi1B1du_Q\tExampleWINSScope\twins\t6573\t6\t\t0\t1\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tWINS scope firewall exception\t1",
59 + "Wix5FirewallException:fexxY71H2ZBkPalv7uid1Yy4qaA_lA\tExampleDNSScope\tdns\t356\t17\t\t0\t2147483647\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tDNS scope firewall exception\t1",
60 }, results);
61 }
62
@@ -71,8 +79,17 @@ namespace WixToolsetTest.Firewall
79 {
80 "FirewallException",
81 "FirewallException",
82 + "FirewallException",
83 + "FirewallException",
84 + "FirewallException",
85 + "FirewallException",
86 }, actual.Select(a => a.Name).ToArray());
87 + }
88
89 + [Fact]
90 + public void RoundtripAttributesAreCorrectForApp()
91 + {
92 + var actual = BuildAndDecompileAndBuild("http://wixtoolset.org/schemas/v4/wxs/firewall", "ExampleApp");
93 WixAssert.CompareLineByLine(new[]
94 {
95 "Id=ExampleFirewall",
@@ -85,8 +102,13 @@ namespace WixToolsetTest.Firewall
102 "Description=An app-based firewall exception",
103 "Outbound=no",
104 "xmlns=http://wixtoolset.org/schemas/v4/wxs/firewall",
88 - }, actual[0].Attributes);
105 + }, actual.Attributes);
106 + }
107
108 + [Fact]
109 + public void RoundtripAttributesAreCorrectForPort()
110 + {
111 + var actual = BuildAndDecompileAndBuild("http://wixtoolset.org/schemas/v4/wxs/firewall", "ExamplePort");
112 WixAssert.CompareLineByLine(new[]
113 {
114 "Id=fex70IVsYNnbwiHQrEepmdTPKH8XYs",
@@ -98,7 +120,79 @@ namespace WixToolsetTest.Firewall
120 "Description=A port-based firewall exception",
121 "Outbound=yes",
122 "xmlns=http://wixtoolset.org/schemas/v4/wxs/firewall",
101 - }, actual[1].Attributes);
123 + }, actual.Attributes);
124 + }
125 +
126 + [Fact]
127 + public void RoundtripAttributesAreCorrectForDNSScope()
128 + {
129 + var actual = BuildAndDecompileAndBuild("http://wixtoolset.org/schemas/v4/wxs/firewall", "ExampleDNSScope");
130 + WixAssert.CompareLineByLine(new[]
131 + {
132 + "Id=fexxY71H2ZBkPalv7uid1Yy4qaA_lA",
133 + "Name=ExampleDNSScope",
134 + "Scope=DNS",
135 + "Port=356",
136 + "Protocol=udp",
137 + "Profile=all",
138 + "Description=DNS scope firewall exception",
139 + "Outbound=no",
140 + "xmlns=http://wixtoolset.org/schemas/v4/wxs/firewall",
141 + }, actual.Attributes);
142 + }
143 +
144 + [Fact]
145 + public void RoundtripAttributesAreCorrectForDHCPScope()
146 + {
147 + var actual = BuildAndDecompileAndBuild("http://wixtoolset.org/schemas/v4/wxs/firewall", "ExampleDHCPScope");
148 + WixAssert.CompareLineByLine(new[]
149 + {
150 + "Id=fex6bkfWwpiRGI.wVFx0T7W4LXIHxU",
151 + "Name=ExampleDHCPScope",
152 + "Scope=DHCP",
153 + "Protocol=211",
154 + "Program=test.exe",
155 + "Profile=public",
156 + "Description=DHCP scope firewall exception",
157 + "Outbound=no",
158 + "xmlns=http://wixtoolset.org/schemas/v4/wxs/firewall"
159 + }, actual.Attributes);
160 + }
161 +
162 + [Fact]
163 + public void RoundtripAttributesAreCorrectForWINSScope()
164 + {
165 + var actual = BuildAndDecompileAndBuild("http://wixtoolset.org/schemas/v4/wxs/firewall", "ExampleWINSScope");
166 + WixAssert.CompareLineByLine(new[]
167 + {
168 + "Id=fexXxaXCXXFh.UxO_BjmZxi1B1du_Q",
169 + "Name=ExampleWINSScope",
170 + "Scope=WINS",
171 + "Port=6573",
172 + "Protocol=tcp",
173 + "Profile=domain",
174 + "Description=WINS scope firewall exception",
175 + "Outbound=no",
176 + "xmlns=http://wixtoolset.org/schemas/v4/wxs/firewall",
177 + }, actual.Attributes);
178 + }
179 +
180 + [Fact]
181 + public void RoundtripAttributesAreCorrectForDefaultGatewayScope()
182 + {
183 + var actual = BuildAndDecompileAndBuild("http://wixtoolset.org/schemas/v4/wxs/firewall", "ExampleDefaultGatewayScope");
184 + WixAssert.CompareLineByLine(new[]
185 + {
186 + "Id=fex_ZpDsnKyHlYiA24JHzvFxm3uLZ8",
187 + "Name=ExampleDefaultGatewayScope",
188 + "Scope=defaultGateway",
189 + "Port=4432",
190 + "Protocol=tcp",
191 + "Profile=private",
192 + "Description=defaultGateway scope firewall exception",
193 + "Outbound=no",
194 + "xmlns=http://wixtoolset.org/schemas/v4/wxs/firewall",
195 + }, actual.Attributes);
196 }
197
198 private static void Build(string[] args)
@@ -122,5 +216,31 @@ namespace WixToolsetTest.Firewall
216 var result = WixRunner.Execute(args);
217 result.AssertSuccess();
218 }
219 + class AttributeVerifier
220 + {
221 + public string Name { get; set; }
222 + public string[] Attributes { get; set; }
223 + }
224 +
225 + private static AttributeVerifier BuildAndDecompileAndBuild(string nameSpace, string ruleName)
226 + {
227 + var folder = TestData.Get(@"TestData", "UsingFirewall");
228 + var build = new Builder(folder, typeof(FirewallExtensionFactory), new[] { folder });
229 + var output = Path.Combine(folder, $"Firewall{ruleName}.xml");
230 +
231 + build.BuildAndDecompileAndBuild(Build, Decompile, output);
232 +
233 + var doc = XDocument.Load(output);
234 + var actual = doc.Descendants()
235 + .Where(e => e.Name.Namespace == nameSpace)
236 + .Select(fe => new AttributeVerifier
237 + {
238 + Name = fe.Attributes().Single(a => a.Name.LocalName == "Name").Value,
239 + Attributes = fe.Attributes().Select(a => $"{a.Name.LocalName}={a.Value}").ToArray()
240 + })
241 + .Single(av => av.Name == ruleName);
242 +
243 + return actual;
244 + }
245 }
246 }
src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/PackageComponents.wxs
+4
@@ -12,6 +12,10 @@
12 </File>
13
14 <fw:FirewallException Description="A port-based firewall exception" Name="ExamplePort" Port="42" Outbound="yes" Scope="localSubnet" />
15 + <fw:FirewallException Description="DNS scope firewall exception" Name="ExampleDNSScope" Port="356" Protocol="udp" Scope="DNS" />
16 + <fw:FirewallException Description="DHCP scope firewall exception" Name="ExampleDHCPScope" Program="test.exe" Protocol="211" Scope="DHCP" Profile="public" />
17 + <fw:FirewallException Description="WINS scope firewall exception" Name="ExampleWINSScope" Port="6573" Scope="WINS" Profile="domain"/>
18 + <fw:FirewallException Description="defaultGateway scope firewall exception" Name="ExampleDefaultGatewayScope" Port="4432" Scope="defaultGateway" Profile="private" />
19 </Component>
20 </ComponentGroup>
21 </Fragment>
src/ext/Firewall/wixext/FirewallCompiler.cs
+36 -4
@@ -135,7 +135,12 @@ namespace WixToolset.Firewall
135 protocol = FirewallConstants.NET_FW_IP_PROTOCOL_UDP;
136 break;
137 default:
138 - this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Protocol", protocolValue, "tcp", "udp"));
138 + int parsedProtocol;
139 + if (!Int32.TryParse(protocolValue, out parsedProtocol) || parsedProtocol > 255 || parsedProtocol < 0)
140 + {
141 + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Protocol", protocolValue, "tcp", "udp", "0-255"));
142 + }
143 + protocol = parsedProtocol;
144 break;
145 }
146 break;
@@ -149,8 +154,20 @@ namespace WixToolset.Firewall
154 case "localSubnet":
155 remoteAddresses = "LocalSubnet";
156 break;
157 + case "DNS":
158 + remoteAddresses = "dns";
159 + break;
160 + case "DHCP":
161 + remoteAddresses = "dhcp";
162 + break;
163 + case "WINS":
164 + remoteAddresses = "wins";
165 + break;
166 + case "defaultGateway":
167 + remoteAddresses = "DefaultGateway";
168 + break;
169 default:
153 - this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Scope", scope, "any", "localSubnet"));
170 + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Scope", scope, "any", "localSubnet", "DNS", "DHCP", "WINS", "defaultGateway"));
171 break;
172 }
173 break;
@@ -251,6 +268,21 @@ namespace WixToolset.Firewall
268 this.Messaging.Write(FirewallErrors.NoExceptionSpecified(sourceLineNumbers));
269 }
270
271 + // Ports can only be specified if the protocol is TCP or UDP.
272 + if (!String.IsNullOrEmpty(port) && protocol.HasValue)
273 + {
274 + switch(protocol.Value)
275 + {
276 + case FirewallConstants.NET_FW_IP_PROTOCOL_TCP:
277 + case FirewallConstants.NET_FW_IP_PROTOCOL_UDP:
278 + break;
279 +
280 + default:
281 + this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "Port", "Protocol", protocol.Value.ToString()));
282 + break;
283 + }
284 + }
285 +
286 if (!this.Messaging.EncounteredError)
287 {
288 // at this point, File attribute and File parent element are treated the same
@@ -300,8 +332,8 @@ namespace WixToolset.Firewall
332 symbol.Attributes = attributes;
333 }
334
303 - this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4SchedFirewallExceptionsInstall", this.Context.Platform, CustomActionPlatforms.ARM64 | CustomActionPlatforms.X64 | CustomActionPlatforms.X86);
304 - this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4SchedFirewallExceptionsUninstall", this.Context.Platform, CustomActionPlatforms.ARM64 | CustomActionPlatforms.X64 | CustomActionPlatforms.X86);
335 + this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix5SchedFirewallExceptionsInstall", this.Context.Platform, CustomActionPlatforms.ARM64 | CustomActionPlatforms.X64 | CustomActionPlatforms.X86);
336 + this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix5SchedFirewallExceptionsUninstall", this.Context.Platform, CustomActionPlatforms.ARM64 | CustomActionPlatforms.X64 | CustomActionPlatforms.X86);
337 }
338 }
339
src/ext/Firewall/wixext/FirewallDecompiler.cs
+27 -13
@@ -32,7 +32,7 @@ namespace WixToolset.Firewall
32 {
33 switch (table.Name)
34 {
35 - case "Wix4FirewallException":
35 + case "Wix5FirewallException":
36 this.DecompileWixFirewallExceptionTable(table);
37 break;
38 default:
@@ -69,18 +69,29 @@ namespace WixToolset.Firewall
69 string[] addresses = ((string)row[2]).Split(',');
70 if (addresses.Length == 1)
71 {
72 - // special-case the Scope attribute values
73 - if (addresses[0] == "*")
72 + switch(addresses[0])
73 {
75 - firewallException.Add(new XAttribute("Scope", "any"));
76 - }
77 - else if (addresses[0] == "LocalSubnet")
78 - {
79 - firewallException.Add(new XAttribute("Scope", "localSubnet"));
80 - }
81 - else
82 - {
83 - FirewallDecompiler.AddRemoteAddress(firewallException, addresses[0]);
74 + case "*":
75 + firewallException.Add(new XAttribute("Scope", "any"));
76 + break;
77 + case "LocalSubnet":
78 + firewallException.Add(new XAttribute("Scope", "localSubnet"));
79 + break;
80 + case "dns":
81 + firewallException.Add(new XAttribute("Scope", "DNS"));
82 + break;
83 + case "dhcp":
84 + firewallException.Add(new XAttribute("Scope", "DHCP"));
85 + break;
86 + case "wins":
87 + firewallException.Add(new XAttribute("Scope", "WINS"));
88 + break;
89 + case "DefaultGateway":
90 + firewallException.Add(new XAttribute("Scope", "defaultGateway"));
91 + break;
92 + default:
93 + FirewallDecompiler.AddRemoteAddress(firewallException, addresses[0]);
94 + break;
95 }
96 }
97 else
@@ -107,6 +118,9 @@ namespace WixToolset.Firewall
118 case FirewallConstants.NET_FW_IP_PROTOCOL_UDP:
119 firewallException.Add(new XAttribute("Protocol", "udp"));
120 break;
121 + default:
122 + firewallException.Add(new XAttribute("Protocol", row[4]));
123 + break;
124 }
125 }
126
@@ -183,7 +197,7 @@ namespace WixToolset.Firewall
197 /// <param name="tables">Collection of all tables.</param>
198 private void FinalizeFirewallExceptionTable(TableIndexedCollection tables)
199 {
186 - if (tables.TryGetTable("Wix4FirewallException", out var firewallExceptionTable))
200 + if (tables.TryGetTable("Wix5FirewallException", out var firewallExceptionTable))
201 {
202 foreach (var row in firewallExceptionTable.Rows)
203 {
src/ext/Firewall/wixext/FirewallTableDefinitions.cs
+3 -3
@@ -7,15 +7,15 @@ namespace WixToolset.Firewall
7 public static class FirewallTableDefinitions
8 {
9 public static readonly TableDefinition WixFirewallException = new TableDefinition(
10 - "Wix4FirewallException",
10 + "Wix5FirewallException",
11 FirewallSymbolDefinitions.WixFirewallException,
12 new[]
13 {
14 - new ColumnDefinition("Wix4FirewallException", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "The primary key, a non-localized token.", modularizeType: ColumnModularizeType.Column),
14 + new ColumnDefinition("Wix5FirewallException", ColumnType.String, 72, primaryKey: true, nullable: false, ColumnCategory.Identifier, description: "The primary key, a non-localized token.", modularizeType: ColumnModularizeType.Column),
15 new ColumnDefinition("Name", ColumnType.Localized, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Localizable display name.", modularizeType: ColumnModularizeType.Property),
16 new ColumnDefinition("RemoteAddresses", ColumnType.String, 0, primaryKey: false, nullable: false, ColumnCategory.Formatted, description: "Remote address to accept incoming connections from.", modularizeType: ColumnModularizeType.Property),
17 new ColumnDefinition("Port", ColumnType.String, 0, primaryKey: false, nullable: true, ColumnCategory.Formatted, minValue: 1, description: "Port number.", modularizeType: ColumnModularizeType.Property),
18 - new ColumnDefinition("Protocol", ColumnType.Number, 1, primaryKey: false, nullable: true, ColumnCategory.Integer, minValue: 6, maxValue: 17, description: "Protocol (6=TCP; 17=UDP)."),
18 + new ColumnDefinition("Protocol", ColumnType.Number, 1, primaryKey: false, nullable: true, ColumnCategory.Integer, minValue: 0, maxValue: 255, description: "Protocol (6=TCP; 17=UDP). https://www.iana.org/assignments/protocol-numbers"),
19 new ColumnDefinition("Program", ColumnType.String, 255, primaryKey: false, nullable: true, ColumnCategory.Formatted, description: "Exception for a program (formatted path name).", modularizeType: ColumnModularizeType.Property),
20 new ColumnDefinition("Attributes", ColumnType.Number, 4, primaryKey: false, nullable: true, ColumnCategory.Unknown, description: "Vital=1"),
21 new ColumnDefinition("Profile", ColumnType.Number, 4, primaryKey: false, nullable: false, ColumnCategory.Integer, minValue: 1, maxValue: 2147483647, description: "Profile (1=domain; 2=private; 4=public; 2147483647=all)."),
src/ext/Firewall/wixlib/FirewallExtension_Platform.wxi
+16 -16
@@ -6,32 +6,32 @@
6 <Fragment>
7 <UIRef Id="WixFirewallErrors" />
8 <UI>
9 - <ProgressText Action="$(var.Prefix)SchedFirewallExceptionsInstall$(var.Suffix)" Message="!(loc.WixSchedFirewallExceptionsInstall)" />
10 - <ProgressText Action="$(var.Prefix)SchedFirewallExceptionsUninstall$(var.Suffix)" Message="!(loc.WixSchedFirewallExceptionsUninstall)" />
11 - <ProgressText Action="$(var.Prefix)RollbackFirewallExceptionsInstall$(var.Suffix)" Message="!(loc.WixRollbackFirewallExceptionsInstall)" />
12 - <ProgressText Action="$(var.Prefix)ExecFirewallExceptionsInstall$(var.Suffix)" Message="!(loc.WixExecFirewallExceptionsInstall)" />
13 - <ProgressText Action="$(var.Prefix)RollbackFirewallExceptionsUninstall$(var.Suffix)" Message="!(loc.WixRollbackFirewallExceptionsUninstall)" />
14 - <ProgressText Action="$(var.Prefix)ExecFirewallExceptionsUninstall$(var.Suffix)" Message="!(loc.WixExecFirewallExceptionsUninstall)" />
9 + <ProgressText Action="$(var.Prefix5)SchedFirewallExceptionsInstall$(var.Suffix)" Message="!(loc.WixSchedFirewallExceptionsInstall)" />
10 + <ProgressText Action="$(var.Prefix5)SchedFirewallExceptionsUninstall$(var.Suffix)" Message="!(loc.WixSchedFirewallExceptionsUninstall)" />
11 + <ProgressText Action="$(var.Prefix5)RollbackFirewallExceptionsInstall$(var.Suffix)" Message="!(loc.WixRollbackFirewallExceptionsInstall)" />
12 + <ProgressText Action="$(var.Prefix5)ExecFirewallExceptionsInstall$(var.Suffix)" Message="!(loc.WixExecFirewallExceptionsInstall)" />
13 + <ProgressText Action="$(var.Prefix5)RollbackFirewallExceptionsUninstall$(var.Suffix)" Message="!(loc.WixRollbackFirewallExceptionsUninstall)" />
14 + <ProgressText Action="$(var.Prefix5)ExecFirewallExceptionsUninstall$(var.Suffix)" Message="!(loc.WixExecFirewallExceptionsUninstall)" />
15 </UI>
16
17 - <CustomAction Id="$(var.Prefix)SchedFirewallExceptionsInstall$(var.Suffix)" DllEntry="SchedFirewallExceptionsInstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)FWCA$(var.Suffix)" />
18 - <CustomAction Id="$(var.Prefix)SchedFirewallExceptionsUninstall$(var.Suffix)" DllEntry="SchedFirewallExceptionsUninstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)FWCA$(var.Suffix)" />
19 - <CustomAction Id="$(var.Prefix)RollbackFirewallExceptionsInstall$(var.Suffix)" DllEntry="ExecFirewallExceptions" Execute="rollback" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)FWCA$(var.Suffix)" />
20 - <CustomAction Id="$(var.Prefix)ExecFirewallExceptionsInstall$(var.Suffix)" DllEntry="ExecFirewallExceptions" Execute="deferred" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)FWCA$(var.Suffix)" />
21 - <CustomAction Id="$(var.Prefix)RollbackFirewallExceptionsUninstall$(var.Suffix)" DllEntry="ExecFirewallExceptions" Execute="rollback" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)FWCA$(var.Suffix)" />
22 - <CustomAction Id="$(var.Prefix)ExecFirewallExceptionsUninstall$(var.Suffix)" DllEntry="ExecFirewallExceptions" Execute="deferred" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix)FWCA$(var.Suffix)" />
17 + <CustomAction Id="$(var.Prefix5)SchedFirewallExceptionsInstall$(var.Suffix)" DllEntry="SchedFirewallExceptionsInstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix5)FWCA$(var.Suffix)" />
18 + <CustomAction Id="$(var.Prefix5)SchedFirewallExceptionsUninstall$(var.Suffix)" DllEntry="SchedFirewallExceptionsUninstall" Execute="immediate" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix5)FWCA$(var.Suffix)" />
19 + <CustomAction Id="$(var.Prefix5)RollbackFirewallExceptionsInstall$(var.Suffix)" DllEntry="ExecFirewallExceptions" Execute="rollback" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix5)FWCA$(var.Suffix)" />
20 + <CustomAction Id="$(var.Prefix5)ExecFirewallExceptionsInstall$(var.Suffix)" DllEntry="ExecFirewallExceptions" Execute="deferred" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix5)FWCA$(var.Suffix)" />
21 + <CustomAction Id="$(var.Prefix5)RollbackFirewallExceptionsUninstall$(var.Suffix)" DllEntry="ExecFirewallExceptions" Execute="rollback" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix5)FWCA$(var.Suffix)" />
22 + <CustomAction Id="$(var.Prefix5)ExecFirewallExceptionsUninstall$(var.Suffix)" DllEntry="ExecFirewallExceptions" Execute="deferred" Impersonate="no" Return="check" SuppressModularization="yes" BinaryRef="$(var.Prefix5)FWCA$(var.Suffix)" />
23
24 <!--
25 - We need the firewall on Windows XP SP2 or later.
25 + We need the firewall on Windows Vista or later.
26 -->
27 <InstallExecuteSequence>
28 - <Custom Action="$(var.Prefix)SchedFirewallExceptionsUninstall$(var.Suffix)" Before="RemoveFiles" Overridable="yes" Condition="VersionNT &gt;= 600 OR (VersionNT &gt;= 501 AND ((MsiNTProductType = 1 AND ServicePackLevel &gt;= 2) OR (MsiNTProductType &gt; 1 AND ServicePackLevel &gt;= 1)))" />
29 - <Custom Action="$(var.Prefix)SchedFirewallExceptionsInstall$(var.Suffix)" After="InstallFiles" Overridable="yes" Condition="VersionNT &gt;= 600 OR (VersionNT &gt;= 501 AND ((MsiNTProductType = 1 AND ServicePackLevel &gt;= 2) OR (MsiNTProductType &gt; 1 AND ServicePackLevel &gt;= 1)))" />
28 + <Custom Action="$(var.Prefix5)SchedFirewallExceptionsUninstall$(var.Suffix)" Before="RemoveFiles" Overridable="yes" Condition="VersionNT &gt;= 600" />
29 + <Custom Action="$(var.Prefix5)SchedFirewallExceptionsInstall$(var.Suffix)" After="InstallFiles" Overridable="yes" Condition="VersionNT &gt;= 600" />
30 </InstallExecuteSequence>
31 </Fragment>
32
33 <!-- Firewall Custom Action DLL Definitions -->
34 <Fragment>
35 - <Binary Id="$(var.Prefix)FWCA$(var.Suffix)" SourceFile="!(bindpath.$(var.platform))fwca.dll" />
35 + <Binary Id="$(var.Prefix5)FWCA$(var.Suffix)" SourceFile="!(bindpath.$(var.platform))fwca.dll" />
36 </Fragment>
37 </Include>
src/ext/caDecor.h
+10
@@ -11,3 +11,13 @@
11 #else
12 #define CUSTOM_ACTION_DECORATION(f) L"Wix4" f L"_X86"
13 #endif
14 +
15 +#if defined(_M_ARM64)
16 +#define CUSTOM_ACTION_DECORATION5(f) L"Wix5" f L"_A64"
17 +#elif defined(_M_AMD64)
18 +#define CUSTOM_ACTION_DECORATION5(f) L"Wix5" f L"_X64"
19 +#elif defined(_M_ARM)
20 +#define CUSTOM_ACTION_DECORATION5(f) L"Wix5" f L"_ARM"
21 +#else
22 +#define CUSTOM_ACTION_DECORATION5(f) L"Wix5" f L"_X86"
23 +#endif
src/ext/caDecor.wxi
+6
@@ -8,6 +8,12 @@
8
9 <?define Prefix="Wix4" ?>
10
11 + <?ifdef Prefix5 ?>
12 + <?undef Prefix5 ?>
13 + <?endif?>
14 +
15 + <?define Prefix5="Wix5" ?>
16 +
17 <?ifndef platform ?>
18 <?define platform="x86" ?>
19 <?endif?>
src/test/msi/TestData/FirewallExtensionTests/ProtocolRules/ProtocolRules.wixproj new
+13
@@ -0,0 +1,13 @@
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 +<Project Sdk="WixToolset.Sdk">
3 + <PropertyGroup>
4 + <UpgradeCode>{4D188568-1CCF-4EEE-BC27-17C3DCC83E58}</UpgradeCode>
5 + <ProductComponentsRef>true</ProductComponentsRef>
6 + </PropertyGroup>
7 + <ItemGroup>
8 + <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 + </ItemGroup>
10 + <ItemGroup>
11 + <PackageReference Include="WixToolset.Firewall.wixext" />
12 + </ItemGroup>
13 +</Project>
\ No newline at end of file
src/test/msi/TestData/FirewallExtensionTests/ProtocolRules/product.wxs new
+23
@@ -0,0 +1,23 @@
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 +
3 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:fw="http://wixtoolset.org/schemas/v4/wxs/firewall">
4 + <Fragment>
5 + <ComponentGroup Id="ProductComponents">
6 + <ComponentRef Id="FirewallComponent1"/>
7 + </ComponentGroup>
8 + </Fragment>
9 +
10 + <Fragment>
11 + <Component Id="FirewallComponent1" Guid="E465C8FE-5B81-4553-9CFC-E0CD96B9A36C" Directory="INSTALLFOLDER">
12 + <fw:FirewallException Id="FirewallException09"
13 + Description="WiX Toolset firewall exception rule integration test - protocol TCP"
14 + Name="WiXToolset401 Test - 0009" Protocol="tcp" Port="900" Scope="any" />
15 + <fw:FirewallException Id="FirewallException10"
16 + Description="WiX Toolset firewall exception rule integration test - protocol UDP"
17 + Name="WiXToolset401 Test - 0010" Protocol="udp" Port="1000" Scope="any" />
18 + <fw:FirewallException Id="FirewallException11"
19 + Description="WiX Toolset firewall exception rule integration test - ports can only be specified if protocol is TCP or UDP"
20 + Name="WiXToolset401 Test - 0011" Protocol="134" Program="test.exe" Scope="any" />
21 + </Component>
22 + </Fragment>
23 +</Wix>
src/test/msi/TestData/FirewallExtensionTests/ScopeRules/ScopeRules.wixproj new
+13
@@ -0,0 +1,13 @@
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 +<Project Sdk="WixToolset.Sdk">
3 + <PropertyGroup>
4 + <UpgradeCode>{4D188568-1CCF-4EEE-BC27-17C3DCC83E58}</UpgradeCode>
5 + <ProductComponentsRef>true</ProductComponentsRef>
6 + </PropertyGroup>
7 + <ItemGroup>
8 + <Compile Include="..\..\Templates\Product.wxs" Link="Product.wxs" />
9 + </ItemGroup>
10 + <ItemGroup>
11 + <PackageReference Include="WixToolset.Firewall.wixext" />
12 + </ItemGroup>
13 +</Project>
\ No newline at end of file
src/test/msi/TestData/FirewallExtensionTests/ScopeRules/product.wxs new
+33
@@ -0,0 +1,33 @@
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 +
3 +
4 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:fw="http://wixtoolset.org/schemas/v4/wxs/firewall">
5 + <Fragment>
6 + <ComponentGroup Id="ProductComponents">
7 + <ComponentRef Id="FirewallComponent1"/>
8 + </ComponentGroup>
9 + </Fragment>
10 +
11 + <Fragment>
12 + <Component Id="FirewallComponent1" Guid="515AEDF0-A656-4006-8CE5-848ECCC680BD" Directory="INSTALLFOLDER">
13 + <fw:FirewallException Id="FirewallException12"
14 + Description="WiX Toolset firewall exception rule integration test - scope any"
15 + Name="WiXToolset401 Test - 0012" Scope="any" Port="1200" />
16 + <fw:FirewallException Id="FirewallException13"
17 + Description="WiX Toolset firewall exception rule integration test - scope local subnet"
18 + Name="WiXToolset401 Test - 0013" Scope="localSubnet" Port="1300" />
19 + <fw:FirewallException Id="FirewallException14"
20 + Description="WiX Toolset firewall exception rule integration test - scope DNS"
21 + Name="WiXToolset401 Test - 0014" Scope="DNS" Port="1400" />
22 + <fw:FirewallException Id="FirewallException15"
23 + Description="WiX Toolset firewall exception rule integration test - scope DHCP"
24 + Name="WiXToolset401 Test - 0015" Scope="DHCP" Port="1500" />
25 + <fw:FirewallException Id="FirewallException16"
26 + Description="WiX Toolset firewall exception rule integration test - scope WINS"
27 + Name="WiXToolset401 Test - 0016" Scope="WINS" Port="1600" />
28 + <fw:FirewallException Id="FirewallException17"
29 + Description="WiX Toolset firewall exception rule integration test - scope default gateway"
30 + Name="WiXToolset401 Test - 0017" Scope="defaultGateway" Port="1700" />
31 + </Component>
32 + </Fragment>
33 +</Wix>
src/test/msi/WixToolsetTest.MsiE2E/FirewallExtensionTests.cs
+217
@@ -315,5 +315,222 @@ namespace WixToolsetTest.MsiE2E
315 var log2 = product.UninstallProduct(MSIExec.MSIExecReturnCode.SUCCESS, "NORULENAME=1");
316 Assert.True(LogVerifier.MessageInLogFile(log2, "failed to remove firewall rule"));
317 }
318 +
319 + [RuntimeFact]
320 + public void VarietyOfProtocolValuesCanBeUsed()
321 + {
322 + var product = this.CreatePackageInstaller("ProtocolRules");
323 + product.InstallProduct(MSIExec.MSIExecReturnCode.SUCCESS);
324 +
325 + var expected1 = new RuleDetails("WiXToolset401 Test - 0009")
326 + {
327 + Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW,
328 + Description = "WiX Toolset firewall exception rule integration test - protocol TCP",
329 + Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN,
330 + EdgeTraversal = false,
331 + EdgeTraversalOptions = 0,
332 + Enabled = true,
333 + InterfaceTypes = "All",
334 + LocalAddresses = "*",
335 + Profiles = Int32.MaxValue,
336 + Protocol = 6,
337 + RemoteAddresses = "*",
338 + SecureFlags = 0,
339 + LocalPorts = "900",
340 + RemotePorts = "*",
341 + };
342 +
343 + Verifier.VerifyFirewallRule("WiXToolset401 Test - 0009", expected1);
344 +
345 +
346 + var expected2 = new RuleDetails("WiXToolset401 Test - 0010")
347 + {
348 + Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW,
349 + Description = "WiX Toolset firewall exception rule integration test - protocol UDP",
350 + Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN,
351 + EdgeTraversal = false,
352 + EdgeTraversalOptions = 0,
353 + Enabled = true,
354 + InterfaceTypes = "All",
355 + LocalAddresses = "*",
356 + Profiles = Int32.MaxValue,
357 + Protocol = 17,
358 + RemoteAddresses = "*",
359 + SecureFlags = 0,
360 + LocalPorts = "1000",
361 + RemotePorts = "*",
362 + };
363 +
364 + Verifier.VerifyFirewallRule("WiXToolset401 Test - 0010", expected2);
365 +
366 +
367 + var expected3 = new RuleDetails("WiXToolset401 Test - 0011")
368 + {
369 + Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW,
370 + ApplicationName = "test.exe",
371 + Description = "WiX Toolset firewall exception rule integration test - ports can only be specified if protocol is TCP or UDP",
372 + Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN,
373 + EdgeTraversal = true,
374 + EdgeTraversalOptions = 1,
375 + Enabled = true,
376 + InterfaceTypes = "All",
377 + LocalAddresses = "*",
378 + Profiles = Int32.MaxValue,
379 + Protocol = 134,
380 + RemoteAddresses = "*",
381 + SecureFlags = 0,
382 + };
383 +
384 + Verifier.VerifyFirewallRule("WiXToolset401 Test - 0011", expected3);
385 +
386 + product.UninstallProduct(MSIExec.MSIExecReturnCode.SUCCESS);
387 +
388 + // verify the firewall exceptions have been removed.
389 + Assert.False(Verifier.FirewallRuleExists("WiXToolset401 Test - 0009"));
390 + Assert.False(Verifier.FirewallRuleExists("WiXToolset401 Test - 0010"));
391 + Assert.False(Verifier.FirewallRuleExists("WiXToolset401 Test - 0011"));
392 + }
393 +
394 + [RuntimeFact]
395 + public void FullSetOfScopeValuesCanBeUsed()
396 + {
397 + var product = this.CreatePackageInstaller("ScopeRules");
398 + product.InstallProduct(MSIExec.MSIExecReturnCode.SUCCESS);
399 +
400 + var expected1 = new RuleDetails("WiXToolset401 Test - 0012")
401 + {
402 + Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW,
403 + Description = "WiX Toolset firewall exception rule integration test - scope any",
404 + Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN,
405 + EdgeTraversal = false,
406 + EdgeTraversalOptions = 0,
407 + Enabled = true,
408 + InterfaceTypes = "All",
409 + LocalAddresses = "*",
410 + Profiles = Int32.MaxValue,
411 + Protocol = 6,
412 + RemoteAddresses = "*",
413 + SecureFlags = 0,
414 + LocalPorts = "1200",
415 + RemotePorts = "*",
416 + };
417 +
418 + Verifier.VerifyFirewallRule("WiXToolset401 Test - 0012", expected1);
419 +
420 +
421 + var expected2 = new RuleDetails("WiXToolset401 Test - 0013")
422 + {
423 + Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW,
424 + Description = "WiX Toolset firewall exception rule integration test - scope local subnet",
425 + Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN,
426 + EdgeTraversal = false,
427 + EdgeTraversalOptions = 0,
428 + Enabled = true,
429 + InterfaceTypes = "All",
430 + LocalAddresses = "*",
431 + Profiles = Int32.MaxValue,
432 + Protocol = 6,
433 + RemoteAddresses = "LocalSubnet",
434 + SecureFlags = 0,
435 + LocalPorts = "1300",
436 + RemotePorts = "*",
437 + };
438 +
439 + Verifier.VerifyFirewallRule("WiXToolset401 Test - 0013", expected2);
440 +
441 +
442 + var expected3 = new RuleDetails("WiXToolset401 Test - 0014")
443 + {
444 + Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW,
445 + Description = "WiX Toolset firewall exception rule integration test - scope DNS",
446 + Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN,
447 + EdgeTraversal = false,
448 + EdgeTraversalOptions = 0,
449 + Enabled = true,
450 + InterfaceTypes = "All",
451 + LocalAddresses = "*",
452 + Profiles = Int32.MaxValue,
453 + Protocol = 6,
454 + RemoteAddresses = "DNS",
455 + SecureFlags = 0,
456 + LocalPorts = "1400",
457 + RemotePorts = "*",
458 + };
459 +
460 + Verifier.VerifyFirewallRule("WiXToolset401 Test - 0014", expected3);
461 +
462 +
463 + var expected4 = new RuleDetails("WiXToolset401 Test - 0015")
464 + {
465 + Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW,
466 + Description = "WiX Toolset firewall exception rule integration test - scope DHCP",
467 + Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN,
468 + EdgeTraversal = false,
469 + EdgeTraversalOptions = 0,
470 + Enabled = true,
471 + InterfaceTypes = "All",
472 + LocalAddresses = "*",
473 + Profiles = Int32.MaxValue,
474 + Protocol = 6,
475 + RemoteAddresses = "DHCP",
476 + SecureFlags = 0,
477 + LocalPorts = "1500",
478 + RemotePorts = "*",
479 + };
480 +
481 + Verifier.VerifyFirewallRule("WiXToolset401 Test - 0015", expected4);
482 +
483 +
484 + var expected5 = new RuleDetails("WiXToolset401 Test - 0016")
485 + {
486 + Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW,
487 + Description = "WiX Toolset firewall exception rule integration test - scope WINS",
488 + Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN,
489 + EdgeTraversal = false,
490 + EdgeTraversalOptions = 0,
491 + Enabled = true,
492 + InterfaceTypes = "All",
493 + LocalAddresses = "*",
494 + Profiles = Int32.MaxValue,
495 + Protocol = 6,
496 + RemoteAddresses = "WINS",
497 + SecureFlags = 0,
498 + LocalPorts = "1600",
499 + RemotePorts = "*",
500 + };
501 +
502 + Verifier.VerifyFirewallRule("WiXToolset401 Test - 0016", expected5);
503 +
504 +
505 + var expected6 = new RuleDetails("WiXToolset401 Test - 0017")
506 + {
507 + Action = NET_FW_ACTION_.NET_FW_ACTION_ALLOW,
508 + Description = "WiX Toolset firewall exception rule integration test - scope default gateway",
509 + Direction = NET_FW_RULE_DIRECTION_.NET_FW_RULE_DIR_IN,
510 + EdgeTraversal = false,
511 + EdgeTraversalOptions = 0,
512 + Enabled = true,
513 + InterfaceTypes = "All",
514 + LocalAddresses = "*",
515 + Profiles = Int32.MaxValue,
516 + Protocol = 6,
517 + RemoteAddresses = "DefaultGateway",
518 + SecureFlags = 0,
519 + LocalPorts = "1700",
520 + RemotePorts = "*",
521 + };
522 +
523 + Verifier.VerifyFirewallRule("WiXToolset401 Test - 0017", expected6);
524 +
525 + product.UninstallProduct(MSIExec.MSIExecReturnCode.SUCCESS);
526 +
527 + // verify the firewall exceptions have been removed.
528 + Assert.False(Verifier.FirewallRuleExists("WiXToolset401 Test - 0012"));
529 + Assert.False(Verifier.FirewallRuleExists("WiXToolset401 Test - 0013"));
530 + Assert.False(Verifier.FirewallRuleExists("WiXToolset401 Test - 0014"));
531 + Assert.False(Verifier.FirewallRuleExists("WiXToolset401 Test - 0015"));
532 + Assert.False(Verifier.FirewallRuleExists("WiXToolset401 Test - 0016"));
533 + Assert.False(Verifier.FirewallRuleExists("WiXToolset401 Test - 0017"));
534 + }
535 }
536 }
src/wix/WixToolset.Converters/WixConverter.cs
+2 -2
@@ -205,8 +205,8 @@ namespace WixToolset.Converters
205 { "WixDependencyRequire", "Wix4DependencyRequire_<PlatformSuffix>" },
206 { "WixDependencyCheck", "Wix4DependencyCheck_<PlatformSuffix>" },
207 { "WixQueryDirectXCaps", "Wix4QueryDirectXCaps_<PlatformSuffix>" },
208 - { "WixSchedFirewallExceptionsUninstall", "Wix4SchedFirewallExceptionsUninstall_<PlatformSuffix>" },
209 - { "WixSchedFirewallExceptionsInstall", "Wix4SchedFirewallExceptionsInstall_<PlatformSuffix>" },
208 + { "WixSchedFirewallExceptionsUninstall", "Wix5SchedFirewallExceptionsUninstall_<PlatformSuffix>" },
209 + { "WixSchedFirewallExceptionsInstall", "Wix5SchedFirewallExceptionsInstall_<PlatformSuffix>" },
210 { "WixSchedHttpUrlReservationsUninstall", "Wix4SchedHttpUrlReservationsUninstall_<PlatformSuffix>" },
211 { "WixSchedHttpUrlReservationsInstall", "Wix4SchedHttpUrlReservationsInstall_<PlatformSuffix>" },
212 { "ConfigureIIs", "Wix4ConfigureIIs_<PlatformSuffix>" },