1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The Safe Browsing service is responsible for downloading anti-phishing and 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// anti-malware tables and checking urls against them. 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_SERVICE_H_ 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_SERVICE_H_ 103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <deque> 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <set> 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/hash_tables.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/synchronization/lock.h" 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/task.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/safe_browsing/safe_browsing_util.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/resource_type.h" 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass MalwareDetails; 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PrefService; 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SafeBrowsingDatabase; 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SafeBrowsingProtocolManager; 31201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass SafeBrowsingServiceFactory; 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace base { 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Thread; 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace net { 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass URLRequestContextGetter; 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Construction needs to happen on the main thread. 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SafeBrowsingService 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : public base::RefCountedThreadSafe<SafeBrowsingService> { 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen class Client; 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Users of this service implement this interface to be notified 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // asynchronously of the result. 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum UrlCheckResult { 49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen SAFE, 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URL_PHISHING, 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URL_MALWARE, 52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BINARY_MALWARE_URL, // Binary url leads to a malware. 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BINARY_MALWARE_HASH, // Binary hash indicates this is a malware. 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Structure used to pass parameters between the IO and UI thread when 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // interacting with the blocking page. 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct UnsafeResource { 59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch UnsafeResource(); 60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ~UnsafeResource(); 61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url; 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL original_url; 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::vector<GURL> redirect_urls; 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResourceType::Type resource_type; 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UrlCheckResult threat_type; 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Client* client; 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int render_process_host_id; 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int render_view_id; 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Bundle of SafeBrowsing state for one URL or hash prefix check. 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct SafeBrowsingCheck { 74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch SafeBrowsingCheck(); 75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ~SafeBrowsingCheck(); 76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Either |urls| or |prefix| is used to lookup database. 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<GURL> urls; 79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen scoped_ptr<SBFullHash> full_hash; 80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Client* client; 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool need_get_hash; 83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen base::TimeTicks start; // When check was sent to SB service. 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UrlCheckResult result; 85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool is_download; // If this check for download url or hash. 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<SBPrefix> prefix_hits; 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<SBFullHashResult> full_hits; 88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Task to make the callback to safebrowsing clients in case 90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // safebrowsing check takes too long to finish. Not owned by 91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // this class. 92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // TODO(lzheng): We should consider to use this time out check 93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // for browsing too (instead of implementin in 94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // safe_browsing_resource_handler.cc). 95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen CancelableTask* timeout_task; 96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private: 98513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DISALLOW_COPY_AND_ASSIGN(SafeBrowsingCheck); 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen class Client { 102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public: 103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual ~Client() {} 104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void OnSafeBrowsingResult(const SafeBrowsingCheck& check); 106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Called when the user has made a decision about how to handle the 108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // SafeBrowsing interstitial page. 109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void OnBlockingPageComplete(bool proceed) {} 110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen protected: 112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Called when the result of checking a browse URL is known. 113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void OnBrowseUrlCheckResult(const GURL& url, 114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen UrlCheckResult result) {} 115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Called when the result of checking a download URL is known. 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void OnDownloadUrlCheckResult(const std::vector<GURL>& url_chain, 118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen UrlCheckResult result) {} 119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Called when the result of checking a download binary hash is known. 121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void OnDownloadHashCheckResult(const std::string& hash, 122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen UrlCheckResult result) {} 123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen }; 124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 126201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Makes the passed |factory| the factory used to instanciate 127201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // a SafeBrowsingService. Useful for tests. 128201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static void RegisterFactory(SafeBrowsingServiceFactory* factory) { 129201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch factory_ = factory; 130201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch } 131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 132201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Create an instance of the safe browsing service. 133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static SafeBrowsingService* CreateSafeBrowsingService(); 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the UI thread to initialize the service. 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Initialize(); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the main thread to let us know that the io_thread is going away. 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ShutDown(); 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns true if the url's scheme can be checked. 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool CanCheckUrl(const GURL& url) const; 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Called on UI thread to decide if safe browsing related stats 145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // could be reported. 146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool CanReportStats() const; 147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Called on UI thread to decide if the download file's sha256 hash 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // should be calculated for safebrowsing. 15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool DownloadBinHashNeeded() const; 15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the IO thread to check if the given url is safe or not. If we 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // can synchronously determine that the url is safe, CheckUrl returns true. 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Otherwise it returns false, and "client" is called asynchronously with the 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // result when it is ready. 15621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual bool CheckBrowseUrl(const GURL& url, Client* client); 15721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 15821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Check if the prefix for |url| is in safebrowsing download add lists. 15921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Result will be passed to callback in |client|. 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool CheckDownloadUrl(const std::vector<GURL>& url_chain, Client* client); 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Check if the prefix for |full_hash| is in safebrowsing binhash add lists. 163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Result will be passed to callback in |client|. 164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual bool CheckDownloadHash(const std::string& full_hash, Client* client); 165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Check if the |url| matches any of the full-length hashes from the 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // client-side phishing detection whitelist. Returns true if there was a 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // match and false otherwise. To make sure we are conservative we will return 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // true if an error occurs. This method is expected to be called on the IO 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // thread. 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual bool MatchCsdWhitelistUrl(const GURL& url); 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the IO thread to cancel a pending check if the result is no 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // longer needed. 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void CancelCheck(Client* client); 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the IO thread to display an interstitial page. 1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // |url| is the url of the resource that matches a safe browsing list. 1793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // If the request contained a chain of redirects, |url| is the last url 1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // in the chain, and |original_url| is the first one (the root of the 1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // chain). Otherwise, |original_url| = |url|. 182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void DisplayBlockingPage(const GURL& url, 183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const GURL& original_url, 184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::vector<GURL>& redirect_urls, 185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ResourceType::Type resource_type, 186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen UrlCheckResult result, 187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Client* client, 188dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int render_process_host_id, 189dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int render_view_id); 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the IO thread when the SafeBrowsingProtocolManager has received 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the full hash results for prefix hits detected in the database. 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void HandleGetHashResults( 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingCheck* check, 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::vector<SBFullHashResult>& full_hashes, 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool can_cache); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the IO thread. 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void HandleChunk(const std::string& list, SBChunkList* chunks); 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void HandleChunkDelete(std::vector<SBChunkDelete>* chunk_deletes); 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Update management. Called on the IO thread. 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void UpdateStarted(); 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void UpdateFinished(bool update_succeeded); 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Whether there is an update in progress. Called on the IO thread. 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool IsUpdateInProgress() const; 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The blocking page on the UI thread has completed. 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnBlockingPageDone(const std::vector<UnsafeResource>& resources, 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool proceed); 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the UI thread when the SafeBrowsingProtocolManager has received 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // updated MAC keys. 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnNewMacKeys(const std::string& client_key, 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& wrapped_key); 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Notification on the UI thread from the advanced options UI. 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnEnable(bool enabled); 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool enabled() const { return enabled_; } 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool download_protection_enabled() const { 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return enabled_ && enable_download_protection_; 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Preference handling. 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void RegisterPrefs(PrefService* prefs); 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the IO thread to try to close the database, freeing the memory 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // associated with it. The database will be automatically reopened as needed. 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // NOTE: Actual database closure is asynchronous, and until it happens, the IO 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // thread is not allowed to access it; may not actually trigger a close if one 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // is already pending or doing so would cause problems. 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void CloseDatabase(); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the IO thread to reset the database. 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ResetDatabase(); 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Log the user perceived delay caused by SafeBrowsing. This delay is the time 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // delta starting from when we would have started reading data from the 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // network, and ending when the SafeBrowsing check completes indicating that 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the current page is 'safe'. 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void LogPauseDelay(base::TimeDelta time); 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Called on the IO thread by the MalwareDetails with the serialized 247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // protocol buffer, so the service can send it over. 248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void SendSerializedMalwareDetails(const std::string& serialized); 24921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Report hits to the unsafe contents (malware, phishing, unsafe download URL) 251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // to the server. Can only be called on UI thread. If |post_data| is 252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // non-empty, the request will be sent as a POST instead of a GET. 253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void ReportSafeBrowsingHit(const GURL& malicious_url, 254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const GURL& page_url, 255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const GURL& referrer_url, 256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool is_subresource, 257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UrlCheckResult threat_type, 258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& post_data); 259dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 260201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch protected: 261201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Creates the safe browsing service. Need to initialize before using. 262201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch SafeBrowsingService(); 263201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 264201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch virtual ~SafeBrowsingService(); 265201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 267201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch friend class SafeBrowsingServiceFactoryImpl; 268201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::set<SafeBrowsingCheck*> CurrentChecks; 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::vector<SafeBrowsingCheck*> GetHashRequestors; 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef base::hash_map<SBPrefix, GetHashRequestors> GetHashRequests; 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Used for whitelisting a render view when the user ignores our warning. 274731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick struct WhiteListedEntry; 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Clients that we've queued up for checking later once the database is ready. 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct QueuedCheck { 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Client* client; 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url; 280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen base::TimeTicks start; // When check was queued. 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class base::RefCountedThreadSafe<SafeBrowsingService>; 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class SafeBrowsingServiceTest; 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called to initialize objects that are used on the io_thread. 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnIOInitialize(const std::string& client_key, 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& wrapped_key, 289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen net::URLRequestContextGetter* request_context_getter); 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called to shutdown operations on the io_thread. 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnIOShutdown(); 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns whether |database_| exists and is accessible. 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool DatabaseAvailable() const; 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the IO thread. If the database does not exist, queues up a call 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // on the db thread to create it. Returns whether the database is available. 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Note that this is only needed outside the db thread, since functions on the 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // db thread can call GetDatabase() directly. 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool MakeDatabaseAvailable(); 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Should only be called on db thread as SafeBrowsingDatabase is not 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // threadsafe. 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingDatabase* GetDatabase(); 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the IO thread with the check result. 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnCheckDone(SafeBrowsingCheck* info); 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the database thread to retrieve chunks. 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void GetAllChunksFromDatabase(); 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the IO thread with the results of all chunks. 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnGetAllChunksFromDatabase(const std::vector<SBListChunkRanges>& lists, 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool database_error); 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the IO thread after the database reports that it added a chunk. 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnChunkInserted(); 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Notification that the database is done loading its bloom filter. We may 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // have had to queue checks until the database is ready, and if so, this 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // checks them. 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void DatabaseLoadComplete(); 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the database thread to add/remove chunks and host keys. 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Callee will free the data when it's done. 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void HandleChunkForDatabase(const std::string& list, 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBChunkList* chunks); 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void DeleteChunks(std::vector<SBChunkDelete>* chunk_deletes); 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static UrlCheckResult GetResultFromListname(const std::string& list_name); 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void NotifyClientBlockingComplete(Client* client, bool proceed); 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void DatabaseUpdateFinished(bool update_succeeded); 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Start up SafeBrowsing objects. This can be called at browser start, or when 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the user checks the "Enable SafeBrowsing" option in the Advanced options 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // UI. 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Start(); 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called on the db thread to close the database. See CloseDatabase(). 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnCloseDatabase(); 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Runs on the db thread to reset the database. We assume that resetting the 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // database is a synchronous operation. 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnResetDatabase(); 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Store in-memory the GetHash response. Runs on the database thread. 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void CacheHashResults(const std::vector<SBPrefix>& prefixes, 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::vector<SBFullHashResult>& full_hashes); 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Internal worker function for processing full hashes. 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnHandleGetHashResults(SafeBrowsingCheck* check, 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::vector<SBFullHashResult>& full_hashes); 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Run one check against |full_hashes|. Returns |true| if the check 3603f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // finds a match in |full_hashes|. 3613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen bool HandleOneCheck(SafeBrowsingCheck* check, 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::vector<SBFullHashResult>& full_hashes); 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Invoked on the UI thread to show the blocking page. 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void DoDisplayBlockingPage(const UnsafeResource& resource); 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 367dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Call protocol manager on IO thread to report hits of unsafe contents. 368dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void ReportSafeBrowsingHitOnIOThread(const GURL& malicious_url, 369dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const GURL& page_url, 370dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const GURL& referrer_url, 371dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool is_subresource, 372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen UrlCheckResult threat_type, 373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& post_data); 374dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 375dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Checks the download hash on safe_browsing_thread_. 376dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void CheckDownloadHashOnSBThread(SafeBrowsingCheck* check); 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Invoked by CheckDownloadUrl. It checks the download URL on 37921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // safe_browsing_thread_. 38021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void CheckDownloadUrlOnSBThread(SafeBrowsingCheck* check); 38121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 382dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // The callback function when a safebrowsing check is timed out. Client will 383dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // be notified that the safebrowsing check is SAFE when this happens. 384dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void TimeoutCallback(SafeBrowsingCheck* check); 385dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 386dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Calls the Client's callback on IO thread after CheckDownloadUrl finishes. 387dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void CheckDownloadUrlDone(SafeBrowsingCheck* check); 388dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 389dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Calls the Client's callback on IO thread after CheckDownloadHash finishes. 390dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void CheckDownloadHashDone(SafeBrowsingCheck* check); 391dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 392dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Helper function that calls safe browsing client and cleans up |checks_|. 393dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void SafeBrowsingCheckDone(SafeBrowsingCheck* check); 394dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 395dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Helper function to set |check| with default values and start a safe 396dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // browsing check with timeout of |timeout_ms|. |task| will be called upon 397dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // success, otherwise TimeoutCallback will be called. 398dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void StartDownloadCheck(SafeBrowsingCheck* check, 399dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Client* client, 400dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen CancelableTask* task, 401dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int64 timeout_ms); 40221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 403201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // The factory used to instanciate a SafeBrowsingService object. 404201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Useful for tests, so they can provide their own implementation of 405201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // SafeBrowsingService. 406201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch static SafeBrowsingServiceFactory* factory_; 407201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CurrentChecks checks_; 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Used for issuing only one GetHash request for a given prefix. 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetHashRequests gethash_requests_; 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // The persistent database. We don't use a scoped_ptr because it 41472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // needs to be destructed on a different thread than this object. 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingDatabase* database_; 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Lock used to prevent possible data races due to compiler optimizations. 41872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen mutable base::Lock database_lock_; 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Handles interaction with SafeBrowsing servers. 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolManager* protocol_manager_; 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<WhiteListedEntry> white_listed_entries_; 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Whether the service is running. 'enabled_' is used by SafeBrowsingService 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // on the IO thread during normal operations. 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool enabled_; 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 42921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Indicate if download_protection is enabled by command switch 43021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // so we allow this feature to be exersized. 43121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool enable_download_protection_; 43221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Indicate if client-side phishing detection whitelist should be enabled 434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // or not. 435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool enable_csd_whitelist_; 436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The SafeBrowsing thread that runs database operations. 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Note: Functions that run on this thread should run synchronously and return 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to the IO thread, not post additional tasks back to this thread, lest we 441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // cause a race condition at shutdown time that leads to a database leak. 442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<base::Thread> safe_browsing_thread_; 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Indicates if we're currently in an update cycle. 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool update_in_progress_; 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // When true, newly fetched chunks may not in the database yet since the 4483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // database is still updating. 4493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool database_update_in_progress_; 4503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Indicates if we're in the midst of trying to close the database. If this 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // is true, nothing on the IO thread should access the database. 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool closing_database_; 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::deque<QueuedCheck> queued_checks_; 456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 457dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // When download url check takes this long, client's callback will be called 458dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // without waiting for the result. 459dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int64 download_urlcheck_timeout_ms_; 460dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 461dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Similar to |download_urlcheck_timeout_ms_|, but for download hash checks. 462dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen int64 download_hashcheck_timeout_ms_; 463dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(SafeBrowsingService); 465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 467201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Factory for creating SafeBrowsingService. Useful for tests. 468201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass SafeBrowsingServiceFactory { 469201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch public: 470201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch SafeBrowsingServiceFactory() { } 471201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch virtual ~SafeBrowsingServiceFactory() { } 472201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch virtual SafeBrowsingService* CreateSafeBrowsingService() = 0; 473201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch private: 474201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DISALLOW_COPY_AND_ASSIGN(SafeBrowsingServiceFactory); 475201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}; 476201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_SAFE_BROWSING_SAFE_BROWSING_SERVICE_H_ 478