| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/ssl/ssl_error_handler.h" | 5 #include "chrome/browser/ssl/ssl_error_handler.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/macros.h" | 8 #include "base/macros.h" |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/metrics/field_trial.h" | 10 #include "base/metrics/field_trial.h" |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 bool captive_portal_interstitial_shown_; | 184 bool captive_portal_interstitial_shown_; |
| 185 bool redirected_to_suggested_url_; | 185 bool redirected_to_suggested_url_; |
| 186 bool is_overridable_error_; | 186 bool is_overridable_error_; |
| 187 CommonNameMismatchHandler::CheckUrlCallback suggested_url_callback_; | 187 CommonNameMismatchHandler::CheckUrlCallback suggested_url_callback_; |
| 188 | 188 |
| 189 DISALLOW_COPY_AND_ASSIGN(TestSSLErrorHandlerDelegate); | 189 DISALLOW_COPY_AND_ASSIGN(TestSSLErrorHandlerDelegate); |
| 190 }; | 190 }; |
| 191 | 191 |
| 192 } // namespace | 192 } // namespace |
| 193 | 193 |
| 194 template <net::CertStatus cert_status> | 194 // A class to test name mismatch errors. Creates an error handler with a name |
| 195 class SSLErrorHandlerCertStatusTestBase | 195 // mismatch error. |
| 196 : public ChromeRenderViewHostTestHarness { | 196 class SSLErrorHandlerNameMismatchTest : public ChromeRenderViewHostTestHarness { |
| 197 public: | 197 public: |
| 198 SSLErrorHandlerCertStatusTestBase() : field_trial_list_(nullptr) {} | 198 SSLErrorHandlerNameMismatchTest() : field_trial_list_(nullptr) {} |
| 199 | 199 |
| 200 void SetUp() override { | 200 void SetUp() override { |
| 201 ChromeRenderViewHostTestHarness::SetUp(); | 201 ChromeRenderViewHostTestHarness::SetUp(); |
| 202 SSLErrorHandler::ResetConfigForTesting(); | 202 SSLErrorHandler::ResetConfigForTesting(); |
| 203 SSLErrorHandler::SetInterstitialDelayForTesting(base::TimeDelta()); | 203 SSLErrorHandler::SetInterstitialDelayForTesting(base::TimeDelta()); |
| 204 ssl_info_.cert = | 204 ssl_info_.cert = |
| 205 net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem"); | 205 net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem"); |
| 206 ssl_info_.cert_status = cert_status; | 206 ssl_info_.cert_status = net::CERT_STATUS_COMMON_NAME_INVALID; |
| 207 ssl_info_.public_key_hashes.push_back( | 207 ssl_info_.public_key_hashes.push_back( |
| 208 net::HashValue(kCertPublicKeyHashValue)); | 208 net::HashValue(kCertPublicKeyHashValue)); |
| 209 | 209 |
| 210 delegate_ = | 210 delegate_ = |
| 211 new TestSSLErrorHandlerDelegate(profile(), web_contents(), ssl_info_); | 211 new TestSSLErrorHandlerDelegate(profile(), web_contents(), ssl_info_); |
| 212 error_handler_.reset(new TestSSLErrorHandler( | 212 error_handler_.reset(new TestSSLErrorHandler( |
| 213 std::unique_ptr<SSLErrorHandler::Delegate>(delegate_), web_contents(), | 213 std::unique_ptr<SSLErrorHandler::Delegate>(delegate_), web_contents(), |
| 214 profile(), net::MapCertStatusToNetError(ssl_info_.cert_status), | 214 profile(), net::MapCertStatusToNetError(ssl_info_.cert_status), |
| 215 ssl_info_, | 215 ssl_info_, |
| 216 GURL(), // request_url | 216 GURL(), // request_url |
| 217 base::Callback<void(content::CertificateRequestResultType)>())); | 217 base::Callback<void(content::CertificateRequestResultType)>())); |
| 218 | |
| 219 // Enable finch experiment for captive portal interstitials. | |
| 220 ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( | |
| 221 "CaptivePortalInterstitial", "Enabled")); | |
| 222 // Enable finch experiment for SSL common name mismatch handling. | |
| 223 ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( | |
| 224 "SSLCommonNameMismatchHandling", "Enabled")); | |
| 225 } | 218 } |
| 226 | 219 |
| 227 void TearDown() override { | 220 void TearDown() override { |
| 221 EXPECT_FALSE(error_handler()->IsTimerRunningForTesting()); |
| 222 error_handler_.reset(nullptr); |
| 223 SSLErrorHandler::ResetConfigForTesting(); |
| 224 ChromeRenderViewHostTestHarness::TearDown(); |
| 225 } |
| 226 |
| 227 TestSSLErrorHandler* error_handler() { return error_handler_.get(); } |
| 228 TestSSLErrorHandlerDelegate* delegate() { return delegate_; } |
| 229 |
| 230 const net::SSLInfo& ssl_info() { return ssl_info_; } |
| 231 |
| 232 private: |
| 233 net::SSLInfo ssl_info_; |
| 234 std::unique_ptr<TestSSLErrorHandler> error_handler_; |
| 235 TestSSLErrorHandlerDelegate* delegate_; |
| 236 base::FieldTrialList field_trial_list_; |
| 237 |
| 238 DISALLOW_COPY_AND_ASSIGN(SSLErrorHandlerNameMismatchTest); |
| 239 }; |
| 240 |
| 241 // A class to test the captive portal certificate list feature. Creates an error |
| 242 // handler with a name mismatch error by default. The error handler can be |
| 243 // recreated by calling ResetErrorHandler() with an appropriate cert status. |
| 244 class SSLErrorHandlerCaptivePortalCertListTest |
| 245 : public ChromeRenderViewHostTestHarness { |
| 246 public: |
| 247 SSLErrorHandlerCaptivePortalCertListTest() : field_trial_list_(nullptr) {} |
| 248 |
| 249 void SetUp() override { |
| 250 ChromeRenderViewHostTestHarness::SetUp(); |
| 251 SSLErrorHandler::ResetConfigForTesting(); |
| 252 SSLErrorHandler::SetInterstitialDelayForTesting(base::TimeDelta()); |
| 253 ResetErrorHandler(net::CERT_STATUS_COMMON_NAME_INVALID); |
| 254 } |
| 255 |
| 256 void TearDown() override { |
| 228 EXPECT_FALSE(error_handler()->IsTimerRunningForTesting()); | 257 EXPECT_FALSE(error_handler()->IsTimerRunningForTesting()); |
| 229 error_handler_.reset(nullptr); | 258 error_handler_.reset(nullptr); |
| 230 SSLErrorHandler::ResetConfigForTesting(); | 259 SSLErrorHandler::ResetConfigForTesting(); |
| 231 ChromeRenderViewHostTestHarness::TearDown(); | 260 ChromeRenderViewHostTestHarness::TearDown(); |
| 232 } | 261 } |
| 233 | 262 |
| 234 TestSSLErrorHandler* error_handler() { return error_handler_.get(); } | 263 TestSSLErrorHandler* error_handler() { return error_handler_.get(); } |
| 235 TestSSLErrorHandlerDelegate* delegate() { return delegate_; } | 264 TestSSLErrorHandlerDelegate* delegate() { return delegate_; } |
| 236 | 265 |
| 237 const net::SSLInfo& ssl_info() { return ssl_info_; } | 266 const net::SSLInfo& ssl_info() { return ssl_info_; } |
| 238 | 267 |
| 268 protected: |
| 269 void SetFeatureEnabled(bool enabled) { |
| 270 if (enabled) { |
| 271 scoped_feature_list_.InitFromCommandLine( |
| 272 "CaptivePortalCertificateList" /* enabled */, |
| 273 std::string() /* disabled */); |
| 274 } else { |
| 275 scoped_feature_list_.InitFromCommandLine( |
| 276 std::string(), "CaptivePortalCertificateList" /* disabled */); |
| 277 } |
| 278 } |
| 279 |
| 280 // Deletes the current error handler and creates a new one with the given |
| 281 // |cert_status|. |
| 282 void ResetErrorHandler(net::CertStatus cert_status) { |
| 283 ssl_info_.Reset(); |
| 284 ssl_info_.cert = |
| 285 net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem"); |
| 286 ssl_info_.cert_status = cert_status; |
| 287 ssl_info_.public_key_hashes.push_back( |
| 288 net::HashValue(kCertPublicKeyHashValue)); |
| 289 |
| 290 delegate_ = |
| 291 new TestSSLErrorHandlerDelegate(profile(), web_contents(), ssl_info_); |
| 292 error_handler_.reset(new TestSSLErrorHandler( |
| 293 std::unique_ptr<SSLErrorHandler::Delegate>(delegate_), web_contents(), |
| 294 profile(), net::MapCertStatusToNetError(ssl_info_.cert_status), |
| 295 ssl_info_, |
| 296 GURL(), // request_url |
| 297 base::Callback<void(content::CertificateRequestResultType)>())); |
| 298 |
| 299 // Enable finch experiment for captive portal interstitials. |
| 300 ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( |
| 301 "CaptivePortalInterstitial", "Enabled")); |
| 302 // Enable finch experiment for SSL common name mismatch handling. |
| 303 ASSERT_TRUE(base::FieldTrialList::CreateFieldTrial( |
| 304 "SSLCommonNameMismatchHandling", "Enabled")); |
| 305 } |
| 306 |
| 307 void TestNoCaptivePortalInterstitial() { |
| 308 base::HistogramTester histograms; |
| 309 |
| 310 EXPECT_FALSE(error_handler()->IsTimerRunningForTesting()); |
| 311 EXPECT_EQ(1u, ssl_info().public_key_hashes.size()); |
| 312 |
| 313 auto config_proto = |
| 314 base::MakeUnique<chrome_browser_ssl::SSLErrorAssistantConfig>(); |
| 315 config_proto->add_captive_portal_cert()->set_sha256_hash( |
| 316 "sha256/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); |
| 317 config_proto->add_captive_portal_cert()->set_sha256_hash( |
| 318 ssl_info().public_key_hashes[0].ToString()); |
| 319 config_proto->add_captive_portal_cert()->set_sha256_hash( |
| 320 "sha256/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); |
| 321 SSLErrorHandler::SetErrorAssistantProto(std::move(config_proto)); |
| 322 |
| 323 error_handler()->StartHandlingError(); |
| 324 |
| 325 // Timer should start for captive portal detection. |
| 326 EXPECT_TRUE(error_handler()->IsTimerRunningForTesting()); |
| 327 EXPECT_TRUE(delegate()->captive_portal_checked()); |
| 328 EXPECT_FALSE(delegate()->ssl_interstitial_shown()); |
| 329 EXPECT_FALSE(delegate()->captive_portal_interstitial_shown()); |
| 330 EXPECT_FALSE(delegate()->suggested_url_checked()); |
| 331 |
| 332 base::RunLoop().RunUntilIdle(); |
| 333 |
| 334 EXPECT_FALSE(error_handler()->IsTimerRunningForTesting()); |
| 335 EXPECT_TRUE(delegate()->captive_portal_checked()); |
| 336 EXPECT_TRUE(delegate()->ssl_interstitial_shown()); |
| 337 EXPECT_FALSE(delegate()->captive_portal_interstitial_shown()); |
| 338 EXPECT_FALSE(delegate()->suggested_url_checked()); |
| 339 |
| 340 // Check that the histogram for the captive portal cert was recorded. |
| 341 histograms.ExpectTotalCount(SSLErrorHandler::GetHistogramNameForTesting(), |
| 342 2); |
| 343 histograms.ExpectBucketCount(SSLErrorHandler::GetHistogramNameForTesting(), |
| 344 SSLErrorHandler::HANDLE_ALL, 1); |
| 345 histograms.ExpectBucketCount( |
| 346 SSLErrorHandler::GetHistogramNameForTesting(), |
| 347 SSLErrorHandler::SHOW_SSL_INTERSTITIAL_OVERRIDABLE, 1); |
| 348 } |
| 349 |
| 239 private: | 350 private: |
| 240 net::SSLInfo ssl_info_; | 351 net::SSLInfo ssl_info_; |
| 241 std::unique_ptr<TestSSLErrorHandler> error_handler_; | 352 std::unique_ptr<TestSSLErrorHandler> error_handler_; |
| 242 TestSSLErrorHandlerDelegate* delegate_; | 353 TestSSLErrorHandlerDelegate* delegate_; |
| 243 base::FieldTrialList field_trial_list_; | 354 base::FieldTrialList field_trial_list_; |
| 355 base::test::ScopedFeatureList scoped_feature_list_; |
| 244 | 356 |
| 245 DISALLOW_COPY_AND_ASSIGN(SSLErrorHandlerCertStatusTestBase); | 357 DISALLOW_COPY_AND_ASSIGN(SSLErrorHandlerCaptivePortalCertListTest); |
| 246 }; | 358 }; |
| 247 | 359 |
| 248 using SSLErrorHandlerNameMismatchTest = | |
| 249 SSLErrorHandlerCertStatusTestBase<net::CERT_STATUS_COMMON_NAME_INVALID>; | |
| 250 using SSLErrorHandlerAuthorityInvalidTest = | |
| 251 SSLErrorHandlerCertStatusTestBase<net::CERT_STATUS_AUTHORITY_INVALID>; | |
| 252 | 360 |
| 253 class SSLErrorHandlerDateInvalidTest : public ChromeRenderViewHostTestHarness { | 361 class SSLErrorHandlerDateInvalidTest : public ChromeRenderViewHostTestHarness { |
| 254 public: | 362 public: |
| 255 SSLErrorHandlerDateInvalidTest() | 363 SSLErrorHandlerDateInvalidTest() |
| 256 : field_trial_test_(new network_time::FieldTrialTest()), | 364 : field_trial_test_(new network_time::FieldTrialTest()), |
| 257 clock_(new base::SimpleTestClock), | 365 clock_(new base::SimpleTestClock), |
| 258 tick_clock_(new base::SimpleTestTickClock), | 366 tick_clock_(new base::SimpleTestTickClock), |
| 259 test_server_(new net::EmbeddedTestServer) { | 367 test_server_(new net::EmbeddedTestServer) { |
| 260 SetThreadBundleOptions(content::TestBrowserThreadBundle::REAL_IO_THREAD); | 368 SetThreadBundleOptions(content::TestBrowserThreadBundle::REAL_IO_THREAD); |
| 261 network_time::NetworkTimeTracker::RegisterPrefs(pref_service_.registry()); | 369 network_time::NetworkTimeTracker::RegisterPrefs(pref_service_.registry()); |
| (...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 696 ClearErrorHandler(); | 804 ClearErrorHandler(); |
| 697 | 805 |
| 698 // Shut down the server to cancel the pending request. | 806 // Shut down the server to cancel the pending request. |
| 699 ASSERT_TRUE(test_server()->ShutdownAndWaitUntilComplete()); | 807 ASSERT_TRUE(test_server()->ShutdownAndWaitUntilComplete()); |
| 700 } | 808 } |
| 701 | 809 |
| 702 #if BUILDFLAG(ENABLE_CAPTIVE_PORTAL_DETECTION) | 810 #if BUILDFLAG(ENABLE_CAPTIVE_PORTAL_DETECTION) |
| 703 | 811 |
| 704 // Tests that a certificate marked as a known captive portal certificate causes | 812 // Tests that a certificate marked as a known captive portal certificate causes |
| 705 // the captive portal interstitial to be shown. | 813 // the captive portal interstitial to be shown. |
| 706 TEST_F(SSLErrorHandlerNameMismatchTest, CaptivePortalCertificateList_Enabled) { | 814 TEST_F(SSLErrorHandlerCaptivePortalCertListTest, Enabled) { |
| 707 base::test::ScopedFeatureList scoped_feature_list; | 815 SetFeatureEnabled(true); |
| 708 scoped_feature_list.InitFromCommandLine( | |
| 709 "CaptivePortalCertificateList" /* enabled */, | |
| 710 std::string() /* disabled */); | |
| 711 | 816 |
| 712 EXPECT_FALSE(error_handler()->IsTimerRunningForTesting()); | 817 EXPECT_FALSE(error_handler()->IsTimerRunningForTesting()); |
| 713 EXPECT_EQ(1u, ssl_info().public_key_hashes.size()); | 818 EXPECT_EQ(1u, ssl_info().public_key_hashes.size()); |
| 714 | 819 |
| 715 auto config_proto = | 820 auto config_proto = |
| 716 base::MakeUnique<chrome_browser_ssl::SSLErrorAssistantConfig>(); | 821 base::MakeUnique<chrome_browser_ssl::SSLErrorAssistantConfig>(); |
| 717 config_proto->add_captive_portal_cert()->set_sha256_hash( | 822 config_proto->add_captive_portal_cert()->set_sha256_hash( |
| 718 "sha256/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); | 823 "sha256/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); |
| 719 config_proto->add_captive_portal_cert()->set_sha256_hash( | 824 config_proto->add_captive_portal_cert()->set_sha256_hash( |
| 720 ssl_info().public_key_hashes[0].ToString()); | 825 ssl_info().public_key_hashes[0].ToString()); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 749 histograms.ExpectBucketCount( | 854 histograms.ExpectBucketCount( |
| 750 SSLErrorHandler::GetHistogramNameForTesting(), | 855 SSLErrorHandler::GetHistogramNameForTesting(), |
| 751 SSLErrorHandler::SHOW_CAPTIVE_PORTAL_INTERSTITIAL_OVERRIDABLE, 1); | 856 SSLErrorHandler::SHOW_CAPTIVE_PORTAL_INTERSTITIAL_OVERRIDABLE, 1); |
| 752 histograms.ExpectBucketCount(SSLErrorHandler::GetHistogramNameForTesting(), | 857 histograms.ExpectBucketCount(SSLErrorHandler::GetHistogramNameForTesting(), |
| 753 SSLErrorHandler::CAPTIVE_PORTAL_CERT_FOUND, 1); | 858 SSLErrorHandler::CAPTIVE_PORTAL_CERT_FOUND, 1); |
| 754 } | 859 } |
| 755 | 860 |
| 756 // Tests that a certificate marked as a known captive portal certificate does | 861 // Tests that a certificate marked as a known captive portal certificate does |
| 757 // not cause the captive portal interstitial to be shown, if the feature is | 862 // not cause the captive portal interstitial to be shown, if the feature is |
| 758 // disabled. | 863 // disabled. |
| 759 TEST_F(SSLErrorHandlerNameMismatchTest, CaptivePortalCertificateList_Disabled) { | 864 TEST_F(SSLErrorHandlerCaptivePortalCertListTest, Disabled) { |
| 760 base::test::ScopedFeatureList scoped_feature_list; | 865 SetFeatureEnabled(false); |
| 761 scoped_feature_list.InitFromCommandLine( | |
| 762 std::string() /* enabled */, | |
| 763 "CaptivePortalCertificateList" /* disabled */); | |
| 764 | 866 |
| 765 base::HistogramTester histograms; | 867 // Default error for SSLErrorHandlerNameMismatchTest tests is name mismatch. |
| 766 | 868 TestNoCaptivePortalInterstitial(); |
| 767 EXPECT_FALSE(error_handler()->IsTimerRunningForTesting()); | |
| 768 EXPECT_EQ(1u, ssl_info().public_key_hashes.size()); | |
| 769 | |
| 770 auto config_proto = | |
| 771 base::MakeUnique<chrome_browser_ssl::SSLErrorAssistantConfig>(); | |
| 772 config_proto->add_captive_portal_cert()->set_sha256_hash( | |
| 773 "sha256/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); | |
| 774 config_proto->add_captive_portal_cert()->set_sha256_hash( | |
| 775 ssl_info().public_key_hashes[0].ToString()); | |
| 776 config_proto->add_captive_portal_cert()->set_sha256_hash( | |
| 777 "sha256/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); | |
| 778 SSLErrorHandler::SetErrorAssistantProto(std::move(config_proto)); | |
| 779 | |
| 780 error_handler()->StartHandlingError(); | |
| 781 | |
| 782 // Timer should start since captive portal certificate list feature is | |
| 783 // disabled. | |
| 784 EXPECT_TRUE(error_handler()->IsTimerRunningForTesting()); | |
| 785 EXPECT_TRUE(delegate()->captive_portal_checked()); | |
| 786 EXPECT_FALSE(delegate()->ssl_interstitial_shown()); | |
| 787 EXPECT_FALSE(delegate()->captive_portal_interstitial_shown()); | |
| 788 EXPECT_FALSE(delegate()->suggested_url_checked()); | |
| 789 | |
| 790 // A buggy SSL error handler might have incorrectly started the timer. Run to | |
| 791 // completion to ensure the timer is expired. | |
| 792 base::RunLoop().RunUntilIdle(); | |
| 793 | |
| 794 EXPECT_FALSE(error_handler()->IsTimerRunningForTesting()); | |
| 795 EXPECT_TRUE(delegate()->captive_portal_checked()); | |
| 796 EXPECT_TRUE(delegate()->ssl_interstitial_shown()); | |
| 797 EXPECT_FALSE(delegate()->captive_portal_interstitial_shown()); | |
| 798 EXPECT_FALSE(delegate()->suggested_url_checked()); | |
| 799 | |
| 800 // Check that the histogram for the captive portal cert was recorded. | |
| 801 histograms.ExpectTotalCount(SSLErrorHandler::GetHistogramNameForTesting(), 2); | |
| 802 histograms.ExpectBucketCount(SSLErrorHandler::GetHistogramNameForTesting(), | |
| 803 SSLErrorHandler::HANDLE_ALL, 1); | |
| 804 histograms.ExpectBucketCount( | |
| 805 SSLErrorHandler::GetHistogramNameForTesting(), | |
| 806 SSLErrorHandler::SHOW_SSL_INTERSTITIAL_OVERRIDABLE, 1); | |
| 807 } | 869 } |
| 808 | 870 |
| 809 // Tests that an error other than name mismatch does not cause a captive portal | 871 // Tests that an error other than name mismatch does not cause a captive portal |
| 810 // interstitial to be shown, even if the certificate is marked as a known | 872 // interstitial to be shown, even if the certificate is marked as a known |
| 811 // captive portal certificate. | 873 // captive portal certificate. |
| 812 TEST_F(SSLErrorHandlerAuthorityInvalidTest, | 874 TEST_F(SSLErrorHandlerCaptivePortalCertListTest, AuthorityInvalid) { |
| 813 CaptivePortalCertificateList_ShouldShowGenericInterstitial) { | 875 SetFeatureEnabled(true); |
| 814 base::test::ScopedFeatureList scoped_feature_list; | |
| 815 scoped_feature_list.InitFromCommandLine( | |
| 816 "CaptivePortalCertificateList" /* enabled */, | |
| 817 std::string() /* disabled */); | |
| 818 | 876 |
| 877 ResetErrorHandler(net::CERT_STATUS_AUTHORITY_INVALID); |
| 878 TestNoCaptivePortalInterstitial(); |
| 879 } |
| 880 |
| 881 // Tests that an authority invalid error in addition to name mismatch error does |
| 882 // not cause a captive portal interstitial to be shown, even if the certificate |
| 883 // is marked as a known captive portal certificate. The resulting error is |
| 884 // authority-invalid. |
| 885 TEST_F(SSLErrorHandlerCaptivePortalCertListTest, |
| 886 NameMismatchAndAuthorityInvalid) { |
| 887 SetFeatureEnabled(true); |
| 888 |
| 889 const net::CertStatus cert_status = |
| 890 net::CERT_STATUS_COMMON_NAME_INVALID | net::CERT_STATUS_AUTHORITY_INVALID; |
| 891 // Sanity check that AUTHORITY_INVALID is seen as the net error. |
| 892 ASSERT_EQ(net::ERR_CERT_AUTHORITY_INVALID, |
| 893 net::MapCertStatusToNetError(cert_status)); |
| 894 ResetErrorHandler(cert_status); |
| 895 TestNoCaptivePortalInterstitial(); |
| 896 } |
| 897 |
| 898 // Tests that another error in addition to name mismatch error does not cause a |
| 899 // captive portal interstitial to be shown, even if the certificate is marked as |
| 900 // a known captive portal certificate. Similar to |
| 901 // NameMismatchAndAuthorityInvalid, except the resulting error is name mismatch. |
| 902 TEST_F(SSLErrorHandlerCaptivePortalCertListTest, NameMismatchAndWeakKey) { |
| 903 SetFeatureEnabled(true); |
| 904 |
| 905 const net::CertStatus cert_status = |
| 906 net::CERT_STATUS_COMMON_NAME_INVALID | net::CERT_STATUS_WEAK_KEY; |
| 907 // Sanity check that COMMON_NAME_INVALID is seen as the net error, since the |
| 908 // test is designed to verify that SSLErrorHandler notices other errors in the |
| 909 // CertStatus even when COMMON_NAME_INVALID is the net error. |
| 910 ASSERT_EQ(net::ERR_CERT_COMMON_NAME_INVALID, |
| 911 net::MapCertStatusToNetError(cert_status)); |
| 912 ResetErrorHandler(cert_status); |
| 913 TestNoCaptivePortalInterstitial(); |
| 914 } |
| 915 |
| 916 #else |
| 917 |
| 918 TEST_F(SSLErrorHandlerCaptivePortalCertListTest, DisabledByBuild) { |
| 919 SetFeatureEnabled(true); |
| 920 |
| 921 // Default error for SSLErrorHandlerNameMismatchTest tests is name mismatch, |
| 922 // but the feature is disabled by build so a generic SSL interstitial will be |
| 923 // displayed. |
| 819 base::HistogramTester histograms; | 924 base::HistogramTester histograms; |
| 820 | 925 |
| 821 EXPECT_FALSE(error_handler()->IsTimerRunningForTesting()); | 926 EXPECT_FALSE(error_handler()->IsTimerRunningForTesting()); |
| 822 EXPECT_EQ(1u, ssl_info().public_key_hashes.size()); | 927 EXPECT_EQ(1u, ssl_info().public_key_hashes.size()); |
| 823 | 928 |
| 824 auto config_proto = | 929 auto config_proto = |
| 825 base::MakeUnique<chrome_browser_ssl::SSLErrorAssistantConfig>(); | 930 base::MakeUnique<chrome_browser_ssl::SSLErrorAssistantConfig>(); |
| 826 config_proto->add_captive_portal_cert()->set_sha256_hash( | 931 config_proto->add_captive_portal_cert()->set_sha256_hash( |
| 827 "sha256/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); | 932 "sha256/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); |
| 828 config_proto->add_captive_portal_cert()->set_sha256_hash( | 933 config_proto->add_captive_portal_cert()->set_sha256_hash( |
| 829 ssl_info().public_key_hashes[0].ToString()); | 934 ssl_info().public_key_hashes[0].ToString()); |
| 830 config_proto->add_captive_portal_cert()->set_sha256_hash( | 935 config_proto->add_captive_portal_cert()->set_sha256_hash( |
| 831 "sha256/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); | 936 "sha256/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"); |
| 832 SSLErrorHandler::SetErrorAssistantProto(std::move(config_proto)); | 937 SSLErrorHandler::SetErrorAssistantProto(std::move(config_proto)); |
| 833 | 938 |
| 834 error_handler()->StartHandlingError(); | 939 error_handler()->StartHandlingError(); |
| 835 | 940 |
| 836 // Timer should start for captive portal detection. | 941 EXPECT_FALSE(error_handler()->IsTimerRunningForTesting()); |
| 837 EXPECT_TRUE(error_handler()->IsTimerRunningForTesting()); | 942 EXPECT_FALSE(delegate()->captive_portal_checked()); |
| 838 EXPECT_TRUE(delegate()->captive_portal_checked()); | 943 EXPECT_TRUE(delegate()->ssl_interstitial_shown()); |
| 839 EXPECT_FALSE(delegate()->ssl_interstitial_shown()); | |
| 840 EXPECT_FALSE(delegate()->captive_portal_interstitial_shown()); | 944 EXPECT_FALSE(delegate()->captive_portal_interstitial_shown()); |
| 841 EXPECT_FALSE(delegate()->suggested_url_checked()); | 945 EXPECT_FALSE(delegate()->suggested_url_checked()); |
| 842 | 946 |
| 843 base::RunLoop().RunUntilIdle(); | 947 base::RunLoop().RunUntilIdle(); |
| 844 | 948 |
| 845 EXPECT_FALSE(error_handler()->IsTimerRunningForTesting()); | 949 EXPECT_FALSE(error_handler()->IsTimerRunningForTesting()); |
| 846 EXPECT_TRUE(delegate()->captive_portal_checked()); | 950 EXPECT_FALSE(delegate()->captive_portal_checked()); |
| 847 EXPECT_TRUE(delegate()->ssl_interstitial_shown()); | 951 EXPECT_TRUE(delegate()->ssl_interstitial_shown()); |
| 848 EXPECT_FALSE(delegate()->captive_portal_interstitial_shown()); | 952 EXPECT_FALSE(delegate()->captive_portal_interstitial_shown()); |
| 849 EXPECT_FALSE(delegate()->suggested_url_checked()); | 953 EXPECT_FALSE(delegate()->suggested_url_checked()); |
| 850 | 954 |
| 851 // Check that the histogram for the captive portal cert was recorded. | |
| 852 histograms.ExpectTotalCount(SSLErrorHandler::GetHistogramNameForTesting(), 2); | 955 histograms.ExpectTotalCount(SSLErrorHandler::GetHistogramNameForTesting(), 2); |
| 853 histograms.ExpectBucketCount(SSLErrorHandler::GetHistogramNameForTesting(), | 956 histograms.ExpectBucketCount(SSLErrorHandler::GetHistogramNameForTesting(), |
| 854 SSLErrorHandler::HANDLE_ALL, 1); | 957 SSLErrorHandler::HANDLE_ALL, 1); |
| 855 histograms.ExpectBucketCount( | 958 histograms.ExpectBucketCount( |
| 856 SSLErrorHandler::GetHistogramNameForTesting(), | 959 SSLErrorHandler::GetHistogramNameForTesting(), |
| 857 SSLErrorHandler::SHOW_SSL_INTERSTITIAL_OVERRIDABLE, 1); | 960 SSLErrorHandler::SHOW_SSL_INTERSTITIAL_OVERRIDABLE, 1); |
| 858 } | 961 } |
| 859 | 962 |
| 860 #endif // BUILDFLAG(ENABLE_CAPTIVE_PORTAL_DETECTION) | 963 #endif // BUILDFLAG(ENABLE_CAPTIVE_PORTAL_DETECTION) |
| OLD | NEW |