| 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_
|
|
|