main
cs 186 lines 8.16 KB
Raw
1 // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3 namespace WixToolset.Core.Burn.Bundles
4 {
5 using System;
6 using WixToolset.Data;
7 using WixToolset.Data.Symbols;
8 using WixToolset.Extensibility.Data;
9 using WixToolset.Extensibility.Services;
10
11 internal class PerformBundleBackendValidationCommand
12 {
13 public PerformBundleBackendValidationCommand(IMessaging messaging, IBurnBackendHelper burnBackendHelper, IntermediateSection section, PackageFacades packageFacades)
14 {
15 this.Messaging = messaging;
16 this.BackendHelper = burnBackendHelper;
17 this.Section = section;
18 this.PackageFacades = packageFacades;
19 }
20
21 private IMessaging Messaging { get; }
22
23 private IBurnBackendHelper BackendHelper { get; }
24
25 private IntermediateSection Section { get; }
26
27 private PackageFacades PackageFacades { get; }
28
29 public void Execute()
30 {
31 foreach (var symbol in this.Section.Symbols)
32 {
33 if (symbol is WixBundleSymbol wixBundleSymbol)
34 {
35 this.ValidateBundle(wixBundleSymbol);
36 }
37 else if (symbol is WixBundleMsiPropertySymbol wixBundleMsiPropertySymbol)
38 {
39 this.ValidateMsiProperty(wixBundleMsiPropertySymbol);
40 }
41 else if (symbol is WixBundleVariableSymbol wixBundleVariableSymbol)
42 {
43 this.ValidateVariable(wixBundleVariableSymbol);
44 }
45 else if (symbol is WixBundlePackageCommandLineSymbol wixBundlePackageCommandLineSymbol)
46 {
47 this.ValidatePackageCommandLine(wixBundlePackageCommandLineSymbol);
48 }
49 else if (symbol is WixSearchSymbol wixSearchSymbol)
50 {
51 this.ValidateSearch(wixSearchSymbol);
52 }
53 }
54
55 foreach (var packageFacade in this.PackageFacades.Values)
56 {
57 if (packageFacade.SpecificPackageSymbol is WixBundleBundlePackageSymbol wixBundleBundlePackageSymbol)
58 {
59 this.ValidateBundlePackage(wixBundleBundlePackageSymbol, packageFacade.PackageSymbol);
60 }
61 else if (packageFacade.SpecificPackageSymbol is WixBundleExePackageSymbol wixBundleExePackageSymbol)
62 {
63 this.ValidateExePackage(wixBundleExePackageSymbol, packageFacade.PackageSymbol);
64 }
65 else if (packageFacade.SpecificPackageSymbol is WixBundleMsiPackageSymbol wixBundleMsiPackageSymbol)
66 {
67 this.ValidateMsiPackage(wixBundleMsiPackageSymbol, packageFacade.PackageSymbol);
68 }
69 else if (packageFacade.SpecificPackageSymbol is WixBundleMspPackageSymbol wixBundleMspPackageSymbol)
70 {
71 this.ValidateMspPackage(wixBundleMspPackageSymbol, packageFacade.PackageSymbol);
72 }
73 else if (packageFacade.SpecificPackageSymbol is WixBundleMsuPackageSymbol wixBundleMsuPackageSymbol)
74 {
75 this.ValidateMsuPackage(wixBundleMsuPackageSymbol, packageFacade.PackageSymbol);
76 }
77 }
78 }
79
80 private void ValidateBundle(WixBundleSymbol symbol)
81 {
82 if (symbol.Condition != null)
83 {
84 this.BackendHelper.ValidateBundleCondition(symbol.SourceLineNumbers, "Bundle", "Condition", symbol.Condition, BundleConditionPhase.Startup);
85 }
86 }
87
88 private void ValidateChainPackage(WixBundlePackageSymbol symbol, string elementName)
89 {
90 if (!String.IsNullOrEmpty(symbol.InstallCondition))
91 {
92 this.BackendHelper.ValidateBundleCondition(symbol.SourceLineNumbers, elementName, "InstallCondition", symbol.InstallCondition, BundleConditionPhase.Plan);
93 }
94
95 if (!String.IsNullOrEmpty(symbol.RepairCondition))
96 {
97 this.BackendHelper.ValidateBundleCondition(symbol.SourceLineNumbers, elementName, "RepairCondition", symbol.RepairCondition, BundleConditionPhase.Plan);
98 }
99 }
100
101 private void ValidateBundlePackage(WixBundleBundlePackageSymbol symbol, WixBundlePackageSymbol packageSymbol)
102 {
103 this.ValidateChainPackage(packageSymbol, "BundlePackage");
104 }
105
106 private void ValidateExePackage(WixBundleExePackageSymbol symbol, WixBundlePackageSymbol packageSymbol)
107 {
108 this.ValidateChainPackage(packageSymbol, "ExePackage");
109
110 if (!packageSymbol.Permanent)
111 {
112 if (symbol.DetectionType == WixBundleExePackageDetectionType.Condition)
113 {
114 this.BackendHelper.ValidateBundleCondition(symbol.SourceLineNumbers, "ExePackage", "DetectCondition", symbol.DetectCondition, BundleConditionPhase.Detect);
115 }
116 else if (symbol.DetectionType == WixBundleExePackageDetectionType.Arp)
117 {
118 if (!this.BackendHelper.IsValidWixVersion(symbol.ArpDisplayVersion))
119 {
120 this.Messaging.Write(WarningMessages.InvalidWixVersion(symbol.SourceLineNumbers, symbol.ArpDisplayVersion, "ArpEntry", "Version"));
121 }
122 }
123 }
124 }
125
126 private void ValidateMsiPackage(WixBundleMsiPackageSymbol symbol, WixBundlePackageSymbol packageSymbol)
127 {
128 this.ValidateChainPackage(packageSymbol, "MsiPackage");
129 }
130
131 private void ValidateMsiProperty(WixBundleMsiPropertySymbol symbol)
132 {
133 // Validate the MSI properties *except* for the ALLUSERS property when set during binding (most likely
134 // by the MsiPackage/@ForcePerMachine attribute).
135 var nameField = symbol.Fields[(int)WixBundleMsiPropertySymbolFields.Name];
136 var name = nameField.AsString();
137 if (name != "ALLUSERS" || nameField.Context != "wix.bind")
138 {
139 this.BackendHelper.ValidateBundleMsiPropertyName(symbol.SourceLineNumbers, "MsiProperty", "Name", name);
140 }
141
142 if (symbol.Condition != null)
143 {
144 this.BackendHelper.ValidateBundleCondition(symbol.SourceLineNumbers, "MsiProperty", "Condition", symbol.Condition, BundleConditionPhase.Execute);
145 }
146 }
147
148 private void ValidateMspPackage(WixBundleMspPackageSymbol symbol, WixBundlePackageSymbol packageSymbol)
149 {
150 this.ValidateChainPackage(packageSymbol, "MspPackage");
151 }
152
153 private void ValidateMsuPackage(WixBundleMsuPackageSymbol symbol, WixBundlePackageSymbol packageSymbol)
154 {
155 this.ValidateChainPackage(packageSymbol, "MsuPackage");
156
157 if (!packageSymbol.Permanent)
158 {
159 this.BackendHelper.ValidateBundleCondition(symbol.SourceLineNumbers, "MsuPackage", "DetectCondition", symbol.DetectCondition, BundleConditionPhase.Detect);
160 }
161 }
162
163 private void ValidatePackageCommandLine(WixBundlePackageCommandLineSymbol symbol)
164 {
165 if (symbol.Condition != null)
166 {
167 this.BackendHelper.ValidateBundleCondition(symbol.SourceLineNumbers, "CommandLine", "Condition", symbol.Condition, BundleConditionPhase.Execute);
168 }
169 }
170
171 private void ValidateSearch(WixSearchSymbol symbol)
172 {
173 this.BackendHelper.ValidateBundleVariableNameTarget(symbol.SourceLineNumbers, "*Search", "Variable", symbol.Variable);
174
175 if (symbol.Condition != null)
176 {
177 this.BackendHelper.ValidateBundleCondition(symbol.SourceLineNumbers, "*Search", "Condition", symbol.Condition, BundleConditionPhase.Detect);
178 }
179 }
180
181 private void ValidateVariable(WixBundleVariableSymbol symbol)
182 {
183 this.BackendHelper.ValidateBundleVariableNameDeclaration(symbol.SourceLineNumbers, "Variable", "Name", symbol.Id.Id);
184 }
185 }
186 }