Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(403)

Side by Side Diff: chrome/browser/safe_browsing/database_manager.h

Issue 1110723002: Split to SafeBrowsingDatabaseManager into Local* and Remote*. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Respond to review. Tweak comments and list initializer. Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // The Safe Browsing service is responsible for downloading anti-phishing and 5 // The Safe Browsing service is responsible for downloading anti-phishing and
6 // anti-malware tables and checking urls against them. 6 // anti-malware tables and checking urls against them.
7 7
8 #ifndef CHROME_BROWSER_SAFE_BROWSING_DATABASE_MANAGER_H_ 8 #ifndef CHROME_BROWSER_SAFE_BROWSING_DATABASE_MANAGER_H_
9 #define CHROME_BROWSER_SAFE_BROWSING_DATABASE_MANAGER_H_ 9 #define CHROME_BROWSER_SAFE_BROWSING_DATABASE_MANAGER_H_
10 10
11 #include <deque> 11 #include <deque>
12 #include <map> 12 #include <map>
13 #include <set> 13 #include <set>
14 #include <string> 14 #include <string>
15 #include <vector> 15 #include <vector>
16 16
17 #include "base/callback.h"
18 #include "base/containers/hash_tables.h"
19 #include "base/memory/ref_counted.h" 17 #include "base/memory/ref_counted.h"
20 #include "base/memory/scoped_ptr.h"
21 #include "base/synchronization/lock.h"
22 #include "base/time/time.h"
23 #include "chrome/browser/safe_browsing/protocol_manager.h"
24 #include "chrome/browser/safe_browsing/safe_browsing_util.h" 18 #include "chrome/browser/safe_browsing/safe_browsing_util.h"
25 #include "url/gurl.h" 19 #include "url/gurl.h"
26 20
27 class SafeBrowsingService; 21 // Interface to either the locally-managed or a remotely-managed database.
28 class SafeBrowsingDatabase;
29
30 namespace net {
31 class URLRequestContext;
32 class URLRequestContextGetter;
33 }
34
35 namespace safe_browsing {
36 class ClientSideDetectionService;
37 class DownloadProtectionService;
38 }
39
40 // Construction needs to happen on the main thread.
41 class SafeBrowsingDatabaseManager 22 class SafeBrowsingDatabaseManager
42 : public base::RefCountedThreadSafe<SafeBrowsingDatabaseManager>, 23 : public base::RefCountedThreadSafe<SafeBrowsingDatabaseManager> {
43 public SafeBrowsingProtocolManagerDelegate {
44 public: 24 public:
45 class Client; 25 // Callers requesting a result should derive from this class.
46 26 // The destructor should call db_manager->CancelCheck(client) if a
47 // Bundle of SafeBrowsing state while performing a URL or hash prefix check. 27 // request is still pending.
48 struct SafeBrowsingCheck {
49 // |check_type| should correspond to the type of item that is being
50 // checked, either a URL or a binary hash/URL. We store this for two
51 // purposes: to know which of Client's methods to call when a result is
52 // known, and for logging purposes. It *isn't* used to predict the response
53 // list type, that is information that the server gives us.
54 SafeBrowsingCheck(const std::vector<GURL>& urls,
55 const std::vector<SBFullHash>& full_hashes,
56 Client* client,
57 safe_browsing_util::ListType check_type,
58 const std::vector<SBThreatType>& expected_threats);
59 ~SafeBrowsingCheck();
60
61 // Either |urls| or |full_hashes| is used to lookup database. |*_results|
62 // are parallel vectors containing the results. They are initialized to
63 // contain SB_THREAT_TYPE_SAFE.
64 std::vector<GURL> urls;
65 std::vector<SBThreatType> url_results;
66 std::vector<std::string> url_metadata;
67 std::vector<SBFullHash> full_hashes;
68 std::vector<SBThreatType> full_hash_results;
69
70 Client* client;
71 bool need_get_hash;
72 base::TimeTicks start; // When check was sent to SB service.
73 safe_browsing_util::ListType check_type; // See comment in constructor.
74 std::vector<SBThreatType> expected_threats;
75 std::vector<SBPrefix> prefix_hits;
76 std::vector<SBFullHashResult> cache_hits;
77
78 // Vends weak pointers for async callbacks on the IO thread, such as
79 // timeout checks and replies from checks performed on the SB task runner.
80 // TODO(lzheng): We should consider to use this time out check
81 // for browsing too (instead of implementing in
82 // safe_browsing_resource_handler.cc).
83 scoped_ptr<base::WeakPtrFactory<
84 SafeBrowsingDatabaseManager> > weak_ptr_factory_;
85
86 private:
87 DISALLOW_COPY_AND_ASSIGN(SafeBrowsingCheck);
88 };
89
90 class Client { 28 class Client {
91 public: 29 public:
92 void OnSafeBrowsingResult(const SafeBrowsingCheck& check);
93
94 protected:
95 virtual ~Client() {} 30 virtual ~Client() {}
96 31
97 // Called when the result of checking a browse URL is known. 32 // Called when the result of checking a browse URL is known.
98 virtual void OnCheckBrowseUrlResult(const GURL& url, 33 virtual void OnCheckBrowseUrlResult(const GURL& url,
99 SBThreatType threat_type, 34 SBThreatType threat_type,
100 const std::string& metadata) {} 35 const std::string& metadata) {}
101 36
102 // Called when the result of checking a download URL is known. 37 // Called when the result of checking a download URL is known.
103 virtual void OnCheckDownloadUrlResult(const std::vector<GURL>& url_chain, 38 virtual void OnCheckDownloadUrlResult(const std::vector<GURL>& url_chain,
104 SBThreatType threat_type) {} 39 SBThreatType threat_type) {}
105 40
106 // Called when the result of checking a set of extensions is known. 41 // Called when the result of checking a set of extensions is known.
107 virtual void OnCheckExtensionsResult( 42 virtual void OnCheckExtensionsResult(
108 const std::set<std::string>& threats) {} 43 const std::set<std::string>& threats) {}
109 }; 44 };
110 45
111 // Creates the safe browsing service. Need to initialize before using.
112 explicit SafeBrowsingDatabaseManager(
113 const scoped_refptr<SafeBrowsingService>& service);
114
115 // Returns true if the url's scheme can be checked. 46 // Returns true if the url's scheme can be checked.
116 bool CanCheckUrl(const GURL& url) const; 47 virtual bool CanCheckUrl(const GURL& url) const = 0;
117 48
118 // Returns whether download protection is enabled. 49 // Returns whether download protection is enabled.
119 bool download_protection_enabled() const { 50 virtual bool download_protection_enabled() const = 0;
120 return enable_download_protection_;
121 }
122 51
123 // Called on the IO thread to check if the given url is safe or not. If we 52 // Called on the IO thread to check if the given url is safe or not. If we
124 // can synchronously determine that the url is safe, CheckUrl returns true. 53 // can synchronously determine that the url is safe, CheckUrl returns true.
125 // Otherwise it returns false, and "client" is called asynchronously with the 54 // Otherwise it returns false, and "client" is called asynchronously with the
126 // result when it is ready. 55 // result when it is ready.
127 virtual bool CheckBrowseUrl(const GURL& url, Client* client); 56 virtual bool CheckBrowseUrl(const GURL& url, Client* client) = 0;
128 57
129 // Check if the prefix for |url| is in safebrowsing download add lists. 58 // Check if the prefix for |url| is in safebrowsing download add lists.
130 // Result will be passed to callback in |client|. 59 // Result will be passed to callback in |client|.
131 virtual bool CheckDownloadUrl(const std::vector<GURL>& url_chain, 60 virtual bool CheckDownloadUrl(const std::vector<GURL>& url_chain,
132 Client* client); 61 Client* client) = 0;
133 62
134 // Check which prefixes in |extension_ids| are in the safebrowsing blacklist. 63 // Check which prefixes in |extension_ids| are in the safebrowsing blacklist.
135 // Returns true if not, false if further checks need to be made in which case 64 // Returns true if not, false if further checks need to be made in which case
136 // the result will be passed to |client|. 65 // the result will be passed to |client|.
137 virtual bool CheckExtensionIDs(const std::set<std::string>& extension_ids, 66 virtual bool CheckExtensionIDs(const std::set<std::string>& extension_ids,
138 Client* client); 67 Client* client) = 0;
139 68
140 // Check if the |url| matches any of the full-length hashes from the client- 69 // Check if the |url| matches any of the full-length hashes from the client-
141 // side phishing detection whitelist. Returns true if there was a match and 70 // side phishing detection whitelist. Returns true if there was a match and
142 // false otherwise. To make sure we are conservative we will return true if 71 // false otherwise. To make sure we are conservative we will return true if
143 // an error occurs. This method must be called on the IO thread. 72 // an error occurs. This method must be called on the IO thread.
144 virtual bool MatchCsdWhitelistUrl(const GURL& url); 73 virtual bool MatchCsdWhitelistUrl(const GURL& url) = 0;
145 74
146 // Check if the given IP address (either IPv4 or IPv6) matches the malware 75 // Check if the given IP address (either IPv4 or IPv6) matches the malware
147 // IP blacklist. 76 // IP blacklist.
148 virtual bool MatchMalwareIP(const std::string& ip_address); 77 virtual bool MatchMalwareIP(const std::string& ip_address) = 0;
149 78
150 // Check if the |url| matches any of the full-length hashes from the download 79 // Check if the |url| matches any of the full-length hashes from the download
151 // whitelist. Returns true if there was a match and false otherwise. To make 80 // whitelist. Returns true if there was a match and false otherwise. To make
152 // sure we are conservative we will return true if an error occurs. This 81 // sure we are conservative we will return true if an error occurs. This
153 // method must be called on the IO thread. 82 // method must be called on the IO thread.
154 virtual bool MatchDownloadWhitelistUrl(const GURL& url); 83 virtual bool MatchDownloadWhitelistUrl(const GURL& url) = 0;
155 84
156 // Check if |str| matches any of the full-length hashes from the download 85 // Check if |str| matches any of the full-length hashes from the download
157 // whitelist. Returns true if there was a match and false otherwise. To make 86 // whitelist. Returns true if there was a match and false otherwise. To make
158 // sure we are conservative we will return true if an error occurs. This 87 // sure we are conservative we will return true if an error occurs. This
159 // method must be called on the IO thread. 88 // method must be called on the IO thread.
160 virtual bool MatchDownloadWhitelistString(const std::string& str); 89 virtual bool MatchDownloadWhitelistString(const std::string& str) = 0;
161 90
162 // Check if the |url| matches any of the full-length hashes from the off- 91 // Check if the |url| matches any of the full-length hashes from the off-
163 // domain inclusion whitelist. Returns true if there was a match and false 92 // domain inclusion whitelist. Returns true if there was a match and false
164 // otherwise. To make sure we are conservative, we will return true if an 93 // otherwise. To make sure we are conservative, we will return true if an
165 // error occurs. This method must be called on the IO thread. 94 // error occurs. This method must be called on the IO thread.
166 virtual bool MatchInclusionWhitelistUrl(const GURL& url); 95 virtual bool MatchInclusionWhitelistUrl(const GURL& url) = 0;
167 96
168 // Check if the CSD malware IP matching kill switch is turned on. 97 // Check if the CSD malware IP matching kill switch is turned on.
169 virtual bool IsMalwareKillSwitchOn(); 98 virtual bool IsMalwareKillSwitchOn() = 0;
170 99
171 // Check if the CSD whitelist kill switch is turned on. 100 // Check if the CSD whitelist kill switch is turned on.
172 virtual bool IsCsdWhitelistKillSwitchOn(); 101 virtual bool IsCsdWhitelistKillSwitchOn() = 0;
173 102
174 // Called on the IO thread to cancel a pending check if the result is no 103 // Called on the IO thread to cancel a pending check if the result is no
175 // longer needed. 104 // longer needed. Also called after the result has been handled.
176 void CancelCheck(Client* client); 105 virtual void CancelCheck(Client* client) = 0;
177
178 // Called on the IO thread when the SafeBrowsingProtocolManager has received
179 // the full hash results for prefix hits detected in the database.
180 void HandleGetHashResults(SafeBrowsingCheck* check,
181 const std::vector<SBFullHashResult>& full_hashes,
182 const base::TimeDelta& cache_lifetime);
183 106
184 // Called to initialize objects that are used on the io_thread. This may be 107 // Called to initialize objects that are used on the io_thread. This may be
185 // called multiple times during the life of the DatabaseManager. Must be 108 // called multiple times during the life of the DatabaseManager. Must be
186 // called on IO thread. 109 // called on IO thread.
187 void StartOnIOThread(); 110 virtual void StartOnIOThread() = 0;
188 111
189 // Called to stop or shutdown operations on the io_thread. This may be called 112 // Called to stop or shutdown operations on the io_thread. This may be called
190 // multiple times during the life of the DatabaseManager. Must be called 113 // multiple times during the life of the DatabaseManager. Must be called
191 // on IO thread. If shutdown is true, the manager is disabled permanently. 114 // on IO thread. If shutdown is true, the manager is disabled permanently.
192 void StopOnIOThread(bool shutdown); 115 virtual void StopOnIOThread(bool shutdown) = 0;
193 116
194 protected: 117 protected:
195 ~SafeBrowsingDatabaseManager() override; 118 virtual ~SafeBrowsingDatabaseManager() {}
196 119
197 // protected for tests.
198 void NotifyDatabaseUpdateFinished(bool update_succeeded);
199
200 private:
201 friend class base::RefCountedThreadSafe<SafeBrowsingDatabaseManager>; 120 friend class base::RefCountedThreadSafe<SafeBrowsingDatabaseManager>;
202 friend class SafeBrowsingServerTest; 121 }; // class SafeBrowsingDatabaseManager
203 friend class SafeBrowsingServiceTest;
204 friend class SafeBrowsingServiceTestHelper;
205 friend class SafeBrowsingDatabaseManagerTest;
206 FRIEND_TEST_ALL_PREFIXES(SafeBrowsingDatabaseManagerTest,
207 GetUrlSeverestThreatType);
208 FRIEND_TEST_ALL_PREFIXES(SafeBrowsingDatabaseManagerTest,
209 ServiceStopWithPendingChecks);
210
211 typedef std::set<SafeBrowsingCheck*> CurrentChecks;
212 typedef std::vector<SafeBrowsingCheck*> GetHashRequestors;
213 typedef base::hash_map<SBPrefix, GetHashRequestors> GetHashRequests;
214
215 // Clients that we've queued up for checking later once the database is ready.
216 struct QueuedCheck {
217 QueuedCheck(const safe_browsing_util::ListType check_type,
218 Client* client,
219 const GURL& url,
220 const std::vector<SBThreatType>& expected_threats,
221 const base::TimeTicks& start);
222 ~QueuedCheck();
223 safe_browsing_util::ListType check_type;
224 Client* client;
225 GURL url;
226 std::vector<SBThreatType> expected_threats;
227 base::TimeTicks start; // When check was queued.
228 };
229
230 // Return the threat type of the severest entry in |full_hashes| which matches
231 // |hash|, or SAFE if none match.
232 static SBThreatType GetHashSeverestThreatType(
233 const SBFullHash& hash,
234 const std::vector<SBFullHashResult>& full_hashes);
235
236 // Given a URL, compare all the possible host + path full hashes to the set of
237 // provided full hashes. Returns the threat type of the severest matching
238 // result from |full_hashes|, or SAFE if none match.
239 static SBThreatType GetUrlSeverestThreatType(
240 const GURL& url,
241 const std::vector<SBFullHashResult>& full_hashes,
242 size_t* index);
243
244 // Called to stop operations on the io_thread. This may be called multiple
245 // times during the life of the DatabaseManager. Should be called on IO
246 // thread.
247 void DoStopOnIOThread();
248
249 // Returns whether |database_| exists and is accessible.
250 bool DatabaseAvailable() const;
251
252 // Called on the IO thread. If the database does not exist, queues up a call
253 // on the db thread to create it. Returns whether the database is available.
254 //
255 // Note that this is only needed outside the db thread, since functions on the
256 // db thread can call GetDatabase() directly.
257 bool MakeDatabaseAvailable();
258
259 // Should only be called on db thread as SafeBrowsingDatabase is not
260 // threadsafe.
261 SafeBrowsingDatabase* GetDatabase();
262
263 // Called on the IO thread with the check result.
264 void OnCheckDone(SafeBrowsingCheck* info);
265
266 // Called on the database thread to retrieve chunks.
267 void GetAllChunksFromDatabase(GetChunksCallback callback);
268
269 // Called on the IO thread with the results of all chunks.
270 void OnGetAllChunksFromDatabase(const std::vector<SBListChunkRanges>& lists,
271 bool database_error,
272 GetChunksCallback callback);
273
274 // Called on the IO thread after the database reports that it added a chunk.
275 void OnAddChunksComplete(AddChunksCallback callback);
276
277 // Notification that the database is done loading its bloom filter. We may
278 // have had to queue checks until the database is ready, and if so, this
279 // checks them.
280 void DatabaseLoadComplete();
281
282 // Called on the database thread to add/remove chunks and host keys.
283 void AddDatabaseChunks(const std::string& list,
284 scoped_ptr<ScopedVector<SBChunkData> > chunks,
285 AddChunksCallback callback);
286
287 void DeleteDatabaseChunks(
288 scoped_ptr<std::vector<SBChunkDelete> > chunk_deletes);
289
290 void NotifyClientBlockingComplete(Client* client, bool proceed);
291
292 void DatabaseUpdateFinished(bool update_succeeded);
293
294 // Called on the db thread to close the database. See CloseDatabase().
295 void OnCloseDatabase();
296
297 // Runs on the db thread to reset the database. We assume that resetting the
298 // database is a synchronous operation.
299 void OnResetDatabase();
300
301 // Internal worker function for processing full hashes.
302 void OnHandleGetHashResults(SafeBrowsingCheck* check,
303 const std::vector<SBFullHashResult>& full_hashes);
304
305 // Run one check against |full_hashes|. Returns |true| if the check
306 // finds a match in |full_hashes|.
307 bool HandleOneCheck(SafeBrowsingCheck* check,
308 const std::vector<SBFullHashResult>& full_hashes);
309
310 // Invoked by CheckDownloadUrl. It checks the download URL on
311 // |safe_browsing_task_runner_|.
312 std::vector<SBPrefix> CheckDownloadUrlOnSBThread(
313 const std::vector<SBPrefix>& prefixes);
314
315 // The callback function when a safebrowsing check is timed out. Client will
316 // be notified that the safebrowsing check is SAFE when this happens.
317 void TimeoutCallback(SafeBrowsingCheck* check);
318
319 // Calls the Client's callback on IO thread after CheckDownloadUrl finishes.
320 void OnAsyncCheckDone(SafeBrowsingCheck* check,
321 const std::vector<SBPrefix>& prefix_hits);
322
323 // Checks all extension ID hashes on |safe_browsing_task_runner_|.
324 std::vector<SBPrefix> CheckExtensionIDsOnSBThread(
325 const std::vector<SBPrefix>& prefixes);
326
327 // Helper function that calls safe browsing client and cleans up |checks_|.
328 void SafeBrowsingCheckDone(SafeBrowsingCheck* check);
329
330 // Helper function to set |check| with default values and start a safe
331 // browsing check with timeout of |timeout|. |task| will be called on
332 // success, otherwise TimeoutCallback will be called.
333 void StartSafeBrowsingCheck(
334 SafeBrowsingCheck* check,
335 const base::Callback<std::vector<SBPrefix>(void)>& task);
336
337 // SafeBrowsingProtocolManageDelegate override
338 void ResetDatabase() override;
339 void UpdateStarted() override;
340 void UpdateFinished(bool success) override;
341 void GetChunks(GetChunksCallback callback) override;
342 void AddChunks(const std::string& list,
343 scoped_ptr<ScopedVector<SBChunkData>> chunks,
344 AddChunksCallback callback) override;
345 void DeleteChunks(
346 scoped_ptr<std::vector<SBChunkDelete>> chunk_deletes) override;
347
348 scoped_refptr<SafeBrowsingService> sb_service_;
349
350 CurrentChecks checks_;
351
352 // Used for issuing only one GetHash request for a given prefix.
353 GetHashRequests gethash_requests_;
354
355 // The persistent database. We don't use a scoped_ptr because it
356 // needs to be destroyed on a different thread than this object.
357 SafeBrowsingDatabase* database_;
358
359 // Lock used to prevent possible data races due to compiler optimizations.
360 mutable base::Lock database_lock_;
361
362 // Whether the service is running. 'enabled_' is used by the
363 // SafeBrowsingDatabaseManager on the IO thread during normal operations.
364 bool enabled_;
365
366 // Indicate if download_protection is enabled by command switch
367 // so we allow this feature to be exersized.
368 bool enable_download_protection_;
369
370 // Indicate if client-side phishing detection whitelist should be enabled
371 // or not.
372 bool enable_csd_whitelist_;
373
374 // Indicate if the download whitelist should be enabled or not.
375 bool enable_download_whitelist_;
376
377 // Indicate if the extension blacklist should be enabled.
378 bool enable_extension_blacklist_;
379
380 // Indicate if the csd malware IP blacklist should be enabled.
381 bool enable_ip_blacklist_;
382
383 // Indicate if the unwanted software blacklist should be enabled.
384 bool enable_unwanted_software_blacklist_;
385
386 // The sequenced task runner for running safe browsing database operations.
387 scoped_refptr<base::SequencedTaskRunner> safe_browsing_task_runner_;
388
389 // Indicates if we're currently in an update cycle.
390 bool update_in_progress_;
391
392 // When true, newly fetched chunks may not in the database yet since the
393 // database is still updating.
394 bool database_update_in_progress_;
395
396 // Indicates if we're in the midst of trying to close the database. If this
397 // is true, nothing on the IO thread should access the database.
398 bool closing_database_;
399
400 std::deque<QueuedCheck> queued_checks_;
401
402 // Timeout to use for safe browsing checks.
403 base::TimeDelta check_timeout_;
404
405 DISALLOW_COPY_AND_ASSIGN(SafeBrowsingDatabaseManager);
406 };
407 122
408 #endif // CHROME_BROWSER_SAFE_BROWSING_DATABASE_MANAGER_H_ 123 #endif // CHROME_BROWSER_SAFE_BROWSING_DATABASE_MANAGER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698