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 >= 600 OR (VersionNT >= 501 AND ((MsiNTProductType = 1 AND ServicePackLevel >= 2) OR (MsiNTProductType > 1 AND ServicePackLevel >= 1)))" />
29
- <Custom Action="$(var.Prefix)SchedFirewallExceptionsInstall$(var.Suffix)" After="InstallFiles" Overridable="yes" Condition="VersionNT >= 600 OR (VersionNT >= 501 AND ((MsiNTProductType = 1 AND ServicePackLevel >= 2) OR (MsiNTProductType > 1 AND ServicePackLevel >= 1)))" />
28
+ <Custom Action="$(var.Prefix5)SchedFirewallExceptionsUninstall$(var.Suffix)" Before="RemoveFiles" Overridable="yes" Condition="VersionNT >= 600" />
29
+ <Custom Action="$(var.Prefix5)SchedFirewallExceptionsInstall$(var.Suffix)" After="InstallFiles" Overridable="yes" Condition="VersionNT >= 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>" },