| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/component_updater/intervention_policy_database_component_installer.h" |
| |
| #include "base/bind.h" |
| #include "base/callback.h" |
| #include "base/files/file_path.h" |
| #include "base/files/file_util.h" |
| #include "base/logging.h" |
| #include "base/stl_util.h" |
| #include "chrome/browser/resource_coordinator/intervention_policy_database.h" |
| #include "components/component_updater/component_updater_paths.h" |
| #include "components/component_updater/component_updater_service.h" |
| #include "components/crx_file/id_util.h" |
| |
| using component_updater::ComponentUpdateService; |
| |
| namespace { |
| |
| // The SHA256 of the SubjectPublicKeyInfo used to sign the component. |
| // The component id is: copjbmjbojbakpaedmpkhmiplmmehfck |
| const uint8_t kInterventionPolicyDatabasePublicKeySHA256[32] = { |
| 0x2e, 0xf9, 0x1c, 0x91, 0xe9, 0x10, 0xaf, 0x04, 0x3c, 0xfa, 0x7c, |
| 0x8f, 0xbc, 0xc4, 0x75, 0x2a, 0x48, 0x9a, 0x64, 0x74, 0xc6, 0xda, |
| 0xb7, 0xb9, 0xdf, 0x5f, 0x51, 0x3e, 0x50, 0x39, 0x04, 0xab}; |
| |
| // The name of the component, used in the chrome://components page. |
| const char kInterventionPolicyDatabaseComponentName[] = |
| "Intervention Policy Database"; |
| |
| // The name of the database file inside of an installation of this component. |
| const base::FilePath::CharType kInterventionPolicyDatabaseBinaryPbFileName[] = |
| FILE_PATH_LITERAL("intervention_policy_database.pb"); |
| |
| } // namespace |
| |
| namespace component_updater { |
| |
| InterventionPolicyDatabaseComponentInstallerPolicy:: |
| InterventionPolicyDatabaseComponentInstallerPolicy( |
| resource_coordinator::InterventionPolicyDatabase* database) |
| : database_(database) { |
| DCHECK(database_); |
| } |
| |
| bool InterventionPolicyDatabaseComponentInstallerPolicy:: |
| SupportsGroupPolicyEnabledComponentUpdates() const { |
| return false; |
| } |
| |
| bool InterventionPolicyDatabaseComponentInstallerPolicy:: |
| RequiresNetworkEncryption() const { |
| // Public data is delivered via this component, no need for encryption. |
| return false; |
| } |
| |
| update_client::CrxInstaller::Result |
| InterventionPolicyDatabaseComponentInstallerPolicy::OnCustomInstall( |
| const base::DictionaryValue& manifest, |
| const base::FilePath& install_dir) { |
| return update_client::CrxInstaller::Result(0); |
| } |
| |
| void InterventionPolicyDatabaseComponentInstallerPolicy::OnCustomUninstall() {} |
| |
| // Called during startup and installation before ComponentReady(). |
| bool InterventionPolicyDatabaseComponentInstallerPolicy::VerifyInstallation( |
| const base::DictionaryValue& manifest, |
| const base::FilePath& install_dir) const { |
| return base::PathExists( |
| install_dir.Append(kInterventionPolicyDatabaseBinaryPbFileName)); |
| } |
| |
| // NOTE: This is always called on the main UI thread. It is called once every |
| // startup to notify of an already installed component, and may be called |
| // repeatedly after that every time a new component is ready. |
| void InterventionPolicyDatabaseComponentInstallerPolicy::ComponentReady( |
| const base::Version& version, |
| const base::FilePath& install_dir, |
| std::unique_ptr<base::DictionaryValue> manifest) { |
| DCHECK(database_); |
| database_->InitializeDatabaseWithProtoFile( |
| install_dir.Append(kInterventionPolicyDatabaseBinaryPbFileName), version, |
| std::move(manifest)); |
| } |
| |
| base::FilePath |
| InterventionPolicyDatabaseComponentInstallerPolicy::GetRelativeInstallDir() |
| const { |
| return base::FilePath(FILE_PATH_LITERAL("InterventionPolicyDatabase")); |
| } |
| |
| void InterventionPolicyDatabaseComponentInstallerPolicy::GetHash( |
| std::vector<uint8_t>* hash) const { |
| hash->assign(kInterventionPolicyDatabasePublicKeySHA256, |
| kInterventionPolicyDatabasePublicKeySHA256 + |
| base::size(kInterventionPolicyDatabasePublicKeySHA256)); |
| } |
| |
| std::string InterventionPolicyDatabaseComponentInstallerPolicy::GetName() |
| const { |
| return kInterventionPolicyDatabaseComponentName; |
| } |
| |
| update_client::InstallerAttributes |
| InterventionPolicyDatabaseComponentInstallerPolicy::GetInstallerAttributes() |
| const { |
| return update_client::InstallerAttributes(); |
| } |
| |
| std::vector<std::string> |
| InterventionPolicyDatabaseComponentInstallerPolicy::GetMimeTypes() const { |
| return std::vector<std::string>(); |
| } |
| |
| void RegisterInterventionPolicyDatabaseComponent( |
| ComponentUpdateService* cus, |
| resource_coordinator::InterventionPolicyDatabase* database) { |
| std::unique_ptr<ComponentInstallerPolicy> policy( |
| new InterventionPolicyDatabaseComponentInstallerPolicy(database)); |
| auto installer = base::MakeRefCounted<ComponentInstaller>(std::move(policy)); |
| installer->Register(cus, base::OnceClosure()); |
| } |
| |
| } // namespace component_updater |