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