| 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 <utility> | 5 #include <utility> |
| 6 | 6 |
| 7 #include "base/base64.h" |
| 7 #include "base/base_switches.h" | 8 #include "base/base_switches.h" |
| 8 #include "base/bind.h" | 9 #include "base/bind.h" |
| 9 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| 10 #include "base/callback.h" | 11 #include "base/callback.h" |
| 11 #include "base/command_line.h" | 12 #include "base/command_line.h" |
| 12 #include "base/location.h" | 13 #include "base/location.h" |
| 13 #include "base/macros.h" | 14 #include "base/macros.h" |
| 14 #include "base/message_loop/message_loop.h" | 15 #include "base/message_loop/message_loop.h" |
| 15 #include "base/metrics/field_trial.h" | 16 #include "base/metrics/field_trial.h" |
| 16 #include "base/single_thread_task_runner.h" | 17 #include "base/single_thread_task_runner.h" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 47 #include "chrome/browser/ui/browser_commands.h" | 48 #include "chrome/browser/ui/browser_commands.h" |
| 48 #include "chrome/browser/ui/browser_finder.h" | 49 #include "chrome/browser/ui/browser_finder.h" |
| 49 #include "chrome/browser/ui/browser_navigator.h" | 50 #include "chrome/browser/ui/browser_navigator.h" |
| 50 #include "chrome/browser/ui/browser_navigator_params.h" | 51 #include "chrome/browser/ui/browser_navigator_params.h" |
| 51 #include "chrome/browser/ui/browser_tabstrip.h" | 52 #include "chrome/browser/ui/browser_tabstrip.h" |
| 52 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 53 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 53 #include "chrome/common/chrome_paths.h" | 54 #include "chrome/common/chrome_paths.h" |
| 54 #include "chrome/common/chrome_switches.h" | 55 #include "chrome/common/chrome_switches.h" |
| 55 #include "chrome/common/pref_names.h" | 56 #include "chrome/common/pref_names.h" |
| 56 #include "chrome/test/base/in_process_browser_test.h" | 57 #include "chrome/test/base/in_process_browser_test.h" |
| 58 #include "chrome/test/base/test_launcher_utils.h" |
| 57 #include "chrome/test/base/ui_test_utils.h" | 59 #include "chrome/test/base/ui_test_utils.h" |
| 58 #include "components/content_settings/core/browser/host_content_settings_map.h" | 60 #include "components/content_settings/core/browser/host_content_settings_map.h" |
| 59 #include "components/network_time/network_time_test_utils.h" | 61 #include "components/network_time/network_time_test_utils.h" |
| 60 #include "components/network_time/network_time_tracker.h" | 62 #include "components/network_time/network_time_tracker.h" |
| 61 #include "components/prefs/testing_pref_service.h" | 63 #include "components/prefs/testing_pref_service.h" |
| 62 #include "components/security_interstitials/core/controller_client.h" | 64 #include "components/security_interstitials/core/controller_client.h" |
| 63 #include "components/security_interstitials/core/metrics_helper.h" | 65 #include "components/security_interstitials/core/metrics_helper.h" |
| 64 #include "components/security_state/core/security_state.h" | 66 #include "components/security_state/core/security_state.h" |
| 65 #include "components/security_state/core/switches.h" | 67 #include "components/security_state/core/switches.h" |
| 66 #include "components/ssl_errors/error_classification.h" | 68 #include "components/ssl_errors/error_classification.h" |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 } // namespace | 313 } // namespace |
| 312 | 314 |
| 313 class SSLUITest : public InProcessBrowserTest { | 315 class SSLUITest : public InProcessBrowserTest { |
| 314 public: | 316 public: |
| 315 SSLUITest() | 317 SSLUITest() |
| 316 : https_server_(net::EmbeddedTestServer::TYPE_HTTPS), | 318 : https_server_(net::EmbeddedTestServer::TYPE_HTTPS), |
| 317 https_server_expired_(net::EmbeddedTestServer::TYPE_HTTPS), | 319 https_server_expired_(net::EmbeddedTestServer::TYPE_HTTPS), |
| 318 https_server_mismatched_(net::EmbeddedTestServer::TYPE_HTTPS), | 320 https_server_mismatched_(net::EmbeddedTestServer::TYPE_HTTPS), |
| 319 wss_server_expired_(net::SpawnedTestServer::TYPE_WSS, | 321 wss_server_expired_(net::SpawnedTestServer::TYPE_WSS, |
| 320 SSLOptions(SSLOptions::CERT_EXPIRED), | 322 SSLOptions(SSLOptions::CERT_EXPIRED), |
| 321 net::GetWebSocketTestDataDirectory()) { | 323 net::GetWebSocketTestDataDirectory()), |
| 324 wss_server_mismatched_(net::SpawnedTestServer::TYPE_WSS, |
| 325 SSLOptions(SSLOptions::CERT_MISMATCHED_NAME), |
| 326 net::GetWebSocketTestDataDirectory()) { |
| 322 https_server_.AddDefaultHandlers(base::FilePath(kDocRoot)); | 327 https_server_.AddDefaultHandlers(base::FilePath(kDocRoot)); |
| 323 | 328 |
| 324 https_server_expired_.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED); | 329 https_server_expired_.SetSSLConfig(net::EmbeddedTestServer::CERT_EXPIRED); |
| 325 https_server_expired_.AddDefaultHandlers(base::FilePath(kDocRoot)); | 330 https_server_expired_.AddDefaultHandlers(base::FilePath(kDocRoot)); |
| 326 | 331 |
| 327 https_server_mismatched_.SetSSLConfig( | 332 https_server_mismatched_.SetSSLConfig( |
| 328 net::EmbeddedTestServer::CERT_MISMATCHED_NAME); | 333 net::EmbeddedTestServer::CERT_MISMATCHED_NAME); |
| 329 https_server_mismatched_.AddDefaultHandlers(base::FilePath(kDocRoot)); | 334 https_server_mismatched_.AddDefaultHandlers(base::FilePath(kDocRoot)); |
| 330 | 335 |
| 331 // Sometimes favicons load before tests check the authentication | 336 // Sometimes favicons load before tests check the authentication |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 625 } else { | 630 } else { |
| 626 base::RunLoop().RunUntilIdle(); | 631 base::RunLoop().RunUntilIdle(); |
| 627 EXPECT_EQ(std::string(), reporter_callback.GetLatestHostnameReported()); | 632 EXPECT_EQ(std::string(), reporter_callback.GetLatestHostnameReported()); |
| 628 } | 633 } |
| 629 } | 634 } |
| 630 | 635 |
| 631 net::EmbeddedTestServer https_server_; | 636 net::EmbeddedTestServer https_server_; |
| 632 net::EmbeddedTestServer https_server_expired_; | 637 net::EmbeddedTestServer https_server_expired_; |
| 633 net::EmbeddedTestServer https_server_mismatched_; | 638 net::EmbeddedTestServer https_server_mismatched_; |
| 634 net::SpawnedTestServer wss_server_expired_; | 639 net::SpawnedTestServer wss_server_expired_; |
| 640 net::SpawnedTestServer wss_server_mismatched_; |
| 635 | 641 |
| 636 protected: | 642 protected: |
| 637 // Navigates to an interstitial and clicks through the certificate | 643 // Navigates to an interstitial and clicks through the certificate |
| 638 // error; then navigates to a page at |path| that loads unsafe content. | 644 // error; then navigates to a page at |path| that loads unsafe content. |
| 639 void SetUpUnsafeContentsWithUserException(const std::string& path) { | 645 void SetUpUnsafeContentsWithUserException(const std::string& path) { |
| 640 ASSERT_TRUE(https_server_.Start()); | 646 ASSERT_TRUE(https_server_.Start()); |
| 641 // Note that it is necessary to user https_server_mismatched_ here over the | 647 // Note that it is necessary to user https_server_mismatched_ here over the |
| 642 // other invalid cert servers. This is because the test relies on the two | 648 // other invalid cert servers. This is because the test relies on the two |
| 643 // servers having different hosts since SSL exceptions are per-host, not per | 649 // servers having different hosts since SSL exceptions are per-host, not per |
| 644 // origin, and https_server_mismatched_ uses 'localhost' rather than | 650 // origin, and https_server_mismatched_ uses 'localhost' rather than |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 683 class SSLUITestIgnoreCertErrors : public SSLUITest { | 689 class SSLUITestIgnoreCertErrors : public SSLUITest { |
| 684 public: | 690 public: |
| 685 SSLUITestIgnoreCertErrors() : SSLUITest() {} | 691 SSLUITestIgnoreCertErrors() : SSLUITest() {} |
| 686 | 692 |
| 687 void SetUpCommandLine(base::CommandLine* command_line) override { | 693 void SetUpCommandLine(base::CommandLine* command_line) override { |
| 688 // Browser will ignore certificate errors. | 694 // Browser will ignore certificate errors. |
| 689 command_line->AppendSwitch(switches::kIgnoreCertificateErrors); | 695 command_line->AppendSwitch(switches::kIgnoreCertificateErrors); |
| 690 } | 696 } |
| 691 }; | 697 }; |
| 692 | 698 |
| 699 static std::string MakeCertSPKIFingerprint(net::X509Certificate* cert) { |
| 700 net::HashValue hash = GetSPKIHash(cert); |
| 701 std::string hash_base64; |
| 702 base::Base64Encode( |
| 703 base::StringPiece(reinterpret_cast<const char*>(hash.data()), |
| 704 hash.size()), |
| 705 &hash_base64); |
| 706 return hash_base64; |
| 707 } |
| 708 |
| 709 class SSLUITestIgnoreCertErrorsBySPKIHTTPS : public SSLUITest { |
| 710 protected: |
| 711 void SetUpCommandLine(base::CommandLine* command_line) override { |
| 712 std::string whitelist_flag = MakeCertSPKIFingerprint( |
| 713 https_server_mismatched_.GetCertificate().get()); |
| 714 // Browser will ignore certificate errors for chains matching one of the |
| 715 // public keys from the list. |
| 716 command_line->AppendSwitchASCII(switches::kIgnoreCertificateErrorsSPKIList, |
| 717 whitelist_flag); |
| 718 } |
| 719 }; |
| 720 |
| 721 class SSLUITestIgnoreCertErrorsBySPKIWSS : public SSLUITest { |
| 722 public: |
| 723 SSLUITestIgnoreCertErrorsBySPKIWSS() : SSLUITest() {} |
| 724 |
| 725 void SetUpCommandLine(base::CommandLine* command_line) override { |
| 726 std::string whitelist_flag = |
| 727 MakeCertSPKIFingerprint(wss_server_expired_.GetCertificate().get()); |
| 728 // Browser will ignore certificate errors for chains matching one of the |
| 729 // public keys from the list. |
| 730 command_line->AppendSwitchASCII(switches::kIgnoreCertificateErrorsSPKIList, |
| 731 whitelist_flag); |
| 732 } |
| 733 }; |
| 734 |
| 693 class SSLUITestIgnoreLocalhostCertErrors : public SSLUITest { | 735 class SSLUITestIgnoreLocalhostCertErrors : public SSLUITest { |
| 694 public: | 736 public: |
| 695 SSLUITestIgnoreLocalhostCertErrors() : SSLUITest() {} | 737 SSLUITestIgnoreLocalhostCertErrors() : SSLUITest() {} |
| 696 | 738 |
| 697 void SetUpCommandLine(base::CommandLine* command_line) override { | 739 void SetUpCommandLine(base::CommandLine* command_line) override { |
| 698 // Browser will ignore certificate errors on localhost. | 740 // Browser will ignore certificate errors on localhost. |
| 699 command_line->AppendSwitch(switches::kAllowInsecureLocalhost); | 741 command_line->AppendSwitch(switches::kAllowInsecureLocalhost); |
| 700 } | 742 } |
| 701 }; | 743 }; |
| 702 | 744 |
| (...skipping 1955 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2658 .ReplaceComponents(replacements)); | 2700 .ReplaceComponents(replacements)); |
| 2659 | 2701 |
| 2660 // We shouldn't have an interstitial page showing here. | 2702 // We shouldn't have an interstitial page showing here. |
| 2661 | 2703 |
| 2662 // Test page run a WebSocket wss connection test. The result will be shown | 2704 // Test page run a WebSocket wss connection test. The result will be shown |
| 2663 // as page title. | 2705 // as page title. |
| 2664 const base::string16 result = watcher.WaitAndGetTitle(); | 2706 const base::string16 result = watcher.WaitAndGetTitle(); |
| 2665 EXPECT_TRUE(base::LowerCaseEqualsASCII(result, "pass")); | 2707 EXPECT_TRUE(base::LowerCaseEqualsASCII(result, "pass")); |
| 2666 } | 2708 } |
| 2667 | 2709 |
| 2710 // Visit a page and establish a WebSocket connection over bad https with |
| 2711 // --ignore-certificate-errors-spki-list. The connection should be established |
| 2712 // without interstitial page showing. |
| 2713 #if !defined(OS_CHROMEOS) // Chrome OS does not support the flag. |
| 2714 IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrorsBySPKIWSS, TestWSSExpired) { |
| 2715 ASSERT_TRUE(wss_server_expired_.Start()); |
| 2716 |
| 2717 // Setup page title observer. |
| 2718 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); |
| 2719 content::TitleWatcher watcher(tab, ASCIIToUTF16("PASS")); |
| 2720 watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL")); |
| 2721 |
| 2722 // Visit bad HTTPS page. |
| 2723 GURL::Replacements replacements; |
| 2724 replacements.SetSchemeStr("https"); |
| 2725 ui_test_utils::NavigateToURL(browser(), |
| 2726 wss_server_expired_.GetURL("connect_check.html") |
| 2727 .ReplaceComponents(replacements)); |
| 2728 |
| 2729 // We shouldn't have an interstitial page showing here. |
| 2730 |
| 2731 // Test page run a WebSocket wss connection test. The result will be shown |
| 2732 // as page title. |
| 2733 const base::string16 result = watcher.WaitAndGetTitle(); |
| 2734 EXPECT_TRUE(base::LowerCaseEqualsASCII(result, "pass")); |
| 2735 } |
| 2736 #endif // !defined(OS_CHROMEOS) |
| 2737 |
| 2738 // Test that HTTPS pages with a bad certificate don't show an interstitial if |
| 2739 // the public key matches a value from --ignore-certificate-errors-spki-list. |
| 2740 #if !defined(OS_CHROMEOS) // Chrome OS does not support the flag. |
| 2741 IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrorsBySPKIHTTPS, TestHTTPS) { |
| 2742 ASSERT_TRUE(https_server_mismatched_.Start()); |
| 2743 |
| 2744 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); |
| 2745 |
| 2746 ui_test_utils::NavigateToURL( |
| 2747 browser(), |
| 2748 https_server_mismatched_.GetURL("/ssl/page_with_subresource.html")); |
| 2749 |
| 2750 // We should see no interstitial. The script tag in the page should have |
| 2751 // loaded and ran (and wasn't blocked by the certificate error). |
| 2752 CheckAuthenticatedState(tab, AuthState::NONE); |
| 2753 base::string16 title; |
| 2754 ui_test_utils::GetCurrentTabTitle(browser(), &title); |
| 2755 EXPECT_EQ(title, base::ASCIIToUTF16("This script has loaded")); |
| 2756 } |
| 2757 #endif // !defined(OS_CHROMEOS) |
| 2758 |
| 2759 // Test subresources from an origin with a bad certificate are loaded if the |
| 2760 // public key matches a value from --ignore-certificate-errors-spki-list. |
| 2761 #if !defined(OS_CHROMEOS) // Chrome OS does not support the flag. |
| 2762 IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrorsBySPKIHTTPS, |
| 2763 TestInsecureSubresource) { |
| 2764 ASSERT_TRUE(https_server_.Start()); |
| 2765 ASSERT_TRUE(https_server_mismatched_.Start()); |
| 2766 |
| 2767 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); |
| 2768 |
| 2769 std::string replacement_path; |
| 2770 GetFilePathWithHostAndPortReplacement( |
| 2771 "/ssl/page_with_unsafe_image.html", |
| 2772 https_server_mismatched_.host_port_pair(), &replacement_path); |
| 2773 ui_test_utils::NavigateToURL(browser(), |
| 2774 https_server_.GetURL(replacement_path)); |
| 2775 |
| 2776 // We should see no interstitial. |
| 2777 CheckAuthenticatedState(tab, AuthState::NONE); |
| 2778 // In order to check that the image was loaded, check its width. |
| 2779 // The actual image (Google logo) is 276 pixels wide. |
| 2780 int img_width = 0; |
| 2781 EXPECT_TRUE(content::ExecuteScriptAndExtractInt( |
| 2782 tab, "window.domAutomationController.send(ImageWidth());", &img_width)); |
| 2783 EXPECT_GT(img_width, 200); |
| 2784 } |
| 2785 #endif // !defined(OS_CHROMEOS) |
| 2786 |
| 2668 // Verifies that the interstitial can proceed, even if JavaScript is disabled. | 2787 // Verifies that the interstitial can proceed, even if JavaScript is disabled. |
| 2669 // http://crbug.com/322948 | 2788 // http://crbug.com/322948 |
| 2670 #if defined(OS_LINUX) | 2789 #if defined(OS_LINUX) |
| 2671 // flaky http://crbug.com/396458 | 2790 // flaky http://crbug.com/396458 |
| 2672 #define MAYBE_TestInterstitialJavaScriptProceeds \ | 2791 #define MAYBE_TestInterstitialJavaScriptProceeds \ |
| 2673 DISABLED_TestInterstitialJavaScriptProceeds | 2792 DISABLED_TestInterstitialJavaScriptProceeds |
| 2674 #else | 2793 #else |
| 2675 #define MAYBE_TestInterstitialJavaScriptProceeds \ | 2794 #define MAYBE_TestInterstitialJavaScriptProceeds \ |
| 2676 TestInterstitialJavaScriptProceeds | 2795 TestInterstitialJavaScriptProceeds |
| 2677 #endif | 2796 #endif |
| (...skipping 1730 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4408 | 4527 |
| 4409 // Visit a page over https that contains a frame with a redirect. | 4528 // Visit a page over https that contains a frame with a redirect. |
| 4410 | 4529 |
| 4411 // XMLHttpRequest insecure content in synchronous mode. | 4530 // XMLHttpRequest insecure content in synchronous mode. |
| 4412 | 4531 |
| 4413 // XMLHttpRequest insecure content in asynchronous mode. | 4532 // XMLHttpRequest insecure content in asynchronous mode. |
| 4414 | 4533 |
| 4415 // XMLHttpRequest over bad ssl in synchronous mode. | 4534 // XMLHttpRequest over bad ssl in synchronous mode. |
| 4416 | 4535 |
| 4417 // XMLHttpRequest over OK ssl in synchronous mode. | 4536 // XMLHttpRequest over OK ssl in synchronous mode. |
| OLD | NEW |