@joebigelow / wix / commits / 5ea1c1b9

Remote payloads using certificate verification cannot use hash

Fixes 6745

Rob Mensching committed Jun 1, 2022 at 13:42 UTC 5ea1c1b91ec31461fa26d4104b7113fc326cdbcb
21 files changed +439 -95
src/ext/NetFx/wixlib/NetCore3.1.12_x64.wxs
+6 -6
@@ -20,8 +20,8 @@
20 <WixVariable Id="AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
21
22 <PackageGroup Id="$(var.AspNetCoreRedistId)">
23 - <ExePackage InstallArguments="$(var.AspNetCoreRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.AspNetCoreRedistId)" Vital="yes" Permanent="yes" Bundle="yes" LogPathVariable="$(var.AspNetCoreRedistLog)" Cache="remove">
24 - <ExePackagePayload Name="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)aspnetcore-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.AspNetCoreRedistLink)" ProductName="Microsoft ASP.NET Core 3.1.12 - Shared Framework" Description="Microsoft ASP.NET Core 3.1.12 - Shared Framework" CertificatePublicKey="3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18" CertificateThumbprint="2485A7AFA98E178CB8F30C9838346B514AEA4769" Hash="5CE9839CAE90FB2936033431F2905E97C7DC080DC50108D58714939CCCC6A265694B8259A3BF742A68BF04D9CFFB0602B0306DD401C4CE644BDB96C7D1168E59" Size="7841808" Version="3.1.12.21070" />
23 + <ExePackage CacheId="$(var.AspNetCoreRedistId)_2485A7AFA98E178CB8F30C9838346B514AEA4769" InstallArguments="$(var.AspNetCoreRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.AspNetCoreRedistId)" Vital="yes" Permanent="yes" Bundle="yes" LogPathVariable="$(var.AspNetCoreRedistLog)" Cache="remove">
24 + <ExePackagePayload Name="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)aspnetcore-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.AspNetCoreRedistLink)" ProductName="Microsoft ASP.NET Core 3.1.12 - Shared Framework" Description="Microsoft ASP.NET Core 3.1.12 - Shared Framework" CertificatePublicKey="3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18" CertificateThumbprint="2485A7AFA98E178CB8F30C9838346B514AEA4769" Size="7841808" Version="3.1.12.21070" />
25 </ExePackage>
26 </PackageGroup>
27 </Fragment>
@@ -35,8 +35,8 @@
35 <WixVariable Id="DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
36
37 <PackageGroup Id="$(var.DesktopNetCoreRedistId)">
38 - <ExePackage InstallArguments="$(var.DesktopNetCoreRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.DesktopNetCoreRedistId)" Vital="yes" Permanent="yes" Bundle="yes" LogPathVariable="$(var.DesktopNetCoreRedistLog)" Cache="remove">
39 - <ExePackagePayload Name="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)windowsdesktop-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.DesktopNetCoreRedistLink)" ProductName="Microsoft Windows Desktop Runtime - 3.1.12 (x64)" Description="Microsoft Windows Desktop Runtime - 3.1.12 (x64)" CertificatePublicKey="3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18" CertificateThumbprint="2485A7AFA98E178CB8F30C9838346B514AEA4769" Hash="CD69B8722B2FF175FADD6774AB6A97F89292FC57A15CEC95218E79FFF1E26F46A7EFFFB15CE0F6D22B83B991F7083BB5C04F5158F87D298EA0F204933F8ECD27" Size="54284816" Version="3.1.12.29719" />
38 + <ExePackage CacheId="$(var.DesktopNetCoreRedistId)_2485A7AFA98E178CB8F30C9838346B514AEA4769" InstallArguments="$(var.DesktopNetCoreRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.DesktopNetCoreRedistId)" Vital="yes" Permanent="yes" Bundle="yes" LogPathVariable="$(var.DesktopNetCoreRedistLog)" Cache="remove">
39 + <ExePackagePayload Name="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)windowsdesktop-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.DesktopNetCoreRedistLink)" ProductName="Microsoft Windows Desktop Runtime - 3.1.12 (x64)" Description="Microsoft Windows Desktop Runtime - 3.1.12 (x64)" CertificatePublicKey="3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18" CertificateThumbprint="2485A7AFA98E178CB8F30C9838346B514AEA4769" Size="54284816" Version="3.1.12.29719" />
40 </ExePackage>
41 </PackageGroup>
42 </Fragment>
@@ -50,8 +50,8 @@
50 <WixVariable Id="DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
51
52 <PackageGroup Id="$(var.DotNetCoreRedistId)">
53 - <ExePackage InstallArguments="$(var.DotNetCoreRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.DotNetCoreRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DotNetCoreRedistLog)" Cache="remove">
54 - <ExePackagePayload Name="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)dotnet-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.DotNetCoreRedistLink)" ProductName="Microsoft .NET Core Runtime - 3.1.12 (x64)" Description="Microsoft .NET Core Runtime - 3.1.12 (x64)" CertificatePublicKey="3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18" CertificateThumbprint="2485A7AFA98E178CB8F30C9838346B514AEA4769" Hash="9B3F882AE5DFDC8B50D3CEC4F3292292D658B2FECB84B3F73426FB3C16E6FC6B8E7118EF559CFAE25ED7A2C175FA4D89E18986CA3C05D15F706524FBB667F702" Size="26090616" Version="3.1.12.29719" />
53 + <ExePackage CacheId="$(var.DotNetCoreRedistId)_2485A7AFA98E178CB8F30C9838346B514AEA4769" InstallArguments="$(var.DotNetCoreRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.DotNetCoreRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DotNetCoreRedistLog)" Cache="remove">
54 + <ExePackagePayload Name="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)dotnet-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.DotNetCoreRedistLink)" ProductName="Microsoft .NET Core Runtime - 3.1.12 (x64)" Description="Microsoft .NET Core Runtime - 3.1.12 (x64)" CertificatePublicKey="3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18" CertificateThumbprint="2485A7AFA98E178CB8F30C9838346B514AEA4769" Size="26090616" Version="3.1.12.29719" />
55 </ExePackage>
56 </PackageGroup>
57 </Fragment>
src/ext/NetFx/wixlib/NetCore3.1.12_x86.wxs
+6 -6
@@ -20,8 +20,8 @@
20 <WixVariable Id="AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
21
22 <PackageGroup Id="$(var.AspNetCoreRedistId)">
23 - <ExePackage InstallArguments="$(var.AspNetCoreRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.AspNetCoreRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.AspNetCoreRedistLog)" Cache="remove">
24 - <ExePackagePayload Name="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)aspnetcore-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.AspNetCoreRedistLink)" ProductName="Microsoft ASP.NET Core 3.1.12 - Shared Framework" Description="Microsoft ASP.NET Core 3.1.12 - Shared Framework" CertificatePublicKey="3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18" CertificateThumbprint="2485A7AFA98E178CB8F30C9838346B514AEA4769" Hash="03EE5F6D3B2AF8FFE2A5154BB05E50938E2D36E98D996D9E67A3C349DD0C8B3051D5A9628F48C51E006CEA0B1F4484B4BE51920FE5CA841060B0D2C6A12FD5D2" Size="7167176" Version="3.1.12.21070" />
23 + <ExePackage CacheId="$(var.AspNetCoreRedistId)_2485A7AFA98E178CB8F30C9838346B514AEA4769" InstallArguments="$(var.AspNetCoreRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.AspNetCoreRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.AspNetCoreRedistLog)" Cache="remove">
24 + <ExePackagePayload Name="!(wix.AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)aspnetcore-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.AspNetCoreRedistLink)" ProductName="Microsoft ASP.NET Core 3.1.12 - Shared Framework" Description="Microsoft ASP.NET Core 3.1.12 - Shared Framework" CertificatePublicKey="3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18" CertificateThumbprint="2485A7AFA98E178CB8F30C9838346B514AEA4769" Size="7167176" Version="3.1.12.21070" />
25 </ExePackage>
26 </PackageGroup>
27 </Fragment>
@@ -35,8 +35,8 @@
35 <WixVariable Id="DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
36
37 <PackageGroup Id="$(var.DesktopNetCoreRedistId)">
38 - <ExePackage InstallArguments="$(var.DesktopNetCoreRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.DesktopNetCoreRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DesktopNetCoreRedistLog)" Cache="remove">
39 - <ExePackagePayload Name="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)windowsdesktop-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.DesktopNetCoreRedistLink)" ProductName="Microsoft Windows Desktop Runtime - 3.1.12 (x86)" Description="Microsoft Windows Desktop Runtime - 3.1.12 (x86)" CertificatePublicKey="3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18" CertificateThumbprint="2485A7AFA98E178CB8F30C9838346B514AEA4769" Hash="C211A7F29D9B6FEEFCF0379B153FFBFB815157D3D494CFD7D0D84D619701EEA284BF12502094BCFF2BB2968213190454E7CE0E865FD623E78C2FCDAEBEF963DA" Size="48590696" Version="3.1.12.29719" />
38 + <ExePackage CacheId="$(var.DesktopNetCoreRedistId)_2485A7AFA98E178CB8F30C9838346B514AEA4769" InstallArguments="$(var.DesktopNetCoreRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.DesktopNetCoreRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DesktopNetCoreRedistLog)" Cache="remove">
39 + <ExePackagePayload Name="!(wix.DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)windowsdesktop-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.DesktopNetCoreRedistLink)" ProductName="Microsoft Windows Desktop Runtime - 3.1.12 (x86)" Description="Microsoft Windows Desktop Runtime - 3.1.12 (x86)" CertificatePublicKey="3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18" CertificateThumbprint="2485A7AFA98E178CB8F30C9838346B514AEA4769" Size="48590696" Version="3.1.12.29719" />
40 </ExePackage>
41 </PackageGroup>
42 </Fragment>
@@ -50,8 +50,8 @@
50 <WixVariable Id="DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
51
52 <PackageGroup Id="$(var.DotNetCoreRedistId)">
53 - <ExePackage InstallArguments="$(var.DotNetCoreRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.DotNetCoreRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DotNetCoreRedistLog)" Cache="remove">
54 - <ExePackagePayload Name="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)dotnet-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.DotNetCoreRedistLink)" ProductName="Microsoft .NET Core Runtime - 3.1.12 (x86)" Description="Microsoft .NET Core Runtime - 3.1.12 (x86)" CertificatePublicKey="3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18" CertificateThumbprint="2485A7AFA98E178CB8F30C9838346B514AEA4769" Hash="BA18F9028B19630D91017BEACCD8D79388125C228A83B5A62306108F3BB283617A7ED9B98785BC73192EC00E5D186DA767E940DCAB388699FAF274E437D0C16F" Size="23392184" Version="3.1.12.29719" />
53 + <ExePackage CacheId="$(var.DotNetCoreRedistId)_2485A7AFA98E178CB8F30C9838346B514AEA4769" InstallArguments="$(var.DotNetCoreRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.DotNetCoreRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DotNetCoreRedistLog)" Cache="remove">
54 + <ExePackagePayload Name="!(wix.DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)dotnet-runtime-$(var.NetCoreVersion)-win-$(var.NetCorePlatform).exe" DownloadUrl="$(var.DotNetCoreRedistLink)" ProductName="Microsoft .NET Core Runtime - 3.1.12 (x86)" Description="Microsoft .NET Core Runtime - 3.1.12 (x86)" CertificatePublicKey="3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18" CertificateThumbprint="2485A7AFA98E178CB8F30C9838346B514AEA4769" Size="23392184" Version="3.1.12.29719" />
55 </ExePackage>
56 </PackageGroup>
57 </Fragment>
src/ext/NetFx/wixlib/NetFx462.wxs
+4 -4
@@ -29,8 +29,8 @@
29 <WixVariable Id="NetFx462WebPackageDirectory" Value="redist\" Overridable="yes" />
30
31 <PackageGroup Id="$(var.NetFx462WebId)">
32 - <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx462FullLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx462WebDetectCondition)" InstallCondition="!(wix.NetFx462WebInstallCondition)" Id="$(var.NetFx462WebId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx462FullLog" Cache="remove">
33 - <ExePackagePayload Name="!(wix.NetFx462WebPackageDirectory)NDP462-KB3151802-Web.exe" DownloadUrl="$(var.NetFx462WebLink)" ProductName="Microsoft .NET Framework 4.6.2" Description="Microsoft .NET Framework 4.6.2 Setup" CertificatePublicKey="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" Hash="D944304952F35B6F49CDA0C6364B55CCB4DF92B134634E594B0496A346B496D3AB709655292595A5D86D44C86C81F19926F84EFF7B87608740B39C12441920A3" Size="1404536" Version="4.6.1590.0" />
32 + <ExePackage CacheId="$(var.NetFx462WebId)_ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" InstallArguments="/q /norestart /log &quot;[NetFx462FullLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx462WebDetectCondition)" InstallCondition="!(wix.NetFx462WebInstallCondition)" Id="$(var.NetFx462WebId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx462FullLog" Cache="remove">
33 + <ExePackagePayload Name="!(wix.NetFx462WebPackageDirectory)NDP462-KB3151802-Web.exe" DownloadUrl="$(var.NetFx462WebLink)" ProductName="Microsoft .NET Framework 4.6.2" Description="Microsoft .NET Framework 4.6.2 Setup" CertificatePublicKey="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" Size="1404536" Version="4.6.1590.0" />
34 </ExePackage>
35 </PackageGroup>
36 </Fragment>
@@ -51,8 +51,8 @@
51 <WixVariable Id="NetFx462RedistPackageDirectory" Value="redist\" Overridable="yes" />
52
53 <PackageGroup Id="$(var.NetFx462RedistId)">
54 - <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx462FullLog].html&quot;" UninstallArguments="/uninstall /q /norestart /log &quot;[NetFx462FullLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx462RedistDetectCondition)" InstallCondition="!(wix.NetFx462RedistInstallCondition)" Id="$(var.NetFx462RedistId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx462FullLog">
55 - <ExePackagePayload Name="!(wix.NetFx462RedistPackageDirectory)NDP462-KB3151800-x86-x64-AllOS-ENU.exe" DownloadUrl="$(var.NetFx462RedistLink)" ProductName="Microsoft .NET Framework 4.6.2" Description="Microsoft .NET Framework 4.6.2 Setup" CertificatePublicKey="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" Hash="045F1AB9AC0126D01494F933EF10DD81B2CC71E1C23A7F2871F06EBAE7A0538467A21ADB461FBFB5EB394BF80A850FF4DCA5EEFDEC17CC3714082018ED372F7A" Size="62000832" Version="4.6.1590.0" />
54 + <ExePackage CacheId="$(var.NetFx462RedistId)_ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" InstallArguments="/q /norestart /log &quot;[NetFx462FullLog].html&quot;" UninstallArguments="/uninstall /q /norestart /log &quot;[NetFx462FullLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx462RedistDetectCondition)" InstallCondition="!(wix.NetFx462RedistInstallCondition)" Id="$(var.NetFx462RedistId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx462FullLog">
55 + <ExePackagePayload Name="!(wix.NetFx462RedistPackageDirectory)NDP462-KB3151800-x86-x64-AllOS-ENU.exe" DownloadUrl="$(var.NetFx462RedistLink)" ProductName="Microsoft .NET Framework 4.6.2" Description="Microsoft .NET Framework 4.6.2 Setup" CertificatePublicKey="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" Size="62000832" Version="4.6.1590.0" />
56 </ExePackage>
57 </PackageGroup>
58 </Fragment>
src/ext/NetFx/wixlib/NetFx472.wxs
+4 -4
@@ -29,8 +29,8 @@
29 <WixVariable Id="NetFx472WebPackageDirectory" Value="redist\" Overridable="yes" />
30
31 <PackageGroup Id="$(var.NetFx472WebId)">
32 - <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx472WebLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx472WebDetectCondition)" InstallCondition="!(wix.NetFx472WebInstallCondition)" Id="$(var.NetFx472WebId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx472WebLog" Cache="remove">
33 - <ExePackagePayload Name="!(wix.NetFx472WebPackageDirectory)NDP472-KB4054531-Web.exe" DownloadUrl="$(var.NetFx472WebLink)" ProductName="Microsoft .NET Framework 4.7.2" Description="Microsoft .NET Framework 4.7.2 Setup" CertificatePublicKey="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" Hash="99B1D7F9264E7D5AEA7B01B69EF541065030055A37CFD76F9846B3CC84FD6F2BAB612042D68DDF992BDA41553C493FB45830699BA5F56AB0AEE200CC539CC5D8" Size="1405792" Version="4.7.3081.0" />
32 + <ExePackage CacheId="$(var.NetFx472WebId)_ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" InstallArguments="/q /norestart /log &quot;[NetFx472WebLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx472WebDetectCondition)" InstallCondition="!(wix.NetFx472WebInstallCondition)" Id="$(var.NetFx472WebId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx472WebLog" Cache="remove">
33 + <ExePackagePayload Name="!(wix.NetFx472WebPackageDirectory)NDP472-KB4054531-Web.exe" DownloadUrl="$(var.NetFx472WebLink)" ProductName="Microsoft .NET Framework 4.7.2" Description="Microsoft .NET Framework 4.7.2 Setup" CertificatePublicKey="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" Size="1405792" Version="4.7.3081.0" />
34 </ExePackage>
35 </PackageGroup>
36 </Fragment>
@@ -51,8 +51,8 @@
51 <WixVariable Id="NetFx472RedistPackageDirectory" Value="redist\" Overridable="yes" />
52
53 <PackageGroup Id="$(var.NetFx472RedistId)">
54 - <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx472RedistLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx472RedistDetectCondition)" InstallCondition="!(wix.NetFx472RedistInstallCondition)" Id="$(var.NetFx472RedistId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx472RedistLog" Cache="remove">
55 - <ExePackagePayload Name="!(wix.NetFx472RedistPackageDirectory)NDP472-KB4054530-x86-x64-AllOS-ENU.exe" DownloadUrl="$(var.NetFx472RedistLink)" ProductName="Microsoft .NET Framework 4.7.2" Description="Microsoft .NET Framework 4.7.2 Setup" CertificatePublicKey="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" Hash="F4EA32D8189DD269FF02D68B39D7DE866AE5F46EEA5A71BF8F4715FB0E4F8B7AC64B274DFA7BFF69B52C719E65256906C8D92FDD355F52C977175AE3E1919098" Size="83940592" Version="4.7.3081.0" />
54 + <ExePackage CacheId="$(var.NetFx472RedistId)_ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" InstallArguments="/q /norestart /log &quot;[NetFx472RedistLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx472RedistDetectCondition)" InstallCondition="!(wix.NetFx472RedistInstallCondition)" Id="$(var.NetFx472RedistId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx472RedistLog" Cache="remove">
55 + <ExePackagePayload Name="!(wix.NetFx472RedistPackageDirectory)NDP472-KB4054530-x86-x64-AllOS-ENU.exe" DownloadUrl="$(var.NetFx472RedistLink)" ProductName="Microsoft .NET Framework 4.7.2" Description="Microsoft .NET Framework 4.7.2 Setup" CertificatePublicKey="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" Size="83940592" Version="4.7.3081.0" />
56 </ExePackage>
57 </PackageGroup>
58 </Fragment>
src/ext/NetFx/wixlib/NetFx48.wxs
+4 -4
@@ -29,8 +29,8 @@
29 <WixVariable Id="NetFx48WebPackageDirectory" Value="redist\" Overridable="yes" />
30
31 <PackageGroup Id="$(var.NetFx48WebId)">
32 - <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx48WebLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx48WebDetectCondition)" InstallCondition="!(wix.NetFx48WebInstallCondition)" Id="$(var.NetFx48WebId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx48WebLog" Cache="remove">
33 - <ExePackagePayload Name="!(wix.NetFx48WebPackageDirectory)ndp48-web.exe" DownloadUrl="$(var.NetFx48WebLink)" ProductName="Microsoft .NET Framework 4.8" Description="Microsoft .NET Framework 4.8 Setup" CertificatePublicKey="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" Hash="642721C60D52051C7F3434D8710FE3406A7CFE10B2B39E90EA847719ED1697D7C614F2DF44AD50412B1DF8C98DD78FDC57CA1D047D28C81AC158092E5FB18040" Size="1439328" Version="4.8.4115.0" />
32 + <ExePackage CacheId="$(var.NetFx48WebId)_ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" InstallArguments="/q /norestart /log &quot;[NetFx48WebLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx48WebDetectCondition)" InstallCondition="!(wix.NetFx48WebInstallCondition)" Id="$(var.NetFx48WebId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx48WebLog" Cache="remove">
33 + <ExePackagePayload Name="!(wix.NetFx48WebPackageDirectory)ndp48-web.exe" DownloadUrl="$(var.NetFx48WebLink)" ProductName="Microsoft .NET Framework 4.8" Description="Microsoft .NET Framework 4.8 Setup" CertificatePublicKey="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" Size="1439328" Version="4.8.4115.0" />
34 </ExePackage>
35 </PackageGroup>
36 </Fragment>
@@ -51,8 +51,8 @@
51 <WixVariable Id="NetFx48RedistPackageDirectory" Value="redist\" Overridable="yes" />
52
53 <PackageGroup Id="$(var.NetFx48RedistId)">
54 - <ExePackage InstallArguments="/q /norestart /log &quot;[NetFx48RedistLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx48RedistDetectCondition)" InstallCondition="!(wix.NetFx48RedistInstallCondition)" Id="$(var.NetFx48RedistId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx48RedistLog" Cache="remove">
55 - <ExePackagePayload Name="!(wix.NetFx48RedistPackageDirectory)ndp48-x86-x64-allos-enu.exe" DownloadUrl="$(var.NetFx48RedistLink)" ProductName="Microsoft .NET Framework 4.8" Description="Microsoft .NET Framework 4.8 Setup" CertificatePublicKey="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" Hash="FFB6C226AF4E5C8FFA7210D5115701883ABF12A8B1CBAE6E08122FB94DD93763468BFF5B00060EABEF19C147B0A4D8063DDE318D2B928CE397C58F7949736C5F" Size="121307088" Version="4.8.4115.0" />
54 + <ExePackage CacheId="$(var.NetFx48RedistId)_ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" InstallArguments="/q /norestart /log &quot;[NetFx48RedistLog].html&quot;" PerMachine="yes" DetectCondition="!(wix.NetFx48RedistDetectCondition)" InstallCondition="!(wix.NetFx48RedistInstallCondition)" Id="$(var.NetFx48RedistId)" Vital="yes" Permanent="yes" Protocol="netfx4" LogPathVariable="NetFx48RedistLog" Cache="remove">
55 + <ExePackagePayload Name="!(wix.NetFx48RedistPackageDirectory)ndp48-x86-x64-allos-enu.exe" DownloadUrl="$(var.NetFx48RedistLink)" ProductName="Microsoft .NET Framework 4.8" Description="Microsoft .NET Framework 4.8 Setup" CertificatePublicKey="F49F9B33E25E33CCA0BFB15A62B7C29FFAB3880B" CertificateThumbprint="ABDCA79AF9DD48A0EA702AD45260B3C03093FB4B" Size="121307088" Version="4.8.4115.0" />
56 </ExePackage>
57 </PackageGroup>
58 </Fragment>
src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
+2 -2
@@ -189,7 +189,7 @@ namespace WixToolset.Core.Burn
189
190 case WixBundlePackageType.Exe:
191 {
192 - var command = new ProcessExePackageCommand(facade, payloadSymbols);
192 + var command = new ProcessExePackageCommand(this.Messaging, facade, payloadSymbols);
193 command.Execute();
194 }
195 break;
@@ -210,7 +210,7 @@ namespace WixToolset.Core.Burn
210
211 case WixBundlePackageType.Msu:
212 {
213 - var command = new ProcessMsuPackageCommand(facade, payloadSymbols);
213 + var command = new ProcessMsuPackageCommand(this.Messaging, facade, payloadSymbols);
214 command.Execute();
215 }
216 break;
src/wix/WixToolset.Core.Burn/Bundles/CacheIdGenerator.cs new
+45
@@ -0,0 +1,45 @@
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 +namespace WixToolset.Core.Burn.Bundles
4 +{
5 + using System;
6 + using WixToolset.Data;
7 + using WixToolset.Data.Symbols;
8 + using WixToolset.Extensibility.Services;
9 +
10 + internal static class CacheIdGenerator
11 + {
12 + // These are "reasonable" limits to trim the very long hashes so
13 + // when used in a cache id we do not overflow MAX_PATH.
14 + private const int ReasonableCountOfCharsFromCertificateThumbprint = 20;
15 + private const int ReasonableUpperLimitForCacheId = 64;
16 +
17 + public static string GenerateCacheIdFromPayloadHashAndThumbprint(WixBundlePayloadSymbol payloadSymbol)
18 + {
19 + var takeFromThumbprint = Math.Min(ReasonableCountOfCharsFromCertificateThumbprint, payloadSymbol.CertificateThumbprint.Length);
20 + var takeFromHash = Math.Min(ReasonableUpperLimitForCacheId - takeFromThumbprint, payloadSymbol.Hash.Length);
21 +
22 + return payloadSymbol.Hash.Substring(0, takeFromHash) + payloadSymbol.CertificateThumbprint.Substring(0, takeFromThumbprint);
23 + }
24 +
25 + public static string GenerateCacheIdFromPackagePayloadHash(IMessaging messaging, WixBundlePayloadSymbol packagePayload, string elementName)
26 + {
27 + string cacheId = null;
28 +
29 + // If we are validating the package via certificate, the CacheId must be specified
30 + // in source code.
31 + if (!String.IsNullOrEmpty(packagePayload.CertificatePublicKey) || !String.IsNullOrEmpty(packagePayload.CertificateThumbprint))
32 + {
33 + var oneOfCertificateAttributeNames = !String.IsNullOrEmpty(packagePayload.CertificatePublicKey) ? "CertificatePublicKey" : "CertificateThumbprint";
34 +
35 + messaging.Write(ErrorMessages.ExpectedAttribute(packagePayload.SourceLineNumbers, elementName, "CacheId", oneOfCertificateAttributeNames));
36 + }
37 + else // validating package by hashing, so the CacheId can be defaulted to the hash with a "reasonable" upper limit since the CacheId is in the cached file path.
38 + {
39 + cacheId = packagePayload.Hash.Length > ReasonableUpperLimitForCacheId ? packagePayload.Hash.Substring(0, ReasonableUpperLimitForCacheId) : packagePayload.Hash;
40 + }
41 +
42 + return cacheId;
43 + }
44 + }
45 +}
src/wix/WixToolset.Core.Burn/Bundles/ProcessExePackageCommand.cs
+8 -3
@@ -4,19 +4,24 @@ namespace WixToolset.Core.Burn.Bundles
4 {
5 using System;
6 using System.Collections.Generic;
7 + using WixToolset.Data;
8 using WixToolset.Data.Symbols;
9 + using WixToolset.Extensibility.Services;
10
11 /// <summary>
12 /// Initializes package state from the Exe contents.
13 /// </summary>
14 internal class ProcessExePackageCommand
15 {
14 - public ProcessExePackageCommand(PackageFacade facade, Dictionary<string, WixBundlePayloadSymbol> payloadSymbols)
16 + public ProcessExePackageCommand(IMessaging messaging, PackageFacade facade, Dictionary<string, WixBundlePayloadSymbol> payloadSymbols)
17 {
16 - this.AuthoredPayloads = payloadSymbols;
18 + this.Messaging = messaging;
19 this.Facade = facade;
20 + this.AuthoredPayloads = payloadSymbols;
21 }
22
23 + public IMessaging Messaging { get; }
24 +
25 public Dictionary<string, WixBundlePayloadSymbol> AuthoredPayloads { get; }
26
27 public PackageFacade Facade { get; }
@@ -30,7 +35,7 @@ namespace WixToolset.Core.Burn.Bundles
35
36 if (String.IsNullOrEmpty(this.Facade.PackageSymbol.CacheId))
37 {
33 - this.Facade.PackageSymbol.CacheId = packagePayload.Hash;
38 + this.Facade.PackageSymbol.CacheId = CacheIdGenerator.GenerateCacheIdFromPackagePayloadHash(this.Messaging, packagePayload, "ExePackage");
39 }
40
41 this.Facade.PackageSymbol.Version = packagePayload.Version;
src/wix/WixToolset.Core.Burn/Bundles/ProcessMsuPackageCommand.cs
+7 -3
@@ -6,18 +6,22 @@ namespace WixToolset.Core.Burn.Bundles
6 using System.Collections.Generic;
7 using WixToolset.Data;
8 using WixToolset.Data.Symbols;
9 + using WixToolset.Extensibility.Services;
10
11 /// <summary>
12 /// Processes the Msu packages to add properties and payloads from the Msu packages.
13 /// </summary>
14 internal class ProcessMsuPackageCommand
15 {
15 - public ProcessMsuPackageCommand(PackageFacade facade, Dictionary<string, WixBundlePayloadSymbol> payloadSymbols)
16 + public ProcessMsuPackageCommand(IMessaging messaging, PackageFacade facade, Dictionary<string, WixBundlePayloadSymbol> payloadSymbols)
17 {
17 - this.AuthoredPayloads = payloadSymbols;
18 + this.Messaging = messaging;
19 this.Facade = facade;
20 + this.AuthoredPayloads = payloadSymbols;
21 }
22
23 + public IMessaging Messaging { get; }
24 +
25 public Dictionary<string, WixBundlePayloadSymbol> AuthoredPayloads { private get; set; }
26
27 public PackageFacade Facade { private get; set; }
@@ -28,7 +32,7 @@ namespace WixToolset.Core.Burn.Bundles
32
33 if (String.IsNullOrEmpty(this.Facade.PackageSymbol.CacheId))
34 {
31 - this.Facade.PackageSymbol.CacheId = packagePayload.Hash;
35 + this.Facade.PackageSymbol.CacheId = CacheIdGenerator.GenerateCacheIdFromPackagePayloadHash(this.Messaging, packagePayload, "MsuPackage");
36 }
37
38 this.Facade.PackageSymbol.PerMachine = true; // MSUs are always per-machine.
src/wix/WixToolset.Core.Burn/CommandLine/RemotePayloadSubcommand.cs
+70 -28
@@ -19,6 +19,9 @@ namespace WixToolset.Core.Burn.CommandLine
19
20 internal class RemotePayloadSubcommand : BurnSubcommandBase
21 {
22 + private static readonly XName BundlePackageName = "BundlePackage";
23 + private static readonly XName ExePackageName = "ExePackage";
24 + private static readonly XName MsuPackageName = "MsuPackage";
25 private static readonly XName BundlePackagePayloadName = "BundlePackagePayload";
26 private static readonly XName ExePackagePayloadName = "ExePackagePayload";
27 private static readonly XName MsuPackagePayloadName = "MsuPackagePayload";
@@ -80,7 +83,7 @@ namespace WixToolset.Core.Burn.CommandLine
83 this.IntermediateFolder = Path.GetTempPath();
84 }
85
83 - var elements = this.HarvestRemotePayloads(inputPaths);
86 + var element = this.HarvestPackageElement(inputPaths);
87
88 if (!this.Messaging.EncounteredError)
89 {
@@ -89,14 +92,11 @@ namespace WixToolset.Core.Burn.CommandLine
92 var outputFolder = Path.GetDirectoryName(this.OutputPath);
93 Directory.CreateDirectory(outputFolder);
94
92 - File.WriteAllLines(this.OutputPath, elements.Select(e => e.ToString()));
95 + File.WriteAllText(this.OutputPath, element.ToString());
96 }
97 else
98 {
96 - foreach (var element in elements)
97 - {
98 - Console.WriteLine(element);
99 - }
99 + Console.WriteLine(element.ToString());
100 }
101 }
102
@@ -189,10 +189,51 @@ namespace WixToolset.Core.Burn.CommandLine
189 return result.Distinct(StringComparer.OrdinalIgnoreCase).ToList();
190 }
191
192 - private IEnumerable<XElement> HarvestRemotePayloads(IEnumerable<string> paths)
192 + private XElement HarvestPackageElement(IEnumerable<string> paths)
193 + {
194 + var harvestedFiles = this.HarvestRemotePayloads(paths).ToList();
195 +
196 + XElement element;
197 +
198 + switch (harvestedFiles[0].PackageType)
199 + {
200 + case WixBundlePackageType.Bundle:
201 + element = new XElement(BundlePackageName);
202 + break;
203 +
204 + case WixBundlePackageType.Exe:
205 + element = new XElement(ExePackageName);
206 + break;
207 +
208 + case WixBundlePackageType.Msu:
209 + element = new XElement(MsuPackageName);
210 + break;
211 +
212 + default:
213 + return null;
214 + }
215 +
216 + var packagePayloadFile = harvestedFiles.FirstOrDefault();
217 +
218 + if (packagePayloadFile != null)
219 + {
220 + if (packagePayloadFile.Element.Attribute("CertificateThumbprint") != null)
221 + {
222 + var cacheId = CacheIdGenerator.GenerateCacheIdFromPayloadHashAndThumbprint(packagePayloadFile.PayloadSymbol);
223 +
224 + element.Add(new XAttribute("CacheId", cacheId));
225 + }
226 +
227 + element.Add(harvestedFiles.Select(h => h.Element));
228 + }
229 +
230 + return element;
231 + }
232 +
233 + private IEnumerable<HarvestedFile> HarvestRemotePayloads(IEnumerable<string> paths)
234 {
235 var first = true;
195 - var hashes = this.GetHashes(paths);
236 + var hashes = this.GetCertificateHashes(paths);
237
238 foreach (var path in paths)
239 {
@@ -204,22 +245,22 @@ namespace WixToolset.Core.Burn.CommandLine
245 continue;
246 }
247
248 + yield return harvestedFile;
249 +
250 if (harvestedFile.PackagePayloads.Any())
251 {
209 - var packageHashes = this.GetHashes(harvestedFile.PackagePayloads.Select(x => x.SourceFile.Path));
252 + var packageCertificateHashes = this.GetCertificateHashes(harvestedFile.PackagePayloads.Select(x => x.SourceFile.Path));
253
254 foreach (var payloadSymbol in harvestedFile.PackagePayloads)
255 {
213 - var harvestedPackageFile = this.HarvestFile(payloadSymbol.SourceFile.Path, false, packageHashes);
214 - yield return harvestedPackageFile.Element;
256 + var harvestedPackageFile = this.HarvestFile(payloadSymbol.SourceFile.Path, false, packageCertificateHashes);
257 + yield return harvestedPackageFile;
258 }
259 }
217 -
218 - yield return harvestedFile.Element;
260 }
261 }
262
222 - private Dictionary<string, CertificateHashes> GetHashes(IEnumerable<string> paths)
263 + private Dictionary<string, CertificateHashes> GetCertificateHashes(IEnumerable<string> paths)
264 {
265 var hashes = new Dictionary<string, CertificateHashes>();
266
@@ -233,7 +274,7 @@ namespace WixToolset.Core.Burn.CommandLine
274 return hashes;
275 }
276
236 - private HarvestedFile HarvestFile(string path, bool isPackage, Dictionary<string, CertificateHashes> hashes)
277 + private HarvestedFile HarvestFile(string path, bool isPackage, Dictionary<string, CertificateHashes> certificateHashes)
278 {
279 XElement element;
280 WixBundlePackageType? packageType = null;
@@ -274,7 +315,7 @@ namespace WixToolset.Core.Burn.CommandLine
315 var payloadSymbol = new WixBundlePayloadSymbol(null, new Identifier(AccessModifier.Section, "id"))
316 {
317 SourceFile = new IntermediateFieldPathValue { Path = path },
277 - Name = Path.GetFileName(path),
318 + Name = this.GetRelativeFileName(path),
319 };
320
321 this.PayloadHarvester.HarvestStandardInformation(payloadSymbol);
@@ -293,22 +334,18 @@ namespace WixToolset.Core.Burn.CommandLine
334
335 if (!String.IsNullOrEmpty(this.DownloadUrl))
336 {
296 - var filename = this.GetRelativeFileName(payloadSymbol.SourceFile.Path);
297 - var formattedUrl = String.Format(this.DownloadUrl, filename);
298 -
299 - if (Uri.TryCreate(formattedUrl, UriKind.Absolute, out var url))
300 - {
301 - element.Add(new XAttribute("DownloadUrl", url.AbsoluteUri));
302 - }
337 + element.Add(new XAttribute("DownloadUrl", this.DownloadUrl));
338 }
339
305 - if (hashes.TryGetValue(path, out var certificateHashes))
340 + if (certificateHashes.TryGetValue(path, out var certificateHashForPath))
341 {
307 - element.Add(new XAttribute("CertificatePublicKey", certificateHashes.PublicKey));
308 - element.Add(new XAttribute("CertificateThumbprint", certificateHashes.Thumbprint));
309 - }
342 + payloadSymbol.CertificatePublicKey = certificateHashForPath.PublicKey;
343 + payloadSymbol.CertificateThumbprint = certificateHashForPath.Thumbprint;
344
311 - if (!String.IsNullOrEmpty(payloadSymbol.Hash))
345 + element.Add(new XAttribute("CertificatePublicKey", payloadSymbol.CertificatePublicKey));
346 + element.Add(new XAttribute("CertificateThumbprint", payloadSymbol.CertificateThumbprint));
347 + }
348 + else if (!String.IsNullOrEmpty(payloadSymbol.Hash))
349 {
350 element.Add(new XAttribute("Hash", payloadSymbol.Hash));
351 }
@@ -326,6 +363,7 @@ namespace WixToolset.Core.Burn.CommandLine
363 var harvestedFile = new HarvestedFile
364 {
365 Element = element,
366 + PackageType = packageType,
367 PayloadSymbol = payloadSymbol,
368 };
369
@@ -418,7 +456,11 @@ namespace WixToolset.Core.Burn.CommandLine
456 private class HarvestedFile
457 {
458 public XElement Element { get; set; }
459 +
460 + public WixBundlePackageType? PackageType { get; internal set; }
461 +
462 public WixBundlePayloadSymbol PayloadSymbol { get; set; }
463 +
464 public List<WixBundlePayloadSymbol> PackagePayloads { get; } = new List<WixBundlePayloadSymbol>();
465 }
466 }
src/wix/WixToolset.Core/Compile/CompilerPayload.cs
+20 -10
@@ -145,18 +145,11 @@ namespace WixToolset.Core
145 this.Core.Write(ErrorMessages.ExpectedAttributeWithoutOtherAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "Name", "SourceFile"));
146 }
147
148 - if (!this.Size.HasValue)
149 - {
150 - this.Core.Write(ErrorMessages.ExpectedAttributeWithoutOtherAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "Size", "SourceFile"));
151 - }
152 -
153 - if (String.IsNullOrEmpty(this.Hash))
154 - {
155 - this.Core.Write(ErrorMessages.ExpectedAttributeWithoutOtherAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "Hash", "SourceFile"));
156 - }
157 -
148 + // If remote payload is being verified by a certificate.
149 if (!String.IsNullOrEmpty(this.CertificatePublicKey) || !String.IsNullOrEmpty(this.CertificateThumbprint))
150 {
151 + var oneOfCertificateAttributeNames = !String.IsNullOrEmpty(this.CertificatePublicKey) ? "CertificatePublicKey" : "CertificateThumbprint";
152 +
153 if (String.IsNullOrEmpty(this.CertificateThumbprint))
154 {
155 this.Core.Write(ErrorMessages.ExpectedAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "CertificateThumbprint", "CertificatePublicKey"));
@@ -165,6 +158,23 @@ namespace WixToolset.Core
158 {
159 this.Core.Write(ErrorMessages.ExpectedAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "CertificatePublicKey", "CertificateThumbprint"));
160 }
161 +
162 + if (!String.IsNullOrEmpty(this.Hash))
163 + {
164 + this.Core.Write(ErrorMessages.IllegalAttributeWithOtherAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "Hash", oneOfCertificateAttributeNames));
165 + }
166 + }
167 + else // payload is being verified by hash.
168 + {
169 + if (String.IsNullOrEmpty(this.Hash))
170 + {
171 + this.Core.Write(ErrorMessages.ExpectedAttributeWithoutOtherAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "Hash", "SourceFile"));
172 + }
173 +
174 + if (!this.Size.HasValue)
175 + {
176 + this.Core.Write(ErrorMessages.ExpectedAttributeWithoutOtherAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "Size", "SourceFile"));
177 + }
178 }
179
180 if (YesNoDefaultType.Yes == this.Compressed)
src/wix/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs
+27
@@ -443,5 +443,32 @@ namespace WixToolsetTest.CoreIntegration
443 Assert.Equal(401, result.ExitCode);
444 }
445 }
446 +
447 + [Fact]
448 + public void CannotBuildBundleWithExePackageUsingCertificateVerificationWithoutCacheId()
449 + {
450 + var dotDatafolder = TestData.Get(@"TestData", ".Data");
451 + var folder = TestData.Get(@"TestData", "ExePackage");
452 +
453 + using (var fs = new DisposableFileSystem())
454 + {
455 + var baseFolder = fs.GetFolder();
456 + var intermediateFolder = Path.Combine(baseFolder, "obj");
457 +
458 + var result = WixRunner.Execute(new[]
459 + {
460 + "build",
461 + Path.Combine(folder, "UseCertificateVerificationWithoutCacheId.wxs"),
462 + "-bindpath", Path.Combine(folder, "data"),
463 + "-bindpath", dotDatafolder,
464 + "-intermediateFolder", intermediateFolder,
465 + "-o", Path.Combine(baseFolder, "bin", "test.exe")
466 + });
467 +
468 + Assert.Equal(10, result.ExitCode);
469 + var message = result.Messages.Single();
470 + Assert.Equal("The ExePackage/@CacheId attribute was not found; it is required when attribute CertificatePublicKey is specified.", message.ToString());
471 + }
472 + }
473 }
474 }
src/wix/test/WixToolsetTest.CoreIntegration/MsuPackageFixture.cs
+56
@@ -3,6 +3,7 @@
3 namespace WixToolsetTest.CoreIntegration
4 {
5 using System.IO;
6 + using System.Linq;
7 using WixBuildTools.TestSupport;
8 using WixToolset.Core.TestPackage;
9 using Xunit;
@@ -12,6 +13,7 @@ namespace WixToolsetTest.CoreIntegration
13 [Fact]
14 public void CanBuildBundleWithMsuPackage()
15 {
16 + var dotDatafolder = TestData.Get(@"TestData", ".Data");
17 var folder = TestData.Get(@"TestData", "MsuPackage");
18
19 using (var fs = new DisposableFileSystem())
@@ -24,6 +26,7 @@ namespace WixToolsetTest.CoreIntegration
26 "build",
27 Path.Combine(folder, "Bundle.wxs"),
28 "-bindpath", Path.Combine(folder, "data"),
29 + "-bindpath", dotDatafolder,
30 "-intermediateFolder", intermediateFolder,
31 "-o", Path.Combine(baseFolder, "bin", "test.exe")
32 });
@@ -32,5 +35,58 @@ namespace WixToolsetTest.CoreIntegration
35 Assert.True(File.Exists(Path.Combine(baseFolder, "bin", "test.exe")));
36 }
37 }
38 +
39 + [Fact]
40 + public void CanBuildBundleWithMsuPackageUsingCertificateVerification()
41 + {
42 + var dotDatafolder = TestData.Get(@"TestData", ".Data");
43 + var folder = TestData.Get(@"TestData", "MsuPackage");
44 +
45 + using (var fs = new DisposableFileSystem())
46 + {
47 + var baseFolder = fs.GetFolder();
48 + var intermediateFolder = Path.Combine(baseFolder, "obj");
49 +
50 + var result = WixRunner.Execute(new[]
51 + {
52 + "build",
53 + Path.Combine(folder, "BundleUsingCertificateVerification.wxs"),
54 + "-bindpath", Path.Combine(folder, "data"),
55 + "-bindpath", dotDatafolder,
56 + "-intermediateFolder", intermediateFolder,
57 + "-o", Path.Combine(baseFolder, "bin", "test.exe")
58 + });
59 +
60 + result.AssertSuccess();
61 + Assert.True(File.Exists(Path.Combine(baseFolder, "bin", "test.exe")));
62 + }
63 + }
64 +
65 + [Fact]
66 + public void CannotBuildBundleWithMsuPackageUsingCertificateVerificationWithoutCacheId()
67 + {
68 + var dotDatafolder = TestData.Get(@"TestData", ".Data");
69 + var folder = TestData.Get(@"TestData", "MsuPackage");
70 +
71 + using (var fs = new DisposableFileSystem())
72 + {
73 + var baseFolder = fs.GetFolder();
74 + var intermediateFolder = Path.Combine(baseFolder, "obj");
75 +
76 + var result = WixRunner.Execute(new[]
77 + {
78 + "build",
79 + Path.Combine(folder, "BundleUsingCertificateVerificationWithoutCacheId.wxs"),
80 + "-bindpath", Path.Combine(folder, "data"),
81 + "-bindpath", dotDatafolder,
82 + "-intermediateFolder", intermediateFolder,
83 + "-o", Path.Combine(baseFolder, "bin", "test.exe")
84 + });
85 +
86 + Assert.Equal(10, result.ExitCode);
87 + var message = result.Messages.Single();
88 + Assert.Equal("The MsuPackage/@CacheId attribute was not found; it is required when attribute CertificatePublicKey is specified.", message.ToString());
89 + }
90 + }
91 }
92 }
src/wix/test/WixToolsetTest.CoreIntegration/PackagePayloadFixture.cs
+2 -1
@@ -336,8 +336,9 @@ namespace WixToolsetTest.CoreIntegration
336 WixAssert.CompareLineByLine(new[]
337 {
338 "The ExePackagePayload/@CertificatePublicKey attribute was not found; it is required when attribute CertificateThumbprint is specified.",
339 + "The ExePackagePayload/@Hash attribute cannot be specified when attribute CertificateThumbprint is present."
340 }, result.Messages.Select(m => m.ToString()).ToArray());
340 - Assert.Equal(10, result.ExitCode);
341 + Assert.Equal(35, result.ExitCode);
342 }
343 }
344
src/wix/test/WixToolsetTest.CoreIntegration/RemotePayloadFixture.cs
+137 -22
@@ -2,6 +2,7 @@
2
3 namespace WixToolsetTest.CoreIntegration
4 {
5 + using System;
6 using System.Collections.Generic;
7 using System.IO;
8 using System.Linq;
@@ -59,9 +60,11 @@ namespace WixToolsetTest.CoreIntegration
60 };
61 WixAssert.StringEqual(
62 "<root>" +
63 + "<BundlePackage>" +
64 "<BundlePackagePayload Name='test.exe' ProductName='DiversePayloadsBundle' Description='DiversePayloadsBundle' Hash='*' Size='*' Version='1.0.0.0'>" +
65 "<RemoteBundle BundleId='*' DisplayName='DiversePayloadsBundle' EngineVersion='*' InstallSize='3790116' ManifestNamespace='http://wixtoolset.org/schemas/v4/2008/Burn' PerMachine='yes' ProviderKey='*' ProtocolVersion='1' Version='1.0.0.0' Win64='no' UpgradeCode='{FEF1D2B8-4737-4A2A-9F91-77F7294FB55B}' />" +
66 "</BundlePackagePayload>" +
67 + "</BundlePackage>" +
68 "</root>", xml.GetFragmentTestXml(ignoreAttributesByElementName));
69
70 // ExternalWithoutDownloadUrl
@@ -81,13 +84,15 @@ namespace WixToolsetTest.CoreIntegration
84 xml = File.ReadAllText(externalWithoutDownloadUrlOutFile);
85 WixAssert.StringEqual(
86 "<root>" +
87 + "<BundlePackage>" +
88 + "<BundlePackagePayload Name='test.exe' ProductName='DiversePayloadsBundle' Description='DiversePayloadsBundle' Hash='*' Size='*' Version='1.0.0.0'>" +
89 + "<RemoteBundle BundleId='*' DisplayName='DiversePayloadsBundle' EngineVersion='*' InstallSize='3790116' ManifestNamespace='http://wixtoolset.org/schemas/v4/2008/Burn' PerMachine='yes' ProviderKey='*' ProtocolVersion='1' Version='1.0.0.0' Win64='no' UpgradeCode='{FEF1D2B8-4737-4A2A-9F91-77F7294FB55B}' />" +
90 + "</BundlePackagePayload>" +
91 "<Payload Name='External.cab' Hash='*' Size='*' />" +
92 "<Payload Name='test.msi' Hash='*' Size='*' />" +
93 "<Payload Name='test.txt' Hash='*' Size='*' />" +
94 "<Payload Name='Shared.dll' Hash='*' Size='*' />" +
88 - "<BundlePackagePayload Name='test.exe' ProductName='DiversePayloadsBundle' Description='DiversePayloadsBundle' Hash='*' Size='*' Version='1.0.0.0'>" +
89 - "<RemoteBundle BundleId='*' DisplayName='DiversePayloadsBundle' EngineVersion='*' InstallSize='3790116' ManifestNamespace='http://wixtoolset.org/schemas/v4/2008/Burn' PerMachine='yes' ProviderKey='*' ProtocolVersion='1' Version='1.0.0.0' Win64='no' UpgradeCode='{FEF1D2B8-4737-4A2A-9F91-77F7294FB55B}' />" +
90 - "</BundlePackagePayload>" +
95 + "</BundlePackage>" +
96 "</root>", xml.GetFragmentTestXml(ignoreAttributesByElementName));
97
98 // External
@@ -107,14 +112,16 @@ namespace WixToolsetTest.CoreIntegration
112 xml = File.ReadAllText(externalOutFile);
113 WixAssert.StringEqual(
114 "<root>" +
115 + "<BundlePackage>" +
116 + "<BundlePackagePayload Name='test.exe' ProductName='DiversePayloadsBundle' Description='DiversePayloadsBundle' Hash='*' Size='*' Version='1.0.0.0'>" +
117 + "<RemoteBundle BundleId='*' DisplayName='DiversePayloadsBundle' EngineVersion='*' InstallSize='3790116' ManifestNamespace='http://wixtoolset.org/schemas/v4/2008/Burn' PerMachine='yes' ProviderKey='*' ProtocolVersion='1' Version='1.0.0.0' Win64='no' UpgradeCode='{FEF1D2B8-4737-4A2A-9F91-77F7294FB55B}' />" +
118 + "</BundlePackagePayload>" +
119 "<Payload Name='External.cab' Hash='*' Size='*' />" +
120 "<Payload Name='Windows8.1-KB2937592-x86.msu' Hash='*' Size='*' />" +
121 "<Payload Name='test.msi' Hash='*' Size='*' />" +
122 "<Payload Name='test.txt' Hash='*' Size='*' />" +
123 "<Payload Name='Shared.dll' Hash='*' Size='*' />" +
115 - "<BundlePackagePayload Name='test.exe' ProductName='DiversePayloadsBundle' Description='DiversePayloadsBundle' Hash='*' Size='*' Version='1.0.0.0'>" +
116 - "<RemoteBundle BundleId='*' DisplayName='DiversePayloadsBundle' EngineVersion='*' InstallSize='3790116' ManifestNamespace='http://wixtoolset.org/schemas/v4/2008/Burn' PerMachine='yes' ProviderKey='*' ProtocolVersion='1' Version='1.0.0.0' Win64='no' UpgradeCode='{FEF1D2B8-4737-4A2A-9F91-77F7294FB55B}' />" +
117 - "</BundlePackagePayload>" +
124 + "</BundlePackage>" +
125 "</root>", xml.GetFragmentTestXml(ignoreAttributesByElementName));
126
127 // All
@@ -134,15 +141,17 @@ namespace WixToolsetTest.CoreIntegration
141 xml = File.ReadAllText(allOutFile);
142 WixAssert.StringEqual(
143 "<root>" +
144 + "<BundlePackage>" +
145 + "<BundlePackagePayload Name='test.exe' ProductName='DiversePayloadsBundle' Description='DiversePayloadsBundle' Hash='*' Size='*' Version='1.0.0.0'>" +
146 + "<RemoteBundle BundleId='*' DisplayName='DiversePayloadsBundle' EngineVersion='*' InstallSize='3790116' ManifestNamespace='http://wixtoolset.org/schemas/v4/2008/Burn' PerMachine='yes' ProviderKey='*' ProtocolVersion='1' Version='1.0.0.0' Win64='no' UpgradeCode='{FEF1D2B8-4737-4A2A-9F91-77F7294FB55B}' />" +
147 + "</BundlePackagePayload>" +
148 "<Payload Name='External.cab' Hash='*' Size='*' />" +
149 "<Payload Name='signed_bundle_engine.exe' ProductName='~TestBundle' Description='~TestBundle' Hash='*' Size='*' Version='1.0.0.0' />" +
150 "<Payload Name='Windows8.1-KB2937592-x86.msu' Hash='*' Size='*' />" +
151 "<Payload Name='test.msi' Hash='*' Size='*' />" +
152 "<Payload Name='test.txt' Hash='*' Size='*' />" +
153 "<Payload Name='Shared.dll' Hash='*' Size='*' />" +
143 - "<BundlePackagePayload Name='test.exe' ProductName='DiversePayloadsBundle' Description='DiversePayloadsBundle' Hash='*' Size='*' Version='1.0.0.0'>" +
144 - "<RemoteBundle BundleId='*' DisplayName='DiversePayloadsBundle' EngineVersion='*' InstallSize='3790116' ManifestNamespace='http://wixtoolset.org/schemas/v4/2008/Burn' PerMachine='yes' ProviderKey='*' ProtocolVersion='1' Version='1.0.0.0' Win64='no' UpgradeCode='{FEF1D2B8-4737-4A2A-9F91-77F7294FB55B}' />" +
145 - "</BundlePackagePayload>" +
154 + "</BundlePackage>" +
155 "</root>", xml.GetFragmentTestXml(ignoreAttributesByElementName));
156 }
157 }
@@ -173,9 +182,11 @@ namespace WixToolsetTest.CoreIntegration
182
183 WixAssert.CompareLineByLine(new[]
184 {
176 - "<BundlePackagePayload Name='v3bundle.exe' ProductName='CustomV3Theme' Description='CustomV3Theme' DownloadUrl='https://www.example.com/files/v3bundle.exe' Hash='80739E7B8C31D75B4CDC48D60D74F5E481CB904212A3AE3FB0920365A163FBF32B0C5C175AB516D4124F107923E96200605DE1D560D362FEB47350FA727823B4' Size='648397' Version='1.0.0.0'>",
177 - " <RemoteBundle BundleId='{215A70DB-AB35-48C7-BE51-D66EAAC87177}' DisplayName='CustomV3Theme' InstallSize='1135' ManifestNamespace='http://schemas.microsoft.com/wix/2008/Burn' PerMachine='yes' ProviderKey='{215a70db-ab35-48c7-be51-d66eaac87177}' ProtocolVersion='1' Version='1.0.0.0' Win64='no' UpgradeCode='{2BF4C01F-C132-4E70-97AB-2BC68C7CCD10}' />",
178 - "</BundlePackagePayload>",
185 + "<BundlePackage>",
186 + " <BundlePackagePayload Name='v3bundle.exe' ProductName='CustomV3Theme' Description='CustomV3Theme' DownloadUrl='https://www.example.com/files/{0}' Hash='80739E7B8C31D75B4CDC48D60D74F5E481CB904212A3AE3FB0920365A163FBF32B0C5C175AB516D4124F107923E96200605DE1D560D362FEB47350FA727823B4' Size='648397' Version='1.0.0.0'>",
187 + " <RemoteBundle BundleId='{215A70DB-AB35-48C7-BE51-D66EAAC87177}' DisplayName='CustomV3Theme' InstallSize='1135' ManifestNamespace='http://schemas.microsoft.com/wix/2008/Burn' PerMachine='yes' ProviderKey='{215a70db-ab35-48c7-be51-d66eaac87177}' ProtocolVersion='1' Version='1.0.0.0' Win64='no' UpgradeCode='{2BF4C01F-C132-4E70-97AB-2BC68C7CCD10}' />",
188 + " </BundlePackagePayload>",
189 + "</BundlePackage>",
190 }, elements);
191 }
192 }
@@ -205,7 +216,9 @@ namespace WixToolsetTest.CoreIntegration
216
217 WixAssert.CompareLineByLine(new[]
218 {
208 - @"<ExePackagePayload Name='burn.exe' ProductName='Windows Installer XML Toolset' Description='WiX Toolset Bootstrapper' DownloadUrl='https://www.example.com/files/burn.exe' Hash='F6E722518AC3AB7E31C70099368D5770788C179AA23226110DCF07319B1E1964E246A1E8AE72E2CF23E0138AFC281BAFDE45969204405E114EB20C8195DA7E5E' Size='463360' Version='3.14.0.1703' />",
219 + @"<ExePackage>",
220 + @" <ExePackagePayload Name='burn.exe' ProductName='Windows Installer XML Toolset' Description='WiX Toolset Bootstrapper' DownloadUrl='https://www.example.com/files/{0}' Hash='F6E722518AC3AB7E31C70099368D5770788C179AA23226110DCF07319B1E1964E246A1E8AE72E2CF23E0138AFC281BAFDE45969204405E114EB20C8195DA7E5E' Size='463360' Version='3.14.0.1703' />",
221 + @"</ExePackage>",
222 }, elements);
223 }
224 }
@@ -234,12 +247,76 @@ namespace WixToolsetTest.CoreIntegration
247
248 WixAssert.CompareLineByLine(new[]
249 {
237 - @"<MsuPackagePayload Name='Windows8.1-KB2937592-x86.msu' Hash='904ADEA6AB675ACE16483138BF3F5850FD56ACB6E3A13AFA7263ED49C68CCE6CF84D6AAD6F99AAF175A95EE1A56C787C5AD968019056490B1073E7DBB7B9B7BE' Size='309544' />",
250 + @"<MsuPackage>",
251 + @" <MsuPackagePayload Name='Windows8.1-KB2937592-x86.msu' Hash='904ADEA6AB675ACE16483138BF3F5850FD56ACB6E3A13AFA7263ED49C68CCE6CF84D6AAD6F99AAF175A95EE1A56C787C5AD968019056490B1073E7DBB7B9B7BE' Size='309544' />",
252 + @"</MsuPackage>"
253 }, elements);
254 }
255 }
256
257 [Fact]
258 + public void CanGetRemoteMsuPayloadWithCertificate()
259 + {
260 + var folder = TestData.Get(@"TestData");
261 +
262 + using (var fs = new DisposableFileSystem())
263 + {
264 + var outputFolder = fs.GetFolder();
265 + var outFile = Path.Combine(outputFolder, "out.xml");
266 + var remotePayloadSourceFile = Path.Combine(outputFolder, "remotePayload.wxs");
267 + var intermediateFolder = Path.Combine(outputFolder, "obj");
268 + var bundleFile = Path.Combine(intermediateFolder, "out.exe");
269 +
270 + var result = WixRunner.Execute(new[]
271 + {
272 + "burn", "remotepayload",
273 + "-usecertificate",
274 + "-downloadUrl", "http://wixtoolset.org/{0}",
275 + Path.Combine(folder, ".Data", "Windows8.1-KB2937592-x86.msu"),
276 + "-o", outFile
277 + });
278 +
279 + result.AssertSuccess();
280 +
281 + var elements = File.ReadAllLines(outFile);
282 + elements = elements.Select(s => s.Replace("\"", "'")).ToArray();
283 +
284 + WixAssert.CompareLineByLine(new[]
285 + {
286 + @"<MsuPackage CacheId='904ADEA6AB675ACE16483138BF3F5850FD56ACB6E3A1108E2BA23632620C427C'>",
287 + @" <MsuPackagePayload Name='Windows8.1-KB2937592-x86.msu' DownloadUrl='http://wixtoolset.org/{0}' CertificatePublicKey='A260A870BE1145ED71E2BB5AA19463A4FE9DCC41' CertificateThumbprint='108E2BA23632620C427C570B6D9DB51AC31387FE' Size='309544' />",
288 + @"</MsuPackage>"
289 + }, elements);
290 +
291 + // Append required attributes to build.
292 + elements[0] = elements[0].Replace(">", " KB='KB2937592' DetectCondition='test'>");
293 +
294 + var remotePayloadSourceText = "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>" +
295 + " <Fragment>" +
296 + " <PackageGroup Id='BundlePackages'>" +
297 + String.Join(Environment.NewLine, elements) +
298 + " </PackageGroup>" +
299 + " </Fragment>" +
300 + "</Wix>";
301 +
302 + File.WriteAllText(remotePayloadSourceFile, remotePayloadSourceText);
303 +
304 + result = WixRunner.Execute(new[]
305 + {
306 + "build",
307 + Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
308 + remotePayloadSourceFile,
309 + "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
310 + "-bindpath", Path.Combine(folder, ".Data"),
311 + "-intermediateFolder", intermediateFolder,
312 + "-o", bundleFile
313 + });
314 +
315 + result.AssertSuccess();
316 + }
317 + }
318 +
319 + [Fact(Skip = "Blocked by https://github.com/wixtoolset/issues/issues/5601 - Support RemotePayload for Payload elements")]
320 public void CanGetRemotePayloadWithCertificate()
321 {
322 var folder = TestData.Get(@"TestData");
@@ -248,11 +325,15 @@ namespace WixToolsetTest.CoreIntegration
325 {
326 var outputFolder = fs.GetFolder();
327 var outFile = Path.Combine(outputFolder, "out.xml");
328 + var remotePayloadSourceFile = Path.Combine(outputFolder, "remotePayload.wxs");
329 + var intermediateFolder = Path.Combine(outputFolder, "obj");
330 + var bundleFile = Path.Combine(intermediateFolder, "out.exe");
331
332 var result = WixRunner.Execute(new[]
333 {
334 "burn", "remotepayload",
335 "-usecertificate",
336 + "-downloadUrl", "http://wixtoolset.org/{0}",
337 Path.Combine(folder, ".Data", "burn.exe"),
338 Path.Combine(folder, ".Data", "signed_cab1.cab"),
339 "-o", outFile
@@ -265,9 +346,38 @@ namespace WixToolsetTest.CoreIntegration
346
347 WixAssert.CompareLineByLine(new[]
348 {
268 - @"<ExePackagePayload Name='burn.exe' ProductName='Windows Installer XML Toolset' Description='WiX Toolset Bootstrapper' Hash='F6E722518AC3AB7E31C70099368D5770788C179AA23226110DCF07319B1E1964E246A1E8AE72E2CF23E0138AFC281BAFDE45969204405E114EB20C8195DA7E5E' Size='463360' Version='3.14.0.1703' />",
269 - @"<Payload Name='signed_cab1.cab' CertificatePublicKey='BBD1B48A37503767C71F455624967D406A5D66C3' CertificateThumbprint='DE13B4CE635E3F63AA2394E66F95C460267BC82F' Hash='D8D3842403710E1F6036A62543224855CADF546853933C2B17BA99D789D4347B36717687C022678A9D3DE749DFC1482DAAB92B997B62BB32A8A6828B9D04C414' Size='1585' />",
349 + @"<ExePackage>",
350 + @" <ExePackagePayload Name='burn.exe' ProductName='Windows Installer XML Toolset' Description='WiX Toolset Bootstrapper' DownloadUrl='http://wixtoolset.org/{0}' Hash='F6E722518AC3AB7E31C70099368D5770788C179AA23226110DCF07319B1E1964E246A1E8AE72E2CF23E0138AFC281BAFDE45969204405E114EB20C8195DA7E5E' Size='463360' Version='3.14.0.1703' />",
351 + @" <Payload Name='signed_cab1.cab' DownloadUrl='http://wixtoolset.org/{0}' CertificatePublicKey='BBD1B48A37503767C71F455624967D406A5D66C3' CertificateThumbprint='DE13B4CE635E3F63AA2394E66F95C460267BC82F' Size='1585' />",
352 + @"</ExePackage>",
353 }, elements);
354 +
355 + elements[0] = elements[0].Replace(">", " Permanent='yes' DetectCondition='test'>");
356 +
357 + var remotePayloadSourceText = "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>" +
358 + " <Fragment>" +
359 + " <PackageGroup Id='BundlePackages'>" +
360 + " <ExePackage CacheId='xyz'>" +
361 + String.Join(Environment.NewLine, elements) +
362 + " </ExePackage>" +
363 + " </PackageGroup>" +
364 + " </Fragment>" +
365 + "</Wix>";
366 +
367 + File.WriteAllText(remotePayloadSourceFile, remotePayloadSourceText);
368 +
369 + result = WixRunner.Execute(new[]
370 + {
371 + "build",
372 + Path.Combine(folder, "BundleWithPackageGroupRef", "Bundle.wxs"),
373 + remotePayloadSourceFile,
374 + "-bindpath", Path.Combine(folder, "SimpleBundle", "data"),
375 + "-bindpath", Path.Combine(folder, ".Data"),
376 + "-intermediateFolder", intermediateFolder,
377 + "-o", bundleFile
378 + });
379 +
380 + result.AssertSuccess();
381 }
382 }
383
@@ -296,8 +406,10 @@ namespace WixToolsetTest.CoreIntegration
406
407 WixAssert.CompareLineByLine(new[]
408 {
299 - @"<ExePackagePayload Name='burn.exe' ProductName='Windows Installer XML Toolset' Description='WiX Toolset Bootstrapper' Hash='F6E722518AC3AB7E31C70099368D5770788C179AA23226110DCF07319B1E1964E246A1E8AE72E2CF23E0138AFC281BAFDE45969204405E114EB20C8195DA7E5E' Size='463360' Version='3.14.0.1703' />",
300 - @"<Payload Name='signed_cab1.cab' Hash='D8D3842403710E1F6036A62543224855CADF546853933C2B17BA99D789D4347B36717687C022678A9D3DE749DFC1482DAAB92B997B62BB32A8A6828B9D04C414' Size='1585' />",
409 + @"<ExePackage>",
410 + @" <ExePackagePayload Name='burn.exe' ProductName='Windows Installer XML Toolset' Description='WiX Toolset Bootstrapper' Hash='F6E722518AC3AB7E31C70099368D5770788C179AA23226110DCF07319B1E1964E246A1E8AE72E2CF23E0138AFC281BAFDE45969204405E114EB20C8195DA7E5E' Size='463360' Version='3.14.0.1703' />",
411 + @" <Payload Name='signed_cab1.cab' Hash='D8D3842403710E1F6036A62543224855CADF546853933C2B17BA99D789D4347B36717687C022678A9D3DE749DFC1482DAAB92B997B62BB32A8A6828B9D04C414' Size='1585' />",
412 + @"</ExePackage>",
413 }, elements);
414 }
415 }
@@ -319,6 +431,7 @@ namespace WixToolsetTest.CoreIntegration
431 "-du", "https://www.example.com/files/{0}",
432 Path.Combine(folder, ".Data", "burn.exe"),
433 Path.Combine(folder, "RemotePayload", "recurse", "*"),
434 + "-basepath", Path.Combine(folder, "RemotePayload", "recurse"),
435 "-basepath", folder,
436 "-bp", Path.Combine(folder, ".Data"),
437 "-o", outFile
@@ -331,10 +444,12 @@ namespace WixToolsetTest.CoreIntegration
444
445 WixAssert.CompareLineByLine(new[]
446 {
334 - @"<ExePackagePayload Name='burn.exe' ProductName='Windows Installer XML Toolset' Description='WiX Toolset Bootstrapper' DownloadUrl='https://www.example.com/files/burn.exe' Hash='F6E722518AC3AB7E31C70099368D5770788C179AA23226110DCF07319B1E1964E246A1E8AE72E2CF23E0138AFC281BAFDE45969204405E114EB20C8195DA7E5E' Size='463360' Version='3.14.0.1703' />",
335 - @"<Payload Name='a.dat' DownloadUrl='https://www.example.com/files/RemotePayload/recurse/a.dat' Hash='D13926E5CBE5ED8B46133F9199FAF2FF25B25981C67A31AE2BC3F6C20390FACBFADCD89BD22D3445D95B989C8EACFB1E68DB634BECB5C9624865BA453BCE362A' Size='16' />",
336 - @"<Payload Name='b.dat' DownloadUrl='https://www.example.com/files/RemotePayload/recurse/subfolder/b.dat' Hash='5F94707BC29ADFE3B9615E6753388707FD0B8F5FD9EEEC2B17E21E72F1635FF7D7A101E7D14F614E111F263CB9AC4D0940BE1247881A7844F226D6C400293D8E' Size='37' />",
337 - @"<Payload Name='c.dat' DownloadUrl='https://www.example.com/files/RemotePayload/recurse/subfolder/c.dat' Hash='97D6209A5571E05E4F72F9C6BF0987651FA03E63F971F9B53C2B3D798A666D9864F232D4E2D6442E47D9D72B282309B6EEFF4EE017B43B706FA92A0F5EF74734' Size='42' />",
447 + @"<ExePackage>",
448 + @" <ExePackagePayload Name='burn.exe' ProductName='Windows Installer XML Toolset' Description='WiX Toolset Bootstrapper' DownloadUrl='https://www.example.com/files/{0}' Hash='F6E722518AC3AB7E31C70099368D5770788C179AA23226110DCF07319B1E1964E246A1E8AE72E2CF23E0138AFC281BAFDE45969204405E114EB20C8195DA7E5E' Size='463360' Version='3.14.0.1703' />",
449 + @" <Payload Name='a.dat' DownloadUrl='https://www.example.com/files/{0}' Hash='D13926E5CBE5ED8B46133F9199FAF2FF25B25981C67A31AE2BC3F6C20390FACBFADCD89BD22D3445D95B989C8EACFB1E68DB634BECB5C9624865BA453BCE362A' Size='16' />",
450 + @" <Payload Name='subfolder\b.dat' DownloadUrl='https://www.example.com/files/{0}' Hash='5F94707BC29ADFE3B9615E6753388707FD0B8F5FD9EEEC2B17E21E72F1635FF7D7A101E7D14F614E111F263CB9AC4D0940BE1247881A7844F226D6C400293D8E' Size='37' />",
451 + @" <Payload Name='subfolder\c.dat' DownloadUrl='https://www.example.com/files/{0}' Hash='97D6209A5571E05E4F72F9C6BF0987651FA03E63F971F9B53C2B3D798A666D9864F232D4E2D6442E47D9D72B282309B6EEFF4EE017B43B706FA92A0F5EF74734' Size='42' />",
452 + @"</ExePackage>"
453 }, elements);
454 }
455 }
src/wix/test/WixToolsetTest.CoreIntegration/TestData/.Data/fakeba.dll renamed
src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/UseCertificateVerificationWithoutCacheId.wxs new
+13
@@ -0,0 +1,13 @@
1 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 + <Bundle Name="BurnBundle" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="B94478B1-E1F3-4700-9CE8-6AA090854AEC">
3 + <BootstrapperApplication>
4 + <BootstrapperApplicationDll SourceFile="fakeba.dll" />
5 + </BootstrapperApplication>
6 +
7 + <Chain>
8 + <ExePackage DetectCondition="DetectedTheMsu" UninstallArguments="-uninstall">
9 + <ExePackagePayload Name='foo.exe' DownloadUrl='http://wixtoolset.org' CertificatePublicKey="abc" CertificateThumbprint="123" Size='10' />
10 + </ExePackage>
11 + </Chain>
12 + </Bundle>
13 +</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/MsuPackage/BundleUsingCertificateVerification.wxs new
+13
@@ -0,0 +1,13 @@
1 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 + <Bundle Name="BurnBundle" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="B94478B1-E1F3-4700-9CE8-6AA090854AEC">
3 + <BootstrapperApplication>
4 + <BootstrapperApplicationDll SourceFile="fakeba.dll" />
5 + </BootstrapperApplication>
6 +
7 + <Chain>
8 + <MsuPackage DetectCondition="DetectedTheMsu" KB="xyz" CacheId="8cf75b99-13c0-4184-82ce-dbde45dcd55a">
9 + <MsuPackagePayload Name='Windows8.1-KB2937592-x86.msu' DownloadUrl='http://wixtoolset.org' CertificatePublicKey="abc" CertificateThumbprint="123" Size='309544' />
10 + </MsuPackage>
11 + </Chain>
12 + </Bundle>
13 +</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/MsuPackage/BundleUsingCertificateVerificationWithoutCacheId.wxs new
+13
@@ -0,0 +1,13 @@
1 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 + <Bundle Name="BurnBundle" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="B94478B1-E1F3-4700-9CE8-6AA090854AEC">
3 + <BootstrapperApplication>
4 + <BootstrapperApplicationDll SourceFile="fakeba.dll" />
5 + </BootstrapperApplication>
6 +
7 + <Chain>
8 + <MsuPackage DetectCondition="DetectedTheMsu" KB="xyz" >
9 + <MsuPackagePayload Name='Windows8.1-KB2937592-x86.msu' DownloadUrl='http://wixtoolset.org' CertificatePublicKey="abc" CertificateThumbprint="123" Size='309544' />
10 + </MsuPackage>
11 + </Chain>
12 + </Bundle>
13 +</Wix>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedCertificate.wxs
+1 -1
@@ -3,7 +3,7 @@
3 <Fragment>
4 <PackageGroup Id="BundlePackages">
5 <ExePackage Id="SpecifiedSourceFileAndHash" Permanent="yes" DetectCondition="none">
6 - <ExePackagePayload CertificatePublicKey="abcd" CertificateThumbprint="abcd" Hash="1234" DownloadUrl="https://example.com/" Name="fake.exe" Size="100" />
6 + <ExePackagePayload CertificatePublicKey="abcd" CertificateThumbprint="abcd" DownloadUrl="https://example.com/" Name="fake.exe" Size="100" />
7 </ExePackage>
8 </PackageGroup>
9 </Fragment>
src/wix/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedCertificatePublicKeyWithoutThumbprint.wxs
+1 -1
@@ -3,7 +3,7 @@
3 <Fragment>
4 <PackageGroup Id="BundlePackages">
5 <ExePackage Id="SpecifiedSourceFileAndHash" Permanent="yes" DetectCondition="none">
6 - <ExePackagePayload CertificatePublicKey="abcd" Hash="123" DownloadUrl="https://example.com/" Name="fake.exe" Size="100" />
6 + <ExePackagePayload CertificatePublicKey="abcd" DownloadUrl="https://example.com/" Name="fake.exe" Size="100" />
7 </ExePackage>
8 </PackageGroup>
9 </Fragment>