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 // This test creates a fake safebrowsing service, where we can inject known- | 5 // This test creates a fake safebrowsing service, where we can inject known- |
| 6 // threat urls. It then uses a real browser to go to these urls, and sends | 6 // threat urls. It then uses a real browser to go to these urls, and sends |
| 7 // "goback" or "proceed" commands and verifies they work. | 7 // "goback" or "proceed" commands and verifies they work. |
| 8 | 8 |
| 9 #include <algorithm> | |
| 10 | |
| 9 #include "base/bind.h" | 11 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 12 #include "base/command_line.h" |
| 11 #include "base/prefs/pref_service.h" | 13 #include "base/prefs/pref_service.h" |
| 12 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/strings/utf_string_conversions.h" | 15 #include "base/strings/utf_string_conversions.h" |
| 14 #include "base/test/histogram_tester.h" | 16 #include "base/test/histogram_tester.h" |
| 15 #include "base/values.h" | 17 #include "base/values.h" |
| 16 #include "chrome/browser/browser_process.h" | 18 #include "chrome/browser/browser_process.h" |
| 17 #include "chrome/browser/interstitials/security_interstitial_page_test_utils.h" | 19 #include "chrome/browser/interstitials/security_interstitial_page_test_utils.h" |
| 18 #include "chrome/browser/net/url_request_mock_util.h" | 20 #include "chrome/browser/net/url_request_mock_util.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 52 using content::InterstitialPage; | 54 using content::InterstitialPage; |
| 53 using content::NavigationController; | 55 using content::NavigationController; |
| 54 using content::WebContents; | 56 using content::WebContents; |
| 55 | 57 |
| 56 namespace safe_browsing { | 58 namespace safe_browsing { |
| 57 | 59 |
| 58 namespace { | 60 namespace { |
| 59 | 61 |
| 60 const char kEmptyPage[] = "empty.html"; | 62 const char kEmptyPage[] = "empty.html"; |
| 61 const char kMalwarePage[] = "safe_browsing/malware.html"; | 63 const char kMalwarePage[] = "safe_browsing/malware.html"; |
| 64 const char kMalwarePage2[] = "safe_browsing/malware2.html"; | |
| 62 const char kMalwareIframe[] = "safe_browsing/malware_iframe.html"; | 65 const char kMalwareIframe[] = "safe_browsing/malware_iframe.html"; |
| 63 const char kUnrelatedUrl[] = "https://www.google.com"; | 66 const char kUnrelatedUrl[] = "https://www.google.com"; |
| 64 | 67 |
| 65 // A SafeBrowsingDatabaseManager class that allows us to inject the malicious | 68 // A SafeBrowsingDatabaseManager class that allows us to inject the malicious |
| 66 // URLs. | 69 // URLs. |
| 67 class FakeSafeBrowsingDatabaseManager : public TestSafeBrowsingDatabaseManager { | 70 class FakeSafeBrowsingDatabaseManager : public TestSafeBrowsingDatabaseManager { |
| 68 public: | 71 public: |
| 69 FakeSafeBrowsingDatabaseManager() {} | 72 FakeSafeBrowsingDatabaseManager() {} |
| 70 | 73 |
| 71 // Called on the IO thread to check if the given url is safe or not. If we | 74 // Called on the IO thread to check if the given url is safe or not. If we |
| (...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 413 | 416 |
| 414 ui_test_utils::NavigateToURL(browser(), url); | 417 ui_test_utils::NavigateToURL(browser(), url); |
| 415 EXPECT_TRUE(WaitForReady()); | 418 EXPECT_TRUE(WaitForReady()); |
| 416 return url; | 419 return url; |
| 417 } | 420 } |
| 418 | 421 |
| 419 // Adds a safebrowsing threat result to the fake safebrowsing service, | 422 // Adds a safebrowsing threat result to the fake safebrowsing service, |
| 420 // navigates to a page with an iframe containing the threat site, and returns | 423 // navigates to a page with an iframe containing the threat site, and returns |
| 421 // the url of the parent page. | 424 // the url of the parent page. |
| 422 GURL SetupThreatIframeWarningAndNavigate() { | 425 GURL SetupThreatIframeWarningAndNavigate() { |
| 423 GURL url = net::URLRequestMockHTTPJob::GetMockUrl(kMalwarePage); | 426 GURL url = net::URLRequestMockHTTPJob::GetMockUrl(kMalwarePage2); |
| 424 GURL iframe_url = net::URLRequestMockHTTPJob::GetMockUrl(kMalwareIframe); | 427 GURL iframe_url = net::URLRequestMockHTTPJob::GetMockUrl(kMalwareIframe); |
| 425 SetURLThreatType(iframe_url, GetParam()); | 428 SetURLThreatType(iframe_url, GetParam()); |
| 426 | 429 |
| 427 ui_test_utils::NavigateToURL(browser(), url); | 430 ui_test_utils::NavigateToURL(browser(), url); |
| 428 EXPECT_TRUE(WaitForReady()); | 431 EXPECT_TRUE(WaitForReady()); |
| 429 return url; | 432 return url; |
| 430 } | 433 } |
| 431 | 434 |
| 432 void SendCommand( | 435 void SendCommand( |
| 433 security_interstitials::SecurityInterstitialCommands command) { | 436 security_interstitials::SecurityInterstitialCommands command) { |
| 434 WebContents* contents = | 437 WebContents* contents = |
| 435 browser()->tab_strip_model()->GetActiveWebContents(); | 438 browser()->tab_strip_model()->GetActiveWebContents(); |
| 436 // We use InterstitialPage::GetInterstitialPage(tab) instead of | 439 // We use InterstitialPage::GetInterstitialPage(tab) instead of |
| 437 // tab->GetInterstitialPage() because the tab doesn't have a pointer | 440 // tab->GetInterstitialPage() because the tab doesn't have a pointer |
| 438 // to its interstital page until it gets a command from the renderer | 441 // to its interstital page until it gets a command from the renderer |
| 439 // that it has indeed displayed it -- and this sometimes happens after | 442 // that it has indeed displayed it -- and this sometimes happens after |
| 440 // NavigateToURL returns. | 443 // NavigateToURL returns. |
| 441 SafeBrowsingBlockingPage* interstitial_page = | 444 SafeBrowsingBlockingPage* interstitial_page = |
| 442 static_cast<SafeBrowsingBlockingPage*>( | 445 static_cast<SafeBrowsingBlockingPage*>( |
| 443 InterstitialPage::GetInterstitialPage(contents)-> | 446 InterstitialPage::GetInterstitialPage(contents)-> |
| 444 GetDelegateForTesting()); | 447 GetDelegateForTesting()); |
| 445 ASSERT_TRUE(interstitial_page); | 448 ASSERT_TRUE(interstitial_page); |
| 446 ASSERT_EQ(SafeBrowsingBlockingPage::kTypeForTesting, | 449 ASSERT_EQ(SafeBrowsingBlockingPage::kTypeForTesting, |
| 447 interstitial_page->GetTypeForTesting()); | 450 interstitial_page->GetTypeForTesting()); |
| 448 interstitial_page->CommandReceived(base::IntToString(command)); | 451 interstitial_page->CommandReceived(base::IntToString(command)); |
| 449 } | 452 } |
| 450 | 453 |
| 451 void DontProceedThroughInterstitial() { | |
| 452 WebContents* contents = | |
| 453 browser()->tab_strip_model()->GetActiveWebContents(); | |
| 454 InterstitialPage* interstitial_page = InterstitialPage::GetInterstitialPage( | |
| 455 contents); | |
| 456 ASSERT_TRUE(interstitial_page); | |
| 457 interstitial_page->DontProceed(); | |
| 458 } | |
| 459 | |
| 460 void ProceedThroughInterstitial() { | |
| 461 WebContents* contents = | |
| 462 browser()->tab_strip_model()->GetActiveWebContents(); | |
| 463 InterstitialPage* interstitial_page = InterstitialPage::GetInterstitialPage( | |
| 464 contents); | |
| 465 ASSERT_TRUE(interstitial_page); | |
| 466 interstitial_page->Proceed(); | |
| 467 } | |
| 468 | |
| 469 void AssertNoInterstitial(bool wait_for_delete) { | 454 void AssertNoInterstitial(bool wait_for_delete) { |
| 470 WebContents* contents = | 455 WebContents* contents = |
| 471 browser()->tab_strip_model()->GetActiveWebContents(); | 456 browser()->tab_strip_model()->GetActiveWebContents(); |
| 472 | 457 |
| 473 if (contents->ShowingInterstitialPage() && wait_for_delete) { | 458 if (contents->ShowingInterstitialPage() && wait_for_delete) { |
| 474 // We'll get notified when the interstitial is deleted. | 459 // We'll get notified when the interstitial is deleted. |
| 475 TestSafeBrowsingBlockingPage* page = | 460 TestSafeBrowsingBlockingPage* page = |
| 476 static_cast<TestSafeBrowsingBlockingPage*>( | 461 static_cast<TestSafeBrowsingBlockingPage*>( |
| 477 contents->GetInterstitialPage()->GetDelegateForTesting()); | 462 contents->GetInterstitialPage()->GetDelegateForTesting()); |
| 478 ASSERT_EQ(SafeBrowsingBlockingPage::kTypeForTesting, | 463 ASSERT_EQ(SafeBrowsingBlockingPage::kTypeForTesting, |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 749 EXPECT_EQ(url, | 734 EXPECT_EQ(url, |
| 750 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); | 735 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); |
| 751 | 736 |
| 752 if (expect_threat_details) { | 737 if (expect_threat_details) { |
| 753 threat_report_sent_runner->Run(); | 738 threat_report_sent_runner->Run(); |
| 754 std::string serialized = GetReportSent(); | 739 std::string serialized = GetReportSent(); |
| 755 ClientSafeBrowsingReportRequest report; | 740 ClientSafeBrowsingReportRequest report; |
| 756 ASSERT_TRUE(report.ParseFromString(serialized)); | 741 ASSERT_TRUE(report.ParseFromString(serialized)); |
| 757 // Verify the report is complete. | 742 // Verify the report is complete. |
| 758 EXPECT_TRUE(report.complete()); | 743 EXPECT_TRUE(report.complete()); |
| 744 // Do some basic verification of report contents. | |
| 745 EXPECT_EQ(url.spec(), report.page_url()); | |
| 746 EXPECT_EQ(net::URLRequestMockHTTPJob::GetMockUrl(kMalwareIframe).spec(), | |
| 747 report.url()); | |
| 748 std::vector<std::string> report_urls; | |
| 749 for (int i = 0; i < report.resources_size(); ++i) | |
| 750 report_urls.push_back(report.resources(i).url()); | |
| 751 ASSERT_EQ(3U, report_urls.size()); | |
| 752 std::sort(report_urls.begin(), report_urls.end()); | |
| 753 EXPECT_EQ("http://example.com/cross_site_iframe.html", report_urls[0]); | |
| 754 EXPECT_EQ(url.spec(), report_urls[1]); | |
| 755 EXPECT_EQ(net::URLRequestMockHTTPJob::GetMockUrl(kMalwareIframe).spec(), | |
| 756 report_urls[2]); | |
| 759 } | 757 } |
| 760 } | 758 } |
| 761 | 759 |
| 760 IN_PROC_BROWSER_TEST_P(SafeBrowsingBlockingPageBrowserTest, | |
| 761 MainFrameBlockedShouldHaveNoDOMDetailsWhenDontProceed) { | |
| 762 const bool expect_threat_details = | |
| 763 SafeBrowsingBlockingPage::ShouldReportThreatDetails(GetParam()); | |
| 764 | |
| 765 scoped_refptr<content::MessageLoopRunner> threat_report_sent_runner( | |
| 766 new content::MessageLoopRunner); | |
| 767 LOG(INFO) << "expect_threat_details: " << expect_threat_details; | |
|
Nathan Parker
2015/12/02 22:05:23
Do you still need this LOG (and below)?
mattm
2015/12/02 23:20:48
nope, just missed these ones. fixed.
| |
| 768 if (expect_threat_details) | |
| 769 SetReportSentCallback(threat_report_sent_runner->QuitClosure()); | |
| 770 | |
| 771 // Navigate to a safe page which contains multiple potential DOM details. | |
| 772 // (Despite the name, kMalwarePage is not the page flagged as malware in this | |
| 773 // test.) | |
| 774 GURL safe_url(net::URLRequestMockHTTPJob::GetMockUrl(kMalwarePage)); | |
| 775 ui_test_utils::NavigateToURL(browser(), safe_url); | |
| 776 | |
| 777 EXPECT_EQ(nullptr, details_factory_.get_details()); | |
| 778 | |
| 779 // Start navigation to bad page (kEmptyPage), which will be blocked before it | |
| 780 // is committed. | |
| 781 GURL url = SetupWarningAndNavigate(); | |
| 782 | |
| 783 FakeThreatDetails* fake_threat_details = details_factory_.get_details(); | |
| 784 EXPECT_EQ(expect_threat_details, fake_threat_details != nullptr); | |
| 785 | |
| 786 // Go back. | |
| 787 EXPECT_EQ(VISIBLE, GetVisibility("extended-reporting-opt-in")); | |
| 788 EXPECT_TRUE(Click("opt-in-checkbox")); | |
| 789 EXPECT_TRUE(ClickAndWaitForDetach("primary-button")); | |
| 790 AssertNoInterstitial(true); // Assert the interstitial is gone | |
| 791 | |
| 792 EXPECT_TRUE(browser()->profile()->GetPrefs()->GetBoolean( | |
| 793 prefs::kSafeBrowsingExtendedReportingEnabled)); | |
| 794 EXPECT_EQ(safe_url, | |
| 795 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); | |
| 796 | |
| 797 if (expect_threat_details) { | |
| 798 threat_report_sent_runner->Run(); | |
| 799 std::string serialized = GetReportSent(); | |
| 800 ClientSafeBrowsingReportRequest report; | |
| 801 ASSERT_TRUE(report.ParseFromString(serialized)); | |
| 802 // Verify the report is complete. | |
| 803 EXPECT_TRUE(report.complete()); | |
| 804 EXPECT_EQ(url.spec(), report.page_url()); | |
| 805 EXPECT_EQ(url.spec(), report.url()); | |
| 806 ASSERT_EQ(1, report.resources_size()); | |
| 807 EXPECT_EQ(url.spec(), report.resources(0).url()); | |
| 808 } | |
| 809 } | |
| 810 | |
| 811 IN_PROC_BROWSER_TEST_P( | |
| 812 SafeBrowsingBlockingPageBrowserTest, | |
| 813 MainFrameBlockedShouldHaveNoDOMDetailsWhenProceeding) { | |
| 814 const bool expect_threat_details = | |
| 815 SafeBrowsingBlockingPage::ShouldReportThreatDetails(GetParam()); | |
| 816 | |
| 817 scoped_refptr<content::MessageLoopRunner> threat_report_sent_runner( | |
| 818 new content::MessageLoopRunner); | |
| 819 LOG(INFO) << "expect_threat_details: " << expect_threat_details; | |
| 820 if (expect_threat_details) | |
| 821 SetReportSentCallback(threat_report_sent_runner->QuitClosure()); | |
| 822 | |
| 823 // Navigate to a safe page which contains multiple potential DOM details. | |
| 824 // (Despite the name, kMalwarePage is not the page flagged as malware in this | |
| 825 // test.) | |
| 826 ui_test_utils::NavigateToURL( | |
| 827 browser(), net::URLRequestMockHTTPJob::GetMockUrl(kMalwarePage)); | |
| 828 | |
| 829 EXPECT_EQ(nullptr, details_factory_.get_details()); | |
| 830 | |
| 831 // Start navigation to bad page (kEmptyPage), which will be blocked before it | |
| 832 // is committed. | |
| 833 GURL url = SetupWarningAndNavigate(); | |
| 834 | |
| 835 FakeThreatDetails* fake_threat_details = details_factory_.get_details(); | |
| 836 EXPECT_EQ(expect_threat_details, fake_threat_details != nullptr); | |
| 837 | |
| 838 // Proceed through the warning. | |
| 839 EXPECT_EQ(VISIBLE, GetVisibility("extended-reporting-opt-in")); | |
| 840 EXPECT_TRUE(Click("opt-in-checkbox")); | |
| 841 EXPECT_TRUE(ClickAndWaitForDetach("proceed-link")); | |
| 842 AssertNoInterstitial(true); // Assert the interstitial is gone | |
| 843 | |
| 844 EXPECT_TRUE(browser()->profile()->GetPrefs()->GetBoolean( | |
| 845 prefs::kSafeBrowsingExtendedReportingEnabled)); | |
| 846 EXPECT_EQ(url, | |
| 847 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); | |
| 848 | |
| 849 if (expect_threat_details) { | |
| 850 threat_report_sent_runner->Run(); | |
| 851 std::string serialized = GetReportSent(); | |
| 852 ClientSafeBrowsingReportRequest report; | |
| 853 ASSERT_TRUE(report.ParseFromString(serialized)); | |
| 854 // Verify the report is complete. | |
| 855 EXPECT_TRUE(report.complete()); | |
| 856 EXPECT_EQ(url.spec(), report.page_url()); | |
| 857 EXPECT_EQ(url.spec(), report.url()); | |
| 858 ASSERT_EQ(1, report.resources_size()); | |
| 859 EXPECT_EQ(url.spec(), report.resources(0).url()); | |
| 860 } | |
| 861 } | |
| 862 | |
| 762 // Verifies that the "proceed anyway" link isn't available when it is disabled | 863 // Verifies that the "proceed anyway" link isn't available when it is disabled |
| 763 // by the corresponding policy. Also verifies that sending the "proceed" | 864 // by the corresponding policy. Also verifies that sending the "proceed" |
| 764 // command anyway doesn't advance to the unsafe site. | 865 // command anyway doesn't advance to the unsafe site. |
| 765 IN_PROC_BROWSER_TEST_P(SafeBrowsingBlockingPageBrowserTest, ProceedDisabled) { | 866 IN_PROC_BROWSER_TEST_P(SafeBrowsingBlockingPageBrowserTest, ProceedDisabled) { |
| 766 #if defined(OS_WIN) && defined(USE_ASH) | 867 #if defined(OS_WIN) && defined(USE_ASH) |
| 767 // Disable this test in Metro+Ash for now (https://crbug.com/262796). | 868 // Disable this test in Metro+Ash for now (https://crbug.com/262796). |
| 768 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 869 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 769 switches::kAshBrowserTests)) { | 870 switches::kAshBrowserTests)) { |
| 770 return; | 871 return; |
| 771 } | 872 } |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1026 EXPECT_TRUE(VerifyIDNDecoded()); | 1127 EXPECT_TRUE(VerifyIDNDecoded()); |
| 1027 } | 1128 } |
| 1028 | 1129 |
| 1029 INSTANTIATE_TEST_CASE_P(SafeBrowsingBlockingPageIDNTestWithThreatType, | 1130 INSTANTIATE_TEST_CASE_P(SafeBrowsingBlockingPageIDNTestWithThreatType, |
| 1030 SafeBrowsingBlockingPageIDNTest, | 1131 SafeBrowsingBlockingPageIDNTest, |
| 1031 testing::Values(SB_THREAT_TYPE_URL_MALWARE, | 1132 testing::Values(SB_THREAT_TYPE_URL_MALWARE, |
| 1032 SB_THREAT_TYPE_URL_PHISHING, | 1133 SB_THREAT_TYPE_URL_PHISHING, |
| 1033 SB_THREAT_TYPE_URL_UNWANTED)); | 1134 SB_THREAT_TYPE_URL_UNWANTED)); |
| 1034 | 1135 |
| 1035 } // namespace safe_browsing | 1136 } // namespace safe_browsing |
| OLD | NEW |