optimization_hints_component_installer.cc 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/component_updater/installer_policies/optimization_hints_component_installer.h"
  5. #include <utility>
  6. #include "base/callback.h"
  7. #include "base/command_line.h"
  8. #include "base/files/file_path.h"
  9. #include "base/files/file_util.h"
  10. #include "base/logging.h"
  11. #include "base/path_service.h"
  12. #include "base/version.h"
  13. #include "components/component_updater/component_updater_paths.h"
  14. #include "components/optimization_guide/core/optimization_guide_constants.h"
  15. #include "components/optimization_guide/core/optimization_guide_features.h"
  16. #include "components/optimization_guide/core/optimization_hints_component_update_listener.h"
  17. using component_updater::ComponentUpdateService;
  18. namespace component_updater {
  19. namespace {
  20. const char kDisableInstallerUpdate[] = "optimization-guide-disable-installer";
  21. // The extension id is: lmelglejhemejginpboagddgdfbepgmp
  22. const uint8_t kOptimizationHintsPublicKeySHA256[32] = {
  23. 0xbc, 0x4b, 0x6b, 0x49, 0x74, 0xc4, 0x96, 0x8d, 0xf1, 0xe0, 0x63,
  24. 0x36, 0x35, 0x14, 0xf6, 0xcf, 0x86, 0x92, 0xe6, 0x06, 0x03, 0x76,
  25. 0x70, 0xaf, 0x8b, 0xd4, 0x47, 0x2c, 0x42, 0x59, 0x38, 0xef};
  26. const char kOptimizationHintsSetFetcherManifestName[] = "Optimization Hints";
  27. } // namespace
  28. // static
  29. const char
  30. OptimizationHintsComponentInstallerPolicy::kManifestRulesetFormatKey[] =
  31. "ruleset_format";
  32. OptimizationHintsComponentInstallerPolicy::
  33. OptimizationHintsComponentInstallerPolicy()
  34. : ruleset_format_version_(
  35. base::Version(optimization_guide::kRulesetFormatVersionString)) {
  36. DCHECK(ruleset_format_version_.IsValid());
  37. }
  38. OptimizationHintsComponentInstallerPolicy::
  39. ~OptimizationHintsComponentInstallerPolicy() = default;
  40. bool OptimizationHintsComponentInstallerPolicy::
  41. SupportsGroupPolicyEnabledComponentUpdates() const {
  42. return true;
  43. }
  44. bool OptimizationHintsComponentInstallerPolicy::RequiresNetworkEncryption()
  45. const {
  46. return false;
  47. }
  48. update_client::CrxInstaller::Result
  49. OptimizationHintsComponentInstallerPolicy::OnCustomInstall(
  50. const base::Value& manifest,
  51. const base::FilePath& install_dir) {
  52. return update_client::CrxInstaller::Result(0); // Nothing custom here.
  53. }
  54. void OptimizationHintsComponentInstallerPolicy::OnCustomUninstall() {}
  55. void OptimizationHintsComponentInstallerPolicy::ComponentReady(
  56. const base::Version& version,
  57. const base::FilePath& install_dir,
  58. base::Value manifest) {
  59. DCHECK(!install_dir.empty());
  60. DVLOG(1) << "Optimization Hints Version Ready: " << version.GetString();
  61. std::string* ruleset_format =
  62. manifest.FindStringKey(kManifestRulesetFormatKey);
  63. if (!ruleset_format) {
  64. DVLOG(1) << "No ruleset_format present in manifest";
  65. return;
  66. }
  67. base::Version ruleset_format_version = base::Version(*ruleset_format);
  68. if (!ruleset_format_version.IsValid() ||
  69. ruleset_format_version.CompareTo(ruleset_format_version_) > 0) {
  70. DVLOG(1) << "Got incompatible ruleset_format. Bailing out.";
  71. return;
  72. }
  73. optimization_guide::OptimizationHintsComponentUpdateListener*
  74. update_listener = optimization_guide::
  75. OptimizationHintsComponentUpdateListener::GetInstance();
  76. if (update_listener && !base::CommandLine::ForCurrentProcess()->HasSwitch(
  77. kDisableInstallerUpdate)) {
  78. optimization_guide::HintsComponentInfo info(
  79. version,
  80. install_dir.Append(optimization_guide::kUnindexedHintsFileName));
  81. update_listener->MaybeUpdateHintsComponent(info);
  82. }
  83. }
  84. // Called during startup and installation before ComponentReady().
  85. bool OptimizationHintsComponentInstallerPolicy::VerifyInstallation(
  86. const base::Value& manifest,
  87. const base::FilePath& install_dir) const {
  88. return base::PathExists(install_dir);
  89. }
  90. base::FilePath
  91. OptimizationHintsComponentInstallerPolicy::GetRelativeInstallDir() const {
  92. return base::FilePath(FILE_PATH_LITERAL("OptimizationHints"));
  93. }
  94. void OptimizationHintsComponentInstallerPolicy::GetHash(
  95. std::vector<uint8_t>* hash) const {
  96. if (!hash) {
  97. return;
  98. }
  99. hash->assign(std::begin(kOptimizationHintsPublicKeySHA256),
  100. std::end(kOptimizationHintsPublicKeySHA256));
  101. }
  102. std::string OptimizationHintsComponentInstallerPolicy::GetName() const {
  103. return kOptimizationHintsSetFetcherManifestName;
  104. }
  105. update_client::InstallerAttributes
  106. OptimizationHintsComponentInstallerPolicy::GetInstallerAttributes() const {
  107. return update_client::InstallerAttributes();
  108. }
  109. void RegisterOptimizationHintsComponent(ComponentUpdateService* cus) {
  110. if (!optimization_guide::features::IsOptimizationHintsEnabled())
  111. return;
  112. auto installer = base::MakeRefCounted<ComponentInstaller>(
  113. std::make_unique<OptimizationHintsComponentInstallerPolicy>());
  114. installer->Register(cus, base::OnceClosure());
  115. }
  116. } // namespace component_updater