// 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 CHROME_BROWSER_EXTENSIONS_EXTENSION_INSTALL_CHECKER_H_ #define CHROME_BROWSER_EXTENSIONS_EXTENSION_INSTALL_CHECKER_H_ #include #include #include "base/callback.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/strings/string16.h" #include "extensions/browser/blacklist_state.h" #include "extensions/common/extension.h" class Profile; namespace extensions { class RequirementsChecker; // Performs common checks for an extension. Extensions that violate these checks // would be disabled or not even installed. class ExtensionInstallChecker { public: // Called when checks are complete. The returned value is a bitmask of // failed checks. typedef base::Callback Callback; enum CheckType { // Check the blacklist state of the extension. CHECK_BLACKLIST = 1 << 0, // Check whether the extension has requirement errors. CHECK_REQUIREMENTS = 1 << 1, // Check whether the extension can be installed and loaded, according to // management policies. CHECK_MANAGEMENT_POLICY = 1 << 2, // Perform all checks. CHECK_ALL = (1 << 3) - 1 }; explicit ExtensionInstallChecker(Profile* profile); virtual ~ExtensionInstallChecker(); // Start a set of checks. |enabled_checks| is a bitmask of CheckTypes to run. // If |fail_fast| is true, the callback will be invoked once any check fails. // Otherwise it will be invoked when all checks have completed. |callback| // will only be called once. // This function must be called on the UI thread. The callback also occurs on // the UI thread. Checks may run asynchronously in parallel. // If checks are currently running, the caller must wait for the callback to // be invoked before starting another set of checks. void Start(int enabled_checks, bool fail_fast, const Callback& callback); Profile* profile() const { return profile_; } const scoped_refptr& extension() { return extension_; } void set_extension(const scoped_refptr& extension) { extension_ = extension; } // Returns true if any checks are currently running. bool is_running() const { return running_checks_ != 0; } // Returns the requirement violations. A non-empty list is considered to be // a check failure. const std::vector& requirement_errors() const { return requirement_errors_; } // Returns the blacklist state of the extension. A blacklist state of // BLACKLISTED_MALWARE is considered to be a check failure. BlacklistState blacklist_state() const { return blacklist_state_; } // Returns whether management policy permits installation of the extension. bool policy_allows_load() const { return policy_allows_load_; } const std::string& policy_error() const { return policy_error_; } protected: virtual void CheckManagementPolicy(); void OnManagementPolicyCheckDone(bool allows_load, const std::string& error); virtual void CheckRequirements(); void OnRequirementsCheckDone(int sequence_number, std::vector errors); virtual void CheckBlacklistState(); void OnBlacklistStateCheckDone(int sequence_number, BlacklistState state); virtual void ResetResults(); int current_sequence_number() const { return current_sequence_number_; } private: void MaybeInvokeCallback(); scoped_ptr requirements_checker_; // The Profile where the extension is being installed in. Profile* profile_; // The extension to run checks for. scoped_refptr extension_; // Requirement violations. std::vector requirement_errors_; // Result of the blacklist state check. BlacklistState blacklist_state_; // Whether the extension can be installed, according to management policies. bool policy_allows_load_; std::string policy_error_; // The sequence number of the currently running checks. int current_sequence_number_; // Bitmask of currently running checks. int running_checks_; // If true, the callback is invoked when the first check fails. bool fail_fast_; // The callback to invoke when checks are complete. Callback callback_; base::WeakPtrFactory weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(ExtensionInstallChecker); }; } // namespace extensions #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_INSTALL_CHECKER_H_