aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Arnson <bob@firegiant.com>2024-02-26 22:17:10 -0500
committerBob Arnson <github@bobs.org>2024-02-27 12:28:30 -0500
commit58d81bb1b6f7d7c6104914b3070dac95f16877c4 (patch)
tree01ba734d3d17087560e02f57a062b4712dc48f4b
parent6067839ba180f2f4bcd5eac67f839f68f513ccd2 (diff)
downloadwix-58d81bb1b6f7d7c6104914b3070dac95f16877c4.tar.gz
wix-58d81bb1b6f7d7c6104914b3070dac95f16877c4.tar.bz2
wix-58d81bb1b6f7d7c6104914b3070dac95f16877c4.zip
Use camelCase attribute values.
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs10
-rw-r--r--src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/PackageComponents.wxs14
-rw-r--r--src/ext/Firewall/wixext/FirewallCompiler.cs98
-rw-r--r--src/ext/Firewall/wixext/FirewallDecompiler.cs46
-rw-r--r--src/test/msi/TestData/FirewallExtensionTests/FirewallRulesInterfaces/product.wxs6
-rw-r--r--src/test/msi/TestData/FirewallExtensionTests/FirewallRulesProperties/product.wxs4
6 files changed, 98 insertions, 80 deletions
diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs b/src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs
index df18f0e0..e39fafaa 100644
--- a/src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs
+++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/FirewallExtensionFixture.cs
@@ -48,7 +48,7 @@ namespace WixToolsetTest.Firewall
48 "Wix5FirewallException:fexv60s7u2Dmd1imH5vEFYKPgEWhG4\tinterface nested\t127.0.0.1\t54671\t6\t\t0\t-2147483648\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tInterfaces with nested elements\t1\t-2147483648\t-2147483648\t-2147483648\t\t\tWi-Fi|Local Area Connection\t\t\t\t\t\t\t\t\t\t-2147483648", 48 "Wix5FirewallException:fexv60s7u2Dmd1imH5vEFYKPgEWhG4\tinterface nested\t127.0.0.1\t54671\t6\t\t0\t-2147483648\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tInterfaces with nested elements\t1\t-2147483648\t-2147483648\t-2147483648\t\t\tWi-Fi|Local Area Connection\t\t\t\t\t\t\t\t\t\t-2147483648",
49 "Wix5FirewallException:fexVr6uHcOCak5MHuTLwujjh_oKtbI\tGroupingExample2\t\t8732\t6\t\t0\t-2147483648\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tRule with grouping property\t1\t-2147483648\t-2147483648\t-2147483648\t[GROUPING_PROP]\t\t\t\t\t\t\t\t\t\t\t\t-2147483648", 49 "Wix5FirewallException:fexVr6uHcOCak5MHuTLwujjh_oKtbI\tGroupingExample2\t\t8732\t6\t\t0\t-2147483648\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tRule with grouping property\t1\t-2147483648\t-2147483648\t-2147483648\t[GROUPING_PROP]\t\t\t\t\t\t\t\t\t\t\t\t-2147483648",
50 "Wix5FirewallException:fexwjf4OTFVE9SNiC4goVxBA6ENJBE\tINetFwRule3 values\t*\t\t-2147483648\t\t16\t-2147483648\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tSimple INetFwRule3 values\t1\t-2147483648\t-2147483648\t-2147483648\t\t\t\t\t\t\t\tS-1-15-2-1239072475-3687740317-1842961305-3395936705-4023953123-1525404051-2779347315\tO:LSD:(A;;CC;;;S-1-5-84-0-0-0-0-0)\tS-1-5-21-1898747406-2352535518-1247798438-1914\t127.0.0.1\tO:LSD:(A;;CC;;;S-1-5-84-0-0-0-0-0)\t3", 50 "Wix5FirewallException:fexwjf4OTFVE9SNiC4goVxBA6ENJBE\tINetFwRule3 values\t*\t\t-2147483648\t\t16\t-2147483648\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tSimple INetFwRule3 values\t1\t-2147483648\t-2147483648\t-2147483648\t\t\t\t\t\t\t\tS-1-15-2-1239072475-3687740317-1842961305-3395936705-4023953123-1525404051-2779347315\tO:LSD:(A;;CC;;;S-1-5-84-0-0-0-0-0)\tS-1-5-21-1898747406-2352535518-1247798438-1914\t127.0.0.1\tO:LSD:(A;;CC;;;S-1-5-84-0-0-0-0-0)\t3",
51 "Wix5FirewallException:ServiceInstall.nested\tExampleNestedService\tLocalSubnet\t3546-7890\t6\t\t1\t-2147483648\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tA port-based firewall exception for a windows service\t1\t-2147483648\t-2147483648\t-2147483648\t\t\t\tLan,Wireless\t\t\tsvc1\t\t\t\t\t\t-2147483648", 51 "Wix5FirewallException:ServiceInstall.nested\tExampleNestedService\tLocalSubnet\t3546-7890\t6\t\t1\t-2147483648\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tA port-based firewall exception for a Windows service\t1\t-2147483648\t-2147483648\t-2147483648\t\t\t\tLan,Wireless\t\t\tsvc1\t\t\t\t\t\t-2147483648",
52 }, results); 52 }, results);
53 } 53 }
54 54
@@ -87,7 +87,7 @@ namespace WixToolsetTest.Firewall
87 "Wix5FirewallException:fexv60s7u2Dmd1imH5vEFYKPgEWhG4\tinterface nested\t127.0.0.1\t54671\t6\t\t0\t-2147483648\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tInterfaces with nested elements\t1\t-2147483648\t-2147483648\t-2147483648\t\t\tWi-Fi|Local Area Connection\t\t\t\t\t\t\t\t\t\t-2147483648", 87 "Wix5FirewallException:fexv60s7u2Dmd1imH5vEFYKPgEWhG4\tinterface nested\t127.0.0.1\t54671\t6\t\t0\t-2147483648\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tInterfaces with nested elements\t1\t-2147483648\t-2147483648\t-2147483648\t\t\tWi-Fi|Local Area Connection\t\t\t\t\t\t\t\t\t\t-2147483648",
88 "Wix5FirewallException:fexVr6uHcOCak5MHuTLwujjh_oKtbI\tGroupingExample2\t\t8732\t6\t\t0\t-2147483648\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tRule with grouping property\t1\t-2147483648\t-2147483648\t-2147483648\t[GROUPING_PROP]\t\t\t\t\t\t\t\t\t\t\t\t-2147483648", 88 "Wix5FirewallException:fexVr6uHcOCak5MHuTLwujjh_oKtbI\tGroupingExample2\t\t8732\t6\t\t0\t-2147483648\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tRule with grouping property\t1\t-2147483648\t-2147483648\t-2147483648\t[GROUPING_PROP]\t\t\t\t\t\t\t\t\t\t\t\t-2147483648",
89 "Wix5FirewallException:fexwjf4OTFVE9SNiC4goVxBA6ENJBE\tINetFwRule3 values\t*\t\t-2147483648\t\t16\t-2147483648\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tSimple INetFwRule3 values\t1\t-2147483648\t-2147483648\t-2147483648\t\t\t\t\t\t\t\tS-1-15-2-1239072475-3687740317-1842961305-3395936705-4023953123-1525404051-2779347315\tO:LSD:(A;;CC;;;S-1-5-84-0-0-0-0-0)\tS-1-5-21-1898747406-2352535518-1247798438-1914\t127.0.0.1\tO:LSD:(A;;CC;;;S-1-5-84-0-0-0-0-0)\t3", 89 "Wix5FirewallException:fexwjf4OTFVE9SNiC4goVxBA6ENJBE\tINetFwRule3 values\t*\t\t-2147483648\t\t16\t-2147483648\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tSimple INetFwRule3 values\t1\t-2147483648\t-2147483648\t-2147483648\t\t\t\t\t\t\t\tS-1-15-2-1239072475-3687740317-1842961305-3395936705-4023953123-1525404051-2779347315\tO:LSD:(A;;CC;;;S-1-5-84-0-0-0-0-0)\tS-1-5-21-1898747406-2352535518-1247798438-1914\t127.0.0.1\tO:LSD:(A;;CC;;;S-1-5-84-0-0-0-0-0)\t3",
90 "Wix5FirewallException:ServiceInstall.nested\tExampleNestedService\tLocalSubnet\t3546-7890\t6\t\t1\t-2147483648\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tA port-based firewall exception for a windows service\t1\t-2147483648\t-2147483648\t-2147483648\t\t\t\tLan,Wireless\t\t\tsvc1\t\t\t\t\t\t-2147483648", 90 "Wix5FirewallException:ServiceInstall.nested\tExampleNestedService\tLocalSubnet\t3546-7890\t6\t\t1\t-2147483648\tfilNdJBJmq3UCUIwmXS8x21aAsvqzk\tA port-based firewall exception for a Windows service\t1\t-2147483648\t-2147483648\t-2147483648\t\t\t\tLan,Wireless\t\t\tsvc1\t\t\t\t\t\t-2147483648",
91 }, results); 91 }, results);
92 } 92 }
93 93
@@ -224,7 +224,7 @@ namespace WixToolsetTest.Firewall
224 "Port=42", 224 "Port=42",
225 "Protocol=tcp", 225 "Protocol=tcp",
226 "Program=[#filNdJBJmq3UCUIwmXS8x21aAsvqzk]", 226 "Program=[#filNdJBJmq3UCUIwmXS8x21aAsvqzk]",
227 "OnUpdate=DoNothing", 227 "OnUpdate=doNothing",
228 "Description=An app-based firewall exception", 228 "Description=An app-based firewall exception",
229 "xmlns=http://wixtoolset.org/schemas/v4/wxs/firewall", 229 "xmlns=http://wixtoolset.org/schemas/v4/wxs/firewall",
230 }, actual.Attributes); 230 }, actual.Attributes);
@@ -241,7 +241,7 @@ namespace WixToolsetTest.Firewall
241 "Scope=localSubnet", 241 "Scope=localSubnet",
242 "Port=42", 242 "Port=42",
243 "Protocol=tcp", 243 "Protocol=tcp",
244 "OnUpdate=EnableOnly", 244 "OnUpdate=enableOnly",
245 "Description=A port-based firewall exception", 245 "Description=A port-based firewall exception",
246 "Outbound=yes", 246 "Outbound=yes",
247 "xmlns=http://wixtoolset.org/schemas/v4/wxs/firewall", 247 "xmlns=http://wixtoolset.org/schemas/v4/wxs/firewall",
@@ -330,7 +330,7 @@ namespace WixToolsetTest.Firewall
330 "LocalUserOwner=S-1-5-21-1898747406-2352535518-1247798438-1914", 330 "LocalUserOwner=S-1-5-21-1898747406-2352535518-1247798438-1914",
331 "RemoteMachineAuthorizedList=127.0.0.1", 331 "RemoteMachineAuthorizedList=127.0.0.1",
332 "RemoteUserAuthorizedList=O:LSD:(A;;CC;;;S-1-5-84-0-0-0-0-0)", 332 "RemoteUserAuthorizedList=O:LSD:(A;;CC;;;S-1-5-84-0-0-0-0-0)",
333 "IPSecSecureFlags=NegotiateEncryption", 333 "IPSecSecureFlags=negotiateEncryption",
334 "xmlns=http://wixtoolset.org/schemas/v4/wxs/firewall", 334 "xmlns=http://wixtoolset.org/schemas/v4/wxs/firewall",
335 }, actual.Attributes); 335 }, actual.Attributes);
336 } 336 }
diff --git a/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/PackageComponents.wxs b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/PackageComponents.wxs
index 4bb2e192..b9ba0aa4 100644
--- a/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/PackageComponents.wxs
+++ b/src/ext/Firewall/test/WixToolsetTest.Firewall/TestData/UsingFirewall/PackageComponents.wxs
@@ -6,18 +6,18 @@
6 <Component> 6 <Component>
7 <File Name="fw.exe" Source="example.txt"> 7 <File Name="fw.exe" Source="example.txt">
8 <Shortcut Id="FwShortcut" Directory="INSTALLFOLDER" Name="Firewall" /> 8 <Shortcut Id="FwShortcut" Directory="INSTALLFOLDER" Name="Firewall" />
9 <fw:FirewallException Id="ExampleFirewall" Description="An app-based firewall exception" Name="ExampleApp" Port="42" OnUpdate="DoNothing" > 9 <fw:FirewallException Id="ExampleFirewall" Description="An app-based firewall exception" Name="ExampleApp" Port="42" OnUpdate="doNothing" >
10 <fw:RemoteAddress Value="*" /> 10 <fw:RemoteAddress Value="*" />
11 </fw:FirewallException> 11 </fw:FirewallException>
12 </File> 12 </File>
13 13
14 <fw:FirewallException Description="A port-based firewall exception" Name="ExamplePort" Port="42" Outbound="yes" Scope="localSubnet" OnUpdate="EnableOnly" /> 14 <fw:FirewallException Description="A port-based firewall exception" Name="ExamplePort" Port="42" Outbound="yes" Scope="localSubnet" OnUpdate="enableOnly" />
15 <fw:FirewallException Description="DNS scope firewall exception" Name="ExampleDNSScope" Port="356" Protocol="udp" Scope="DNS" /> 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" /> 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"/> 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" /> 18 <fw:FirewallException Description="defaultGateway scope firewall exception" Name="ExampleDefaultGatewayScope" Port="4432" Scope="defaultGateway" Profile="private" />
19 19
20 <fw:FirewallException Description="Defer to user edge traversal" Name="defertouser" Program="fw.exe" EdgeTraversal="DeferToUser" /> 20 <fw:FirewallException Description="Defer to user edge traversal" Name="defertouser" Program="fw.exe" EdgeTraversal="deferToUser" />
21 <fw:FirewallException Description="A port-based service exception" Name="ExampleService" Port="12000" Service="ftpsrv" Program="%windir%\system32\svchost.exe" > 21 <fw:FirewallException Description="A port-based service exception" Name="ExampleService" Port="12000" Service="ftpsrv" Program="%windir%\system32\svchost.exe" >
22 <fw:LocalAddress Value="DHCP"/> 22 <fw:LocalAddress Value="DHCP"/>
23 <fw:LocalAddress Value="WINS"/> 23 <fw:LocalAddress Value="WINS"/>
@@ -31,13 +31,13 @@
31 <fw:FirewallException Description="Interfaces with property" Name="interface property" Port="54671" Interface="[INTERFACE_PROPERTY]" /> 31 <fw:FirewallException Description="Interfaces with property" Name="interface property" Port="54671" Interface="[INTERFACE_PROPERTY]" />
32 32
33 <ServiceInstall Name="svc1" Type="ownProcess" Start="disabled" ErrorControl="ignore" > 33 <ServiceInstall Name="svc1" Type="ownProcess" Start="disabled" ErrorControl="ignore" >
34 <fw:FirewallException Id="ServiceInstall.nested" IgnoreFailure="true" Description="A port-based firewall exception for a windows service" Name="ExampleNestedService" Port="3546-7890" Scope="localSubnet" > 34 <fw:FirewallException Id="ServiceInstall.nested" IgnoreFailure="true" Description="A port-based firewall exception for a Windows service" Name="ExampleNestedService" Port="3546-7890" Scope="localSubnet" >
35 <fw:InterfaceType Value="Lan" /> 35 <fw:InterfaceType Value="lan" />
36 <fw:InterfaceType Value="Wireless" /> 36 <fw:InterfaceType Value="wireless" />
37 </fw:FirewallException> 37 </fw:FirewallException>
38 </ServiceInstall> 38 </ServiceInstall>
39 39
40 <fw:FirewallException Description="Simple INetFwRule3 values" Name="INetFwRule3 values" Scope="any" LocalAppPackageId="S-1-15-2-1239072475-3687740317-1842961305-3395936705-4023953123-1525404051-2779347315" LocalUserAuthorizedList="O:LSD:(A;;CC;;;S-1-5-84-0-0-0-0-0)" LocalUserOwner="S-1-5-21-1898747406-2352535518-1247798438-1914" RemoteMachineAuthorizedList="127.0.0.1" RemoteUserAuthorizedList="O:LSD:(A;;CC;;;S-1-5-84-0-0-0-0-0)" IPSecSecureFlags="NegotiateEncryption" /> 40 <fw:FirewallException Description="Simple INetFwRule3 values" Name="INetFwRule3 values" Scope="any" LocalAppPackageId="S-1-15-2-1239072475-3687740317-1842961305-3395936705-4023953123-1525404051-2779347315" LocalUserAuthorizedList="O:LSD:(A;;CC;;;S-1-5-84-0-0-0-0-0)" LocalUserOwner="S-1-5-21-1898747406-2352535518-1247798438-1914" RemoteMachineAuthorizedList="127.0.0.1" RemoteUserAuthorizedList="O:LSD:(A;;CC;;;S-1-5-84-0-0-0-0-0)" IPSecSecureFlags="negotiateEncryption" />
41 <fw:FirewallException Description="INetFwRule3 passed via properties" Name="INetFwRule3 properties" Scope="any" LocalAppPackageId="[PROP1]" LocalUserAuthorizedList="[PROP2]" LocalUserOwner="[PROP3]" RemoteMachineAuthorizedList="[PROP4]" RemoteUserAuthorizedList="[PROP5]" IPSecSecureFlags="[PROP6]" /> 41 <fw:FirewallException Description="INetFwRule3 passed via properties" Name="INetFwRule3 properties" Scope="any" LocalAppPackageId="[PROP1]" LocalUserAuthorizedList="[PROP2]" LocalUserOwner="[PROP3]" RemoteMachineAuthorizedList="[PROP4]" RemoteUserAuthorizedList="[PROP5]" IPSecSecureFlags="[PROP6]" />
42 42
43 <fw:FirewallException Description="Simple rule with grouping" Name="GroupingExample1" Program="fw.exe" Grouping="@yourresources.dll,-1005" /> 43 <fw:FirewallException Description="Simple rule with grouping" Name="GroupingExample1" Program="fw.exe" Grouping="@yourresources.dll,-1005" />
diff --git a/src/ext/Firewall/wixext/FirewallCompiler.cs b/src/ext/Firewall/wixext/FirewallCompiler.cs
index c4a5318c..7db1dcc4 100644
--- a/src/ext/Firewall/wixext/FirewallCompiler.cs
+++ b/src/ext/Firewall/wixext/FirewallCompiler.cs
@@ -155,6 +155,16 @@ namespace WixToolset.Firewall
155 file = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 155 file = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
156 } 156 }
157 break; 157 break;
158 case "Program":
159 if (fileId != null)
160 {
161 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, element.Name.LocalName, "Program", parentElement.Name.LocalName));
162 }
163 else
164 {
165 program = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
166 }
167 break;
158 case "IgnoreFailure": 168 case "IgnoreFailure":
159 if (this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) == YesNoType.Yes) 169 if (this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib) == YesNoType.Yes)
160 { 170 {
@@ -165,28 +175,18 @@ namespace WixToolset.Firewall
165 var onupdate = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); 175 var onupdate = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
166 switch (onupdate) 176 switch (onupdate)
167 { 177 {
168 case "DoNothing": 178 case "doNothing":
169 attributes |= 0x2; // feaIgnoreUpdates 179 attributes |= 0x2; // feaIgnoreUpdates
170 break; 180 break;
171 case "EnableOnly": 181 case "enableOnly":
172 attributes |= 0x4; // feaEnableOnUpdate 182 attributes |= 0x4; // feaEnableOnUpdate
173 break; 183 break;
174 184
175 default: 185 default:
176 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "OnUpdate", onupdate, "EnableOnly", "DoNothing")); 186 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "OnUpdate", onupdate, "enableOnly", "doNothing"));
177 break; 187 break;
178 } 188 }
179 break; 189 break;
180 case "Program":
181 if (fileId != null)
182 {
183 this.Messaging.Write(ErrorMessages.IllegalAttributeWhenNested(sourceLineNumbers, element.Name.LocalName, "Program", parentElement.Name.LocalName));
184 }
185 else
186 {
187 program = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
188 }
189 break;
190 case "Port": 190 case "Port":
191 port = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); 191 port = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
192 break; 192 break;
@@ -284,17 +284,17 @@ namespace WixToolset.Firewall
284 action = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); 284 action = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
285 switch (action) 285 switch (action)
286 { 286 {
287 case "Block": 287 case "block":
288 action = "0"; 288 action = "0";
289 break; 289 break;
290 case "Allow": 290 case "allow":
291 action = "1"; 291 action = "1";
292 break; 292 break;
293 293
294 default: 294 default:
295 if (!this.ParseHelper.ContainsProperty(action)) 295 if (!this.ParseHelper.ContainsProperty(action))
296 { 296 {
297 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Action", action, "Allow", "Block")); 297 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Action", action, "allow", "block"));
298 } 298 }
299 break; 299 break;
300 } 300 }
@@ -303,17 +303,17 @@ namespace WixToolset.Firewall
303 edgeTraversal = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); 303 edgeTraversal = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
304 switch (edgeTraversal) 304 switch (edgeTraversal)
305 { 305 {
306 case "Deny": 306 case "deny":
307 edgeTraversal = FirewallConstants.NET_FW_EDGE_TRAVERSAL_TYPE_DENY.ToString(); 307 edgeTraversal = FirewallConstants.NET_FW_EDGE_TRAVERSAL_TYPE_DENY.ToString();
308 break; 308 break;
309 case "Allow": 309 case "allow":
310 edgeTraversal = FirewallConstants.NET_FW_EDGE_TRAVERSAL_TYPE_ALLOW.ToString(); 310 edgeTraversal = FirewallConstants.NET_FW_EDGE_TRAVERSAL_TYPE_ALLOW.ToString();
311 break; 311 break;
312 case "DeferToApp": 312 case "deferToApp":
313 attributes |= 0x8; // feaAddINetFwRule2 313 attributes |= 0x8; // feaAddINetFwRule2
314 edgeTraversal = FirewallConstants.NET_FW_EDGE_TRAVERSAL_TYPE_DEFER_TO_APP.ToString(); 314 edgeTraversal = FirewallConstants.NET_FW_EDGE_TRAVERSAL_TYPE_DEFER_TO_APP.ToString();
315 break; 315 break;
316 case "DeferToUser": 316 case "deferToUser":
317 attributes |= 0x8; // feaAddINetFwRule2 317 attributes |= 0x8; // feaAddINetFwRule2
318 edgeTraversal = FirewallConstants.NET_FW_EDGE_TRAVERSAL_TYPE_DEFER_TO_USER.ToString(); 318 edgeTraversal = FirewallConstants.NET_FW_EDGE_TRAVERSAL_TYPE_DEFER_TO_USER.ToString();
319 break; 319 break;
@@ -321,7 +321,7 @@ namespace WixToolset.Firewall
321 default: 321 default:
322 if (!this.ParseHelper.ContainsProperty(edgeTraversal)) 322 if (!this.ParseHelper.ContainsProperty(edgeTraversal))
323 { 323 {
324 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "EdgeTraversal", edgeTraversal, "Allow", "DeferToApp", "DeferToUser", "Deny")); 324 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "EdgeTraversal", edgeTraversal, "allow", "deferToApp", "deferToUser", "deny"));
325 } 325 }
326 break; 326 break;
327 } 327 }
@@ -338,7 +338,6 @@ namespace WixToolset.Firewall
338 case YesNoType.No: 338 case YesNoType.No:
339 enabled = "0"; 339 enabled = "0";
340 break; 340 break;
341
342 default: 341 default:
343 this.Messaging.Write(ErrorMessages.IllegalYesNoValue(sourceLineNumbers, element.Name.LocalName, "Enabled", enabled)); 342 this.Messaging.Write(ErrorMessages.IllegalYesNoValue(sourceLineNumbers, element.Name.LocalName, "Enabled", enabled));
344 break; 343 break;
@@ -359,16 +358,16 @@ namespace WixToolset.Firewall
359 interfaceTypeValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); 358 interfaceTypeValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
360 switch (interfaceTypeValue) 359 switch (interfaceTypeValue)
361 { 360 {
362 case "RemoteAccess": 361 case "remoteAccess":
363 case "Wireless": 362 case "wireless":
364 case "Lan": 363 case "lan":
365 case "All": 364 case "all":
366 break; 365 break;
367 366
368 default: 367 default:
369 if (!this.ParseHelper.ContainsProperty(interfaceTypeValue)) 368 if (!this.ParseHelper.ContainsProperty(interfaceTypeValue))
370 { 369 {
371 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "InterfaceType", interfaceTypeValue, "RemoteAccess", "Wireless", "Lan", "All")); 370 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "InterfaceType", interfaceTypeValue, "remoteAccess", "wireless", "lan", "all"));
372 } 371 }
373 break; 372 break;
374 } 373 }
@@ -449,23 +448,23 @@ namespace WixToolset.Firewall
449 { 448 {
450 switch (secureFlags) 449 switch (secureFlags)
451 { 450 {
452 case "None": 451 case "none":
453 secureFlags = "0"; 452 secureFlags = "0";
454 break; 453 break;
455 case "NoEncapsulation": 454 case "noEncapsulation":
456 secureFlags = "1"; 455 secureFlags = "1";
457 break; 456 break;
458 case "WithIntegrity": 457 case "withIntegrity":
459 secureFlags = "2"; 458 secureFlags = "2";
460 break; 459 break;
461 case "NegotiateEncryption": 460 case "negotiateEncryption":
462 secureFlags = "3"; 461 secureFlags = "3";
463 break; 462 break;
464 case "Encrypt": 463 case "encrypt":
465 secureFlags = "4"; 464 secureFlags = "4";
466 break; 465 break;
467 default: 466 default:
468 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "IPSecSecureFlags", secureFlags, "None", "NoEncapsulation", "WithIntegrity", "NegotiateEncryption", "Encrypt")); 467 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "IPSecSecureFlags", secureFlags, "none", "noEncapsulation", "withIntegrity", "negotiateEncryption", "encrypt"));
469 break; 468 break;
470 } 469 }
471 } 470 }
@@ -573,43 +572,43 @@ namespace WixToolset.Firewall
573 572
574 if (String.IsNullOrEmpty(fileId) && String.IsNullOrEmpty(file) && String.IsNullOrEmpty(program)) 573 if (String.IsNullOrEmpty(fileId) && String.IsNullOrEmpty(file) && String.IsNullOrEmpty(program))
575 { 574 {
576 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Program", "EdgeTraversal", "DeferToUser")); 575 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Program", "EdgeTraversal", "deferToUser"));
577 } 576 }
578 577
579 if (port != null) 578 if (port != null)
580 { 579 {
581 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "Port", "EdgeTraversal", "DeferToUser")); 580 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "Port", "EdgeTraversal", "deferToUser"));
582 } 581 }
583 582
584 if (remotePort != null) 583 if (remotePort != null)
585 { 584 {
586 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "RemotePort", "EdgeTraversal", "DeferToUser")); 585 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "RemotePort", "EdgeTraversal", "deferToUser"));
587 } 586 }
588 587
589 if (localScope != null) 588 if (localScope != null)
590 { 589 {
591 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "LocalScope", "EdgeTraversal", "DeferToUser")); 590 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "LocalScope", "EdgeTraversal", "deferToUser"));
592 } 591 }
593 592
594 if (scope != null) 593 if (scope != null)
595 { 594 {
596 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "Scope", "EdgeTraversal", "DeferToUser")); 595 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "Scope", "EdgeTraversal", "deferToUser"));
597 } 596 }
598 597
599 if (profile != null) 598 if (profile != null)
600 { 599 {
601 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "Profile", "EdgeTraversal", "DeferToUser")); 600 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "Profile", "EdgeTraversal", "deferToUser"));
602 } 601 }
603 602
604 if (service != null) 603 if (service != null)
605 { 604 {
606 if (serviceName != null) 605 if (serviceName != null)
607 { 606 {
608 this.Messaging.Write(ErrorMessages.IllegalAttributeValueWhenNested(sourceLineNumbers, element.Name.LocalName, "EdgeTraversal", "DeferToUser", parentElement.Name.LocalName)); 607 this.Messaging.Write(ErrorMessages.IllegalAttributeValueWhenNested(sourceLineNumbers, element.Name.LocalName, "EdgeTraversal", "deferToUser", parentElement.Name.LocalName));
609 } 608 }
610 else 609 else
611 { 610 {
612 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "Service", "EdgeTraversal", "DeferToUser")); 611 this.Messaging.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(sourceLineNumbers, element.Name.LocalName, "Service", "EdgeTraversal", "deferToUser"));
613 } 612 }
614 } 613 }
615 } 614 }
@@ -807,16 +806,23 @@ namespace WixToolset.Firewall
807 { 806 {
808 switch (value) 807 switch (value)
809 { 808 {
810 case "RemoteAccess": 809 case "remoteAccess":
811 case "Wireless": 810 value = "RemoteAccess";
812 case "Lan": 811 break;
813 case "All": 812 case "wireless":
813 value = "Wireless";
814 break;
815 case "lan":
816 value = "Lan";
817 break;
818 case "all":
819 value = "All";
814 break; 820 break;
815 821
816 default: 822 default:
817 if (!this.ParseHelper.ContainsProperty(value)) 823 if (!this.ParseHelper.ContainsProperty(value))
818 { 824 {
819 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Value", value, "RemoteAccess", "Wireless", "Lan", "All")); 825 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Value", value, "remoteAccess", "wireless", "lan", "all"));
820 value = null; 826 value = null;
821 } 827 }
822 break; 828 break;
diff --git a/src/ext/Firewall/wixext/FirewallDecompiler.cs b/src/ext/Firewall/wixext/FirewallDecompiler.cs
index 7fafab17..46ab2bd1 100644
--- a/src/ext/Firewall/wixext/FirewallDecompiler.cs
+++ b/src/ext/Firewall/wixext/FirewallDecompiler.cs
@@ -4,6 +4,8 @@ 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;
7 using System.Xml.Linq; 9 using System.Xml.Linq;
8 using WixToolset.Data; 10 using WixToolset.Data;
9 using WixToolset.Data.WindowsInstaller; 11 using WixToolset.Data.WindowsInstaller;
@@ -161,11 +163,11 @@ namespace WixToolset.Firewall
161 163
162 if ((attr & 0x2) == 0x2) 164 if ((attr & 0x2) == 0x2)
163 { 165 {
164 firewallException.Add(new XAttribute("OnUpdate", "DoNothing")); 166 firewallException.Add(new XAttribute("OnUpdate", "doNothing"));
165 } 167 }
166 else if ((attr & 0x4) == 0x4) 168 else if ((attr & 0x4) == 0x4)
167 { 169 {
168 firewallException.Add(new XAttribute("OnUpdate", "EnableOnly")); 170 firewallException.Add(new XAttribute("OnUpdate", "enableOnly"));
169 } 171 }
170 } 172 }
171 173
@@ -222,10 +224,10 @@ namespace WixToolset.Firewall
222 case FirewallConstants.IntegerNotSetString: 224 case FirewallConstants.IntegerNotSetString:
223 break; 225 break;
224 case "1": 226 case "1":
225 firewallException.Add(new XAttribute("Action", "Allow")); 227 firewallException.Add(new XAttribute("Action", "allow"));
226 break; 228 break;
227 case "0": 229 case "0":
228 firewallException.Add(new XAttribute("Action", "Block")); 230 firewallException.Add(new XAttribute("Action", "block"));
229 break; 231 break;
230 default: 232 default:
231 firewallException.Add(new XAttribute("Action", action)); 233 firewallException.Add(new XAttribute("Action", action));
@@ -241,16 +243,16 @@ namespace WixToolset.Firewall
241 case FirewallConstants.IntegerNotSetString: 243 case FirewallConstants.IntegerNotSetString:
242 break; 244 break;
243 case "0": 245 case "0":
244 firewallException.Add(new XAttribute("EdgeTraversal", "Deny")); 246 firewallException.Add(new XAttribute("EdgeTraversal", "deny"));
245 break; 247 break;
246 case "1": 248 case "1":
247 firewallException.Add(new XAttribute("EdgeTraversal", "Allow")); 249 firewallException.Add(new XAttribute("EdgeTraversal", "allow"));
248 break; 250 break;
249 case "2": 251 case "2":
250 firewallException.Add(new XAttribute("EdgeTraversal", "DeferToApp")); 252 firewallException.Add(new XAttribute("EdgeTraversal", "deferToApp"));
251 break; 253 break;
252 case "3": 254 case "3":
253 firewallException.Add(new XAttribute("EdgeTraversal", "DeferToUser")); 255 firewallException.Add(new XAttribute("EdgeTraversal", "deferToUser"));
254 break; 256 break;
255 default: 257 default:
256 firewallException.Add(new XAttribute("EdgeTraversal", edgeTraversal)); 258 firewallException.Add(new XAttribute("EdgeTraversal", edgeTraversal));
@@ -292,13 +294,13 @@ namespace WixToolset.Firewall
292 string[] interfaces = row.FieldAsString(16).Split(new[] { FirewallConstants.FORBIDDEN_FIREWALL_CHAR }, StringSplitOptions.RemoveEmptyEntries); 294 string[] interfaces = row.FieldAsString(16).Split(new[] { FirewallConstants.FORBIDDEN_FIREWALL_CHAR }, StringSplitOptions.RemoveEmptyEntries);
293 if (interfaces.Length == 1) 295 if (interfaces.Length == 1)
294 { 296 {
295 firewallException.Add(new XAttribute("Interface", interfaces[0])); 297 firewallException.Add(new XAttribute("Interface", interfaces[0].ToCamelCase()));
296 } 298 }
297 else 299 else
298 { 300 {
299 foreach (var interfaceItem in interfaces) 301 foreach (var interfaceItem in interfaces)
300 { 302 {
301 FirewallDecompiler.AddInterface(firewallException, interfaceItem); 303 FirewallDecompiler.AddInterface(firewallException, interfaceItem.ToCamelCase());
302 } 304 }
303 } 305 }
304 } 306 }
@@ -308,13 +310,13 @@ namespace WixToolset.Firewall
308 string[] interfaceTypes = row.FieldAsString(17).Split(','); 310 string[] interfaceTypes = row.FieldAsString(17).Split(',');
309 if (interfaceTypes.Length == 1) 311 if (interfaceTypes.Length == 1)
310 { 312 {
311 firewallException.Add(new XAttribute("InterfaceType", interfaceTypes[0])); 313 firewallException.Add(new XAttribute("InterfaceType", interfaceTypes[0].ToCamelCase()));
312 } 314 }
313 else 315 else
314 { 316 {
315 foreach (var interfaceType in interfaceTypes) 317 foreach (var interfaceType in interfaceTypes)
316 { 318 {
317 FirewallDecompiler.AddInterfaceType(firewallException, interfaceType); 319 FirewallDecompiler.AddInterfaceType(firewallException, interfaceType.ToCamelCase());
318 } 320 }
319 } 321 }
320 } 322 }
@@ -408,19 +410,19 @@ namespace WixToolset.Firewall
408 case FirewallConstants.IntegerNotSetString: 410 case FirewallConstants.IntegerNotSetString:
409 break; 411 break;
410 case "0": 412 case "0":
411 firewallException.Add(new XAttribute("IPSecSecureFlags", "None")); 413 firewallException.Add(new XAttribute("IPSecSecureFlags", "none"));
412 break; 414 break;
413 case "1": 415 case "1":
414 firewallException.Add(new XAttribute("IPSecSecureFlags", "NoEncapsulation")); 416 firewallException.Add(new XAttribute("IPSecSecureFlags", "noEncapsulation"));
415 break; 417 break;
416 case "2": 418 case "2":
417 firewallException.Add(new XAttribute("IPSecSecureFlags", "WithIntegrity")); 419 firewallException.Add(new XAttribute("IPSecSecureFlags", "withIntegrity"));
418 break; 420 break;
419 case "3": 421 case "3":
420 firewallException.Add(new XAttribute("IPSecSecureFlags", "NegotiateEncryption")); 422 firewallException.Add(new XAttribute("IPSecSecureFlags", "negotiateEncryption"));
421 break; 423 break;
422 case "4": 424 case "4":
423 firewallException.Add(new XAttribute("IPSecSecureFlags", "Encrypt")); 425 firewallException.Add(new XAttribute("IPSecSecureFlags", "encrypt"));
424 break; 426 break;
425 default: 427 default:
426 firewallException.Add(new XAttribute("IPSecSecureFlags", secureFlags)); 428 firewallException.Add(new XAttribute("IPSecSecureFlags", secureFlags));
@@ -499,4 +501,14 @@ namespace WixToolset.Firewall
499 } 501 }
500 } 502 }
501 } 503 }
504
505 internal static class StringExtensions
506 {
507 public static string ToCamelCase(this string str)
508 {
509 var camelCase = str[0].ToString().ToLowerInvariant() + str.Substring(1);
510
511 return camelCase;
512 }
513 }
502} 514}
diff --git a/src/test/msi/TestData/FirewallExtensionTests/FirewallRulesInterfaces/product.wxs b/src/test/msi/TestData/FirewallExtensionTests/FirewallRulesInterfaces/product.wxs
index 142c8f68..a8e772af 100644
--- a/src/test/msi/TestData/FirewallExtensionTests/FirewallRulesInterfaces/product.wxs
+++ b/src/test/msi/TestData/FirewallExtensionTests/FirewallRulesInterfaces/product.wxs
@@ -17,9 +17,9 @@
17 <fw:Interface Name="[INTERFACE1]" /> 17 <fw:Interface Name="[INTERFACE1]" />
18 <fw:Interface Name="[INTERFACE2]" /> 18 <fw:Interface Name="[INTERFACE2]" />
19 <fw:Interface Name="[INTERFACE3]" /> 19 <fw:Interface Name="[INTERFACE3]" />
20 <fw:InterfaceType Value="RemoteAccess" /> 20 <fw:InterfaceType Value="remoteAccess" />
21 <fw:InterfaceType Value="Lan" /> 21 <fw:InterfaceType Value="lan" />
22 <fw:InterfaceType Value="Wireless" /> 22 <fw:InterfaceType Value="wireless" />
23 </fw:FirewallException> 23 </fw:FirewallException>
24 </File> 24 </File>
25 25
diff --git a/src/test/msi/TestData/FirewallExtensionTests/FirewallRulesProperties/product.wxs b/src/test/msi/TestData/FirewallExtensionTests/FirewallRulesProperties/product.wxs
index 1f9935d5..48696c0d 100644
--- a/src/test/msi/TestData/FirewallExtensionTests/FirewallRulesProperties/product.wxs
+++ b/src/test/msi/TestData/FirewallExtensionTests/FirewallRulesProperties/product.wxs
@@ -11,7 +11,7 @@
11 <Fragment> 11 <Fragment>
12 <Component Id="FirewallComponent1" Guid="A1553D10-BEB7-4E60-A0DC-6F1EEE5A1719" Directory="INSTALLFOLDER"> 12 <Component Id="FirewallComponent1" Guid="A1553D10-BEB7-4E60-A0DC-6F1EEE5A1719" Directory="INSTALLFOLDER">
13 <fw:FirewallException 13 <fw:FirewallException
14 Name="WiXToolset Test - 0028" OnUpdate="EnableOnly" 14 Name="WiXToolset Test - 0028" OnUpdate="enableOnly"
15 Port="[LOCALPORT]" 15 Port="[LOCALPORT]"
16 Protocol="[PROTOCOL]" 16 Protocol="[PROTOCOL]"
17 Program="[PROGRAM]" 17 Program="[PROGRAM]"
@@ -35,7 +35,7 @@
35 IPSecSecureFlags="[SECUREFLAGS]" 35 IPSecSecureFlags="[SECUREFLAGS]"
36 /> 36 />
37 37
38 <fw:FirewallException Name="WiXToolset Test - 0029" OnUpdate="DoNothing" > 38 <fw:FirewallException Name="WiXToolset Test - 0029" OnUpdate="doNothing" >
39 <fw:RemoteAddress Value="[REMOTEADDRESS]" /> 39 <fw:RemoteAddress Value="[REMOTEADDRESS]" />
40 <fw:LocalAddress Value="[LOCALADDRESS]" /> 40 <fw:LocalAddress Value="[LOCALADDRESS]" />
41 <fw:InterfaceType Value="[INTERFACETYPE]" /> 41 <fw:InterfaceType Value="[INTERFACETYPE]" />