| // Copyright 2014 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. |
| |
| #ifndef COMPONENTS_COMPONENT_UPDATER_COMPONENT_INSTALLER_H_ |
| #define COMPONENTS_COMPONENT_UPDATER_COMPONENT_INSTALLER_H_ |
| |
| #include <stdint.h> |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "base/callback_forward.h" |
| #include "base/files/file_path.h" |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/threading/thread_checker.h" |
| #include "base/values.h" |
| #include "base/version.h" |
| #include "components/update_client/update_client.h" |
| |
| namespace base { |
| class SequencedTaskRunner; |
| class SingleThreadTaskRunner; |
| } // namespace base |
| |
| namespace component_updater { |
| |
| class ComponentUpdateService; |
| |
| // Components should use a ComponentInstaller by defining a class that |
| // implements the members of ComponentInstallerPolicy, and then registering a |
| // ComponentInstaller that has been constructed with an instance of that |
| // class. |
| class ComponentInstallerPolicy { |
| public: |
| virtual ~ComponentInstallerPolicy(); |
| |
| // Verifies that a working installation resides within the directory specified |
| // by |install_dir|. |install_dir| is of the form <base directory>/<version>. |
| // |manifest| should have been read from the manifest file in |install_dir|. |
| // Called only from a thread belonging to a blocking thread pool. |
| // The implementation of this function must be efficient since the function |
| // can be called when Chrome starts. |
| virtual bool VerifyInstallation(const base::DictionaryValue& manifest, |
| const base::FilePath& install_dir) const = 0; |
| |
| // Returns true if the component supports a group policy to enable updates. |
| // Called once during component registration from the UI thread. |
| virtual bool SupportsGroupPolicyEnabledComponentUpdates() const = 0; |
| |
| // Returns true if the network communication related to this component |
| // must be encrypted. |
| virtual bool RequiresNetworkEncryption() const = 0; |
| |
| // OnCustomInstall is called during the installation process. Components that |
| // require custom installation operations should implement them here. |
| // Returns false if a custom operation failed, and true otherwise. |
| // Called only from a thread belonging to a blocking thread pool. |
| virtual update_client::CrxInstaller::Result OnCustomInstall( |
| const base::DictionaryValue& manifest, |
| const base::FilePath& install_dir) = 0; |
| |
| // OnCustomUninstall is called during the unregister (uninstall) process. |
| // Components that require custom uninstallation operations should implement |
| // them here. |
| virtual void OnCustomUninstall() = 0; |
| |
| // ComponentReady is called in two cases: |
| // 1) After an installation is successfully completed. |
| // 2) During component registration if the component is already installed. |
| // In both cases the install is verified before this is called. This method |
| // is guaranteed to be called before any observers of the component are |
| // notified of a successful install, and is meant to support follow-on work |
| // such as updating paths elsewhere in Chrome. Called on the UI thread. |
| // |version| is the version of the component. |
| // |install_dir| is the path to the install directory for this version. |
| // |manifest| is the manifest for this version of the component. |
| virtual void ComponentReady( |
| const base::Version& version, |
| const base::FilePath& install_dir, |
| std::unique_ptr<base::DictionaryValue> manifest) = 0; |
| |
| // Returns a relative path that will be appended to the component updater |
| // root directories to find the data for this particular component. |
| virtual base::FilePath GetRelativeInstallDir() const = 0; |
| |
| // Returns the component's SHA2 hash as raw bytes. |
| virtual void GetHash(std::vector<uint8_t>* hash) const = 0; |
| |
| // Returns the human-readable name of the component. |
| virtual std::string GetName() const = 0; |
| |
| // If this component is a plugin, returns the media types it can handle. |
| virtual std::vector<std::string> GetMimeTypes() const = 0; |
| |
| // Returns a container of name-value pairs representing arbitrary, |
| // installer-defined metadata. |
| // The installer metadata may be used in the update checks for this component. |
| // A compatible server may use these attributes to negotiate special update |
| // rules when issuing an update response. |
| // Valid values for the name part of an attribute match |
| // ^[-_a-zA-Z0-9]{1,256}$ and valid values the value part of an attribute |
| // match ^[-.,;+_=a-zA-Z0-9]{0,256}$ . |
| virtual update_client::InstallerAttributes GetInstallerAttributes() const = 0; |
| }; |
| |
| // Defines the installer for Chrome components. The behavior of this class is |
| // controlled by an instance of ComponentInstallerPolicy, at construction time. |
| class ComponentInstaller final : public update_client::CrxInstaller { |
| public: |
| explicit ComponentInstaller( |
| std::unique_ptr<ComponentInstallerPolicy> installer_policy); |
| |
| // Registers the component for update checks and installs. |
| // The passed |callback| will be called once the initial check for installed |
| // versions is done and the component has been registered. |
| void Register(ComponentUpdateService* cus, base::OnceClosure callback); |
| |
| // Overrides from update_client::CrxInstaller. |
| void OnUpdateError(int error) override; |
| |
| void Install(const base::FilePath& unpack_path, |
| const std::string& public_key, |
| Callback callback) override; |
| |
| bool GetInstalledFile(const std::string& file, |
| base::FilePath* installed_file) override; |
| // Only user-level component installations can be uninstalled. |
| bool Uninstall() override; |
| |
| private: |
| struct RegistrationInfo : base::RefCountedThreadSafe<RegistrationInfo> { |
| RegistrationInfo(); |
| |
| base::FilePath install_dir; |
| base::Version version; |
| std::string fingerprint; |
| std::unique_ptr<base::DictionaryValue> manifest; |
| |
| private: |
| friend class base::RefCountedThreadSafe<RegistrationInfo>; |
| |
| ~RegistrationInfo(); |
| |
| DISALLOW_COPY_AND_ASSIGN(RegistrationInfo); |
| }; |
| |
| ~ComponentInstaller() override; |
| |
| // If there is a installation of the component set up alongside Chrome's |
| // files (as opposed to in the user data directory), sets current_* to the |
| // values associated with that installation and returns true; otherwise, |
| // returns false. |
| bool FindPreinstallation(const base::FilePath& root, |
| scoped_refptr<RegistrationInfo> registration_info); |
| update_client::CrxInstaller::Result InstallHelper( |
| const base::FilePath& unpack_path, |
| std::unique_ptr<base::DictionaryValue>* manifest, |
| base::Version* version, |
| base::FilePath* install_path); |
| void StartRegistration(scoped_refptr<RegistrationInfo> registration_info); |
| void FinishRegistration(scoped_refptr<RegistrationInfo> registration_info, |
| ComponentUpdateService* cus, |
| base::OnceClosure callback); |
| void ComponentReady(std::unique_ptr<base::DictionaryValue> manifest); |
| void UninstallOnTaskRunner(); |
| |
| base::FilePath current_install_dir_; |
| base::Version current_version_; |
| std::string current_fingerprint_; |
| |
| std::unique_ptr<ComponentInstallerPolicy> installer_policy_; |
| scoped_refptr<base::SequencedTaskRunner> task_runner_; |
| |
| // Posts responses back to the main thread. |
| scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; |
| |
| THREAD_CHECKER(thread_checker_); |
| |
| DISALLOW_COPY_AND_ASSIGN(ComponentInstaller); |
| }; |
| |
| } // namespace component_updater |
| |
| #endif // COMPONENTS_COMPONENT_UPDATER_COMPONENT_INSTALLER_H_ |