Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 #include "chrome/browser/safe_browsing/client_side_detection_host.h" | 5 #include "chrome/browser/safe_browsing/client_side_detection_host.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 38 using content::NavigationEntry; | 38 using content::NavigationEntry; |
| 39 using content::ResourceRequestDetails; | 39 using content::ResourceRequestDetails; |
| 40 using content::ResourceType; | 40 using content::ResourceType; |
| 41 using content::WebContents; | 41 using content::WebContents; |
| 42 | 42 |
| 43 namespace safe_browsing { | 43 namespace safe_browsing { |
| 44 | 44 |
| 45 const size_t ClientSideDetectionHost::kMaxUrlsPerIP = 20; | 45 const size_t ClientSideDetectionHost::kMaxUrlsPerIP = 20; |
| 46 const size_t ClientSideDetectionHost::kMaxIPsPerBrowse = 200; | 46 const size_t ClientSideDetectionHost::kMaxIPsPerBrowse = 200; |
| 47 | 47 |
| 48 const char kSafeBrowsingMatchKey[] = "safe_browsing_match"; | |
| 49 | |
| 50 typedef base::Callback<void(bool)> ShouldClassifyUrlCallback; | 48 typedef base::Callback<void(bool)> ShouldClassifyUrlCallback; |
| 51 | 49 |
| 52 // This class is instantiated each time a new toplevel URL loads, and | 50 // This class is instantiated each time a new toplevel URL loads, and |
| 53 // asynchronously checks whether the malware and phishing classifiers should run | 51 // asynchronously checks whether the malware and phishing classifiers should run |
| 54 // for this URL. If so, it notifies the host class by calling the provided | 52 // for this URL. If so, it notifies the host class by calling the provided |
| 55 // callback form the UI thread. Objects of this class are ref-counted and will | 53 // callback form the UI thread. Objects of this class are ref-counted and will |
| 56 // be destroyed once nobody uses it anymore. If |web_contents|, |csd_service| | 54 // be destroyed once nobody uses it anymore. If |web_contents|, |csd_service| |
| 57 // or |host| go away you need to call Cancel(). We keep the |database_manager| | 55 // or |host| go away you need to call Cancel(). We keep the |database_manager| |
| 58 // alive in a ref pointer for as long as it takes. | 56 // alive in a ref pointer for as long as it takes. |
| 59 class ClientSideDetectionHost::ShouldClassifyUrlRequest | 57 class ClientSideDetectionHost::ShouldClassifyUrlRequest |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 425 // Store the unique page ID for later. | 423 // Store the unique page ID for later. |
| 426 unsafe_unique_page_id_ = | 424 unsafe_unique_page_id_ = |
| 427 web_contents()->GetController().GetActiveEntry()->GetUniqueID(); | 425 web_contents()->GetController().GetActiveEntry()->GetUniqueID(); |
| 428 | 426 |
| 429 // We also keep the resource around in order to be able to send the | 427 // We also keep the resource around in order to be able to send the |
| 430 // malicious URL to the server. | 428 // malicious URL to the server. |
| 431 unsafe_resource_.reset(new SafeBrowsingUIManager::UnsafeResource(resource)); | 429 unsafe_resource_.reset(new SafeBrowsingUIManager::UnsafeResource(resource)); |
| 432 unsafe_resource_->callback.Reset(); // Don't do anything stupid. | 430 unsafe_resource_->callback.Reset(); // Don't do anything stupid. |
| 433 } | 431 } |
| 434 | 432 |
| 435 void ClientSideDetectionHost::OnSafeBrowsingMatch( | 433 void ClientSideDetectionHost::OnSafeBrowsingMatch( |
|
Nathan Parker
2015/12/03 17:21:20
Can this method be removed altogether (from the ob
mattm
2015/12/03 20:38:36
Yeah, it could be. I'll do that in a separate CL s
| |
| 436 const SafeBrowsingUIManager::UnsafeResource& resource) { | 434 const SafeBrowsingUIManager::UnsafeResource& resource) {} |
| 437 if (!web_contents() || !web_contents()->GetController().GetActiveEntry()) | |
| 438 return; | |
| 439 | |
| 440 // Check that this notification is really for us. | |
| 441 content::RenderViewHost* hit_rvh = content::RenderViewHost::FromID( | |
| 442 resource.render_process_host_id, resource.render_view_id); | |
| 443 if (!hit_rvh || | |
| 444 web_contents() != content::WebContents::FromRenderViewHost(hit_rvh)) | |
| 445 return; | |
| 446 | |
| 447 web_contents()->GetController().GetActiveEntry()->SetExtraData( | |
| 448 kSafeBrowsingMatchKey, base::ASCIIToUTF16("1")); | |
| 449 } | |
| 450 | 435 |
| 451 scoped_refptr<SafeBrowsingDatabaseManager> | 436 scoped_refptr<SafeBrowsingDatabaseManager> |
| 452 ClientSideDetectionHost::database_manager() { | 437 ClientSideDetectionHost::database_manager() { |
| 453 return database_manager_; | 438 return database_manager_; |
| 454 } | 439 } |
| 455 | 440 |
| 456 bool ClientSideDetectionHost::DidPageReceiveSafeBrowsingMatch() const { | |
| 457 if (!web_contents() || !web_contents()->GetController().GetVisibleEntry()) | |
| 458 return false; | |
| 459 | |
| 460 // If an interstitial page is showing, GetVisibleEntry will return the | |
| 461 // transient NavigationEntry for the interstitial. The transient entry | |
| 462 // will not have the flag set, so use the pending entry instead if there | |
| 463 // is one. | |
| 464 NavigationEntry* entry = web_contents()->GetController().GetPendingEntry(); | |
| 465 if (!entry) { | |
| 466 entry = web_contents()->GetController().GetVisibleEntry(); | |
| 467 if (entry->GetPageType() == content::PAGE_TYPE_INTERSTITIAL) | |
| 468 entry = web_contents()->GetController().GetLastCommittedEntry(); | |
| 469 if (!entry) | |
| 470 return false; | |
| 471 } | |
| 472 | |
| 473 base::string16 value; | |
| 474 return entry->GetExtraData(kSafeBrowsingMatchKey, &value); | |
| 475 } | |
| 476 | |
| 477 void ClientSideDetectionHost::WebContentsDestroyed() { | 441 void ClientSideDetectionHost::WebContentsDestroyed() { |
| 478 // Tell any pending classification request that it is being canceled. | 442 // Tell any pending classification request that it is being canceled. |
| 479 if (classification_request_.get()) { | 443 if (classification_request_.get()) { |
| 480 classification_request_->Cancel(); | 444 classification_request_->Cancel(); |
| 481 } | 445 } |
| 482 // Cancel all pending feature extractions. | 446 // Cancel all pending feature extractions. |
| 483 feature_extractor_.reset(); | 447 feature_extractor_.reset(); |
| 484 } | 448 } |
| 485 | 449 |
| 486 void ClientSideDetectionHost::OnPhishingPreClassificationDone( | 450 void ClientSideDetectionHost::OnPhishingPreClassificationDone( |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 729 ui_manager_->RemoveObserver(this); | 693 ui_manager_->RemoveObserver(this); |
| 730 | 694 |
| 731 ui_manager_ = ui_manager; | 695 ui_manager_ = ui_manager; |
| 732 if (ui_manager) | 696 if (ui_manager) |
| 733 ui_manager_->AddObserver(this); | 697 ui_manager_->AddObserver(this); |
| 734 | 698 |
| 735 database_manager_ = database_manager; | 699 database_manager_ = database_manager; |
| 736 } | 700 } |
| 737 | 701 |
| 738 } // namespace safe_browsing | 702 } // namespace safe_browsing |
| OLD | NEW |