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