database_manager.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The Safe Browsing service is responsible for downloading anti-phishing and
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// anti-malware tables and checking urls against them.
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_SAFE_BROWSING_DATABASE_MANAGER_H_
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_SAFE_BROWSING_DATABASE_MANAGER_H_
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <deque>
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map>
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set>
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/synchronization/lock.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/protocol_manager.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_util.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SafeBrowsingService;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SafeBrowsingDatabase;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Thread;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLRequestContext;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLRequestContextGetter;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace safe_browsing {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ClientSideDetectionService;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DownloadProtectionService;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Construction needs to happen on the main thread.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SafeBrowsingDatabaseManager
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public base::RefCountedThreadSafe<SafeBrowsingDatabaseManager>,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public SafeBrowsingProtocolManagerDelegate {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class Client;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Bundle of SafeBrowsing state while performing a URL or hash prefix check.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct SafeBrowsingCheck {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // |check_type| should correspond to the type of item that is being
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // checked, either a URL or a binary hash/URL. We store this for two
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // purposes: to know which of Client's methods to call when a result is
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // known, and for logging purposes. It *isn't* used to predict the response
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // list type, that is information that the server gives us.
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SafeBrowsingCheck(const std::vector<GURL>& urls,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const std::vector<SBFullHash>& full_hashes,
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      Client* client,
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                      safe_browsing_util::ListType check_type,
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                      const std::vector<SBThreatType>& expected_threats);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~SafeBrowsingCheck();
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Either |urls| or |full_hashes| is used to lookup database. |*_results|
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // are parallel vectors containing the results. They are initialized to
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // contain SB_THREAT_TYPE_SAFE.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<GURL> urls;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<SBThreatType> url_results;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<SBFullHash> full_hashes;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<SBThreatType> full_hash_results;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Client* client;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool need_get_hash;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeTicks start;  // When check was sent to SB service.
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    safe_browsing_util::ListType check_type;  // See comment in constructor.
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::vector<SBThreatType> expected_threats;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<SBPrefix> prefix_hits;
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::vector<SBFullHashResult> cache_hits;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Vends weak pointers for TimeoutCallback().  If the response is
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // received before the timeout fires, factory is destructed and
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the timeout won't be fired.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(lzheng): We should consider to use this time out check
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // for browsing too (instead of implementin in
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // safe_browsing_resource_handler.cc).
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<base::WeakPtrFactory<
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SafeBrowsingDatabaseManager> > timeout_factory_;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(SafeBrowsingCheck);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class Client {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void OnSafeBrowsingResult(const SafeBrowsingCheck& check);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   protected:
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~Client() {}
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Called when the result of checking a browse URL is known.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void OnCheckBrowseUrlResult(const GURL& url,
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        SBThreatType threat_type) {}
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Called when the result of checking a download URL is known.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void OnCheckDownloadUrlResult(const std::vector<GURL>& url_chain,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          SBThreatType threat_type) {}
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Called when the result of checking a set of extensions is known.
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void OnCheckExtensionsResult(
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const std::set<std::string>& threats) {}
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates the safe browsing service.  Need to initialize before using.
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SafeBrowsingDatabaseManager(
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const scoped_refptr<SafeBrowsingService>& service);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if the url's scheme can be checked.
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CanCheckUrl(const GURL& url) const;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns whether download protection is enabled.
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool download_protection_enabled() const {
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return enable_download_protection_;
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called on the IO thread to check if the given url is safe or not.  If we
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // can synchronously determine that the url is safe, CheckUrl returns true.
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Otherwise it returns false, and "client" is called asynchronously with the
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // result when it is ready.
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool CheckBrowseUrl(const GURL& url, Client* client);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check if the prefix for |url| is in safebrowsing download add lists.
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Result will be passed to callback in |client|.
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool CheckDownloadUrl(const std::vector<GURL>& url_chain,
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                Client* client);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check which prefixes in |extension_ids| are in the safebrowsing blacklist.
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if not, false if further checks need to be made in which case
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the result will be passed to |client|.
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool CheckExtensionIDs(const std::set<std::string>& extension_ids,
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 Client* client);
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Check if the given url is on the side-effect free whitelist.
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Can be called on any thread. Returns false if the check cannot be performed
14590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // (e.g. because we are disabled or because of an invalid scheme in the URL).
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Otherwise, returns true if the URL is on the whitelist based on matching
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // the hash prefix only (so there may be false positives).
14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool CheckSideEffectFreeWhitelistUrl(const GURL& url);
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check if the |url| matches any of the full-length hashes from the
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // client-side phishing detection whitelist.  Returns true if there was a
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // match and false otherwise.  To make sure we are conservative we will return
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // true if an error occurs. This method is expected to be called on the IO
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // thread.
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool MatchCsdWhitelistUrl(const GURL& url);
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Check if the given IP address (either IPv4 or IPv6) matches the malware
1580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // IP blacklist.
1590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual bool MatchMalwareIP(const std::string& ip_address);
1600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check if the |url| matches any of the full-length hashes from the
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // download whitelist.  Returns true if there was a match and false otherwise.
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // To make sure we are conservative we will return true if an error occurs.
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This method is expected to be called on the IO thread.
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool MatchDownloadWhitelistUrl(const GURL& url);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check if |str| matches any of the full-length hashes from the download
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // whitelist.  Returns true if there was a match and false otherwise.
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // To make sure we are conservative we will return true if an error occurs.
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This method is expected to be called on the IO thread.
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool MatchDownloadWhitelistString(const std::string& str);
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  // Check if the CSD malware IP matching kill switch is turned on.
17458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  virtual bool IsMalwareKillSwitchOn();
17558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Check if the CSD whitelist kill switch is turned on.
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool IsCsdWhitelistKillSwitchOn();
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called on the IO thread to cancel a pending check if the result is no
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // longer needed.
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CancelCheck(Client* client);
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called on the IO thread when the SafeBrowsingProtocolManager has received
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the full hash results for prefix hits detected in the database.
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void HandleGetHashResults(SafeBrowsingCheck* check,
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            const std::vector<SBFullHashResult>& full_hashes,
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            const base::TimeDelta& cache_lifetime);
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Log the user perceived delay caused by SafeBrowsing. This delay is the time
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // delta starting from when we would have started reading data from the
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // network, and ending when the SafeBrowsing check completes indicating that
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the current page is 'safe'.
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void LogPauseDelay(base::TimeDelta time);
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called to initialize objects that are used on the io_thread.  This may be
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // called multiple times during the life of the DatabaseManager. Should be
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // called on IO thread.
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StartOnIOThread();
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called to stop or shutdown operations on the io_thread. This may be called
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // multiple times during the life of the DatabaseManager. Should be called
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // on IO thread. If shutdown is true, the manager is disabled permanently.
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StopOnIOThread(bool shutdown);
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SafeBrowsingDatabaseManager();
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // protected for tests.
20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void NotifyDatabaseUpdateFinished(bool update_succeeded);
21068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class base::RefCountedThreadSafe<SafeBrowsingDatabaseManager>;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class SafeBrowsingServerTest;
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class SafeBrowsingServiceTest;
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class SafeBrowsingServiceTestHelper;
21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  friend class SafeBrowsingDatabaseManagerTest;
217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SafeBrowsingDatabaseManagerTest, GetUrlThreatType);
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::set<SafeBrowsingCheck*> CurrentChecks;
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::vector<SafeBrowsingCheck*> GetHashRequestors;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::hash_map<SBPrefix, GetHashRequestors> GetHashRequests;
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Clients that we've queued up for checking later once the database is ready.
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct QueuedCheck {
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    QueuedCheck(const safe_browsing_util::ListType check_type,
22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                Client* client,
22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                const GURL& url,
22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                const std::vector<SBThreatType>& expected_threats,
22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                const base::TimeTicks& start);
23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ~QueuedCheck();
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    safe_browsing_util::ListType check_type;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Client* client;
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GURL url;
23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::vector<SBThreatType> expected_threats;
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::TimeTicks start;  // When check was queued.
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Return the threat type from the first result in |full_hashes| which matches
239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |hash|, or SAFE if none match.
240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static SBThreatType GetHashThreatType(
241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const SBFullHash& hash,
242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::vector<SBFullHashResult>& full_hashes);
243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Given a URL, compare all the possible host + path full hashes to the set of
245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // provided full hashes.  Returns the threat type of the matching result from
246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |full_hashes|, or SAFE if none match.
247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static SBThreatType GetUrlThreatType(
248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const GURL& url,
249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::vector<SBFullHashResult>& full_hashes);
250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called to stop operations on the io_thread. This may be called multiple
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // times during the life of the DatabaseManager. Should be called on IO
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // thread.
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoStopOnIOThread();
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns whether |database_| exists and is accessible.
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool DatabaseAvailable() const;
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called on the IO thread.  If the database does not exist, queues up a call
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // on the db thread to create it.  Returns whether the database is available.
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note that this is only needed outside the db thread, since functions on the
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // db thread can call GetDatabase() directly.
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool MakeDatabaseAvailable();
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Should only be called on db thread as SafeBrowsingDatabase is not
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // threadsafe.
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SafeBrowsingDatabase* GetDatabase();
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called on the IO thread with the check result.
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnCheckDone(SafeBrowsingCheck* info);
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called on the database thread to retrieve chunks.
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GetAllChunksFromDatabase(GetChunksCallback callback);
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called on the IO thread with the results of all chunks.
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnGetAllChunksFromDatabase(const std::vector<SBListChunkRanges>& lists,
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  bool database_error,
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  GetChunksCallback callback);
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called on the IO thread after the database reports that it added a chunk.
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnAddChunksComplete(AddChunksCallback callback);
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notification that the database is done loading its bloom filter.  We may
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // have had to queue checks until the database is ready, and if so, this
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // checks them.
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DatabaseLoadComplete();
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called on the database thread to add/remove chunks and host keys.
290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void AddDatabaseChunks(const std::string& list,
291f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         scoped_ptr<ScopedVector<SBChunkData> > chunks,
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         AddChunksCallback callback);
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void DeleteDatabaseChunks(
295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_ptr<std::vector<SBChunkDelete> > chunk_deletes);
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void NotifyClientBlockingComplete(Client* client, bool proceed);
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DatabaseUpdateFinished(bool update_succeeded);
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called on the db thread to close the database.  See CloseDatabase().
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnCloseDatabase();
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Runs on the db thread to reset the database. We assume that resetting the
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // database is a synchronous operation.
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnResetDatabase();
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Internal worker function for processing full hashes.
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnHandleGetHashResults(SafeBrowsingCheck* check,
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const std::vector<SBFullHashResult>& full_hashes);
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Run one check against |full_hashes|.  Returns |true| if the check
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // finds a match in |full_hashes|.
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool HandleOneCheck(SafeBrowsingCheck* check,
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      const std::vector<SBFullHashResult>& full_hashes);
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Invoked by CheckDownloadUrl. It checks the download URL on
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // safe_browsing_thread_.
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CheckDownloadUrlOnSBThread(SafeBrowsingCheck* check);
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The callback function when a safebrowsing check is timed out. Client will
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // be notified that the safebrowsing check is SAFE when this happens.
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void TimeoutCallback(SafeBrowsingCheck* check);
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calls the Client's callback on IO thread after CheckDownloadUrl finishes.
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CheckDownloadUrlDone(SafeBrowsingCheck* check);
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Checks all extension ID hashes on safe_browsing_thread_.
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CheckExtensionIDsOnSBThread(SafeBrowsingCheck* check);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Helper function that calls safe browsing client and cleans up |checks_|.
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SafeBrowsingCheckDone(SafeBrowsingCheck* check);
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Helper function to set |check| with default values and start a safe
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // browsing check with timeout of |timeout|. |task| will be called on
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // success, otherwise TimeoutCallback will be called.
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StartSafeBrowsingCheck(SafeBrowsingCheck* check,
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const base::Closure& task);
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SafeBrowsingProtocolManageDelegate override
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ResetDatabase() OVERRIDE;
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void UpdateStarted() OVERRIDE;
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void UpdateFinished(bool success) OVERRIDE;
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void GetChunks(GetChunksCallback callback) OVERRIDE;
345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void AddChunks(const std::string& list,
346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         scoped_ptr<ScopedVector<SBChunkData> > chunks,
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         AddChunksCallback callback) OVERRIDE;
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DeleteChunks(
349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_ptr<std::vector<SBChunkDelete> > chunk_deletes) OVERRIDE;
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<SafeBrowsingService> sb_service_;
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CurrentChecks checks_;
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used for issuing only one GetHash request for a given prefix.
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetHashRequests gethash_requests_;
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The persistent database.  We don't use a scoped_ptr because it
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // needs to be destroyed on a different thread than this object.
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SafeBrowsingDatabase* database_;
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Lock used to prevent possible data races due to compiler optimizations.
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mutable base::Lock database_lock_;
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether the service is running. 'enabled_' is used by the
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SafeBrowsingDatabaseManager on the IO thread during normal operations.
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool enabled_;
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Indicate if download_protection is enabled by command switch
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // so we allow this feature to be exersized.
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool enable_download_protection_;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Indicate if client-side phishing detection whitelist should be enabled
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // or not.
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool enable_csd_whitelist_;
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Indicate if the download whitelist should be enabled or not.
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool enable_download_whitelist_;
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Indicate if the extension blacklist should be enabled.
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool enable_extension_blacklist_;
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
38390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Indicate if the side effect free whitelist should be enabled.
38490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool enable_side_effect_free_whitelist_;
38590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Indicate if the csd malware IP blacklist should be enabled.
3870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  bool enable_ip_blacklist_;
3880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The SafeBrowsing thread that runs database operations.
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note: Functions that run on this thread should run synchronously and return
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to the IO thread, not post additional tasks back to this thread, lest we
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // cause a race condition at shutdown time that leads to a database leak.
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Thread> safe_browsing_thread_;
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Indicates if we're currently in an update cycle.
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool update_in_progress_;
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When true, newly fetched chunks may not in the database yet since the
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // database is still updating.
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool database_update_in_progress_;
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Indicates if we're in the midst of trying to close the database.  If this
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is true, nothing on the IO thread should access the database.
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool closing_database_;
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::deque<QueuedCheck> queued_checks_;
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Timeout to use for safe browsing checks.
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta check_timeout_;
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SafeBrowsingDatabaseManager);
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_BROWSER_SAFE_BROWSING_DATABASE_MANAGER_H_
416