blob: bcacc8f35cffdbbac7c55be24d308d6e1c5c1e82 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_EXTENSIONS_SAFE_BROWSING_VERDICT_HANDLER_H_
#define CHROME_BROWSER_EXTENSIONS_SAFE_BROWSING_VERDICT_HANDLER_H_
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "chrome/browser/extensions/blocklist.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_registry_observer.h"
#include "extensions/common/extension_set.h"
namespace extensions {
class ExtensionPrefs;
class ExtensionService;
// Manages the Safe Browsing blocklist/greylist state in extension pref.
class SafeBrowsingVerdictHandler : public ExtensionRegistryObserver {
public:
SafeBrowsingVerdictHandler(ExtensionPrefs* extension_prefs,
ExtensionRegistry* registry,
ExtensionService* extension_service);
SafeBrowsingVerdictHandler(const SafeBrowsingVerdictHandler&) = delete;
SafeBrowsingVerdictHandler& operator=(const SafeBrowsingVerdictHandler&) =
delete;
~SafeBrowsingVerdictHandler() override;
// Initializes and load greylist from prefs.
void Init();
// Manages the blocklisted extensions. Enables/disables/loads/unloads
// extensions based on the current `state_map`.
void ManageBlocklist(const Blocklist::BlocklistStateMap& state_map);
private:
// Adds extensions in `blocklist` to `blocklist_` and maybe unload them.
// Removes extensions that are neither in `blocklist`, nor in `unchanged` from
// `blocklist_` and maybe reload them.
void UpdateBlocklistedExtensions(const ExtensionIdSet& blocklist,
const ExtensionIdSet& unchanged);
// Adds extensions in `greylist` to `greylist_` and disables them. Removes
// extensions that are neither in `greylist`, nor in `unchanged` from
// `greylist_` and maybe re-enable them.
void UpdateGreylistedExtensions(
const ExtensionIdSet& greylist,
const ExtensionIdSet& unchanged,
const Blocklist::BlocklistStateMap& state_map);
// ExtensionRegistryObserver overrides.
void OnExtensionUninstalled(content::BrowserContext* browser_context,
const extensions::Extension* extension,
extensions::UninstallReason reason) override;
base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver>
extension_registry_observation_{this};
raw_ptr<ExtensionPrefs> extension_prefs_ = nullptr;
raw_ptr<ExtensionRegistry> registry_ = nullptr;
raw_ptr<ExtensionService> extension_service_ = nullptr;
// Set of blocklisted extensions. These extensions are unloaded if they are
// already installed in Chromium at the time when they are added to
// the blocklist. This blocklist_ only contains extensions blocklisted by Safe
// Browsing while ExtensionRegistry::blocklisted_extensions_ contains
// extensions blocklisted by other sources such as Omaha attribute.
ExtensionSet blocklist_;
// Set of greylisted extensions. These extensions are disabled if they are
// already installed in Chromium at the time when they are added to
// the greylist. Unlike blocklisted extensions, greylisted ones are visible
// to the user and if user re-enables such an extension, they remain enabled.
//
// These extensions should appear in registry_.
ExtensionSet greylist_;
};
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_SAFE_BROWSING_VERDICT_HANDLER_H_