ManifestYamlPopulator.h (7210B)
1 // Copyright (c) Microsoft Corporation. 2 // Licensed under the MIT License. 3 #pragma once 4 #include <winget/Manifest.h> 5 #include <winget/ManifestValidation.h> 6 #include <winget/Yaml.h> 7 8 namespace AppInstaller::Manifest 9 { 10 // Add here new manifest pointer types. 11 using VariantManifestPtr = std::variant<Agreement*, AppsAndFeaturesEntry*, Dependency*, DependencyList*, Documentation*, ExpectedReturnCode*, Icon*, InstallationMetadataInfo*, InstalledFile*, Manifest*, ManifestInstaller*, ManifestLocalization*, MarketsInfo*, NestedInstallerFile*, std::map<InstallerSwitchType, Utility::NormalizedString>*, AppInstaller::Authentication::AuthenticationInfo*, AppInstaller::Authentication::MicrosoftEntraIdAuthenticationInfo*>; 12 13 struct ManifestYamlPopulator 14 { 15 static std::vector<ValidationError> PopulateManifest( 16 YAML::Node& rootNode, 17 Manifest& manifest, 18 const ManifestVer& manifestVersion, 19 ManifestValidateOption validateOption, 20 const std::optional<YAML::Node>& shadowNode); 21 22 private: 23 24 ManifestYamlPopulator(YAML::Node& rootNode, Manifest& manifest, const ManifestVer& manifestVersion, ManifestValidateOption validateOption); 25 26 std::reference_wrapper<YAML::Node> m_rootNode; 27 std::reference_wrapper<Manifest> m_manifest; 28 std::reference_wrapper<const ManifestVer> m_manifestVersion; 29 bool m_isMergedManifest = false; 30 ManifestValidateOption m_validateOption; 31 32 // Struct mapping a manifest field to its population logic 33 struct FieldProcessInfo 34 { 35 FieldProcessInfo(std::string name, std::function<std::vector<ValidationError>(const YAML::Node&, const VariantManifestPtr& v)> func, bool requireVerifiedPublisher = false) : 36 Name(std::move(name)), ProcessFunc(func), RequireVerifiedPublisher(requireVerifiedPublisher) {} 37 38 std::string Name; 39 std::function<std::vector<ValidationError>(const YAML::Node&, const VariantManifestPtr& v)> ProcessFunc; 40 bool RequireVerifiedPublisher = false; 41 }; 42 43 std::vector<FieldProcessInfo> RootFieldInfos; 44 std::vector<FieldProcessInfo> InstallerFieldInfos; 45 std::vector<FieldProcessInfo> SwitchesFieldInfos; 46 std::vector<FieldProcessInfo> ExpectedReturnCodesFieldInfos; 47 std::vector<FieldProcessInfo> DependenciesFieldInfos; 48 std::vector<FieldProcessInfo> PackageDependenciesFieldInfos; 49 std::vector<FieldProcessInfo> LocalizationFieldInfos; 50 std::vector<FieldProcessInfo> AgreementFieldInfos; 51 std::vector<FieldProcessInfo> MarketsFieldInfos; 52 std::vector<FieldProcessInfo> AppsAndFeaturesEntryFieldInfos; 53 std::vector<FieldProcessInfo> DocumentationFieldInfos; 54 std::vector<FieldProcessInfo> IconFieldInfos; 55 std::vector<FieldProcessInfo> NestedInstallerFileFieldInfos; 56 std::vector<FieldProcessInfo> InstallationMetadataFieldInfos; 57 std::vector<FieldProcessInfo> InstallationMetadataFilesFieldInfos; 58 std::vector<FieldProcessInfo> AuthenticationFieldInfos; 59 std::vector<FieldProcessInfo> MicrosoftEntraIdAuthenticationInfoFieldInfos; 60 61 // Cache of Installers node and Localization node 62 YAML::Node const* m_p_installersNode = nullptr; 63 YAML::Node const* m_p_localizationsNode = nullptr; 64 65 std::vector<FieldProcessInfo> GetRootFieldProcessInfo(); 66 std::vector<FieldProcessInfo> GetInstallerFieldProcessInfo(bool forRootFields = false); 67 std::vector<FieldProcessInfo> GetSwitchesFieldProcessInfo(); 68 std::vector<FieldProcessInfo> GetExpectedReturnCodesFieldProcessInfo(); 69 std::vector<FieldProcessInfo> GetDependenciesFieldProcessInfo(); 70 std::vector<FieldProcessInfo> GetPackageDependenciesFieldProcessInfo(); 71 std::vector<FieldProcessInfo> GetLocalizationFieldProcessInfo(bool forRootFields = false); 72 std::vector<FieldProcessInfo> GetAgreementFieldProcessInfo(); 73 std::vector<FieldProcessInfo> GetMarketsFieldProcessInfo(); 74 std::vector<FieldProcessInfo> GetAppsAndFeaturesEntryFieldProcessInfo(); 75 std::vector<FieldProcessInfo> GetDocumentationFieldProcessInfo(); 76 std::vector<FieldProcessInfo> GetIconFieldProcessInfo(); 77 std::vector<FieldProcessInfo> GetNestedInstallerFileFieldProcessInfo(); 78 std::vector<FieldProcessInfo> GetInstallationMetadataFieldProcessInfo(); 79 std::vector<FieldProcessInfo> GetInstallationMetadataFilesFieldProcessInfo(); 80 std::vector<FieldProcessInfo> GetAuthenticationFieldInfos(); 81 std::vector<FieldProcessInfo> GetMicrosoftEntraIdAuthenticationInfoFieldInfos(); 82 83 // Shadow 84 std::vector<FieldProcessInfo> GetShadowRootFieldProcessInfo(); 85 std::vector<FieldProcessInfo> GetShadowLocalizationFieldProcessInfo(); 86 87 // This method takes YAML root node and list of manifest field info. 88 // Yaml lib does not support case-insensitive search and it allows duplicate keys. If duplicate keys exist, 89 // the value is undefined. So in this method, we will iterate through the node map and process each individual 90 // pair ourselves. This also helps with generating aggregated error rather than throwing on first failure. 91 std::vector<ValidationError> ValidateAndProcessFields( 92 const YAML::Node& rootNode, 93 const std::vector<FieldProcessInfo>& fieldInfos, 94 const VariantManifestPtr& v); 95 96 std::vector<ValidationError> ProcessPackageDependenciesNode(const YAML::Node& rootNode, DependencyList* dependencyList); 97 std::vector<ValidationError> ProcessAgreementsNode(const YAML::Node& agreementsNode, ManifestLocalization* localization); 98 std::vector<ValidationError> ProcessMarketsNode(const YAML::Node& marketsNode, AppInstaller::Manifest::ManifestInstaller* installer); 99 std::vector<ValidationError> ProcessAppsAndFeaturesEntriesNode(const YAML::Node& appsAndFeaturesEntriesNode, AppInstaller::Manifest::ManifestInstaller* installer); 100 std::vector<ValidationError> ProcessExpectedReturnCodesNode(const YAML::Node& returnCodesNode, AppInstaller::Manifest::ManifestInstaller* installer); 101 std::vector<ValidationError> ProcessDocumentationsNode(const YAML::Node& documentationsNode, ManifestLocalization* localization); 102 std::vector<ValidationError> ProcessIconsNode(const YAML::Node& iconsNode, ManifestLocalization* localization); 103 std::vector<ValidationError> ProcessNestedInstallerFilesNode(const YAML::Node& nestedInstallerFilesNode, AppInstaller::Manifest::ManifestInstaller* installer); 104 std::vector<ValidationError> ProcessInstallationMetadataFilesNode(const YAML::Node& installedFilesNode, InstallationMetadataInfo* installationMetadata); 105 std::vector<ValidationError> ProcessShadowLocalizationNode(const YAML::Node& localizationNode, Manifest* manifest); 106 107 std::vector<ValidationError> PopulateManifestInternal(); 108 std::vector<ValidationError> InsertShadow(const YAML::Node& shadowNode); 109 }; 110 }