15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_SAFE_BROWSING_PROTOCOL_MANAGER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_SAFE_BROWSING_PROTOCOL_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class that implements Chrome's interface with the SafeBrowsing protocol.
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// See https://developers.google.com/safe-browsing/developers_guide_v2 for
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// protocol details.
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The SafeBrowsingProtocolManager handles formatting and making requests of,
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and handling responses from, Google's SafeBrowsing servers. This class uses
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The SafeBrowsingProtocolParser class to do the actual parsing.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/non_thread_safe.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/chunk_range.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/protocol_manager_helper.h"
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/safe_browsing/protocol_parser.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_util.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h"
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLFetcher;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLRequestContextGetter;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(COMPILER_GCC)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Allows us to use URLFetchers in a hash_map with gcc (MSVC is okay without
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specifying this).
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace BASE_HASH_NAMESPACE {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<>
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct hash<const net::URLFetcher*> {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t operator()(const net::URLFetcher* fetcher) const {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return reinterpret_cast<size_t>(fetcher);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SBProtocolManagerFactory;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SafeBrowsingProtocolManagerDelegate;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SafeBrowsingProtocolManager : public net::URLFetcherDelegate,
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                    public base::NonThreadSafe {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FullHashCallback is invoked when GetFullHash completes.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parameters:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   - The vector of full hash results. If empty, indicates that there
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     were no matches, and that the resource is safe.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   - Whether the result can be cached. This may not be the case when
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //     the result did not come from the SB server, for example.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(const std::vector<SBFullHashResult>&,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool)> FullHashCallback;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SafeBrowsingProtocolManager();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes the passed |factory| the factory used to instantiate
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a SafeBrowsingService. Useful for tests.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RegisterFactory(SBProtocolManagerFactory* factory) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    factory_ = factory;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create an instance of the safe browsing protocol manager.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static SafeBrowsingProtocolManager* Create(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SafeBrowsingProtocolManagerDelegate* delegate,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::URLRequestContextGetter* request_context_getter,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const SafeBrowsingProtocolConfig& config);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets up the update schedule and internal state for making periodic requests
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of the Safebrowsing servers.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Initialize();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // net::URLFetcherDelegate interface.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieve the full hash for a set of prefixes, and invoke the callback
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // argument when the results are retrieved. The callback may be invoked
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // synchronously.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetFullHash(const std::vector<SBPrefix>& prefixes,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           FullHashCallback callback,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           bool is_download);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Forces the start of next update after |interval| time.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ForceScheduleNextUpdate(base::TimeDelta interval);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Scheduled update callback.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetNextUpdate();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called by the SafeBrowsingService when our request for a list of all chunks
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for each list is done.  If database_error is true, that means the protocol
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // manager shouldn't fetch updates since they can't be written to disk.  It
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should try again later to open the database.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetChunksComplete(const std::vector<SBListChunkRanges>& list,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           bool database_error);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last time we received an update.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_update() const { return last_update_; }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setter for additional_query_. To make sure the additional_query_ won't
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be changed in the middle of an update, caller (e.g.: SafeBrowsingService)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should call this after callbacks triggered in UpdateFinished() or before
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IssueUpdateRequest().
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_additional_query(const std::string& query) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    additional_query_ = query;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& additional_query() const {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return additional_query_;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enumerate failures for histogramming purposes.  DO NOT CHANGE THE
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ORDERING OF THESE VALUES.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum ResultType {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 200 response code means that the server recognized the hash
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // prefix, while 204 is an empty response indicating that the
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // server did not recognize it.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GET_HASH_STATUS_200,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GET_HASH_STATUS_204,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Subset of successful responses which returned no full hashes.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This includes the 204 case, and also 200 responses for stale
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // prefixes (deleted at the server but yet deleted on the client).
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GET_HASH_FULL_HASH_EMPTY,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Subset of successful responses for which one or more of the
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // full hashes matched (should lead to an interstitial).
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GET_HASH_FULL_HASH_HIT,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Subset of successful responses which weren't empty and have no
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // matches.  It means that there was a prefix collision which was
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // cleared up by the full hashes.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GET_HASH_FULL_HASH_MISS,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Memory space for histograms is determined by the max.  ALWAYS
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ADD NEW VALUES BEFORE THIS ONE.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GET_HASH_RESULT_MAX
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Record a GetHash result. |is_download| indicates if the get
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hash is triggered by download related lookup.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void RecordGetHashResult(bool is_download,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ResultType result_type);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns whether another update is currently scheduled.
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsUpdateScheduled() const;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructs a SafeBrowsingProtocolManager for |delegate| that issues
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // network requests using |request_context_getter|.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SafeBrowsingProtocolManager(
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SafeBrowsingProtocolManagerDelegate* delegate,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::URLRequestContextGetter* request_context_getter,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const SafeBrowsingProtocolConfig& config);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SafeBrowsingProtocolManagerTest, TestBackOffTimes);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SafeBrowsingProtocolManagerTest, TestChunkStrings);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SafeBrowsingProtocolManagerTest, TestGetHashUrl);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SafeBrowsingProtocolManagerTest,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           TestGetHashBackOffTimes);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SafeBrowsingProtocolManagerTest, TestNextChunkUrl);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SafeBrowsingProtocolManagerTest, TestUpdateUrl);
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class SafeBrowsingServerTest;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class SBProtocolManagerFactoryImpl;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Internal API for fetching information from the SafeBrowsing servers. The
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetHash requests are higher priority since they can block user requests
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // so are handled separately.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum SafeBrowsingRequestType {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NO_REQUEST = 0,     // No requests in progress
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UPDATE_REQUEST,     // Request for redirect URLs
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BACKUP_UPDATE_REQUEST, // Request for redirect URLs to a backup URL.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHUNK_REQUEST,      // Request for a specific chunk
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Which type of backup update request is being used.
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum BackupUpdateReason {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BACKUP_UPDATE_REASON_CONNECT,
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BACKUP_UPDATE_REASON_HTTP,
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BACKUP_UPDATE_REASON_NETWORK,
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BACKUP_UPDATE_REASON_MAX,
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates Update URL for querying about the latest set of chunk updates.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL UpdateUrl() const;
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Generates backup Update URL for querying about the latest set of chunk
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // updates. |url_prefix| is the base prefix to use.
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL BackupUpdateUrl(BackupUpdateReason reason) const;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates GetHash request URL for retrieving full hashes.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL GetHashUrl() const;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates URL for reporting safe browsing hits for UMA users.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Composes a ChunkUrl based on input string.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL NextChunkUrl(const std::string& input) const;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the time for the next update request. If |back_off| is true,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the time returned will increment an error count and return the appriate
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // next time (see ScheduleNextUpdate below).
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta GetNextUpdateInterval(bool back_off);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Worker function for calculating GetHash and Update backoff times (in
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // seconds). |multiplier| is doubled for each consecutive error between the
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2nd and 5th, and |error_count| is incremented with each call.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta GetNextBackOffInterval(int* error_count,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int* multiplier) const;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Manages our update with the next allowable update time. If 'back_off_' is
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // true, we must decrease the frequency of requests of the SafeBrowsing
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // service according to section 5 of the protocol specification.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When disable_auto_update_ is set, ScheduleNextUpdate will do nothing.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ForceScheduleNextUpdate has to be called to trigger the update.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ScheduleNextUpdate(bool back_off);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends a request for a list of chunks we should download to the SafeBrowsing
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // servers. In order to format this request, we need to send all the chunk
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // numbers for each list that we have to the server. Getting the chunk numbers
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // requires a database query (run on the database thread), and the request
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is sent upon completion of that query in OnGetChunksComplete.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void IssueUpdateRequest();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sends a backup request for a list of chunks to download, when the primary
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // update request failed. |reason| specifies why the backup is needed. Unlike
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the primary IssueUpdateRequest, this does not need to hit the local
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SafeBrowsing database since the existing chunk numbers are remembered from
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the primary update request. Returns whether the backup request was issued -
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // this may be false in cases where there is not a prefix specified.
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IssueBackupUpdateRequest(BackupUpdateReason reason);
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sends a request for a chunk to the SafeBrowsing servers.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void IssueChunkRequest();
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Formats a string returned from the database into:
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   "list_name;a:<add_chunk_ranges>:s:<sub_chunk_ranges>\n"
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string FormatList(const SBListChunkRanges& list);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs the protocol parser on received data and update the
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SafeBrowsingService with the new content. Returns 'true' on successful
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // parse, 'false' on error.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HandleServiceResponse(const GURL& url, const char* data, int length);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates internal state for each GetHash response error, assuming that the
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // current time is |now|.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HandleGetHashError(const base::Time& now);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function for update completion.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateFinished(bool success);
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateFinished(bool success, bool back_off);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A callback that runs if we timeout waiting for a response to an update
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request. We use this to properly set our update state.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateResponseTimeout();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called after the chunks are added to the database.
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnAddChunksComplete();
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Map of GetHash requests to parameters which created it.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct FullHashDetails {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FullHashDetails();
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FullHashDetails(FullHashCallback callback, bool is_download);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~FullHashDetails();
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FullHashCallback callback;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_download;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::hash_map<const net::URLFetcher*, FullHashDetails> HashRequests;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The factory that controls the creation of SafeBrowsingProtocolManager.
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is used by tests.
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static SBProtocolManagerFactory* factory_;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Our delegate.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SafeBrowsingProtocolManagerDelegate* delegate_;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Current active request (in case we need to cancel) for updates or chunks
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from the SafeBrowsing service. We can only have one of these outstanding
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // at any given time unlike GetHash requests, which are tracked separately.
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::URLFetcher> request_;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The kind of request that is currently in progress.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SafeBrowsingRequestType request_type_;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The number of HTTP response errors, used for request backoff timing.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int update_error_count_;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int gethash_error_count_;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Multipliers which double (max == 8) for each error after the second.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int update_back_off_mult_;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int gethash_back_off_mult_;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Multiplier between 0 and 1 to spread clients over an interval.
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float back_off_fuzz_;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The list for which we are make a request.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string list_name_;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For managing the next earliest time to query the SafeBrowsing servers for
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updates.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta next_update_interval_;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::OneShotTimer<SafeBrowsingProtocolManager> update_timer_;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // timeout_timer_ is used to interrupt update requests which are taking
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // too long.
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::OneShotTimer<SafeBrowsingProtocolManager> timeout_timer_;
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All chunk requests that need to be made.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::deque<ChunkUrl> chunk_request_urls_;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HashRequests hash_requests_;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The next scheduled update has special behavior for the first 2 requests.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum UpdateRequestState {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FIRST_REQUEST = 0,
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SECOND_REQUEST,
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NORMAL_REQUEST
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateRequestState update_state_;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the service has been given an add/sub chunk but it hasn't been
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // added to the database yet.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool chunk_pending_to_write_;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last time we successfully received an update.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_update_;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // While in GetHash backoff, we can't make another GetHash until this time.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time next_gethash_time_;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Current product version sent in each request.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string version_;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for measuring chunk request latency.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time chunk_request_start_;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tracks the size of each update (in bytes).
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int update_size_;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The safe browsing client name sent in each request.
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string client_name_;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A string that is appended to the end of URLs for download, gethash,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // safebrowsing hits and chunk update requests.
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string additional_query_;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The context we use to issue network requests.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URL prefix where browser fetches safebrowsing chunk updates, and hashes.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url_prefix_;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Backup URL prefixes for updates.
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string backup_url_prefixes_[BACKUP_UPDATE_REASON_MAX];
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The current reason why the backup update request is happening.
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BackupUpdateReason backup_update_reason_;
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Data to POST when doing an update.
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string update_list_data_;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When true, protocol manager will not start an update unless
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ForceScheduleNextUpdate() is called. This is set for testing purpose.
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool disable_auto_update_;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ID for URLFetchers for testing.
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int url_fetcher_id_;
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SafeBrowsingProtocolManager);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Interface of a factory to create ProtocolManager.  Useful for tests.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SBProtocolManagerFactory {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SBProtocolManagerFactory() {}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SBProtocolManagerFactory() {}
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SafeBrowsingProtocolManager* CreateProtocolManager(
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SafeBrowsingProtocolManagerDelegate* delegate,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::URLRequestContextGetter* request_context_getter,
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const SafeBrowsingProtocolConfig& config) = 0;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SBProtocolManagerFactory);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delegate interface for the SafeBrowsingProtocolManager.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SafeBrowsingProtocolManagerDelegate {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::Callback<void(const std::vector<SBListChunkRanges>&, bool)>
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetChunksCallback;
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<void(void)> AddChunksCallback;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SafeBrowsingProtocolManagerDelegate();
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |UpdateStarted()| is called just before the SafeBrowsing update protocol
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has begun.
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateStarted() = 0;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |UpdateFinished()| is called just after the SafeBrowsing update protocol
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has completed.
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateFinished(bool success) = 0;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wipe out the local database. The SafeBrowsing server can request this.
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ResetDatabase() = 0;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieve all the local database chunks, and invoke |callback| with the
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // results. The SafeBrowsingProtocolManagerDelegate must only invoke the
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // callback if the SafeBrowsingProtocolManager is still alive. Only one call
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // may be made to GetChunks at a time.
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetChunks(GetChunksCallback callback) = 0;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add new chunks to the database. Invokes |callback| when complete, but must
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // call at a later time.
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AddChunks(const std::string& list, SBChunkList* chunks,
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         AddChunksCallback callback) = 0;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete chunks from the database.
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DeleteChunks(
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<SBChunkDelete>* delete_chunks) = 0;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_SAFE_BROWSING_PROTOCOL_MANAGER_H_
433