Index: chrome/browser/safe_browsing/database_manager.h |
diff --git a/chrome/browser/safe_browsing/database_manager.h b/chrome/browser/safe_browsing/database_manager.h |
index 3b0984d7ba9c0d07069ea23ec4caa8db8d4ff236..601d4f3c58064e2596fbafa641d27a43a773af56 100644 |
--- a/chrome/browser/safe_browsing/database_manager.h |
+++ b/chrome/browser/safe_browsing/database_manager.h |
@@ -14,84 +14,19 @@ |
#include <string> |
#include <vector> |
-#include "base/callback.h" |
-#include "base/containers/hash_tables.h" |
#include "base/memory/ref_counted.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/synchronization/lock.h" |
-#include "base/time/time.h" |
-#include "chrome/browser/safe_browsing/protocol_manager.h" |
#include "chrome/browser/safe_browsing/safe_browsing_util.h" |
#include "url/gurl.h" |
-class SafeBrowsingService; |
-class SafeBrowsingDatabase; |
- |
-namespace net { |
-class URLRequestContext; |
-class URLRequestContextGetter; |
-} |
- |
-namespace safe_browsing { |
-class ClientSideDetectionService; |
-class DownloadProtectionService; |
-} |
- |
-// Construction needs to happen on the main thread. |
+// Interface to either the locally-managed or a remotely-managed database. |
class SafeBrowsingDatabaseManager |
- : public base::RefCountedThreadSafe<SafeBrowsingDatabaseManager>, |
- public SafeBrowsingProtocolManagerDelegate { |
+ : public base::RefCountedThreadSafe<SafeBrowsingDatabaseManager> { |
public: |
- class Client; |
- |
- // Bundle of SafeBrowsing state while performing a URL or hash prefix check. |
- struct SafeBrowsingCheck { |
- // |check_type| should correspond to the type of item that is being |
- // checked, either a URL or a binary hash/URL. We store this for two |
- // purposes: to know which of Client's methods to call when a result is |
- // known, and for logging purposes. It *isn't* used to predict the response |
- // list type, that is information that the server gives us. |
- SafeBrowsingCheck(const std::vector<GURL>& urls, |
- const std::vector<SBFullHash>& full_hashes, |
- Client* client, |
- safe_browsing_util::ListType check_type, |
- const std::vector<SBThreatType>& expected_threats); |
- ~SafeBrowsingCheck(); |
- |
- // Either |urls| or |full_hashes| is used to lookup database. |*_results| |
- // are parallel vectors containing the results. They are initialized to |
- // contain SB_THREAT_TYPE_SAFE. |
- std::vector<GURL> urls; |
- std::vector<SBThreatType> url_results; |
- std::vector<std::string> url_metadata; |
- std::vector<SBFullHash> full_hashes; |
- std::vector<SBThreatType> full_hash_results; |
- |
- Client* client; |
- bool need_get_hash; |
- base::TimeTicks start; // When check was sent to SB service. |
- safe_browsing_util::ListType check_type; // See comment in constructor. |
- std::vector<SBThreatType> expected_threats; |
- std::vector<SBPrefix> prefix_hits; |
- std::vector<SBFullHashResult> cache_hits; |
- |
- // Vends weak pointers for async callbacks on the IO thread, such as |
- // timeout checks and replies from checks performed on the SB task runner. |
- // TODO(lzheng): We should consider to use this time out check |
- // for browsing too (instead of implementing in |
- // safe_browsing_resource_handler.cc). |
- scoped_ptr<base::WeakPtrFactory< |
- SafeBrowsingDatabaseManager> > weak_ptr_factory_; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(SafeBrowsingCheck); |
- }; |
- |
+ // Callers requesting a result should derive from this class. |
+ // The destructor should call db_manager->CancelCheck(client) if a |
+ // request is still pending. |
class Client { |
public: |
- void OnSafeBrowsingResult(const SafeBrowsingCheck& check); |
- |
- protected: |
virtual ~Client() {} |
// Called when the result of checking a browse URL is known. |
@@ -108,301 +43,81 @@ class SafeBrowsingDatabaseManager |
const std::set<std::string>& threats) {} |
}; |
- // Creates the safe browsing service. Need to initialize before using. |
- explicit SafeBrowsingDatabaseManager( |
- const scoped_refptr<SafeBrowsingService>& service); |
- |
// Returns true if the url's scheme can be checked. |
- bool CanCheckUrl(const GURL& url) const; |
+ virtual bool CanCheckUrl(const GURL& url) const = 0; |
// Returns whether download protection is enabled. |
- bool download_protection_enabled() const { |
- return enable_download_protection_; |
- } |
+ virtual bool download_protection_enabled() const = 0; |
// Called on the IO thread to check if the given url is safe or not. If we |
// can synchronously determine that the url is safe, CheckUrl returns true. |
// Otherwise it returns false, and "client" is called asynchronously with the |
// result when it is ready. |
- virtual bool CheckBrowseUrl(const GURL& url, Client* client); |
+ virtual bool CheckBrowseUrl(const GURL& url, Client* client) = 0; |
// Check if the prefix for |url| is in safebrowsing download add lists. |
// Result will be passed to callback in |client|. |
virtual bool CheckDownloadUrl(const std::vector<GURL>& url_chain, |
- Client* client); |
+ Client* client) = 0; |
// Check which prefixes in |extension_ids| are in the safebrowsing blacklist. |
// Returns true if not, false if further checks need to be made in which case |
// the result will be passed to |client|. |
virtual bool CheckExtensionIDs(const std::set<std::string>& extension_ids, |
- Client* client); |
+ Client* client) = 0; |
// Check if the |url| matches any of the full-length hashes from the client- |
// side phishing detection whitelist. Returns true if there was a match and |
// false otherwise. To make sure we are conservative we will return true if |
// an error occurs. This method must be called on the IO thread. |
- virtual bool MatchCsdWhitelistUrl(const GURL& url); |
+ virtual bool MatchCsdWhitelistUrl(const GURL& url) = 0; |
// Check if the given IP address (either IPv4 or IPv6) matches the malware |
// IP blacklist. |
- virtual bool MatchMalwareIP(const std::string& ip_address); |
+ virtual bool MatchMalwareIP(const std::string& ip_address) = 0; |
// Check if the |url| matches any of the full-length hashes from the download |
// whitelist. Returns true if there was a match and false otherwise. To make |
// sure we are conservative we will return true if an error occurs. This |
// method must be called on the IO thread. |
- virtual bool MatchDownloadWhitelistUrl(const GURL& url); |
+ virtual bool MatchDownloadWhitelistUrl(const GURL& url) = 0; |
// Check if |str| matches any of the full-length hashes from the download |
// whitelist. Returns true if there was a match and false otherwise. To make |
// sure we are conservative we will return true if an error occurs. This |
// method must be called on the IO thread. |
- virtual bool MatchDownloadWhitelistString(const std::string& str); |
+ virtual bool MatchDownloadWhitelistString(const std::string& str) = 0; |
// Check if the |url| matches any of the full-length hashes from the off- |
// domain inclusion whitelist. Returns true if there was a match and false |
// otherwise. To make sure we are conservative, we will return true if an |
// error occurs. This method must be called on the IO thread. |
- virtual bool MatchInclusionWhitelistUrl(const GURL& url); |
+ virtual bool MatchInclusionWhitelistUrl(const GURL& url) = 0; |
// Check if the CSD malware IP matching kill switch is turned on. |
- virtual bool IsMalwareKillSwitchOn(); |
+ virtual bool IsMalwareKillSwitchOn() = 0; |
// Check if the CSD whitelist kill switch is turned on. |
- virtual bool IsCsdWhitelistKillSwitchOn(); |
+ virtual bool IsCsdWhitelistKillSwitchOn() = 0; |
// Called on the IO thread to cancel a pending check if the result is no |
- // longer needed. |
- void CancelCheck(Client* client); |
- |
- // Called on the IO thread when the SafeBrowsingProtocolManager has received |
- // the full hash results for prefix hits detected in the database. |
- void HandleGetHashResults(SafeBrowsingCheck* check, |
- const std::vector<SBFullHashResult>& full_hashes, |
- const base::TimeDelta& cache_lifetime); |
+ // longer needed. Also called after the result has been handled. |
+ virtual void CancelCheck(Client* client) = 0; |
// Called to initialize objects that are used on the io_thread. This may be |
// called multiple times during the life of the DatabaseManager. Must be |
// called on IO thread. |
- void StartOnIOThread(); |
+ virtual void StartOnIOThread() = 0; |
// Called to stop or shutdown operations on the io_thread. This may be called |
// multiple times during the life of the DatabaseManager. Must be called |
// on IO thread. If shutdown is true, the manager is disabled permanently. |
- void StopOnIOThread(bool shutdown); |
+ virtual void StopOnIOThread(bool shutdown) = 0; |
protected: |
- ~SafeBrowsingDatabaseManager() override; |
- |
- // protected for tests. |
- void NotifyDatabaseUpdateFinished(bool update_succeeded); |
+ virtual ~SafeBrowsingDatabaseManager() {} |
- private: |
friend class base::RefCountedThreadSafe<SafeBrowsingDatabaseManager>; |
- friend class SafeBrowsingServerTest; |
- friend class SafeBrowsingServiceTest; |
- friend class SafeBrowsingServiceTestHelper; |
- friend class SafeBrowsingDatabaseManagerTest; |
- FRIEND_TEST_ALL_PREFIXES(SafeBrowsingDatabaseManagerTest, |
- GetUrlSeverestThreatType); |
- FRIEND_TEST_ALL_PREFIXES(SafeBrowsingDatabaseManagerTest, |
- ServiceStopWithPendingChecks); |
- |
- typedef std::set<SafeBrowsingCheck*> CurrentChecks; |
- typedef std::vector<SafeBrowsingCheck*> GetHashRequestors; |
- typedef base::hash_map<SBPrefix, GetHashRequestors> GetHashRequests; |
- |
- // Clients that we've queued up for checking later once the database is ready. |
- struct QueuedCheck { |
- QueuedCheck(const safe_browsing_util::ListType check_type, |
- Client* client, |
- const GURL& url, |
- const std::vector<SBThreatType>& expected_threats, |
- const base::TimeTicks& start); |
- ~QueuedCheck(); |
- safe_browsing_util::ListType check_type; |
- Client* client; |
- GURL url; |
- std::vector<SBThreatType> expected_threats; |
- base::TimeTicks start; // When check was queued. |
- }; |
- |
- // Return the threat type of the severest entry in |full_hashes| which matches |
- // |hash|, or SAFE if none match. |
- static SBThreatType GetHashSeverestThreatType( |
- const SBFullHash& hash, |
- const std::vector<SBFullHashResult>& full_hashes); |
- |
- // Given a URL, compare all the possible host + path full hashes to the set of |
- // provided full hashes. Returns the threat type of the severest matching |
- // result from |full_hashes|, or SAFE if none match. |
- static SBThreatType GetUrlSeverestThreatType( |
- const GURL& url, |
- const std::vector<SBFullHashResult>& full_hashes, |
- size_t* index); |
- |
- // Called to stop operations on the io_thread. This may be called multiple |
- // times during the life of the DatabaseManager. Should be called on IO |
- // thread. |
- void DoStopOnIOThread(); |
- |
- // Returns whether |database_| exists and is accessible. |
- bool DatabaseAvailable() const; |
- |
- // Called on the IO thread. If the database does not exist, queues up a call |
- // on the db thread to create it. Returns whether the database is available. |
- // |
- // Note that this is only needed outside the db thread, since functions on the |
- // db thread can call GetDatabase() directly. |
- bool MakeDatabaseAvailable(); |
- |
- // Should only be called on db thread as SafeBrowsingDatabase is not |
- // threadsafe. |
- SafeBrowsingDatabase* GetDatabase(); |
- |
- // Called on the IO thread with the check result. |
- void OnCheckDone(SafeBrowsingCheck* info); |
- |
- // Called on the database thread to retrieve chunks. |
- void GetAllChunksFromDatabase(GetChunksCallback callback); |
- |
- // Called on the IO thread with the results of all chunks. |
- void OnGetAllChunksFromDatabase(const std::vector<SBListChunkRanges>& lists, |
- bool database_error, |
- GetChunksCallback callback); |
- |
- // Called on the IO thread after the database reports that it added a chunk. |
- void OnAddChunksComplete(AddChunksCallback callback); |
- |
- // Notification that the database is done loading its bloom filter. We may |
- // have had to queue checks until the database is ready, and if so, this |
- // checks them. |
- void DatabaseLoadComplete(); |
- |
- // Called on the database thread to add/remove chunks and host keys. |
- void AddDatabaseChunks(const std::string& list, |
- scoped_ptr<ScopedVector<SBChunkData> > chunks, |
- AddChunksCallback callback); |
- |
- void DeleteDatabaseChunks( |
- scoped_ptr<std::vector<SBChunkDelete> > chunk_deletes); |
- |
- void NotifyClientBlockingComplete(Client* client, bool proceed); |
- |
- void DatabaseUpdateFinished(bool update_succeeded); |
- |
- // Called on the db thread to close the database. See CloseDatabase(). |
- void OnCloseDatabase(); |
- |
- // Runs on the db thread to reset the database. We assume that resetting the |
- // database is a synchronous operation. |
- void OnResetDatabase(); |
- |
- // Internal worker function for processing full hashes. |
- void OnHandleGetHashResults(SafeBrowsingCheck* check, |
- const std::vector<SBFullHashResult>& full_hashes); |
- |
- // Run one check against |full_hashes|. Returns |true| if the check |
- // finds a match in |full_hashes|. |
- bool HandleOneCheck(SafeBrowsingCheck* check, |
- const std::vector<SBFullHashResult>& full_hashes); |
- |
- // Invoked by CheckDownloadUrl. It checks the download URL on |
- // |safe_browsing_task_runner_|. |
- std::vector<SBPrefix> CheckDownloadUrlOnSBThread( |
- const std::vector<SBPrefix>& prefixes); |
- |
- // The callback function when a safebrowsing check is timed out. Client will |
- // be notified that the safebrowsing check is SAFE when this happens. |
- void TimeoutCallback(SafeBrowsingCheck* check); |
- |
- // Calls the Client's callback on IO thread after CheckDownloadUrl finishes. |
- void OnAsyncCheckDone(SafeBrowsingCheck* check, |
- const std::vector<SBPrefix>& prefix_hits); |
- |
- // Checks all extension ID hashes on |safe_browsing_task_runner_|. |
- std::vector<SBPrefix> CheckExtensionIDsOnSBThread( |
- const std::vector<SBPrefix>& prefixes); |
- |
- // Helper function that calls safe browsing client and cleans up |checks_|. |
- void SafeBrowsingCheckDone(SafeBrowsingCheck* check); |
- |
- // Helper function to set |check| with default values and start a safe |
- // browsing check with timeout of |timeout|. |task| will be called on |
- // success, otherwise TimeoutCallback will be called. |
- void StartSafeBrowsingCheck( |
- SafeBrowsingCheck* check, |
- const base::Callback<std::vector<SBPrefix>(void)>& task); |
- |
- // SafeBrowsingProtocolManageDelegate override |
- void ResetDatabase() override; |
- void UpdateStarted() override; |
- void UpdateFinished(bool success) override; |
- void GetChunks(GetChunksCallback callback) override; |
- void AddChunks(const std::string& list, |
- scoped_ptr<ScopedVector<SBChunkData>> chunks, |
- AddChunksCallback callback) override; |
- void DeleteChunks( |
- scoped_ptr<std::vector<SBChunkDelete>> chunk_deletes) override; |
- |
- scoped_refptr<SafeBrowsingService> sb_service_; |
- |
- CurrentChecks checks_; |
- |
- // Used for issuing only one GetHash request for a given prefix. |
- GetHashRequests gethash_requests_; |
- |
- // The persistent database. We don't use a scoped_ptr because it |
- // needs to be destroyed on a different thread than this object. |
- SafeBrowsingDatabase* database_; |
- |
- // Lock used to prevent possible data races due to compiler optimizations. |
- mutable base::Lock database_lock_; |
- |
- // Whether the service is running. 'enabled_' is used by the |
- // SafeBrowsingDatabaseManager on the IO thread during normal operations. |
- bool enabled_; |
- |
- // Indicate if download_protection is enabled by command switch |
- // so we allow this feature to be exersized. |
- bool enable_download_protection_; |
- |
- // Indicate if client-side phishing detection whitelist should be enabled |
- // or not. |
- bool enable_csd_whitelist_; |
- |
- // Indicate if the download whitelist should be enabled or not. |
- bool enable_download_whitelist_; |
- |
- // Indicate if the extension blacklist should be enabled. |
- bool enable_extension_blacklist_; |
- |
- // Indicate if the csd malware IP blacklist should be enabled. |
- bool enable_ip_blacklist_; |
- |
- // Indicate if the unwanted software blacklist should be enabled. |
- bool enable_unwanted_software_blacklist_; |
- |
- // The sequenced task runner for running safe browsing database operations. |
- scoped_refptr<base::SequencedTaskRunner> safe_browsing_task_runner_; |
- |
- // Indicates if we're currently in an update cycle. |
- bool update_in_progress_; |
- |
- // When true, newly fetched chunks may not in the database yet since the |
- // database is still updating. |
- bool database_update_in_progress_; |
- |
- // Indicates if we're in the midst of trying to close the database. If this |
- // is true, nothing on the IO thread should access the database. |
- bool closing_database_; |
- |
- std::deque<QueuedCheck> queued_checks_; |
- |
- // Timeout to use for safe browsing checks. |
- base::TimeDelta check_timeout_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SafeBrowsingDatabaseManager); |
-}; |
+}; // class SafeBrowsingDatabaseManager |
#endif // CHROME_BROWSER_SAFE_BROWSING_DATABASE_MANAGER_H_ |