OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 // This file should not be build on Android but is currently getting built. | 5 // This file should not be build on Android but is currently getting built. |
6 // TODO(vakh): Fix that: http://crbug.com/621647 | 6 // TODO(vakh): Fix that: http://crbug.com/621647 |
7 | 7 |
8 #include "components/safe_browsing_db/v4_local_database_manager.h" | 8 #include "components/safe_browsing_db/v4_local_database_manager.h" |
9 | 9 |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/bind_helpers.h" | 12 #include "base/bind_helpers.h" |
13 #include "base/callback.h" | 13 #include "base/callback.h" |
14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
15 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
16 #include "base/metrics/histogram_macros.h" | |
16 #include "components/safe_browsing_db/v4_feature_list.h" | 17 #include "components/safe_browsing_db/v4_feature_list.h" |
17 #include "content/public/browser/browser_thread.h" | 18 #include "content/public/browser/browser_thread.h" |
18 | 19 |
19 using content::BrowserThread; | 20 using content::BrowserThread; |
21 using base::TimeTicks; | |
20 | 22 |
21 namespace safe_browsing { | 23 namespace safe_browsing { |
22 | 24 |
23 namespace { | 25 namespace { |
24 | 26 |
25 const ThreatSeverity kLeastSeverity = | 27 const ThreatSeverity kLeastSeverity = |
26 std::numeric_limits<ThreatSeverity>::max(); | 28 std::numeric_limits<ThreatSeverity>::max(); |
27 | 29 |
28 ListInfos GetListInfos() { | 30 ListInfos GetListInfos() { |
29 // NOTE(vakh): When adding a store here, add the corresponding store-specific | 31 // NOTE(vakh): When adding a store here, add the corresponding store-specific |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
330 } | 332 } |
331 | 333 |
332 bool V4LocalDatabaseManager::GetPrefixMatches( | 334 bool V4LocalDatabaseManager::GetPrefixMatches( |
333 const std::unique_ptr<PendingCheck>& check, | 335 const std::unique_ptr<PendingCheck>& check, |
334 FullHashToStoreAndHashPrefixesMap* full_hash_to_store_and_hash_prefixes) { | 336 FullHashToStoreAndHashPrefixesMap* full_hash_to_store_and_hash_prefixes) { |
335 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 337 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
336 | 338 |
337 DCHECK(enabled_); | 339 DCHECK(enabled_); |
338 DCHECK(v4_database_); | 340 DCHECK(v4_database_); |
339 DCHECK_GT(ClientCallbackType::CHECK_MAX, check->client_callback_type); | 341 DCHECK_GT(ClientCallbackType::CHECK_MAX, check->client_callback_type); |
342 full_hash_to_store_and_hash_prefixes->clear(); | |
340 | 343 |
344 const base::TimeTicks before = TimeTicks::Now(); | |
341 if (check->client_callback_type == ClientCallbackType::CHECK_BROWSE_URL) { | 345 if (check->client_callback_type == ClientCallbackType::CHECK_BROWSE_URL) { |
342 std::unordered_set<FullHash> full_hashes; | 346 std::unordered_set<FullHash> full_hashes; |
343 V4ProtocolManagerUtil::UrlToFullHashes(check->url, &full_hashes); | 347 V4ProtocolManagerUtil::UrlToFullHashes(check->url, &full_hashes); |
344 | 348 |
345 StoreAndHashPrefixes matched_store_and_hash_prefixes; | 349 StoreAndHashPrefixes matched_store_and_hash_prefixes; |
346 for (const auto& full_hash : full_hashes) { | 350 for (const auto& full_hash : full_hashes) { |
347 matched_store_and_hash_prefixes.clear(); | 351 matched_store_and_hash_prefixes.clear(); |
348 v4_database_->GetStoresMatchingFullHash(full_hash, check->stores_to_check, | 352 v4_database_->GetStoresMatchingFullHash(full_hash, check->stores_to_check, |
349 &matched_store_and_hash_prefixes); | 353 &matched_store_and_hash_prefixes); |
350 if (!matched_store_and_hash_prefixes.empty()) { | 354 if (!matched_store_and_hash_prefixes.empty()) { |
351 (*full_hash_to_store_and_hash_prefixes)[full_hash] = | 355 (*full_hash_to_store_and_hash_prefixes)[full_hash] = |
352 matched_store_and_hash_prefixes; | 356 matched_store_and_hash_prefixes; |
353 } | 357 } |
354 } | 358 } |
355 | 359 } else { |
356 // No hash prefixes found in the local database so that resource must be | 360 NOTREACHED() << "Unexpected client_callback_type encountered"; |
357 // safe. | |
358 return !full_hash_to_store_and_hash_prefixes->empty(); | |
359 } | 361 } |
360 | 362 |
361 NOTREACHED() << "Unexpected client_callback_type encountered"; | 363 // TODO(vakh): Consider changing the following histogram name to be |
362 return false; | 364 // SafeBrowsing.V4GetPrefixMatches.Time once PVer3 code is removed. |
365 UMA_HISTOGRAM_TIMES("SB2.FilterCheck", TimeTicks::Now() - before); | |
Nathan Parker
2016/10/21 20:21:19
This is almost always < 1 ms. I think we should l
vakh (use Gerrit instead)
2016/10/21 22:54:04
Done.
| |
366 return !full_hash_to_store_and_hash_prefixes->empty(); | |
363 } | 367 } |
364 | 368 |
365 void V4LocalDatabaseManager::GetSeverestThreatTypeAndMetadata( | 369 void V4LocalDatabaseManager::GetSeverestThreatTypeAndMetadata( |
366 SBThreatType* result_threat_type, | 370 SBThreatType* result_threat_type, |
367 ThreatMetadata* metadata, | 371 ThreatMetadata* metadata, |
368 const std::vector<FullHashInfo>& full_hash_infos) { | 372 const std::vector<FullHashInfo>& full_hash_infos) { |
369 DCHECK(result_threat_type); | 373 DCHECK(result_threat_type); |
370 DCHECK(metadata); | 374 DCHECK(metadata); |
371 | 375 |
372 ThreatSeverity most_severe_yet = kLeastSeverity; | 376 ThreatSeverity most_severe_yet = kLeastSeverity; |
(...skipping 29 matching lines...) Expand all Loading... | |
402 void V4LocalDatabaseManager::OnFullHashResponse( | 406 void V4LocalDatabaseManager::OnFullHashResponse( |
403 std::unique_ptr<PendingCheck> pending_check, | 407 std::unique_ptr<PendingCheck> pending_check, |
404 const std::vector<FullHashInfo>& full_hash_infos) { | 408 const std::vector<FullHashInfo>& full_hash_infos) { |
405 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 409 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
406 | 410 |
407 if (!enabled_) { | 411 if (!enabled_) { |
408 DCHECK(pending_clients_.empty()); | 412 DCHECK(pending_clients_.empty()); |
409 return; | 413 return; |
410 } | 414 } |
411 | 415 |
416 // TODO(vakh): Consider changing the following histogram name to be | |
417 // SafeBrowsing.V4GetFullHashOverNetwork.Time once PVer3 code is removed. | |
Nathan Parker
2016/10/21 20:21:19
an aside: There is a SafeBrowsing.GetV4HashResult.
vakh (use Gerrit instead)
2016/10/21 22:54:04
Yes, I need to correct the metrics in that file. O
| |
418 UMA_HISTOGRAM_LONG_TIMES("SB2.Network", | |
419 TimeTicks::Now() - pending_check->start); | |
412 auto it = pending_clients_.find(pending_check->client); | 420 auto it = pending_clients_.find(pending_check->client); |
413 if (it == pending_clients_.end()) { | 421 if (it == pending_clients_.end()) { |
414 // The check has since been cancelled. | 422 // The check has since been cancelled. |
415 return; | 423 return; |
416 } | 424 } |
417 | 425 |
418 // Find out the most severe threat, if any, to report to the client. | 426 // Find out the most severe threat, if any, to report to the client. |
419 GetSeverestThreatTypeAndMetadata(&pending_check->result_threat_type, | 427 GetSeverestThreatTypeAndMetadata(&pending_check->result_threat_type, |
420 &pending_check->url_metadata, | 428 &pending_check->url_metadata, |
421 full_hash_infos); | 429 full_hash_infos); |
422 pending_clients_.erase(it); | 430 pending_clients_.erase(it); |
423 RespondToClient(std::move(pending_check)); | 431 RespondToClient(std::move(pending_check)); |
424 } | 432 } |
425 | 433 |
426 void V4LocalDatabaseManager::PerformFullHashCheck( | 434 void V4LocalDatabaseManager::PerformFullHashCheck( |
427 std::unique_ptr<PendingCheck> check, | 435 std::unique_ptr<PendingCheck> check, |
428 const FullHashToStoreAndHashPrefixesMap& | 436 const FullHashToStoreAndHashPrefixesMap& |
429 full_hash_to_store_and_hash_prefixes) { | 437 full_hash_to_store_and_hash_prefixes) { |
430 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 438 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
431 | 439 |
432 DCHECK(enabled_); | 440 DCHECK(enabled_); |
433 DCHECK(!full_hash_to_store_and_hash_prefixes.empty()); | 441 DCHECK(!full_hash_to_store_and_hash_prefixes.empty()); |
434 | 442 |
435 pending_clients_.insert(check->client); | 443 pending_clients_.insert(check->client); |
436 | 444 |
445 // Set the start time for the network request. | |
446 check->start = TimeTicks::Now(); | |
447 | |
437 v4_get_hash_protocol_manager_->GetFullHashes( | 448 v4_get_hash_protocol_manager_->GetFullHashes( |
438 full_hash_to_store_and_hash_prefixes, | 449 full_hash_to_store_and_hash_prefixes, |
439 base::Bind(&V4LocalDatabaseManager::OnFullHashResponse, | 450 base::Bind(&V4LocalDatabaseManager::OnFullHashResponse, |
440 weak_factory_.GetWeakPtr(), base::Passed(std::move(check)))); | 451 weak_factory_.GetWeakPtr(), base::Passed(std::move(check)))); |
441 } | 452 } |
442 | 453 |
443 void V4LocalDatabaseManager::ProcessQueuedChecks() { | 454 void V4LocalDatabaseManager::ProcessQueuedChecks() { |
444 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 455 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
445 for (auto& it : queued_checks_) { | 456 for (auto& it : queued_checks_) { |
446 FullHashToStoreAndHashPrefixesMap full_hash_to_store_and_hash_prefixes; | 457 FullHashToStoreAndHashPrefixesMap full_hash_to_store_and_hash_prefixes; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
508 } | 519 } |
509 | 520 |
510 void V4LocalDatabaseManager::UpdateRequestCompleted( | 521 void V4LocalDatabaseManager::UpdateRequestCompleted( |
511 std::unique_ptr<ParsedServerResponse> parsed_server_response) { | 522 std::unique_ptr<ParsedServerResponse> parsed_server_response) { |
512 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 523 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
513 v4_database_->ApplyUpdate(std::move(parsed_server_response), | 524 v4_database_->ApplyUpdate(std::move(parsed_server_response), |
514 db_updated_callback_); | 525 db_updated_callback_); |
515 } | 526 } |
516 | 527 |
517 } // namespace safe_browsing | 528 } // namespace safe_browsing |
OLD | NEW |