Add conversion for renaming RemotePayload, and warn about changed hash.
#3992, #4183
Sean Hall committed
Mar 1, 2021 at 18:11 UTC
8929554278be056a73160ec5f06ab6cc6b8c4fb4
3 files changed
+169
-33
src/WixToolset.Converters/WixConverter.cs
+65
@@ -66,10 +66,12 @@ namespace WixToolset.Converters
66
private static readonly XName LaunchElementName = WixNamespace + "Launch";
67
private static readonly XName LevelElementName = WixNamespace + "Level";
68
private static readonly XName ExePackageElementName = WixNamespace + "ExePackage";
69
+ private static readonly XName ExePackagePayloadElementName = WixNamespace + "ExePackagePayload";
70
private static readonly XName ModuleElementName = WixNamespace + "Module";
71
private static readonly XName MsiPackageElementName = WixNamespace + "MsiPackage";
72
private static readonly XName MspPackageElementName = WixNamespace + "MspPackage";
73
private static readonly XName MsuPackageElementName = WixNamespace + "MsuPackage";
74
+ private static readonly XName MsuPackagePayloadElementName = WixNamespace + "MsuPackagePayload";
75
private static readonly XName PackageElementName = WixNamespace + "Package";
76
private static readonly XName PayloadElementName = WixNamespace + "Payload";
77
private static readonly XName PermissionExElementName = WixNamespace + "PermissionEx";
@@ -1099,6 +1101,44 @@ namespace WixToolset.Converters
1101
1102
private void ConvertRemotePayloadElement(XElement element)
1103
{
1104
+ var xParent = element.Parent;
1105
+
1106
+ if (xParent.Name == ExePackageElementName &&
1107
+ this.OnError(ConverterTestType.RemotePayloadRenamed, element, "The RemotePayload element has been renamed. Use the 'ExePackagePayload' instead."))
1108
+ {
1109
+ element.Name = ExePackagePayloadElementName;
1110
+ }
1111
+ else if (xParent.Name == MsuPackageElementName &&
1112
+ this.OnError(ConverterTestType.RemotePayloadRenamed, element, "The RemotePayload element has been renamed. Use the 'MsuPackagePayload' instead."))
1113
+ {
1114
+ element.Name = MsuPackagePayloadElementName;
1115
+ }
1116
+
1117
+ var xName = xParent.Attribute("Name");
1118
+ if (xName != null &&
1119
+ this.OnError(ConverterTestType.NameAttributeMovedToRemotePayload, xParent, "The Name attribute must be specified on the child XxxPackagePayload element when using a remote payload."))
1120
+ {
1121
+ element.SetAttributeValue("Name", xName.Value);
1122
+ xName.Remove();
1123
+ }
1124
+
1125
+ var xDownloadUrl = xParent.Attribute("DownloadUrl");
1126
+ if (xDownloadUrl != null &&
1127
+ this.OnError(ConverterTestType.DownloadUrlAttributeMovedToRemotePayload, xParent, "The DownloadUrl attribute must be specified on the child XxxPackagePayload element when using a remote payload."))
1128
+ {
1129
+ element.SetAttributeValue("DownloadUrl", xDownloadUrl.Value);
1130
+ xDownloadUrl.Remove();
1131
+ }
1132
+
1133
+ var xCompressed = xParent.Attribute("Compressed");
1134
+ if (xCompressed != null &&
1135
+ this.OnError(ConverterTestType.CompressedAttributeUnnecessaryForRemotePayload, xParent, "The Compressed attribute should not be specified when using a remote payload."))
1136
+ {
1137
+ xCompressed.Remove();
1138
+ }
1139
+
1140
+ this.OnError(ConverterTestType.BurnHashAlgorithmChanged, element, "The hash algorithm for bundles changed from SHA1 to SHA512.");
1141
+
1142
RemoveIfPresent(element.Attribute("CertificatePublicKey"));
1143
RemoveIfPresent(element.Attribute("CertificateThumbprint"));
1144
@@ -1957,6 +1997,31 @@ namespace WixToolset.Converters
1997
/// Remove unused namespaces.
1998
/// </summary>
1999
RemoveUnusedNamespaces,
2000
+
2001
+ /// <summary>
2002
+ /// The Remote element has been renamed. Use the "XxxPackagePayload" element instead.
2003
+ /// </summary>
2004
+ RemotePayloadRenamed,
2005
+
2006
+ /// <summary>
2007
+ /// The XxxPackage/@Name attribute must be specified on the child XxxPackagePayload element when using a remote payload.
2008
+ /// </summary>
2009
+ NameAttributeMovedToRemotePayload,
2010
+
2011
+ /// <summary>
2012
+ /// The XxxPackage/@Compressed attribute should not be specified when using a remote payload.
2013
+ /// </summary>
2014
+ CompressedAttributeUnnecessaryForRemotePayload,
2015
+
2016
+ /// <summary>
2017
+ /// The XxxPackage/@DownloadUrl attribute must be specified on the child XxxPackagePayload element when using a remote payload.
2018
+ /// </summary>
2019
+ DownloadUrlAttributeMovedToRemotePayload,
2020
+
2021
+ /// <summary>
2022
+ /// The hash algorithm used for bundles changed from SHA1 to SHA512.
2023
+ /// </summary>
2024
+ BurnHashAlgorithmChanged,
2025
}
2026
}
2027
}
src/test/WixToolsetTest.Converters/ConverterFixture.cs
-33
@@ -330,39 +330,6 @@ namespace WixToolsetTest.Converters
330
Assert.Equal(expected, actual);
331
}
332
333
- [Fact]
334
- public void CanConvertRemotePayloadElement()
335
- {
336
- var parse = String.Join(Environment.NewLine,
337
- "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
338
- " <RemotePayload",
339
- " Description='Microsoft ASP.NET Core 3.1.8 - Shared Framework'",
340
- " Hash='61DC9EAA0C8968E48E13C5913ED202A2F8F94DBA'",
341
- " CertificatePublicKey='3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18'",
342
- " CertificateThumbprint='2485A7AFA98E178CB8F30C9838346B514AEA4769'",
343
- " ProductName='Microsoft ASP.NET Core 3.1.8 - Shared Framework'",
344
- " Size='7841880'",
345
- " Version='3.1.8.20421' />",
346
- "</Wix>");
347
-
348
- var expected = String.Join(Environment.NewLine,
349
- "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
350
- " <RemotePayload Description=\"Microsoft ASP.NET Core 3.1.8 - Shared Framework\" Hash=\"61DC9EAA0C8968E48E13C5913ED202A2F8F94DBA\" ProductName=\"Microsoft ASP.NET Core 3.1.8 - Shared Framework\" Size=\"7841880\" Version=\"3.1.8.20421\" />",
351
- "</Wix>");
352
-
353
- var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
354
-
355
- var messaging = new MockMessaging();
356
- var converter = new WixConverter(messaging, 2, null, null);
357
-
358
- var errors = converter.ConvertDocument(document);
359
-
360
- var actual = UnformattedDocumentString(document);
361
-
362
- Assert.Equal(2, errors);
363
- Assert.Equal(expected, actual);
364
- }
365
-
333
[Fact]
334
public void CanConvertSuppressSignatureValidationNo()
335
{
src/test/WixToolsetTest.Converters/RemotePayloadFixture.cs
new
+104
@@ -0,0 +1,104 @@
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 WixToolsetTest.Converters
4
+{
5
+ using System;
6
+ using System.Xml.Linq;
7
+ using WixBuildTools.TestSupport;
8
+ using WixToolset.Converters;
9
+ using WixToolsetTest.Converters.Mocks;
10
+ using Xunit;
11
+
12
+ public class RemotePayloadFixture : BaseConverterFixture
13
+ {
14
+ [Fact]
15
+ public void CanConvertExePackageRemotePayload()
16
+ {
17
+ var parse = String.Join(Environment.NewLine,
18
+ "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
19
+ " <Fragment>",
20
+ " <PackageGroup Id='exe'>",
21
+ " <ExePackage Name='example.exe' DownloadUrl='example.com'>",
22
+ " <RemotePayload",
23
+ " Description='Microsoft ASP.NET Core 3.1.8 - Shared Framework'",
24
+ " Hash='61DC9EAA0C8968E48E13C5913ED202A2F8F94DBA'",
25
+ " CertificatePublicKey='3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18'",
26
+ " CertificateThumbprint='2485A7AFA98E178CB8F30C9838346B514AEA4769'",
27
+ " ProductName='Microsoft ASP.NET Core 3.1.8 - Shared Framework'",
28
+ " Size='7841880'",
29
+ " Version='3.1.8.20421' />",
30
+ " </ExePackage>",
31
+ " </PackageGroup>",
32
+ " </Fragment>",
33
+ "</Wix>");
34
+
35
+ var expected = new[]
36
+ {
37
+ "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
38
+ " <Fragment>",
39
+ " <PackageGroup Id=\"exe\">",
40
+ " <ExePackage>",
41
+ " <ExePackagePayload Description=\"Microsoft ASP.NET Core 3.1.8 - Shared Framework\" Hash=\"61DC9EAA0C8968E48E13C5913ED202A2F8F94DBA\" ProductName=\"Microsoft ASP.NET Core 3.1.8 - Shared Framework\" Size=\"7841880\" Version=\"3.1.8.20421\" Name=\"example.exe\" DownloadUrl=\"example.com\" />",
42
+ " </ExePackage>",
43
+ " </PackageGroup>",
44
+ " </Fragment>",
45
+ "</Wix>"
46
+ };
47
+
48
+ var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
49
+
50
+ var messaging = new MockMessaging();
51
+ var converter = new WixConverter(messaging, 2, null, null);
52
+
53
+ var errors = converter.ConvertDocument(document);
54
+ Assert.Equal(6, errors);
55
+
56
+ var actualLines = UnformattedDocumentLines(document);
57
+ WixAssert.CompareLineByLine(expected, actualLines);
58
+ }
59
+
60
+ [Fact]
61
+ public void CanConvertMsuPackageRemotePayload()
62
+ {
63
+ var parse = String.Join(Environment.NewLine,
64
+ "<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>",
65
+ " <Fragment>",
66
+ " <PackageGroup Id='msu'>",
67
+ " <MsuPackage Name='example.msu' DownloadUrl='example.com' Compressed='no'>",
68
+ " <RemotePayload",
69
+ " Description='msu description'",
70
+ " Hash='71DC9EAA0C8968E48E13C5913ED202A2F8F94DBB'",
71
+ " ProductName='msu product name'",
72
+ " Size='500'",
73
+ " Version='0.0.0.0' />",
74
+ " </MsuPackage>",
75
+ " </PackageGroup>",
76
+ " </Fragment>",
77
+ "</Wix>");
78
+
79
+ var expected = new[]
80
+ {
81
+ "<Wix xmlns=\"http://wixtoolset.org/schemas/v4/wxs\">",
82
+ " <Fragment>",
83
+ " <PackageGroup Id=\"msu\">",
84
+ " <MsuPackage>",
85
+ " <MsuPackagePayload Description=\"msu description\" Hash=\"71DC9EAA0C8968E48E13C5913ED202A2F8F94DBB\" ProductName=\"msu product name\" Size=\"500\" Version=\"0.0.0.0\" Name=\"example.msu\" DownloadUrl=\"example.com\" />",
86
+ " </MsuPackage>",
87
+ " </PackageGroup>",
88
+ " </Fragment>",
89
+ "</Wix>"
90
+ };
91
+
92
+ var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo);
93
+
94
+ var messaging = new MockMessaging();
95
+ var converter = new WixConverter(messaging, 2, null, null);
96
+
97
+ var errors = converter.ConvertDocument(document);
98
+ Assert.Equal(5, errors);
99
+
100
+ var actualLines = UnformattedDocumentLines(document);
101
+ WixAssert.CompareLineByLine(expected, actualLines);
102
+ }
103
+ }
104
+}