Index: components/ssl_errors/error_classification.cc |
diff --git a/components/ssl_errors/error_classification.cc b/components/ssl_errors/error_classification.cc |
index 7ab390bc62adc8d5e8918e574f77f7654a99c4bf..579c5cc01501cad0761378beb91ecf3674f7b11a 100644 |
--- a/components/ssl_errors/error_classification.cc |
+++ b/components/ssl_errors/error_classification.cc |
@@ -16,6 +16,7 @@ |
#include "base/strings/utf_string_conversions.h" |
#include "base/time/time.h" |
#include "build/build_config.h" |
+#include "components/network_time/network_time_tracker.h" |
#include "components/ssl_errors/error_info.h" |
#include "components/url_formatter/url_formatter.h" |
#include "net/base/network_change_notifier.h" |
@@ -117,23 +118,30 @@ base::LazyInstance<base::Time> g_testing_build_time = LAZY_INSTANCE_INITIALIZER; |
} // namespace |
+static ssl_errors::ErrorInfo::ErrorType RecordErrorType(int cert_error) { |
+ ssl_errors::ErrorInfo::ErrorType error_type = |
+ ssl_errors::ErrorInfo::NetErrorToErrorType(cert_error); |
+ UMA_HISTOGRAM_ENUMERATION("interstitial.ssl_error_type", error_type, |
+ ssl_errors::ErrorInfo::END_OF_ENUM); |
+ UMA_HISTOGRAM_ENUMERATION("interstitial.ssl.connection_type", |
+ net::NetworkChangeNotifier::GetConnectionType(), |
+ net::NetworkChangeNotifier::CONNECTION_LAST); |
+ return error_type; |
+} |
+ |
void RecordUMAStatistics(bool overridable, |
const base::Time& current_time, |
const GURL& request_url, |
int cert_error, |
const net::X509Certificate& cert) { |
- ssl_errors::ErrorInfo::ErrorType type = |
- ssl_errors::ErrorInfo::NetErrorToErrorType(cert_error); |
- UMA_HISTOGRAM_ENUMERATION("interstitial.ssl_error_type", type, |
- ssl_errors::ErrorInfo::END_OF_ENUM); |
- switch (type) { |
+ ssl_errors::ErrorInfo::ErrorType error_type = RecordErrorType(cert_error); |
+ |
+ switch (error_type) { |
case ssl_errors::ErrorInfo::CERT_DATE_INVALID: { |
- if (IsUserClockInThePast(base::Time::NowFromSystemTime())) { |
- RecordSSLInterstitialCause(overridable, CLOCK_PAST); |
- } else if (IsUserClockInTheFuture(base::Time::NowFromSystemTime())) { |
- RecordSSLInterstitialCause(overridable, CLOCK_FUTURE); |
- } else if (cert.HasExpired() && |
- (current_time - cert.valid_expiry()).InDays() < 28) { |
+ // Note: not reached when displaying the bad clock interstitial. |
+ // See |RecordUMAStatisticsForClockInterstitial| below. |
+ if (cert.HasExpired() && |
+ (current_time - cert.valid_expiry()).InDays() < 28) { |
RecordSSLInterstitialCause(overridable, EXPIRED_RECENTLY); |
} |
break; |
@@ -176,35 +184,57 @@ void RecordUMAStatistics(bool overridable, |
default: |
break; |
} |
- UMA_HISTOGRAM_ENUMERATION("interstitial.ssl.connection_type", |
- net::NetworkChangeNotifier::GetConnectionType(), |
- net::NetworkChangeNotifier::CONNECTION_LAST); |
} |
-bool IsUserClockInThePast(const base::Time& time_now) { |
- base::Time build_time; |
- if (!g_testing_build_time.Get().is_null()) { |
- build_time = g_testing_build_time.Get(); |
+void RecordUMAStatisticsForClockInterstitial(bool overridable, |
+ ssl_errors::ClockState clock_state, |
+ int cert_error) { |
+ ssl_errors::ErrorInfo::ErrorType error_type = RecordErrorType(cert_error); |
+ DCHECK(error_type == ssl_errors::ErrorInfo::CERT_DATE_INVALID); |
+ |
+ if (clock_state == ssl_errors::CLOCK_STATE_FUTURE) { |
+ RecordSSLInterstitialCause(overridable, CLOCK_FUTURE); |
+ } else if (clock_state == ssl_errors::CLOCK_STATE_PAST) { |
+ RecordSSLInterstitialCause(overridable, CLOCK_PAST); |
} else { |
- build_time = base::GetBuildTime(); |
+ NOTREACHED(); |
} |
- |
- if (time_now < build_time - base::TimeDelta::FromDays(2)) |
- return true; |
- return false; |
} |
-bool IsUserClockInTheFuture(const base::Time& time_now) { |
- base::Time build_time; |
- if (!g_testing_build_time.Get().is_null()) { |
- build_time = g_testing_build_time.Get(); |
- } else { |
- build_time = base::GetBuildTime(); |
+ClockState GetClockState( |
+ const base::Time& now_system, |
+ const network_time::NetworkTimeTracker* network_time_tracker) { |
+ base::Time now_network; |
+ base::TimeDelta uncertainty; |
+ const base::TimeDelta kNetworkTimeFudge = base::TimeDelta::FromMinutes(5); |
+ ClockState network_state = CLOCK_STATE_UNKNOWN; |
+ if (network_time_tracker->GetNetworkTime(&now_network, &uncertainty)) { |
+ if (now_system < now_network - uncertainty - kNetworkTimeFudge) { |
+ network_state = CLOCK_STATE_PAST; |
+ } else if (now_system > now_network + uncertainty + kNetworkTimeFudge) { |
+ network_state = CLOCK_STATE_FUTURE; |
+ } else { |
+ network_state = CLOCK_STATE_OK; |
+ } |
} |
- if (time_now > build_time + base::TimeDelta::FromDays(365)) |
- return true; |
- return false; |
+ ClockState build_time_state = CLOCK_STATE_UNKNOWN; |
+ base::Time build_time = g_testing_build_time.Get().is_null() |
+ ? base::GetBuildTime() |
+ : g_testing_build_time.Get(); |
+ if (now_system < build_time - base::TimeDelta::FromDays(2)) { |
+ build_time_state = CLOCK_STATE_PAST; |
+ } else if (now_system > build_time + base::TimeDelta::FromDays(365)) { |
+ build_time_state = CLOCK_STATE_FUTURE; |
+ } |
+ |
+ UMA_HISTOGRAM_ENUMERATION("interstitial.ssl.clockstate.network", |
+ network_state, CLOCK_STATE_MAX); |
+ UMA_HISTOGRAM_ENUMERATION("interstitial.ssl.clockstate.build_time", |
+ build_time_state, CLOCK_STATE_MAX); |
+ |
+ return network_state == CLOCK_STATE_UNKNOWN ? build_time_state |
+ : network_state; |
} |
void SetBuildTimeForTesting(const base::Time& testing_time) { |