Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(123)

Side by Side Diff: chrome/browser/ssl/ssl_browser_tests.cc

Issue 2449193002: Attempt an on-demand time fetch when encountering a date invalid error (Closed)
Patch Set: meacer comments Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | chrome/browser/ssl/ssl_error_handler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/base_switches.h" 7 #include "base/base_switches.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/bind_helpers.h" 9 #include "base/bind_helpers.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/location.h" 12 #include "base/location.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/metrics/field_trial.h" 14 #include "base/metrics/field_trial.h"
15 #include "base/single_thread_task_runner.h" 15 #include "base/single_thread_task_runner.h"
16 #include "base/strings/string_split.h" 16 #include "base/strings/string_split.h"
17 #include "base/strings/string_util.h" 17 #include "base/strings/string_util.h"
18 #include "base/strings/stringprintf.h" 18 #include "base/strings/stringprintf.h"
19 #include "base/strings/utf_string_conversions.h" 19 #include "base/strings/utf_string_conversions.h"
20 #include "base/test/histogram_tester.h" 20 #include "base/test/histogram_tester.h"
21 #include "base/test/simple_test_clock.h" 21 #include "base/test/simple_test_clock.h"
22 #include "base/threading/thread_task_runner_handle.h" 22 #include "base/threading/thread_task_runner_handle.h"
23 #include "base/time/default_clock.h"
24 #include "base/time/default_tick_clock.h"
23 #include "base/time/time.h" 25 #include "base/time/time.h"
24 #include "build/build_config.h" 26 #include "build/build_config.h"
25 #include "chrome/app/chrome_command_ids.h" 27 #include "chrome/app/chrome_command_ids.h"
26 #include "chrome/browser/browser_process.h" 28 #include "chrome/browser/browser_process.h"
27 #include "chrome/browser/chrome_notification_types.h" 29 #include "chrome/browser/chrome_notification_types.h"
28 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" 30 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
29 #include "chrome/browser/interstitials/security_interstitial_page_test_utils.h" 31 #include "chrome/browser/interstitials/security_interstitial_page_test_utils.h"
30 #include "chrome/browser/profiles/profile.h" 32 #include "chrome/browser/profiles/profile.h"
31 #include "chrome/browser/ssl/bad_clock_blocking_page.h" 33 #include "chrome/browser/ssl/bad_clock_blocking_page.h"
32 #include "chrome/browser/ssl/cert_report_helper.h" 34 #include "chrome/browser/ssl/cert_report_helper.h"
(...skipping 10 matching lines...) Expand all
43 #include "chrome/browser/ui/browser_navigator.h" 45 #include "chrome/browser/ui/browser_navigator.h"
44 #include "chrome/browser/ui/browser_navigator_params.h" 46 #include "chrome/browser/ui/browser_navigator_params.h"
45 #include "chrome/browser/ui/browser_tabstrip.h" 47 #include "chrome/browser/ui/browser_tabstrip.h"
46 #include "chrome/browser/ui/tabs/tab_strip_model.h" 48 #include "chrome/browser/ui/tabs/tab_strip_model.h"
47 #include "chrome/common/chrome_paths.h" 49 #include "chrome/common/chrome_paths.h"
48 #include "chrome/common/chrome_switches.h" 50 #include "chrome/common/chrome_switches.h"
49 #include "chrome/common/pref_names.h" 51 #include "chrome/common/pref_names.h"
50 #include "chrome/test/base/in_process_browser_test.h" 52 #include "chrome/test/base/in_process_browser_test.h"
51 #include "chrome/test/base/ui_test_utils.h" 53 #include "chrome/test/base/ui_test_utils.h"
52 #include "components/content_settings/core/browser/host_content_settings_map.h" 54 #include "components/content_settings/core/browser/host_content_settings_map.h"
55 #include "components/network_time/network_time_test_utils.h"
53 #include "components/network_time/network_time_tracker.h" 56 #include "components/network_time/network_time_tracker.h"
54 #include "components/prefs/pref_service.h" 57 #include "components/prefs/testing_pref_service.h"
55 #include "components/security_interstitials/core/controller_client.h" 58 #include "components/security_interstitials/core/controller_client.h"
56 #include "components/security_interstitials/core/metrics_helper.h" 59 #include "components/security_interstitials/core/metrics_helper.h"
57 #include "components/security_state/security_state_model.h" 60 #include "components/security_state/security_state_model.h"
58 #include "components/security_state/switches.h" 61 #include "components/security_state/switches.h"
59 #include "components/ssl_errors/error_classification.h" 62 #include "components/ssl_errors/error_classification.h"
60 #include "components/variations/variations_associated_data.h" 63 #include "components/variations/variations_associated_data.h"
61 #include "components/web_modal/web_contents_modal_dialog_manager.h" 64 #include "components/web_modal/web_contents_modal_dialog_manager.h"
62 #include "content/public/browser/browser_context.h" 65 #include "content/public/browser/browser_context.h"
63 #include "content/public/browser/interstitial_page.h" 66 #include "content/public/browser/interstitial_page.h"
64 #include "content/public/browser/navigation_controller.h" 67 #include "content/public/browser/navigation_controller.h"
(...skipping 14 matching lines...) Expand all
79 #include "content/public/test/download_test_observer.h" 82 #include "content/public/test/download_test_observer.h"
80 #include "content/public/test/test_navigation_observer.h" 83 #include "content/public/test/test_navigation_observer.h"
81 #include "content/public/test/test_renderer_host.h" 84 #include "content/public/test/test_renderer_host.h"
82 #include "content/public/test/test_utils.h" 85 #include "content/public/test/test_utils.h"
83 #include "net/base/host_port_pair.h" 86 #include "net/base/host_port_pair.h"
84 #include "net/base/net_errors.h" 87 #include "net/base/net_errors.h"
85 #include "net/cert/cert_status_flags.h" 88 #include "net/cert/cert_status_flags.h"
86 #include "net/cert/mock_cert_verifier.h" 89 #include "net/cert/mock_cert_verifier.h"
87 #include "net/cert/x509_certificate.h" 90 #include "net/cert/x509_certificate.h"
88 #include "net/dns/mock_host_resolver.h" 91 #include "net/dns/mock_host_resolver.h"
92 #include "net/http/http_response_headers.h"
89 #include "net/ssl/ssl_info.h" 93 #include "net/ssl/ssl_info.h"
90 #include "net/test/cert_test_util.h" 94 #include "net/test/cert_test_util.h"
91 #include "net/test/embedded_test_server/embedded_test_server.h" 95 #include "net/test/embedded_test_server/embedded_test_server.h"
92 #include "net/test/embedded_test_server/request_handler_util.h" 96 #include "net/test/embedded_test_server/request_handler_util.h"
93 #include "net/test/spawned_test_server/spawned_test_server.h" 97 #include "net/test/spawned_test_server/spawned_test_server.h"
94 #include "net/test/test_certificate_data.h" 98 #include "net/test/test_certificate_data.h"
95 #include "net/test/test_data_directory.h" 99 #include "net/test/test_data_directory.h"
96 #include "net/url_request/url_request_context.h" 100 #include "net/url_request/url_request_context.h"
97 #include "net/url_request/url_request_filter.h" 101 #include "net/url_request/url_request_filter.h"
98 #include "net/url_request/url_request_job.h" 102 #include "net/url_request/url_request_job.h"
(...skipping 2747 matching lines...) Expand 10 before | Expand all | Expand 10 after
2846 2850
2847 // Grab the SSLStatus from the page and check that it is the same as 2851 // Grab the SSLStatus from the page and check that it is the same as
2848 // on the clock interstitial. 2852 // on the clock interstitial.
2849 entry = tab->GetController().GetActiveEntry(); 2853 entry = tab->GetController().GetActiveEntry();
2850 ASSERT_TRUE(entry); 2854 ASSERT_TRUE(entry);
2851 content::SSLStatus after_interstitial_ssl_status = entry->GetSSL(); 2855 content::SSLStatus after_interstitial_ssl_status = entry->GetSSL();
2852 ASSERT_NO_FATAL_FAILURE( 2856 ASSERT_NO_FATAL_FAILURE(
2853 after_interstitial_ssl_status.Equals(clock_interstitial_ssl_status)); 2857 after_interstitial_ssl_status.Equals(clock_interstitial_ssl_status));
2854 } 2858 }
2855 2859
2860 // A URLRequestJob that serves valid time server responses, but delays
2861 // them until Resume() is called. If Resume() is called before a request
2862 // is made, then the request will not be delayed.
2863 class DelayableNetworkTimeURLRequestJob : public net::URLRequestJob {
2864 public:
2865 DelayableNetworkTimeURLRequestJob(net::URLRequest* request,
2866 net::NetworkDelegate* network_delegate,
2867 bool delayed)
2868 : net::URLRequestJob(request, network_delegate),
2869 delayed_(delayed),
2870 weak_factory_(this) {}
2871
2872 ~DelayableNetworkTimeURLRequestJob() override {}
2873
2874 /// URLRequestJob:
mmenke 2016/11/07 15:27:45 nit: Remove extra slash.
estark 2016/11/07 23:24:00 Done.
2875 void Start() override {
2876 if (delayed_) {
2877 // Do nothing until Resume() is called.
2878 return;
2879 }
2880 Resume(response_callback_);
2881 }
2882
2883 int ReadRawData(net::IOBuffer* buf, int buf_size) override {
2884 int bytes_read =
2885 std::min(static_cast<size_t>(buf_size),
2886 strlen(network_time::kGoodTimeResponseBody) - data_offset_);
2887 memcpy(buf->data(), network_time::kGoodTimeResponseBody + data_offset_,
mmenke 2016/11/07 15:27:45 Should include net/base/io_buffer.h
estark 2016/11/07 23:24:00 Done.
2888 bytes_read);
2889 data_offset_ += bytes_read;
2890 return bytes_read;
2891 }
2892
2893 int GetResponseCode() const override { return 200; }
2894
2895 void GetResponseInfo(net::HttpResponseInfo* info) override {
2896 std::string raw_headers;
2897 raw_headers.append(
mmenke 2016/11/07 15:27:45 Terminology is confusing here, but the term "raw h
estark 2016/11/07 23:24:00 Done.
2898 "HTTP/1.1 200 OK\n"
2899 "Content-type: text/plain\n");
2900 raw_headers.append(base::StringPrintf(
2901 "Content-Length: %1d\n",
2902 static_cast<int>(strlen(network_time::kGoodTimeResponseBody))));
2903 info->headers =
2904 new net::HttpResponseHeaders(net::HttpUtil::AssembleRawHeaders(
2905 raw_headers.c_str(), static_cast<int>(raw_headers.length())));
2906 info->headers->AddHeader(
2907 "x-cup-server-proof: " +
2908 std::string(network_time::kGoodTimeResponseServerProofHeader));
2909 if (!response_callback_.is_null()) {
2910 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
2911 response_callback_);
2912 }
2913 }
2914
2915 void StartAsync() {
2916 if (!request_)
mmenke 2016/11/07 15:27:45 Not need to check this - the request owns the URLR
estark 2016/11/07 23:24:00 Done.
2917 return;
2918 NotifyHeadersComplete();
2919 }
2920
2921 // Resumes delayed requests. When the response info for a request is
2922 // read (i.e. GetResponseInfo() is called), then |quit_closure| will be
2923 // called.
mmenke 2016/11/07 15:27:45 Putting this in GetResponseInfo isn't right - ther
estark 2016/11/07 23:24:00 I removed this callback. (See question above -- no
2924 void Resume(const base::Closure& quit_closure) {
2925 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
2926 response_callback_ = quit_closure;
2927 // Start reading asynchronously as would a normal network request.
2928 base::ThreadTaskRunnerHandle::Get()->PostTask(
2929 FROM_HERE, base::Bind(&DelayableNetworkTimeURLRequestJob::StartAsync,
2930 weak_factory_.GetWeakPtr()));
mmenke 2016/11/07 15:27:45 Should handle jobs that haven't yet had Start() ca
mmenke 2016/11/07 15:27:45 You're using weak_ptrs here, but DelayedNetworkTim
estark 2016/11/07 23:24:00 Done. If Resume() is called before Start(), then w
estark 2016/11/07 23:24:00 I think this should handle premature request destr
2931 }
2932
2933 private:
2934 bool delayed_;
2935 int data_offset_ = 0;
2936 base::Closure response_callback_;
2937 base::WeakPtrFactory<DelayableNetworkTimeURLRequestJob> weak_factory_;
2938
2939 DISALLOW_COPY_AND_ASSIGN(DelayableNetworkTimeURLRequestJob);
2940 };
2941
2942 // A URLRequestInterceptor that intercepts requests to use
2943 // DelayableNetworkTimeURLRequestJobs.
2944 class DelayedNetworkTimeInterceptor : public net::URLRequestInterceptor {
2945 public:
2946 DelayedNetworkTimeInterceptor() : net::URLRequestInterceptor() {}
mmenke 2016/11/07 15:27:45 net::URLRequestInterceptor() not needed.
estark 2016/11/07 23:24:00 Done.
2947 ~DelayedNetworkTimeInterceptor() override {}
2948
2949 net::URLRequestJob* MaybeInterceptRequest(
2950 net::URLRequest* request,
2951 net::NetworkDelegate* network_delegate) const override {
2952 // If requests have been resumed before this request is created,
2953 // then |delay_requests_| will be false and the request will not delay.
2954 DelayableNetworkTimeURLRequestJob* job =
2955 new DelayableNetworkTimeURLRequestJob(request, network_delegate,
2956 delay_requests_);
2957 if (delay_requests_) {
2958 delayed_requests_.push_back(job);
2959 }
mmenke 2016/11/07 15:27:45 nit: Remove braces for two-line ifs.
estark 2016/11/07 23:24:00 Done.
2960 return job;
2961 }
2962
2963 void ResumeAll(const base::Closure& quit_closure) {
2964 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
2965 if (!delay_requests_) {
2966 return;
2967 }
mmenke 2016/11/07 15:27:45 nit: Remove braces for two-line ifs.
estark 2016/11/07 23:24:00 Done.
2968 delay_requests_ = false;
2969 for (const auto& request : delayed_requests_) {
2970 request->Resume(quit_closure);
mmenke 2016/11/07 15:27:45 If no requests have been started yet, quit closure
estark 2016/11/07 23:24:00 Done; I changed the interceptor to expect only one
mmenke 2016/11/08 15:24:21 I don't see any waiting on NetworkDelegate::OnComp
estark 2016/11/08 17:54:01 Oh no, I'm sorry, I uploaded this in a weird inter
2971 }
2972 delayed_requests_.clear();
2973 }
2974
2975 private:
2976 bool delay_requests_ = true;
2977 mutable std::vector<DelayableNetworkTimeURLRequestJob*> delayed_requests_;
2978
2979 DISALLOW_COPY_AND_ASSIGN(DelayedNetworkTimeInterceptor);
2980 };
2981
2982 // Helper method for SSLNetworkTimeBrowserTest.
2983 void CleanUpOnIOThread() {
2984 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
2985 net::URLRequestFilter::GetInstance()->ClearHandlers();
2986 }
2987
2988 // A fixture for testing on-demand network time queries on SSL
2989 // certificate date errors. It can simulate delayed network time
2990 // requests, and it allows the user to configure the experimental
2991 // parameters of the NetworkTimeTracker.
2992 class SSLNetworkTimeBrowserTest : public SSLUITest {
2993 public:
2994 SSLNetworkTimeBrowserTest()
2995 : SSLUITest(),
2996 field_trial_test_(network_time::FieldTrialTest::CreateForBrowserTest()),
2997 interceptor_(nullptr) {}
2998 ~SSLNetworkTimeBrowserTest() override {}
2999
3000 void TearDownOnMainThread() override {
3001 content::BrowserThread::PostTask(content::BrowserThread::IO, FROM_HERE,
3002 base::Bind(&CleanUpOnIOThread));
3003 }
3004
3005 protected:
3006 network_time::FieldTrialTest* field_trial_test() const {
3007 return field_trial_test_.get();
3008 }
3009
3010 void SetUpNetworkTimeServer() {
3011 field_trial_test()->SetNetworkQueriesWithVariationsService(
3012 true, 0.0, network_time::FieldTrialTest::FETCHES_ON_DEMAND_ONLY);
3013
3014 // Install the URL interceptor that serves delayed network time
3015 // responses.
3016 content::BrowserThread::PostTask(
3017 content::BrowserThread::IO, FROM_HERE,
3018 base::Bind(
3019 &SSLNetworkTimeBrowserTest::SetUpNetworkTimeInterceptorOnIOThread,
3020 base::Unretained(this), g_browser_process->network_time_tracker()
3021 ->GetTimeServerURLForTesting()));
3022 }
3023
3024 void TriggerTimeResponse(const base::Closure& quit_closure) {
3025 content::BrowserThread::PostTask(
3026 content::BrowserThread::IO, FROM_HERE,
3027 base::Bind(&SSLNetworkTimeBrowserTest::ResumeDelayedNetworkTimeRequests,
3028 base::Unretained(this), quit_closure));
3029 }
3030
3031 private:
3032 void SetUpNetworkTimeInterceptorOnIOThread(const GURL& time_server_url) {
3033 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
3034 interceptor_ = new DelayedNetworkTimeInterceptor();
mmenke 2016/11/07 15:27:45 This works. My own personal style preference woul
estark 2016/11/07 17:17:19 If I were to do that, would I pass a WeakPtr to th
mmenke 2016/11/07 17:21:41 It would be an unretained pointer. The intercepto
estark 2016/11/07 23:24:00 Done.
3035 net::URLRequestFilter::GetInstance()->AddHostnameInterceptor(
3036 time_server_url.scheme(), time_server_url.host(),
3037 std::unique_ptr<DelayedNetworkTimeInterceptor>(interceptor_));
3038 }
3039
3040 void ResumeDelayedNetworkTimeRequests(const base::Closure& quit_closure) {
3041 DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
3042 interceptor_->ResumeAll(quit_closure);
3043 }
3044
3045 std::unique_ptr<network_time::FieldTrialTest> field_trial_test_;
3046
3047 // Should only be accessed on the IO thread.
3048 DelayedNetworkTimeInterceptor* interceptor_;
3049
3050 DISALLOW_COPY_AND_ASSIGN(SSLNetworkTimeBrowserTest);
3051 };
3052
3053 // Tests that if an on-demand network time fetch returns that the clock
3054 // is okay, a normal SSL interstitial is shown.
3055 IN_PROC_BROWSER_TEST_F(SSLNetworkTimeBrowserTest, OnDemandFetchClockOk) {
3056 ASSERT_TRUE(https_server_expired_.Start());
3057 SetUpNetworkTimeServer();
3058 // Use a testing clock set to the time that GoodTimeResponseHandler
3059 // returns, to simulate the system clock matching the network time.
3060 base::SimpleTestClock testing_clock;
3061 SSLErrorHandler::SetClockForTest(&testing_clock);
3062 testing_clock.SetNow(
3063 base::Time::FromJsTime(network_time::kGoodTimeResponseHandlerJsTime));
3064 // Set the build time to match the testing clock, to ensure that the
3065 // build time heuristic doesn't fire.
3066 ssl_errors::SetBuildTimeForTesting(testing_clock.Now());
3067
3068 // Set a long timeout to ensure that the on-demand time fetch completes.
3069 SSLErrorHandler::SetInterstitialDelayForTest(base::TimeDelta::FromHours(1));
3070
3071 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
3072 ASSERT_TRUE(contents);
3073 SSLInterstitialTimerObserver interstitial_timer_observer(contents);
3074
3075 content::WindowedNotificationObserver observer(
3076 content::NOTIFICATION_LOAD_STOP,
3077 content::NotificationService::AllSources());
3078 ui_test_utils::NavigateToURLWithDisposition(
3079 browser(), https_server_expired_.GetURL("/"),
3080 WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
3081
3082 // Once |interstitial_timer_observer| has fired, the request has been
3083 // sent. Override the nonce that NetworkTimeTracker expects so that
3084 // when the response comes back, it will validate. The nonce can only
3085 // be overriden for the current in-flight request, so the test must
3086 // call OverrideNonceForTesting() after the request has been sent and
3087 // before the response has been received.
3088 interstitial_timer_observer.WaitForTimerStarted();
3089 g_browser_process->network_time_tracker()->OverrideNonceForTesting(123123123);
3090 base::RunLoop wait_for_time_response;
3091 TriggerTimeResponse(wait_for_time_response.QuitClosure());
3092
3093 EXPECT_TRUE(contents->IsLoading());
3094 observer.Wait();
3095 content::WaitForInterstitialAttach(contents);
3096 wait_for_time_response.Run();
3097
3098 EXPECT_TRUE(contents->ShowingInterstitialPage());
3099 InterstitialPage* interstitial_page = contents->GetInterstitialPage();
3100 ASSERT_TRUE(interstitial_page);
3101 ASSERT_EQ(SSLBlockingPage::kTypeForTesting,
3102 interstitial_page->GetDelegateForTesting()->GetTypeForTesting());
3103 }
3104
3105 // Tests that if an on-demand network time fetch returns that the clock
3106 // is wrong, a bad clock interstitial is shown.
3107 IN_PROC_BROWSER_TEST_F(SSLNetworkTimeBrowserTest, OnDemandFetchClockWrong) {
3108 ASSERT_TRUE(https_server_expired_.Start());
3109 SetUpNetworkTimeServer();
3110 // Use a testing clock set to a time that is different from what
3111 // GoodTimeResponseHandler returns, simulating a system clock that is
3112 // 30 days ahead of the network time.
3113 base::SimpleTestClock testing_clock;
3114 SSLErrorHandler::SetClockForTest(&testing_clock);
3115 testing_clock.SetNow(
3116 base::Time::FromJsTime(network_time::kGoodTimeResponseHandlerJsTime));
3117 testing_clock.Advance(base::TimeDelta::FromDays(30));
3118 // Set the build time to match the testing clock, to ensure that the
3119 // build time heuristic doesn't fire.
3120 ssl_errors::SetBuildTimeForTesting(testing_clock.Now());
3121
3122 // Set a long timeout to ensure that the on-demand time fetch completes.
3123 SSLErrorHandler::SetInterstitialDelayForTest(base::TimeDelta::FromHours(1));
3124
3125 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
3126 ASSERT_TRUE(contents);
3127 SSLInterstitialTimerObserver interstitial_timer_observer(contents);
3128
3129 content::WindowedNotificationObserver observer(
3130 content::NOTIFICATION_LOAD_STOP,
3131 content::NotificationService::AllSources());
3132
3133 ui_test_utils::NavigateToURLWithDisposition(
3134 browser(), https_server_expired_.GetURL("/"),
3135 WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
3136
3137 // Once |interstitial_timer_observer| has fired, the request has been
3138 // sent. Override the nonce that NetworkTimeTracker expects so that
3139 // when the response comes back, it will validate. The nonce can only
3140 // be overriden for the current in-flight request, so the test must
3141 // call OverrideNonceForTesting() after the request has been sent and
3142 // before the response has been received.
3143 interstitial_timer_observer.WaitForTimerStarted();
3144 g_browser_process->network_time_tracker()->OverrideNonceForTesting(123123123);
3145 base::RunLoop wait_for_time_response;
3146 TriggerTimeResponse(wait_for_time_response.QuitClosure());
3147
3148 EXPECT_TRUE(contents->IsLoading());
3149 observer.Wait();
3150 content::WaitForInterstitialAttach(contents);
3151 wait_for_time_response.Run();
3152
3153 EXPECT_TRUE(contents->ShowingInterstitialPage());
3154 InterstitialPage* interstitial_page = contents->GetInterstitialPage();
3155 ASSERT_TRUE(interstitial_page);
3156 ASSERT_EQ(BadClockBlockingPage::kTypeForTesting,
3157 interstitial_page->GetDelegateForTesting()->GetTypeForTesting());
3158 }
3159
3160 // Tests that if the timeout expires before the network time fetch
3161 // returns, then a normal SSL intersitial is shown.
3162 IN_PROC_BROWSER_TEST_F(SSLNetworkTimeBrowserTest,
3163 TimeoutExpiresBeforeFetchCompletes) {
3164 ASSERT_TRUE(https_server_expired_.Start());
3165 SetUpNetworkTimeServer();
3166 // Set the timer to fire immediately.
3167 SSLErrorHandler::SetInterstitialDelayForTest(base::TimeDelta());
3168
3169 ui_test_utils::NavigateToURL(browser(), https_server_expired_.GetURL("/"));
3170 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
3171 ASSERT_TRUE(contents);
3172 content::WaitForInterstitialAttach(contents);
3173
3174 EXPECT_TRUE(contents->ShowingInterstitialPage());
3175 InterstitialPage* interstitial_page = contents->GetInterstitialPage();
3176 ASSERT_TRUE(interstitial_page);
3177 ASSERT_EQ(SSLBlockingPage::kTypeForTesting,
3178 interstitial_page->GetDelegateForTesting()->GetTypeForTesting());
3179
3180 // Navigate away, and then trigger the network time response and wait
3181 // for the response; no crash should occur.
3182 ASSERT_TRUE(https_server_.Start());
3183 ui_test_utils::NavigateToURL(browser(), https_server_.GetURL("/"));
3184 base::RunLoop wait_for_time_response;
3185 TriggerTimeResponse(wait_for_time_response.QuitClosure());
3186 wait_for_time_response.Run();
3187 }
3188
3189 // Tests that if the user stops the page load before either the network
3190 // time fetch completes or the timeout expires, then there is no interstitial.
3191 IN_PROC_BROWSER_TEST_F(SSLNetworkTimeBrowserTest, StopBeforeTimeoutExpires) {
3192 ASSERT_TRUE(https_server_expired_.Start());
3193 SetUpNetworkTimeServer();
3194 // Set the timer to a long delay.
3195 SSLErrorHandler::SetInterstitialDelayForTest(base::TimeDelta::FromHours(1));
3196
3197 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
3198 ASSERT_TRUE(contents);
3199 SSLInterstitialTimerObserver interstitial_timer_observer(contents);
3200
3201 ui_test_utils::NavigateToURLWithDisposition(
3202 browser(), https_server_expired_.GetURL("/"),
3203 WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
3204 interstitial_timer_observer.WaitForTimerStarted();
3205
3206 EXPECT_TRUE(contents->IsLoading());
3207 content::WindowedNotificationObserver observer(
3208 content::NOTIFICATION_LOAD_STOP,
3209 content::NotificationService::AllSources());
3210 contents->Stop();
3211 observer.Wait();
3212
3213 // Make sure that the |SSLErrorHandler| is deleted.
3214 EXPECT_FALSE(SSLErrorHandler::FromWebContents(contents));
3215 EXPECT_FALSE(contents->ShowingInterstitialPage());
3216 EXPECT_FALSE(contents->IsLoading());
3217
3218 // Navigate away, and then trigger the network time response and wait
3219 // for the response; no crash should occur.
3220 ASSERT_TRUE(https_server_.Start());
3221 ui_test_utils::NavigateToURL(browser(), https_server_.GetURL("/title1.html"));
3222 base::RunLoop wait_for_time_response;
3223 TriggerTimeResponse(wait_for_time_response.QuitClosure());
3224 wait_for_time_response.Run();
3225 }
3226
3227 // Tests that if the user reloads the page before either the network
3228 // time fetch completes or the timeout expires, then there is no interstitial.
3229 IN_PROC_BROWSER_TEST_F(SSLNetworkTimeBrowserTest, ReloadBeforeTimeoutExpires) {
3230 ASSERT_TRUE(https_server_expired_.Start());
3231 SetUpNetworkTimeServer();
3232 // Set the timer to a long delay.
3233 SSLErrorHandler::SetInterstitialDelayForTest(base::TimeDelta::FromHours(1));
3234
3235 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
3236 SSLInterstitialTimerObserver interstitial_timer_observer(contents);
3237
3238 ui_test_utils::NavigateToURLWithDisposition(
3239 browser(), https_server_expired_.GetURL("/"),
3240 WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
3241 interstitial_timer_observer.WaitForTimerStarted();
3242
3243 EXPECT_TRUE(contents->IsLoading());
3244 content::TestNavigationObserver observer(contents, 1);
3245 chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB);
3246 observer.Wait();
3247
3248 // Make sure that the |SSLErrorHandler| is deleted.
3249 EXPECT_FALSE(SSLErrorHandler::FromWebContents(contents));
3250 EXPECT_FALSE(contents->ShowingInterstitialPage());
3251 EXPECT_FALSE(contents->IsLoading());
3252
3253 // Navigate away, and then trigger the network time response and wait
3254 // for the response; no crash should occur.
3255 ASSERT_TRUE(https_server_.Start());
3256 ui_test_utils::NavigateToURL(browser(), https_server_.GetURL("/"));
3257 base::RunLoop wait_for_time_response;
3258 TriggerTimeResponse(wait_for_time_response.QuitClosure());
3259 wait_for_time_response.Run();
3260 }
3261
3262 // Tests that if the user navigates away before either the network time
3263 // fetch completes or the timeout expires, then there is no
3264 // interstitial.
3265 IN_PROC_BROWSER_TEST_F(SSLNetworkTimeBrowserTest,
3266 NavigateAwayBeforeTimeoutExpires) {
3267 ASSERT_TRUE(https_server_expired_.Start());
3268 ASSERT_TRUE(https_server_.Start());
3269 SetUpNetworkTimeServer();
3270 // Set the timer to a long delay.
3271 SSLErrorHandler::SetInterstitialDelayForTest(base::TimeDelta::FromHours(1));
3272
3273 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
3274 SSLInterstitialTimerObserver interstitial_timer_observer(contents);
3275
3276 ui_test_utils::NavigateToURLWithDisposition(
3277 browser(), https_server_expired_.GetURL("/"),
3278 WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
3279 interstitial_timer_observer.WaitForTimerStarted();
3280
3281 EXPECT_TRUE(contents->IsLoading());
3282 content::TestNavigationObserver observer(contents, 1);
3283 browser()->OpenURL(content::OpenURLParams(
3284 https_server_.GetURL("/"), content::Referrer(),
3285 WindowOpenDisposition::CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
3286 observer.Wait();
3287
3288 // Make sure that the |SSLErrorHandler| is deleted.
3289 EXPECT_FALSE(SSLErrorHandler::FromWebContents(contents));
3290 EXPECT_FALSE(contents->ShowingInterstitialPage());
3291 EXPECT_FALSE(contents->IsLoading());
3292
3293 // Navigate away, and then trigger the network time response and wait
3294 // for the response; no crash should occur.
3295 ui_test_utils::NavigateToURL(browser(), https_server_.GetURL("/"));
3296 base::RunLoop wait_for_time_response;
3297 TriggerTimeResponse(wait_for_time_response.QuitClosure());
3298 wait_for_time_response.Run();
3299 }
3300
3301 // Tests that if the user closes the tab before the network time fetch
3302 // completes, it doesn't cause a crash.
3303 IN_PROC_BROWSER_TEST_F(SSLNetworkTimeBrowserTest,
3304 CloseTabBeforeNetworkFetchCompletes) {
3305 ASSERT_TRUE(https_server_expired_.Start());
3306 SetUpNetworkTimeServer();
3307 // Set the timer to fire immediately.
3308 SSLErrorHandler::SetInterstitialDelayForTest(base::TimeDelta());
3309
3310 ui_test_utils::NavigateToURL(browser(), https_server_expired_.GetURL("/"));
3311 WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
3312 ASSERT_TRUE(contents);
3313 content::WaitForInterstitialAttach(contents);
3314
3315 EXPECT_TRUE(contents->ShowingInterstitialPage());
3316 InterstitialPage* interstitial_page = contents->GetInterstitialPage();
3317 ASSERT_TRUE(interstitial_page);
3318 ASSERT_EQ(SSLBlockingPage::kTypeForTesting,
3319 interstitial_page->GetDelegateForTesting()->GetTypeForTesting());
3320
3321 // Open a second tab, close the first, and then trigger the network time
3322 // response and wait for the response; no crash should occur.
3323 ASSERT_TRUE(https_server_.Start());
3324 AddTabAtIndex(1, https_server_.GetURL("/"), ui::PAGE_TRANSITION_TYPED);
3325 chrome::CloseWebContents(browser(), contents, false);
3326 base::RunLoop wait_for_time_response;
3327 TriggerTimeResponse(wait_for_time_response.QuitClosure());
3328 wait_for_time_response.Run();
3329 }
3330
2856 class CommonNameMismatchBrowserTest : public CertVerifierBrowserTest { 3331 class CommonNameMismatchBrowserTest : public CertVerifierBrowserTest {
2857 public: 3332 public:
2858 CommonNameMismatchBrowserTest() : CertVerifierBrowserTest() {} 3333 CommonNameMismatchBrowserTest() : CertVerifierBrowserTest() {}
2859 ~CommonNameMismatchBrowserTest() override {} 3334 ~CommonNameMismatchBrowserTest() override {}
2860 3335
2861 void SetUpCommandLine(base::CommandLine* command_line) override { 3336 void SetUpCommandLine(base::CommandLine* command_line) override {
2862 // Enable finch experiment for SSL common name mismatch handling. 3337 // Enable finch experiment for SSL common name mismatch handling.
2863 command_line->AppendSwitchASCII(switches::kForceFieldTrials, 3338 command_line->AppendSwitchASCII(switches::kForceFieldTrials,
2864 "SSLCommonNameMismatchHandling/Enabled/"); 3339 "SSLCommonNameMismatchHandling/Enabled/");
2865 } 3340 }
(...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after
3410 3885
3411 // Visit a page over https that contains a frame with a redirect. 3886 // Visit a page over https that contains a frame with a redirect.
3412 3887
3413 // XMLHttpRequest insecure content in synchronous mode. 3888 // XMLHttpRequest insecure content in synchronous mode.
3414 3889
3415 // XMLHttpRequest insecure content in asynchronous mode. 3890 // XMLHttpRequest insecure content in asynchronous mode.
3416 3891
3417 // XMLHttpRequest over bad ssl in synchronous mode. 3892 // XMLHttpRequest over bad ssl in synchronous mode.
3418 3893
3419 // XMLHttpRequest over OK ssl in synchronous mode. 3894 // XMLHttpRequest over OK ssl in synchronous mode.
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/ssl/ssl_error_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698