aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2022-06-01 13:42:18 -0700
committerRob Mensching <rob@firegiant.com>2022-06-29 23:01:15 -0700
commit5ea1c1b91ec31461fa26d4104b7113fc326cdbcb (patch)
tree1f2e49cf00b445b602ab8a8cb89f63506c234300
parenta73e1caa90c0b7230b569aea2739991124d36360 (diff)
downloadwix-5ea1c1b91ec31461fa26d4104b7113fc326cdbcb.tar.gz
wix-5ea1c1b91ec31461fa26d4104b7113fc326cdbcb.tar.bz2
wix-5ea1c1b91ec31461fa26d4104b7113fc326cdbcb.zip
Remote payloads using certificate verification cannot use hash
Fixes 6745
-rw-r--r--src/ext/NetFx/wixlib/NetCore3.1.12_x64.wxs12
-rw-r--r--src/ext/NetFx/wixlib/NetCore3.1.12_x86.wxs12
-rw-r--r--src/ext/NetFx/wixlib/NetFx462.wxs8
-rw-r--r--src/ext/NetFx/wixlib/NetFx472.wxs8
-rw-r--r--src/ext/NetFx/wixlib/NetFx48.wxs8
-rw-r--r--src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs4
-rw-r--r--src/wix/WixToolset.Core.Burn/Bundles/CacheIdGenerator.cs45
-rw-r--r--src/wix/WixToolset.Core.Burn/Bundles/ProcessExePackageCommand.cs11
-rw-r--r--src/wix/WixToolset.Core.Burn/Bundles/ProcessMsuPackageCommand.cs10
-rw-r--r--src/wix/WixToolset.Core.Burn/CommandLine/RemotePayloadSubcommand.cs98
-rw-r--r--src/wix/WixToolset.Core/Compile/CompilerPayload.cs30
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs27
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/MsuPackageFixture.cs56
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/PackagePayloadFixture.cs3
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/RemotePayloadFixture.cs159
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/.Data/fakeba.dll (renamed from src/wix/test/WixToolsetTest.CoreIntegration/TestData/MsuPackage/data/fakeba.dll)0
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/UseCertificateVerificationWithoutCacheId.wxs13
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/MsuPackage/BundleUsingCertificateVerification.wxs13
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/MsuPackage/BundleUsingCertificateVerificationWithoutCacheId.wxs13
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedCertificate.wxs2
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedCertificatePublicKeyWithoutThumbprint.wxs2
21 files changed, 439 insertions, 95 deletions
diff --git a/src/ext/NetFx/wixlib/NetCore3.1.12_x64.wxs b/src/ext/NetFx/wixlib/NetCore3.1.12_x64.wxs
index b69bb37f..3a1f5910 100644
--- a/src/ext/NetFx/wixlib/NetCore3.1.12_x64.wxs
+++ b/src/ext/NetFx/wixlib/NetCore3.1.12_x64.wxs
@@ -20,8 +20,8 @@
20 <WixVariable Id="AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" /> 20 <WixVariable Id="AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
21 21
22 <PackageGroup Id="$(var.AspNetCoreRedistId)"> 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"> 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" Hash="5CE9839CAE90FB2936033431F2905E97C7DC080DC50108D58714939CCCC6A265694B8259A3BF742A68BF04D9CFFB0602B0306DD401C4CE644BDB96C7D1168E59" Size="7841808" Version="3.1.12.21070" /> 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> 25 </ExePackage>
26 </PackageGroup> 26 </PackageGroup>
27 </Fragment> 27 </Fragment>
@@ -35,8 +35,8 @@
35 <WixVariable Id="DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" /> 35 <WixVariable Id="DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
36 36
37 <PackageGroup Id="$(var.DesktopNetCoreRedistId)"> 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"> 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" Hash="CD69B8722B2FF175FADD6774AB6A97F89292FC57A15CEC95218E79FFF1E26F46A7EFFFB15CE0F6D22B83B991F7083BB5C04F5158F87D298EA0F204933F8ECD27" Size="54284816" Version="3.1.12.29719" /> 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> 40 </ExePackage>
41 </PackageGroup> 41 </PackageGroup>
42 </Fragment> 42 </Fragment>
@@ -50,8 +50,8 @@
50 <WixVariable Id="DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" /> 50 <WixVariable Id="DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
51 51
52 <PackageGroup Id="$(var.DotNetCoreRedistId)"> 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"> 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" Hash="9B3F882AE5DFDC8B50D3CEC4F3292292D658B2FECB84B3F73426FB3C16E6FC6B8E7118EF559CFAE25ED7A2C175FA4D89E18986CA3C05D15F706524FBB667F702" Size="26090616" Version="3.1.12.29719" /> 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> 55 </ExePackage>
56 </PackageGroup> 56 </PackageGroup>
57 </Fragment> 57 </Fragment>
diff --git a/src/ext/NetFx/wixlib/NetCore3.1.12_x86.wxs b/src/ext/NetFx/wixlib/NetCore3.1.12_x86.wxs
index cf88b32c..e3a70daf 100644
--- a/src/ext/NetFx/wixlib/NetCore3.1.12_x86.wxs
+++ b/src/ext/NetFx/wixlib/NetCore3.1.12_x86.wxs
@@ -20,8 +20,8 @@
20 <WixVariable Id="AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" /> 20 <WixVariable Id="AspNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
21 21
22 <PackageGroup Id="$(var.AspNetCoreRedistId)"> 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"> 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" Hash="03EE5F6D3B2AF8FFE2A5154BB05E50938E2D36E98D996D9E67A3C349DD0C8B3051D5A9628F48C51E006CEA0B1F4484B4BE51920FE5CA841060B0D2C6A12FD5D2" Size="7167176" Version="3.1.12.21070" /> 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> 25 </ExePackage>
26 </PackageGroup> 26 </PackageGroup>
27 </Fragment> 27 </Fragment>
@@ -35,8 +35,8 @@
35 <WixVariable Id="DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" /> 35 <WixVariable Id="DesktopNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
36 36
37 <PackageGroup Id="$(var.DesktopNetCoreRedistId)"> 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"> 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" Hash="C211A7F29D9B6FEEFCF0379B153FFBFB815157D3D494CFD7D0D84D619701EEA284BF12502094BCFF2BB2968213190454E7CE0E865FD623E78C2FCDAEBEF963DA" Size="48590696" Version="3.1.12.29719" /> 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> 40 </ExePackage>
41 </PackageGroup> 41 </PackageGroup>
42 </Fragment> 42 </Fragment>
@@ -50,8 +50,8 @@
50 <WixVariable Id="DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" /> 50 <WixVariable Id="DotNetCoreRuntime$(var.NetCoreIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
51 51
52 <PackageGroup Id="$(var.DotNetCoreRedistId)"> 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"> 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" Hash="BA18F9028B19630D91017BEACCD8D79388125C228A83B5A62306108F3BB283617A7ED9B98785BC73192EC00E5D186DA767E940DCAB388699FAF274E437D0C16F" Size="23392184" Version="3.1.12.29719" /> 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> 55 </ExePackage>
56 </PackageGroup> 56 </PackageGroup>
57 </Fragment> 57 </Fragment>
diff --git a/src/ext/NetFx/wixlib/NetFx462.wxs b/src/ext/NetFx/wixlib/NetFx462.wxs
index cafbee56..904d2be0 100644
--- a/src/ext/NetFx/wixlib/NetFx462.wxs
+++ b/src/ext/NetFx/wixlib/NetFx462.wxs
@@ -29,8 +29,8 @@
29 <WixVariable Id="NetFx462WebPackageDirectory" Value="redist\" Overridable="yes" /> 29 <WixVariable Id="NetFx462WebPackageDirectory" Value="redist\" Overridable="yes" />
30 30
31 <PackageGroup Id="$(var.NetFx462WebId)"> 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"> 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" Hash="D944304952F35B6F49CDA0C6364B55CCB4DF92B134634E594B0496A346B496D3AB709655292595A5D86D44C86C81F19926F84EFF7B87608740B39C12441920A3" Size="1404536" Version="4.6.1590.0" /> 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> 34 </ExePackage>
35 </PackageGroup> 35 </PackageGroup>
36 </Fragment> 36 </Fragment>
@@ -51,8 +51,8 @@
51 <WixVariable Id="NetFx462RedistPackageDirectory" Value="redist\" Overridable="yes" /> 51 <WixVariable Id="NetFx462RedistPackageDirectory" Value="redist\" Overridable="yes" />
52 52
53 <PackageGroup Id="$(var.NetFx462RedistId)"> 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"> 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" Hash="045F1AB9AC0126D01494F933EF10DD81B2CC71E1C23A7F2871F06EBAE7A0538467A21ADB461FBFB5EB394BF80A850FF4DCA5EEFDEC17CC3714082018ED372F7A" Size="62000832" Version="4.6.1590.0" /> 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> 56 </ExePackage>
57 </PackageGroup> 57 </PackageGroup>
58 </Fragment> 58 </Fragment>
diff --git a/src/ext/NetFx/wixlib/NetFx472.wxs b/src/ext/NetFx/wixlib/NetFx472.wxs
index b6d50e75..15cb0de2 100644
--- a/src/ext/NetFx/wixlib/NetFx472.wxs
+++ b/src/ext/NetFx/wixlib/NetFx472.wxs
@@ -29,8 +29,8 @@
29 <WixVariable Id="NetFx472WebPackageDirectory" Value="redist\" Overridable="yes" /> 29 <WixVariable Id="NetFx472WebPackageDirectory" Value="redist\" Overridable="yes" />
30 30
31 <PackageGroup Id="$(var.NetFx472WebId)"> 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"> 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" Hash="99B1D7F9264E7D5AEA7B01B69EF541065030055A37CFD76F9846B3CC84FD6F2BAB612042D68DDF992BDA41553C493FB45830699BA5F56AB0AEE200CC539CC5D8" Size="1405792" Version="4.7.3081.0" /> 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> 34 </ExePackage>
35 </PackageGroup> 35 </PackageGroup>
36 </Fragment> 36 </Fragment>
@@ -51,8 +51,8 @@
51 <WixVariable Id="NetFx472RedistPackageDirectory" Value="redist\" Overridable="yes" /> 51 <WixVariable Id="NetFx472RedistPackageDirectory" Value="redist\" Overridable="yes" />
52 52
53 <PackageGroup Id="$(var.NetFx472RedistId)"> 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"> 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" Hash="F4EA32D8189DD269FF02D68B39D7DE866AE5F46EEA5A71BF8F4715FB0E4F8B7AC64B274DFA7BFF69B52C719E65256906C8D92FDD355F52C977175AE3E1919098" Size="83940592" Version="4.7.3081.0" /> 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> 56 </ExePackage>
57 </PackageGroup> 57 </PackageGroup>
58 </Fragment> 58 </Fragment>
diff --git a/src/ext/NetFx/wixlib/NetFx48.wxs b/src/ext/NetFx/wixlib/NetFx48.wxs
index f23f08db..fc2f97f5 100644
--- a/src/ext/NetFx/wixlib/NetFx48.wxs
+++ b/src/ext/NetFx/wixlib/NetFx48.wxs
@@ -29,8 +29,8 @@
29 <WixVariable Id="NetFx48WebPackageDirectory" Value="redist\" Overridable="yes" /> 29 <WixVariable Id="NetFx48WebPackageDirectory" Value="redist\" Overridable="yes" />
30 30
31 <PackageGroup Id="$(var.NetFx48WebId)"> 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"> 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" Hash="642721C60D52051C7F3434D8710FE3406A7CFE10B2B39E90EA847719ED1697D7C614F2DF44AD50412B1DF8C98DD78FDC57CA1D047D28C81AC158092E5FB18040" Size="1439328" Version="4.8.4115.0" /> 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> 34 </ExePackage>
35 </PackageGroup> 35 </PackageGroup>
36 </Fragment> 36 </Fragment>
@@ -51,8 +51,8 @@
51 <WixVariable Id="NetFx48RedistPackageDirectory" Value="redist\" Overridable="yes" /> 51 <WixVariable Id="NetFx48RedistPackageDirectory" Value="redist\" Overridable="yes" />
52 52
53 <PackageGroup Id="$(var.NetFx48RedistId)"> 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"> 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" Hash="FFB6C226AF4E5C8FFA7210D5115701883ABF12A8B1CBAE6E08122FB94DD93763468BFF5B00060EABEF19C147B0A4D8063DDE318D2B928CE397C58F7949736C5F" Size="121307088" Version="4.8.4115.0" /> 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> 56 </ExePackage>
57 </PackageGroup> 57 </PackageGroup>
58 </Fragment> 58 </Fragment>
diff --git a/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs b/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
index 348a4b41..82547487 100644
--- a/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
+++ b/src/wix/WixToolset.Core.Burn/Bind/BindBundleCommand.cs
@@ -189,7 +189,7 @@ namespace WixToolset.Core.Burn
189 189
190 case WixBundlePackageType.Exe: 190 case WixBundlePackageType.Exe:
191 { 191 {
192 var command = new ProcessExePackageCommand(facade, payloadSymbols); 192 var command = new ProcessExePackageCommand(this.Messaging, facade, payloadSymbols);
193 command.Execute(); 193 command.Execute();
194 } 194 }
195 break; 195 break;
@@ -210,7 +210,7 @@ namespace WixToolset.Core.Burn
210 210
211 case WixBundlePackageType.Msu: 211 case WixBundlePackageType.Msu:
212 { 212 {
213 var command = new ProcessMsuPackageCommand(facade, payloadSymbols); 213 var command = new ProcessMsuPackageCommand(this.Messaging, facade, payloadSymbols);
214 command.Execute(); 214 command.Execute();
215 } 215 }
216 break; 216 break;
diff --git a/src/wix/WixToolset.Core.Burn/Bundles/CacheIdGenerator.cs b/src/wix/WixToolset.Core.Burn/Bundles/CacheIdGenerator.cs
new file mode 100644
index 00000000..2efa748b
--- /dev/null
+++ b/src/wix/WixToolset.Core.Burn/Bundles/CacheIdGenerator.cs
@@ -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
3namespace 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}
diff --git a/src/wix/WixToolset.Core.Burn/Bundles/ProcessExePackageCommand.cs b/src/wix/WixToolset.Core.Burn/Bundles/ProcessExePackageCommand.cs
index 8d8ea986..3307db47 100644
--- a/src/wix/WixToolset.Core.Burn/Bundles/ProcessExePackageCommand.cs
+++ b/src/wix/WixToolset.Core.Burn/Bundles/ProcessExePackageCommand.cs
@@ -4,19 +4,24 @@ namespace WixToolset.Core.Burn.Bundles
4{ 4{
5 using System; 5 using System;
6 using System.Collections.Generic; 6 using System.Collections.Generic;
7 using WixToolset.Data;
7 using WixToolset.Data.Symbols; 8 using WixToolset.Data.Symbols;
9 using WixToolset.Extensibility.Services;
8 10
9 /// <summary> 11 /// <summary>
10 /// Initializes package state from the Exe contents. 12 /// Initializes package state from the Exe contents.
11 /// </summary> 13 /// </summary>
12 internal class ProcessExePackageCommand 14 internal class ProcessExePackageCommand
13 { 15 {
14 public ProcessExePackageCommand(PackageFacade facade, Dictionary<string, WixBundlePayloadSymbol> payloadSymbols) 16 public ProcessExePackageCommand(IMessaging messaging, PackageFacade facade, Dictionary<string, WixBundlePayloadSymbol> payloadSymbols)
15 { 17 {
16 this.AuthoredPayloads = payloadSymbols; 18 this.Messaging = messaging;
17 this.Facade = facade; 19 this.Facade = facade;
20 this.AuthoredPayloads = payloadSymbols;
18 } 21 }
19 22
23 public IMessaging Messaging { get; }
24
20 public Dictionary<string, WixBundlePayloadSymbol> AuthoredPayloads { get; } 25 public Dictionary<string, WixBundlePayloadSymbol> AuthoredPayloads { get; }
21 26
22 public PackageFacade Facade { get; } 27 public PackageFacade Facade { get; }
@@ -30,7 +35,7 @@ namespace WixToolset.Core.Burn.Bundles
30 35
31 if (String.IsNullOrEmpty(this.Facade.PackageSymbol.CacheId)) 36 if (String.IsNullOrEmpty(this.Facade.PackageSymbol.CacheId))
32 { 37 {
33 this.Facade.PackageSymbol.CacheId = packagePayload.Hash; 38 this.Facade.PackageSymbol.CacheId = CacheIdGenerator.GenerateCacheIdFromPackagePayloadHash(this.Messaging, packagePayload, "ExePackage");
34 } 39 }
35 40
36 this.Facade.PackageSymbol.Version = packagePayload.Version; 41 this.Facade.PackageSymbol.Version = packagePayload.Version;
diff --git a/src/wix/WixToolset.Core.Burn/Bundles/ProcessMsuPackageCommand.cs b/src/wix/WixToolset.Core.Burn/Bundles/ProcessMsuPackageCommand.cs
index 4c61f6d7..b61956a2 100644
--- a/src/wix/WixToolset.Core.Burn/Bundles/ProcessMsuPackageCommand.cs
+++ b/src/wix/WixToolset.Core.Burn/Bundles/ProcessMsuPackageCommand.cs
@@ -6,18 +6,22 @@ namespace WixToolset.Core.Burn.Bundles
6 using System.Collections.Generic; 6 using System.Collections.Generic;
7 using WixToolset.Data; 7 using WixToolset.Data;
8 using WixToolset.Data.Symbols; 8 using WixToolset.Data.Symbols;
9 using WixToolset.Extensibility.Services;
9 10
10 /// <summary> 11 /// <summary>
11 /// Processes the Msu packages to add properties and payloads from the Msu packages. 12 /// Processes the Msu packages to add properties and payloads from the Msu packages.
12 /// </summary> 13 /// </summary>
13 internal class ProcessMsuPackageCommand 14 internal class ProcessMsuPackageCommand
14 { 15 {
15 public ProcessMsuPackageCommand(PackageFacade facade, Dictionary<string, WixBundlePayloadSymbol> payloadSymbols) 16 public ProcessMsuPackageCommand(IMessaging messaging, PackageFacade facade, Dictionary<string, WixBundlePayloadSymbol> payloadSymbols)
16 { 17 {
17 this.AuthoredPayloads = payloadSymbols; 18 this.Messaging = messaging;
18 this.Facade = facade; 19 this.Facade = facade;
20 this.AuthoredPayloads = payloadSymbols;
19 } 21 }
20 22
23 public IMessaging Messaging { get; }
24
21 public Dictionary<string, WixBundlePayloadSymbol> AuthoredPayloads { private get; set; } 25 public Dictionary<string, WixBundlePayloadSymbol> AuthoredPayloads { private get; set; }
22 26
23 public PackageFacade Facade { private get; set; } 27 public PackageFacade Facade { private get; set; }
@@ -28,7 +32,7 @@ namespace WixToolset.Core.Burn.Bundles
28 32
29 if (String.IsNullOrEmpty(this.Facade.PackageSymbol.CacheId)) 33 if (String.IsNullOrEmpty(this.Facade.PackageSymbol.CacheId))
30 { 34 {
31 this.Facade.PackageSymbol.CacheId = packagePayload.Hash; 35 this.Facade.PackageSymbol.CacheId = CacheIdGenerator.GenerateCacheIdFromPackagePayloadHash(this.Messaging, packagePayload, "MsuPackage");
32 } 36 }
33 37
34 this.Facade.PackageSymbol.PerMachine = true; // MSUs are always per-machine. 38 this.Facade.PackageSymbol.PerMachine = true; // MSUs are always per-machine.
diff --git a/src/wix/WixToolset.Core.Burn/CommandLine/RemotePayloadSubcommand.cs b/src/wix/WixToolset.Core.Burn/CommandLine/RemotePayloadSubcommand.cs
index e812bc8a..83b10c7c 100644
--- a/src/wix/WixToolset.Core.Burn/CommandLine/RemotePayloadSubcommand.cs
+++ b/src/wix/WixToolset.Core.Burn/CommandLine/RemotePayloadSubcommand.cs
@@ -19,6 +19,9 @@ namespace WixToolset.Core.Burn.CommandLine
19 19
20 internal class RemotePayloadSubcommand : BurnSubcommandBase 20 internal class RemotePayloadSubcommand : BurnSubcommandBase
21 { 21 {
22 private static readonly XName BundlePackageName = "BundlePackage";
23 private static readonly XName ExePackageName = "ExePackage";
24 private static readonly XName MsuPackageName = "MsuPackage";
22 private static readonly XName BundlePackagePayloadName = "BundlePackagePayload"; 25 private static readonly XName BundlePackagePayloadName = "BundlePackagePayload";
23 private static readonly XName ExePackagePayloadName = "ExePackagePayload"; 26 private static readonly XName ExePackagePayloadName = "ExePackagePayload";
24 private static readonly XName MsuPackagePayloadName = "MsuPackagePayload"; 27 private static readonly XName MsuPackagePayloadName = "MsuPackagePayload";
@@ -80,7 +83,7 @@ namespace WixToolset.Core.Burn.CommandLine
80 this.IntermediateFolder = Path.GetTempPath(); 83 this.IntermediateFolder = Path.GetTempPath();
81 } 84 }
82 85
83 var elements = this.HarvestRemotePayloads(inputPaths); 86 var element = this.HarvestPackageElement(inputPaths);
84 87
85 if (!this.Messaging.EncounteredError) 88 if (!this.Messaging.EncounteredError)
86 { 89 {
@@ -89,14 +92,11 @@ namespace WixToolset.Core.Burn.CommandLine
89 var outputFolder = Path.GetDirectoryName(this.OutputPath); 92 var outputFolder = Path.GetDirectoryName(this.OutputPath);
90 Directory.CreateDirectory(outputFolder); 93 Directory.CreateDirectory(outputFolder);
91 94
92 File.WriteAllLines(this.OutputPath, elements.Select(e => e.ToString())); 95 File.WriteAllText(this.OutputPath, element.ToString());
93 } 96 }
94 else 97 else
95 { 98 {
96 foreach (var element in elements) 99 Console.WriteLine(element.ToString());
97 {
98 Console.WriteLine(element);
99 }
100 } 100 }
101 } 101 }
102 102
@@ -189,10 +189,51 @@ namespace WixToolset.Core.Burn.CommandLine
189 return result.Distinct(StringComparer.OrdinalIgnoreCase).ToList(); 189 return result.Distinct(StringComparer.OrdinalIgnoreCase).ToList();
190 } 190 }
191 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)
193 { 234 {
194 var first = true; 235 var first = true;
195 var hashes = this.GetHashes(paths); 236 var hashes = this.GetCertificateHashes(paths);
196 237
197 foreach (var path in paths) 238 foreach (var path in paths)
198 { 239 {
@@ -204,22 +245,22 @@ namespace WixToolset.Core.Burn.CommandLine
204 continue; 245 continue;
205 } 246 }
206 247
248 yield return harvestedFile;
249
207 if (harvestedFile.PackagePayloads.Any()) 250 if (harvestedFile.PackagePayloads.Any())
208 { 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));
210 253
211 foreach (var payloadSymbol in harvestedFile.PackagePayloads) 254 foreach (var payloadSymbol in harvestedFile.PackagePayloads)
212 { 255 {
213 var harvestedPackageFile = this.HarvestFile(payloadSymbol.SourceFile.Path, false, packageHashes); 256 var harvestedPackageFile = this.HarvestFile(payloadSymbol.SourceFile.Path, false, packageCertificateHashes);
214 yield return harvestedPackageFile.Element; 257 yield return harvestedPackageFile;
215 } 258 }
216 } 259 }
217
218 yield return harvestedFile.Element;
219 } 260 }
220 } 261 }
221 262
222 private Dictionary<string, CertificateHashes> GetHashes(IEnumerable<string> paths) 263 private Dictionary<string, CertificateHashes> GetCertificateHashes(IEnumerable<string> paths)
223 { 264 {
224 var hashes = new Dictionary<string, CertificateHashes>(); 265 var hashes = new Dictionary<string, CertificateHashes>();
225 266
@@ -233,7 +274,7 @@ namespace WixToolset.Core.Burn.CommandLine
233 return hashes; 274 return hashes;
234 } 275 }
235 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)
237 { 278 {
238 XElement element; 279 XElement element;
239 WixBundlePackageType? packageType = null; 280 WixBundlePackageType? packageType = null;
@@ -274,7 +315,7 @@ namespace WixToolset.Core.Burn.CommandLine
274 var payloadSymbol = new WixBundlePayloadSymbol(null, new Identifier(AccessModifier.Section, "id")) 315 var payloadSymbol = new WixBundlePayloadSymbol(null, new Identifier(AccessModifier.Section, "id"))
275 { 316 {
276 SourceFile = new IntermediateFieldPathValue { Path = path }, 317 SourceFile = new IntermediateFieldPathValue { Path = path },
277 Name = Path.GetFileName(path), 318 Name = this.GetRelativeFileName(path),
278 }; 319 };
279 320
280 this.PayloadHarvester.HarvestStandardInformation(payloadSymbol); 321 this.PayloadHarvester.HarvestStandardInformation(payloadSymbol);
@@ -293,22 +334,18 @@ namespace WixToolset.Core.Burn.CommandLine
293 334
294 if (!String.IsNullOrEmpty(this.DownloadUrl)) 335 if (!String.IsNullOrEmpty(this.DownloadUrl))
295 { 336 {
296 var filename = this.GetRelativeFileName(payloadSymbol.SourceFile.Path); 337 element.Add(new XAttribute("DownloadUrl", this.DownloadUrl));
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 }
303 } 338 }
304 339
305 if (hashes.TryGetValue(path, out var certificateHashes)) 340 if (certificateHashes.TryGetValue(path, out var certificateHashForPath))
306 { 341 {
307 element.Add(new XAttribute("CertificatePublicKey", certificateHashes.PublicKey)); 342 payloadSymbol.CertificatePublicKey = certificateHashForPath.PublicKey;
308 element.Add(new XAttribute("CertificateThumbprint", certificateHashes.Thumbprint)); 343 payloadSymbol.CertificateThumbprint = certificateHashForPath.Thumbprint;
309 }
310 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))
312 { 349 {
313 element.Add(new XAttribute("Hash", payloadSymbol.Hash)); 350 element.Add(new XAttribute("Hash", payloadSymbol.Hash));
314 } 351 }
@@ -326,6 +363,7 @@ namespace WixToolset.Core.Burn.CommandLine
326 var harvestedFile = new HarvestedFile 363 var harvestedFile = new HarvestedFile
327 { 364 {
328 Element = element, 365 Element = element,
366 PackageType = packageType,
329 PayloadSymbol = payloadSymbol, 367 PayloadSymbol = payloadSymbol,
330 }; 368 };
331 369
@@ -418,7 +456,11 @@ namespace WixToolset.Core.Burn.CommandLine
418 private class HarvestedFile 456 private class HarvestedFile
419 { 457 {
420 public XElement Element { get; set; } 458 public XElement Element { get; set; }
459
460 public WixBundlePackageType? PackageType { get; internal set; }
461
421 public WixBundlePayloadSymbol PayloadSymbol { get; set; } 462 public WixBundlePayloadSymbol PayloadSymbol { get; set; }
463
422 public List<WixBundlePayloadSymbol> PackagePayloads { get; } = new List<WixBundlePayloadSymbol>(); 464 public List<WixBundlePayloadSymbol> PackagePayloads { get; } = new List<WixBundlePayloadSymbol>();
423 } 465 }
424 } 466 }
diff --git a/src/wix/WixToolset.Core/Compile/CompilerPayload.cs b/src/wix/WixToolset.Core/Compile/CompilerPayload.cs
index 2cdc70cf..98ab1579 100644
--- a/src/wix/WixToolset.Core/Compile/CompilerPayload.cs
+++ b/src/wix/WixToolset.Core/Compile/CompilerPayload.cs
@@ -145,18 +145,11 @@ namespace WixToolset.Core
145 this.Core.Write(ErrorMessages.ExpectedAttributeWithoutOtherAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "Name", "SourceFile")); 145 this.Core.Write(ErrorMessages.ExpectedAttributeWithoutOtherAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "Name", "SourceFile"));
146 } 146 }
147 147
148 if (!this.Size.HasValue) 148 // If remote payload is being verified by a certificate.
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
158 if (!String.IsNullOrEmpty(this.CertificatePublicKey) || !String.IsNullOrEmpty(this.CertificateThumbprint)) 149 if (!String.IsNullOrEmpty(this.CertificatePublicKey) || !String.IsNullOrEmpty(this.CertificateThumbprint))
159 { 150 {
151 var oneOfCertificateAttributeNames = !String.IsNullOrEmpty(this.CertificatePublicKey) ? "CertificatePublicKey" : "CertificateThumbprint";
152
160 if (String.IsNullOrEmpty(this.CertificateThumbprint)) 153 if (String.IsNullOrEmpty(this.CertificateThumbprint))
161 { 154 {
162 this.Core.Write(ErrorMessages.ExpectedAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "CertificateThumbprint", "CertificatePublicKey")); 155 this.Core.Write(ErrorMessages.ExpectedAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "CertificateThumbprint", "CertificatePublicKey"));
@@ -165,6 +158,23 @@ namespace WixToolset.Core
165 { 158 {
166 this.Core.Write(ErrorMessages.ExpectedAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "CertificatePublicKey", "CertificateThumbprint")); 159 this.Core.Write(ErrorMessages.ExpectedAttribute(this.SourceLineNumbers, this.Element.Name.LocalName, "CertificatePublicKey", "CertificateThumbprint"));
167 } 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 }
168 } 178 }
169 179
170 if (YesNoDefaultType.Yes == this.Compressed) 180 if (YesNoDefaultType.Yes == this.Compressed)
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs
index cebed367..0dba95e1 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/ExePackageFixture.cs
@@ -443,5 +443,32 @@ namespace WixToolsetTest.CoreIntegration
443 Assert.Equal(401, result.ExitCode); 443 Assert.Equal(401, result.ExitCode);
444 } 444 }
445 } 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 }
446 } 473 }
447} 474}
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/MsuPackageFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/MsuPackageFixture.cs
index 475afcf0..37499ea9 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/MsuPackageFixture.cs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/MsuPackageFixture.cs
@@ -3,6 +3,7 @@
3namespace WixToolsetTest.CoreIntegration 3namespace WixToolsetTest.CoreIntegration
4{ 4{
5 using System.IO; 5 using System.IO;
6 using System.Linq;
6 using WixBuildTools.TestSupport; 7 using WixBuildTools.TestSupport;
7 using WixToolset.Core.TestPackage; 8 using WixToolset.Core.TestPackage;
8 using Xunit; 9 using Xunit;
@@ -12,6 +13,7 @@ namespace WixToolsetTest.CoreIntegration
12 [Fact] 13 [Fact]
13 public void CanBuildBundleWithMsuPackage() 14 public void CanBuildBundleWithMsuPackage()
14 { 15 {
16 var dotDatafolder = TestData.Get(@"TestData", ".Data");
15 var folder = TestData.Get(@"TestData", "MsuPackage"); 17 var folder = TestData.Get(@"TestData", "MsuPackage");
16 18
17 using (var fs = new DisposableFileSystem()) 19 using (var fs = new DisposableFileSystem())
@@ -24,6 +26,7 @@ namespace WixToolsetTest.CoreIntegration
24 "build", 26 "build",
25 Path.Combine(folder, "Bundle.wxs"), 27 Path.Combine(folder, "Bundle.wxs"),
26 "-bindpath", Path.Combine(folder, "data"), 28 "-bindpath", Path.Combine(folder, "data"),
29 "-bindpath", dotDatafolder,
27 "-intermediateFolder", intermediateFolder, 30 "-intermediateFolder", intermediateFolder,
28 "-o", Path.Combine(baseFolder, "bin", "test.exe") 31 "-o", Path.Combine(baseFolder, "bin", "test.exe")
29 }); 32 });
@@ -32,5 +35,58 @@ namespace WixToolsetTest.CoreIntegration
32 Assert.True(File.Exists(Path.Combine(baseFolder, "bin", "test.exe"))); 35 Assert.True(File.Exists(Path.Combine(baseFolder, "bin", "test.exe")));
33 } 36 }
34 } 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 }
35 } 91 }
36} 92}
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/PackagePayloadFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/PackagePayloadFixture.cs
index 39caf8fd..f817317d 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/PackagePayloadFixture.cs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/PackagePayloadFixture.cs
@@ -336,8 +336,9 @@ namespace WixToolsetTest.CoreIntegration
336 WixAssert.CompareLineByLine(new[] 336 WixAssert.CompareLineByLine(new[]
337 { 337 {
338 "The ExePackagePayload/@CertificatePublicKey attribute was not found; it is required when attribute CertificateThumbprint is specified.", 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."
339 }, result.Messages.Select(m => m.ToString()).ToArray()); 340 }, result.Messages.Select(m => m.ToString()).ToArray());
340 Assert.Equal(10, result.ExitCode); 341 Assert.Equal(35, result.ExitCode);
341 } 342 }
342 } 343 }
343 344
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/RemotePayloadFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/RemotePayloadFixture.cs
index 9336a635..fc105880 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/RemotePayloadFixture.cs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/RemotePayloadFixture.cs
@@ -2,6 +2,7 @@
2 2
3namespace WixToolsetTest.CoreIntegration 3namespace WixToolsetTest.CoreIntegration
4{ 4{
5 using System;
5 using System.Collections.Generic; 6 using System.Collections.Generic;
6 using System.IO; 7 using System.IO;
7 using System.Linq; 8 using System.Linq;
@@ -59,9 +60,11 @@ namespace WixToolsetTest.CoreIntegration
59 }; 60 };
60 WixAssert.StringEqual( 61 WixAssert.StringEqual(
61 "<root>" + 62 "<root>" +
63 "<BundlePackage>" +
62 "<BundlePackagePayload Name='test.exe' ProductName='DiversePayloadsBundle' Description='DiversePayloadsBundle' Hash='*' Size='*' Version='1.0.0.0'>" + 64 "<BundlePackagePayload Name='test.exe' ProductName='DiversePayloadsBundle' Description='DiversePayloadsBundle' Hash='*' Size='*' Version='1.0.0.0'>" +
63 "<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}' />" + 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}' />" +
64 "</BundlePackagePayload>" + 66 "</BundlePackagePayload>" +
67 "</BundlePackage>" +
65 "</root>", xml.GetFragmentTestXml(ignoreAttributesByElementName)); 68 "</root>", xml.GetFragmentTestXml(ignoreAttributesByElementName));
66 69
67 // ExternalWithoutDownloadUrl 70 // ExternalWithoutDownloadUrl
@@ -81,13 +84,15 @@ namespace WixToolsetTest.CoreIntegration
81 xml = File.ReadAllText(externalWithoutDownloadUrlOutFile); 84 xml = File.ReadAllText(externalWithoutDownloadUrlOutFile);
82 WixAssert.StringEqual( 85 WixAssert.StringEqual(
83 "<root>" + 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>" +
84 "<Payload Name='External.cab' Hash='*' Size='*' />" + 91 "<Payload Name='External.cab' Hash='*' Size='*' />" +
85 "<Payload Name='test.msi' Hash='*' Size='*' />" + 92 "<Payload Name='test.msi' Hash='*' Size='*' />" +
86 "<Payload Name='test.txt' Hash='*' Size='*' />" + 93 "<Payload Name='test.txt' Hash='*' Size='*' />" +
87 "<Payload Name='Shared.dll' 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'>" + 95 "</BundlePackage>" +
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 "</root>", xml.GetFragmentTestXml(ignoreAttributesByElementName)); 96 "</root>", xml.GetFragmentTestXml(ignoreAttributesByElementName));
92 97
93 // External 98 // External
@@ -107,14 +112,16 @@ namespace WixToolsetTest.CoreIntegration
107 xml = File.ReadAllText(externalOutFile); 112 xml = File.ReadAllText(externalOutFile);
108 WixAssert.StringEqual( 113 WixAssert.StringEqual(
109 "<root>" + 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>" +
110 "<Payload Name='External.cab' Hash='*' Size='*' />" + 119 "<Payload Name='External.cab' Hash='*' Size='*' />" +
111 "<Payload Name='Windows8.1-KB2937592-x86.msu' Hash='*' Size='*' />" + 120 "<Payload Name='Windows8.1-KB2937592-x86.msu' Hash='*' Size='*' />" +
112 "<Payload Name='test.msi' Hash='*' Size='*' />" + 121 "<Payload Name='test.msi' Hash='*' Size='*' />" +
113 "<Payload Name='test.txt' Hash='*' Size='*' />" + 122 "<Payload Name='test.txt' Hash='*' Size='*' />" +
114 "<Payload Name='Shared.dll' 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'>" + 124 "</BundlePackage>" +
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>" +
118 "</root>", xml.GetFragmentTestXml(ignoreAttributesByElementName)); 125 "</root>", xml.GetFragmentTestXml(ignoreAttributesByElementName));
119 126
120 // All 127 // All
@@ -134,15 +141,17 @@ namespace WixToolsetTest.CoreIntegration
134 xml = File.ReadAllText(allOutFile); 141 xml = File.ReadAllText(allOutFile);
135 WixAssert.StringEqual( 142 WixAssert.StringEqual(
136 "<root>" + 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>" +
137 "<Payload Name='External.cab' Hash='*' Size='*' />" + 148 "<Payload Name='External.cab' Hash='*' Size='*' />" +
138 "<Payload Name='signed_bundle_engine.exe' ProductName='~TestBundle' Description='~TestBundle' Hash='*' Size='*' Version='1.0.0.0' />" + 149 "<Payload Name='signed_bundle_engine.exe' ProductName='~TestBundle' Description='~TestBundle' Hash='*' Size='*' Version='1.0.0.0' />" +
139 "<Payload Name='Windows8.1-KB2937592-x86.msu' Hash='*' Size='*' />" + 150 "<Payload Name='Windows8.1-KB2937592-x86.msu' Hash='*' Size='*' />" +
140 "<Payload Name='test.msi' Hash='*' Size='*' />" + 151 "<Payload Name='test.msi' Hash='*' Size='*' />" +
141 "<Payload Name='test.txt' Hash='*' Size='*' />" + 152 "<Payload Name='test.txt' Hash='*' Size='*' />" +
142 "<Payload Name='Shared.dll' 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'>" + 154 "</BundlePackage>" +
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>" +
146 "</root>", xml.GetFragmentTestXml(ignoreAttributesByElementName)); 155 "</root>", xml.GetFragmentTestXml(ignoreAttributesByElementName));
147 } 156 }
148 } 157 }
@@ -173,9 +182,11 @@ namespace WixToolsetTest.CoreIntegration
173 182
174 WixAssert.CompareLineByLine(new[] 183 WixAssert.CompareLineByLine(new[]
175 { 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'>", 185 "<BundlePackage>",
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}' />", 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'>",
178 "</BundlePackagePayload>", 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>",
179 }, elements); 190 }, elements);
180 } 191 }
181 } 192 }
@@ -205,7 +216,9 @@ namespace WixToolsetTest.CoreIntegration
205 216
206 WixAssert.CompareLineByLine(new[] 217 WixAssert.CompareLineByLine(new[]
207 { 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>",
209 }, elements); 222 }, elements);
210 } 223 }
211 } 224 }
@@ -234,12 +247,76 @@ namespace WixToolsetTest.CoreIntegration
234 247
235 WixAssert.CompareLineByLine(new[] 248 WixAssert.CompareLineByLine(new[]
236 { 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>"
238 }, elements); 253 }, elements);
239 } 254 }
240 } 255 }
241 256
242 [Fact] 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")]
243 public void CanGetRemotePayloadWithCertificate() 320 public void CanGetRemotePayloadWithCertificate()
244 { 321 {
245 var folder = TestData.Get(@"TestData"); 322 var folder = TestData.Get(@"TestData");
@@ -248,11 +325,15 @@ namespace WixToolsetTest.CoreIntegration
248 { 325 {
249 var outputFolder = fs.GetFolder(); 326 var outputFolder = fs.GetFolder();
250 var outFile = Path.Combine(outputFolder, "out.xml"); 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");
251 331
252 var result = WixRunner.Execute(new[] 332 var result = WixRunner.Execute(new[]
253 { 333 {
254 "burn", "remotepayload", 334 "burn", "remotepayload",
255 "-usecertificate", 335 "-usecertificate",
336 "-downloadUrl", "http://wixtoolset.org/{0}",
256 Path.Combine(folder, ".Data", "burn.exe"), 337 Path.Combine(folder, ".Data", "burn.exe"),
257 Path.Combine(folder, ".Data", "signed_cab1.cab"), 338 Path.Combine(folder, ".Data", "signed_cab1.cab"),
258 "-o", outFile 339 "-o", outFile
@@ -265,9 +346,38 @@ namespace WixToolsetTest.CoreIntegration
265 346
266 WixAssert.CompareLineByLine(new[] 347 WixAssert.CompareLineByLine(new[]
267 { 348 {
268 @"<ExePackagePayload Name='burn.exe' ProductName='Windows Installer XML Toolset' Description='WiX Toolset Bootstrapper' Hash='F6E722518AC3AB7E31C70099368D5770788C179AA23226110DCF07319B1E1964E246A1E8AE72E2CF23E0138AFC281BAFDE45969204405E114EB20C8195DA7E5E' Size='463360' Version='3.14.0.1703' />", 349 @"<ExePackage>",
269 @"<Payload Name='signed_cab1.cab' CertificatePublicKey='BBD1B48A37503767C71F455624967D406A5D66C3' CertificateThumbprint='DE13B4CE635E3F63AA2394E66F95C460267BC82F' Hash='D8D3842403710E1F6036A62543224855CADF546853933C2B17BA99D789D4347B36717687C022678A9D3DE749DFC1482DAAB92B997B62BB32A8A6828B9D04C414' Size='1585' />", 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>",
270 }, elements); 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();
271 } 381 }
272 } 382 }
273 383
@@ -296,8 +406,10 @@ namespace WixToolsetTest.CoreIntegration
296 406
297 WixAssert.CompareLineByLine(new[] 407 WixAssert.CompareLineByLine(new[]
298 { 408 {
299 @"<ExePackagePayload Name='burn.exe' ProductName='Windows Installer XML Toolset' Description='WiX Toolset Bootstrapper' Hash='F6E722518AC3AB7E31C70099368D5770788C179AA23226110DCF07319B1E1964E246A1E8AE72E2CF23E0138AFC281BAFDE45969204405E114EB20C8195DA7E5E' Size='463360' Version='3.14.0.1703' />", 409 @"<ExePackage>",
300 @"<Payload Name='signed_cab1.cab' Hash='D8D3842403710E1F6036A62543224855CADF546853933C2B17BA99D789D4347B36717687C022678A9D3DE749DFC1482DAAB92B997B62BB32A8A6828B9D04C414' Size='1585' />", 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>",
301 }, elements); 413 }, elements);
302 } 414 }
303 } 415 }
@@ -319,6 +431,7 @@ namespace WixToolsetTest.CoreIntegration
319 "-du", "https://www.example.com/files/{0}", 431 "-du", "https://www.example.com/files/{0}",
320 Path.Combine(folder, ".Data", "burn.exe"), 432 Path.Combine(folder, ".Data", "burn.exe"),
321 Path.Combine(folder, "RemotePayload", "recurse", "*"), 433 Path.Combine(folder, "RemotePayload", "recurse", "*"),
434 "-basepath", Path.Combine(folder, "RemotePayload", "recurse"),
322 "-basepath", folder, 435 "-basepath", folder,
323 "-bp", Path.Combine(folder, ".Data"), 436 "-bp", Path.Combine(folder, ".Data"),
324 "-o", outFile 437 "-o", outFile
@@ -331,10 +444,12 @@ namespace WixToolsetTest.CoreIntegration
331 444
332 WixAssert.CompareLineByLine(new[] 445 WixAssert.CompareLineByLine(new[]
333 { 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' />", 447 @"<ExePackage>",
335 @"<Payload Name='a.dat' DownloadUrl='https://www.example.com/files/RemotePayload/recurse/a.dat' Hash='D13926E5CBE5ED8B46133F9199FAF2FF25B25981C67A31AE2BC3F6C20390FACBFADCD89BD22D3445D95B989C8EACFB1E68DB634BECB5C9624865BA453BCE362A' Size='16' />", 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' />",
336 @"<Payload Name='b.dat' DownloadUrl='https://www.example.com/files/RemotePayload/recurse/subfolder/b.dat' Hash='5F94707BC29ADFE3B9615E6753388707FD0B8F5FD9EEEC2B17E21E72F1635FF7D7A101E7D14F614E111F263CB9AC4D0940BE1247881A7844F226D6C400293D8E' Size='37' />", 449 @" <Payload Name='a.dat' DownloadUrl='https://www.example.com/files/{0}' Hash='D13926E5CBE5ED8B46133F9199FAF2FF25B25981C67A31AE2BC3F6C20390FACBFADCD89BD22D3445D95B989C8EACFB1E68DB634BECB5C9624865BA453BCE362A' Size='16' />",
337 @"<Payload Name='c.dat' DownloadUrl='https://www.example.com/files/RemotePayload/recurse/subfolder/c.dat' Hash='97D6209A5571E05E4F72F9C6BF0987651FA03E63F971F9B53C2B3D798A666D9864F232D4E2D6442E47D9D72B282309B6EEFF4EE017B43B706FA92A0F5EF74734' Size='42' />", 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>"
338 }, elements); 453 }, elements);
339 } 454 }
340 } 455 }
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/MsuPackage/data/fakeba.dll b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/.Data/fakeba.dll
index b3cf17d8..b3cf17d8 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/MsuPackage/data/fakeba.dll
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/.Data/fakeba.dll
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/UseCertificateVerificationWithoutCacheId.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/UseCertificateVerificationWithoutCacheId.wxs
new file mode 100644
index 00000000..49306479
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExePackage/UseCertificateVerificationWithoutCacheId.wxs
@@ -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>
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/MsuPackage/BundleUsingCertificateVerification.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/MsuPackage/BundleUsingCertificateVerification.wxs
new file mode 100644
index 00000000..dcae2cf8
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/MsuPackage/BundleUsingCertificateVerification.wxs
@@ -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>
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/MsuPackage/BundleUsingCertificateVerificationWithoutCacheId.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/MsuPackage/BundleUsingCertificateVerificationWithoutCacheId.wxs
new file mode 100644
index 00000000..f9282e37
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/MsuPackage/BundleUsingCertificateVerificationWithoutCacheId.wxs
@@ -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>
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedCertificate.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedCertificate.wxs
index b5dec9a2..bee56215 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedCertificate.wxs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedCertificate.wxs
@@ -3,7 +3,7 @@
3 <Fragment> 3 <Fragment>
4 <PackageGroup Id="BundlePackages"> 4 <PackageGroup Id="BundlePackages">
5 <ExePackage Id="SpecifiedSourceFileAndHash" Permanent="yes" DetectCondition="none"> 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> 7 </ExePackage>
8 </PackageGroup> 8 </PackageGroup>
9 </Fragment> 9 </Fragment>
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedCertificatePublicKeyWithoutThumbprint.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedCertificatePublicKeyWithoutThumbprint.wxs
index aa915a31..3694cd72 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedCertificatePublicKeyWithoutThumbprint.wxs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/PackagePayload/SpecifiedCertificatePublicKeyWithoutThumbprint.wxs
@@ -3,7 +3,7 @@
3 <Fragment> 3 <Fragment>
4 <PackageGroup Id="BundlePackages"> 4 <PackageGroup Id="BundlePackages">
5 <ExePackage Id="SpecifiedSourceFileAndHash" Permanent="yes" DetectCondition="none"> 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> 7 </ExePackage>
8 </PackageGroup> 8 </PackageGroup>
9 </Fragment> 9 </Fragment>