1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
// Copyright 2013 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_BLACKLIST_H_
#define CHROME_BROWSER_EXTENSIONS_BLACKLIST_H_
#include <list>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <vector>
#include "base/callback.h"
#include "base/callback_list.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/safe_browsing/db/database_manager.h"
#include "extensions/browser/blacklist_state.h"
namespace content {
class BrowserContext;
}
namespace extensions {
class BlacklistStateFetcher;
class ExtensionPrefs;
// The blacklist of extensions backed by safe browsing.
class Blacklist : public KeyedService,
public base::SupportsWeakPtr<Blacklist> {
public:
class Observer {
public:
// Observes |blacklist| on construction and unobserves on destruction.
explicit Observer(Blacklist* blacklist);
virtual void OnBlacklistUpdated() = 0;
protected:
virtual ~Observer();
private:
Blacklist* blacklist_;
};
class ScopedDatabaseManagerForTest {
public:
explicit ScopedDatabaseManagerForTest(
scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager>
database_manager);
~ScopedDatabaseManagerForTest();
private:
scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> original_;
DISALLOW_COPY_AND_ASSIGN(ScopedDatabaseManagerForTest);
};
using BlacklistStateMap = std::map<std::string, BlacklistState>;
using GetBlacklistedIDsCallback =
base::Callback<void(const BlacklistStateMap&)>;
using GetMalwareIDsCallback =
base::Callback<void(const std::set<std::string>&)>;
using IsBlacklistedCallback = base::Callback<void(BlacklistState)>;
explicit Blacklist(ExtensionPrefs* prefs);
~Blacklist() override;
static Blacklist* Get(content::BrowserContext* context);
// From the set of extension IDs passed in via |ids|, asynchronously checks
// which are blacklisted and includes them in the resulting map passed
// via |callback|, which will be sent on the caller's message loop. The values
// of the map are the blacklist state for each extension. Extensions with
// a BlacklistState of NOT_BLACKLISTED are not included in the result.
//
// For a synchronous version which ONLY CHECKS CURRENTLY INSTALLED EXTENSIONS
// see ExtensionPrefs::IsExtensionBlacklisted.
void GetBlacklistedIDs(const std::set<std::string>& ids,
const GetBlacklistedIDsCallback& callback);
// From the subset of extension IDs passed in via |ids|, select the ones
// marked in the blacklist as BLACKLISTED_MALWARE and asynchronously pass
// to |callback|. Basically, will call GetBlacklistedIDs and filter its
// results.
void GetMalwareIDs(const std::set<std::string>& ids,
const GetMalwareIDsCallback& callback);
// More convenient form of GetBlacklistedIDs for checking a single extension.
void IsBlacklisted(const std::string& extension_id,
const IsBlacklistedCallback& callback);
// Used to mock BlacklistStateFetcher in unit tests. Blacklist owns the
// |fetcher|.
void SetBlacklistStateFetcherForTest(BlacklistStateFetcher* fetcher);
// Reset the owned BlacklistStateFetcher to null and return the current
// BlacklistStateFetcher.
BlacklistStateFetcher* ResetBlacklistStateFetcherForTest();
// Reset the listening for an updated database.
void ResetDatabaseUpdatedListenerForTest();
// Adds/removes an observer to the blacklist.
void AddObserver(Observer* observer);
void RemoveObserver(Observer* observer);
private:
// Use via ScopedDatabaseManagerForTest.
static void SetDatabaseManager(
scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager>
database_manager);
static scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager>
GetDatabaseManager();
void ObserveNewDatabase();
void NotifyObservers();
void GetBlacklistStateForIDs(const GetBlacklistedIDsCallback& callback,
const std::set<std::string>& blacklisted_ids);
void RequestExtensionsBlacklistState(const std::set<std::string>& ids,
base::OnceClosure callback);
void OnBlacklistStateReceived(const std::string& id, BlacklistState state);
void ReturnBlacklistStateMap(const GetBlacklistedIDsCallback& callback,
const std::set<std::string>& blacklisted_ids);
base::ObserverList<Observer>::Unchecked observers_;
std::unique_ptr<base::CallbackList<void()>::Subscription>
database_updated_subscription_;
std::unique_ptr<base::CallbackList<void()>::Subscription>
database_changed_subscription_;
// The cached BlacklistState's, received from BlacklistStateFetcher.
BlacklistStateMap blacklist_state_cache_;
std::unique_ptr<BlacklistStateFetcher> state_fetcher_;
// The list of ongoing requests for blacklist states that couldn't be
// served directly from the cache. A new request is created in
// GetBlacklistedIDs and deleted when the callback is called from
// OnBlacklistStateReceived.
//
// This is a list of requests. Each item in the list is a request. A request
// is a pair of [vector of string ids to check, response closure].
std::list<std::pair<std::vector<std::string>, base::OnceClosure>>
state_requests_;
DISALLOW_COPY_AND_ASSIGN(Blacklist);
};
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_BLACKLIST_H_
|