@joebigelow / wix / commits / 89295542

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 +}