OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ssl/ssl_blocking_page.h" | 5 #include "chrome/browser/ssl/ssl_blocking_page.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/build_time.h" | 9 #include "base/build_time.h" |
10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
12 #include "base/i18n/rtl.h" | 12 #include "base/i18n/rtl.h" |
13 #include "base/i18n/time_formatting.h" | 13 #include "base/i18n/time_formatting.h" |
14 #include "base/metrics/field_trial.h" | 14 #include "base/metrics/field_trial.h" |
15 #include "base/metrics/histogram.h" | 15 #include "base/metrics/histogram.h" |
16 #include "base/prefs/pref_service.h" | 16 #include "base/prefs/pref_service.h" |
17 #include "base/process/launch.h" | 17 #include "base/process/launch.h" |
18 #include "base/rand_util.h" | |
18 #include "base/strings/string_number_conversions.h" | 19 #include "base/strings/string_number_conversions.h" |
19 #include "base/strings/string_piece.h" | 20 #include "base/strings/string_piece.h" |
20 #include "base/strings/string_util.h" | 21 #include "base/strings/string_util.h" |
21 #include "base/strings/stringprintf.h" | 22 #include "base/strings/stringprintf.h" |
22 #include "base/strings/utf_string_conversions.h" | 23 #include "base/strings/utf_string_conversions.h" |
23 #include "base/time/time.h" | 24 #include "base/time/time.h" |
24 #include "base/values.h" | 25 #include "base/values.h" |
25 #include "chrome/browser/browser_process.h" | 26 #include "chrome/browser/browser_process.h" |
26 #include "chrome/browser/chrome_notification_types.h" | 27 #include "chrome/browser/chrome_notification_types.h" |
27 #include "chrome/browser/interstitials/security_interstitial_metrics_helper.h" | 28 #include "chrome/browser/interstitials/security_interstitial_metrics_helper.h" |
28 #include "chrome/browser/profiles/profile.h" | 29 #include "chrome/browser/profiles/profile.h" |
29 #include "chrome/browser/renderer_preferences_util.h" | 30 #include "chrome/browser/renderer_preferences_util.h" |
30 #include "chrome/browser/safe_browsing/ui_manager.h" | 31 #include "chrome/browser/safe_browsing/ui_manager.h" |
31 #include "chrome/browser/ssl/ssl_error_classification.h" | 32 #include "chrome/browser/ssl/ssl_error_classification.h" |
32 #include "chrome/browser/ssl/ssl_error_info.h" | 33 #include "chrome/browser/ssl/ssl_error_info.h" |
33 #include "chrome/common/chrome_switches.h" | 34 #include "chrome/common/chrome_switches.h" |
34 #include "chrome/common/pref_names.h" | 35 #include "chrome/common/pref_names.h" |
35 #include "chrome/grit/chromium_strings.h" | 36 #include "chrome/grit/chromium_strings.h" |
36 #include "chrome/grit/generated_resources.h" | 37 #include "chrome/grit/generated_resources.h" |
37 #include "components/google/core/browser/google_util.h" | 38 #include "components/google/core/browser/google_util.h" |
39 #include "components/variations/variations_associated_data.h" | |
38 #include "content/public/browser/browser_thread.h" | 40 #include "content/public/browser/browser_thread.h" |
39 #include "content/public/browser/cert_store.h" | 41 #include "content/public/browser/cert_store.h" |
40 #include "content/public/browser/interstitial_page.h" | 42 #include "content/public/browser/interstitial_page.h" |
41 #include "content/public/browser/interstitial_page_delegate.h" | 43 #include "content/public/browser/interstitial_page_delegate.h" |
42 #include "content/public/browser/navigation_controller.h" | 44 #include "content/public/browser/navigation_controller.h" |
43 #include "content/public/browser/navigation_entry.h" | 45 #include "content/public/browser/navigation_entry.h" |
44 #include "content/public/browser/notification_service.h" | 46 #include "content/public/browser/notification_service.h" |
45 #include "content/public/browser/notification_types.h" | 47 #include "content/public/browser/notification_types.h" |
46 #include "content/public/browser/render_process_host.h" | 48 #include "content/public/browser/render_process_host.h" |
47 #include "content/public/browser/render_view_host.h" | 49 #include "content/public/browser/render_view_host.h" |
(...skipping 23 matching lines...) Expand all Loading... | |
71 #include "chrome/common/url_constants.h" | 73 #include "chrome/common/url_constants.h" |
72 #endif | 74 #endif |
73 | 75 |
74 using base::ASCIIToUTF16; | 76 using base::ASCIIToUTF16; |
75 using base::TimeTicks; | 77 using base::TimeTicks; |
76 using content::InterstitialPage; | 78 using content::InterstitialPage; |
77 using content::InterstitialPageDelegate; | 79 using content::InterstitialPageDelegate; |
78 using content::NavigationController; | 80 using content::NavigationController; |
79 using content::NavigationEntry; | 81 using content::NavigationEntry; |
80 | 82 |
83 // Constants for the HTTPSErrorReporter Finch experiment | |
84 const char kHTTPSErrorReporterFinchExperimentName[] = "ReportCertificateErrors"; | |
85 const char kHTTPSErrorReporterFinchGroupShowPossiblySend[] = | |
86 "ShowAndPossiblySend"; | |
87 const char kHTTPSErrorReporterFinchParamName[] = "possibly_send"; | |
88 | |
81 namespace { | 89 namespace { |
82 | 90 |
83 // URL for help page. | 91 // URL for help page. |
84 const char kHelpURL[] = "https://support.google.com/chrome/answer/4454607"; | 92 const char kHelpURL[] = "https://support.google.com/chrome/answer/4454607"; |
85 | 93 |
86 // Constants for the Experience Sampling instrumentation. | 94 // Constants for the Experience Sampling instrumentation. |
87 const char kEventNameBase[] = "ssl_interstitial_"; | 95 const char kEventNameBase[] = "ssl_interstitial_"; |
88 const char kEventNotOverridable[] = "notoverridable_"; | 96 const char kEventNotOverridable[] = "notoverridable_"; |
89 const char kEventOverridable[] = "overridable_"; | 97 const char kEventOverridable[] = "overridable_"; |
90 | 98 |
91 // Events for UMA. Do not reorder or change! | 99 // Events for UMA. Do not reorder or change! |
92 enum SSLExpirationAndDecision { | 100 enum SSLExpirationAndDecision { |
93 EXPIRED_AND_PROCEED, | 101 EXPIRED_AND_PROCEED, |
94 EXPIRED_AND_DO_NOT_PROCEED, | 102 EXPIRED_AND_DO_NOT_PROCEED, |
95 NOT_EXPIRED_AND_PROCEED, | 103 NOT_EXPIRED_AND_PROCEED, |
96 NOT_EXPIRED_AND_DO_NOT_PROCEED, | 104 NOT_EXPIRED_AND_DO_NOT_PROCEED, |
97 END_OF_SSL_EXPIRATION_AND_DECISION, | 105 END_OF_SSL_EXPIRATION_AND_DECISION, |
98 }; | 106 }; |
99 | 107 |
100 // Rappor prefix | 108 // Rappor prefix |
101 const char kSSLRapporPrefix[] = "ssl"; | 109 const char kSSLRapporPrefix[] = "ssl"; |
102 | 110 |
111 // Check whether to show the certificate reporter checkbox | |
112 bool ShouldShowCertificateReporterCheckbox(bool in_incognito) { | |
113 // Check Finch parameters | |
114 return base::FieldTrialList::FindFullName( | |
115 kHTTPSErrorReporterFinchExperimentName) | |
felt
2015/04/03 14:32:28
nit: this indentation is very odd, is this what gi
fahl
2015/04/03 17:39:31
Yep, I usually run git cl format before git cl upl
| |
116 .compare(kHTTPSErrorReporterFinchGroupShowPossiblySend) == 0 && | |
felt
2015/04/03 14:32:29
nit: you normally see this as FindFullName(name) =
fahl
2015/04/03 17:39:31
Done.
| |
117 !in_incognito; | |
118 } | |
119 | |
120 // Check whether to report certificate verification errors to Google | |
121 bool ShouldReportCertificateErrors(bool in_incognito) { | |
122 DCHECK(ShouldShowCertificateReporterCheckbox(in_incognito)); | |
123 // Check Finch parameters | |
felt
2015/04/03 14:32:29
either leave off this comment (as it's obvious), o
fahl
2015/04/03 17:39:31
Done.
| |
124 const std::string param = | |
125 variations::GetVariationParamValue(kHTTPSErrorReporterFinchExperimentName, | |
126 kHTTPSErrorReporterFinchParamName); | |
127 if (param.compare("") != 0) { | |
felt
2015/04/03 14:32:29
this is an awfully weird check too. if (!param.emp
fahl
2015/04/03 17:39:31
Done.
| |
128 double possiblySend; | |
felt
2015/04/03 14:32:28
nit: would "sendingThreshold" be a more descriptiv
fahl
2015/04/03 17:39:31
Done.
| |
129 if (base::StringToDouble(param, &possiblySend)) | |
felt
2015/04/03 14:32:29
you'll need { } for the outermost one because its
fahl
2015/04/03 17:39:31
Done.
| |
130 if (possiblySend >= 0.0 && possiblySend <= 1.0) | |
131 return base::RandDouble() <= possiblySend; | |
132 } | |
133 return false; | |
134 } | |
135 | |
103 void RecordSSLExpirationPageEventState(bool expired_but_previously_allowed, | 136 void RecordSSLExpirationPageEventState(bool expired_but_previously_allowed, |
104 bool proceed, | 137 bool proceed, |
105 bool overridable) { | 138 bool overridable) { |
106 SSLExpirationAndDecision event; | 139 SSLExpirationAndDecision event; |
107 if (expired_but_previously_allowed && proceed) | 140 if (expired_but_previously_allowed && proceed) |
108 event = EXPIRED_AND_PROCEED; | 141 event = EXPIRED_AND_PROCEED; |
109 else if (expired_but_previously_allowed && !proceed) | 142 else if (expired_but_previously_allowed && !proceed) |
110 event = EXPIRED_AND_DO_NOT_PROCEED; | 143 event = EXPIRED_AND_DO_NOT_PROCEED; |
111 else if (!expired_but_previously_allowed && proceed) | 144 else if (!expired_but_previously_allowed && proceed) |
112 event = NOT_EXPIRED_AND_PROCEED; | 145 event = NOT_EXPIRED_AND_PROCEED; |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
449 &encoded_chain); | 482 &encoded_chain); |
450 load_time_data->SetString( | 483 load_time_data->SetString( |
451 "pem", JoinString(encoded_chain, std::string())); | 484 "pem", JoinString(encoded_chain, std::string())); |
452 | 485 |
453 PopulateExtendedReportingOption(load_time_data); | 486 PopulateExtendedReportingOption(load_time_data); |
454 } | 487 } |
455 | 488 |
456 void SSLBlockingPage::PopulateExtendedReportingOption( | 489 void SSLBlockingPage::PopulateExtendedReportingOption( |
457 base::DictionaryValue* load_time_data) { | 490 base::DictionaryValue* load_time_data) { |
458 // Only show the checkbox if not off-the-record and if the | 491 // Only show the checkbox if not off-the-record and if the |
459 // command-line option is set. | 492 // command-line option is set. |
felt
2015/04/03 14:32:29
does this comment need to be updated?
fahl
2015/04/03 17:39:31
Done.
| |
460 const bool show = !web_contents()->GetBrowserContext()->IsOffTheRecord() && | 493 const bool show = ShouldShowCertificateReporterCheckbox( |
461 base::CommandLine::ForCurrentProcess()->HasSwitch( | 494 web_contents()->GetBrowserContext()->IsOffTheRecord()); |
462 switches::kEnableInvalidCertCollection); | |
463 | 495 |
464 load_time_data->SetBoolean(interstitials::kDisplayCheckBox, show); | 496 load_time_data->SetBoolean(interstitials::kDisplayCheckBox, show); |
465 if (!show) | 497 if (!show) |
466 return; | 498 return; |
467 | 499 |
468 load_time_data->SetBoolean( | 500 load_time_data->SetBoolean( |
469 interstitials::kBoxChecked, | 501 interstitials::kBoxChecked, |
470 IsPrefEnabled(prefs::kSafeBrowsingExtendedReportingEnabled)); | 502 IsPrefEnabled(prefs::kSafeBrowsingExtendedReportingEnabled)); |
471 | 503 |
472 const std::string privacy_link = base::StringPrintf( | 504 const std::string privacy_link = base::StringPrintf( |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
638 else | 670 else |
639 event_name.append(kEventNotOverridable); | 671 event_name.append(kEventNotOverridable); |
640 event_name.append(net::ErrorToString(cert_error_)); | 672 event_name.append(net::ErrorToString(cert_error_)); |
641 return event_name; | 673 return event_name; |
642 } | 674 } |
643 | 675 |
644 void SSLBlockingPage::FinishCertCollection() { | 676 void SSLBlockingPage::FinishCertCollection() { |
645 base::ScopedClosureRunner scoped_callback( | 677 base::ScopedClosureRunner scoped_callback( |
646 certificate_report_callback_for_testing_); | 678 certificate_report_callback_for_testing_); |
647 | 679 |
648 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( | 680 if (!ShouldShowCertificateReporterCheckbox( |
649 switches::kEnableInvalidCertCollection) || | 681 web_contents()->GetBrowserContext()->IsOffTheRecord())) { |
650 web_contents()->GetBrowserContext()->IsOffTheRecord()) { | |
651 return; | 682 return; |
652 } | 683 } |
653 | 684 |
654 const bool enabled = | 685 const bool enabled = |
felt
2015/04/03 14:32:29
should this pref check be moved into ShouldShowCer
fahl
2015/04/03 17:39:31
Currently, IsPrefEnabled is a protected member of
estark
2015/04/03 17:44:36
I don't think there's any problem with making Shou
felt
2015/04/03 22:38:09
you're right emily, nevermind sascha
| |
655 IsPrefEnabled(prefs::kSafeBrowsingExtendedReportingEnabled); | 686 IsPrefEnabled(prefs::kSafeBrowsingExtendedReportingEnabled); |
656 | 687 |
657 if (!enabled) | 688 if (!enabled) |
658 return; | 689 return; |
659 | 690 |
660 metrics_helper()->RecordUserInteraction( | 691 metrics_helper()->RecordUserInteraction( |
661 SecurityInterstitialMetricsHelper::EXTENDED_REPORTING_IS_ENABLED); | 692 SecurityInterstitialMetricsHelper::EXTENDED_REPORTING_IS_ENABLED); |
662 | 693 |
663 if (certificate_report_callback_for_testing_.is_null()) | 694 if (ShouldReportCertificateErrors( |
664 scoped_callback.Reset(base::Bind(&base::DoNothing)); | 695 web_contents()->GetBrowserContext()->IsOffTheRecord())) { |
665 | 696 if (certificate_report_callback_for_testing_.is_null()) |
666 safe_browsing_ui_manager_->ReportInvalidCertificateChain( | 697 scoped_callback.Reset(base::Bind(&base::DoNothing)); |
667 request_url().host(), ssl_info_, scoped_callback.Release()); | 698 safe_browsing_ui_manager_->ReportInvalidCertificateChain( |
699 request_url().host(), ssl_info_, scoped_callback.Release()); | |
700 } | |
668 } | 701 } |
669 | 702 |
670 // static | 703 // static |
671 bool SSLBlockingPage::IsOptionsOverridable(int options_mask) { | 704 bool SSLBlockingPage::IsOptionsOverridable(int options_mask) { |
672 return (options_mask & SSLBlockingPage::OVERRIDABLE) && | 705 return (options_mask & SSLBlockingPage::OVERRIDABLE) && |
673 !(options_mask & SSLBlockingPage::STRICT_ENFORCEMENT); | 706 !(options_mask & SSLBlockingPage::STRICT_ENFORCEMENT); |
674 } | 707 } |
OLD | NEW |