blob: 3913415c9efd7c37076d4b6028bbb54eacc4126c [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/safe_browsing/password_protection/metrics_util.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/time/time.h"
#include "net/http/http_status_code.h"
namespace safe_browsing {
const char kAnyPasswordEntryRequestOutcomeHistogram[] =
"PasswordProtection.RequestOutcome.AnyPasswordEntry";
const char kAnyPasswordEntryVerdictHistogram[] =
"PasswordProtection.Verdict.AnyPasswordEntry";
const char kEnterprisePasswordEntryRequestOutcomeHistogram[] =
"PasswordProtection.RequestOutcome.NonGaiaEnterprisePasswordEntry";
const char kEnterprisePasswordEntryVerdictHistogram[] =
"PasswordProtection.Verdict.NonGaiaEnterprisePasswordEntry";
const char kEnterprisePasswordPageInfoHistogram[] =
"PasswordProtection.PageInfoAction.NonGaiaEnterprisePasswordEntry";
const char kEnterprisePasswordInterstitialHistogram[] =
"PasswordProtection.InterstitialAction.NonGaiaEnterprisePasswordEntry";
const char kEnterprisePasswordWarningDialogHistogram[] =
"PasswordProtection.ModalWarningDialogAction."
"NonGaiaEnterprisePasswordEntry";
const char kGSuiteSyncPasswordEntryRequestOutcomeHistogram[] =
"PasswordProtection.RequestOutcome.GSuiteSyncPasswordEntry";
const char kGSuiteSyncPasswordEntryVerdictHistogram[] =
"PasswordProtection.Verdict.GSuiteSyncPasswordEntry";
const char kGSuiteSyncPasswordInterstitialHistogram[] =
"PasswordProtection.InterstitialAction.GSuiteSyncPasswordEntry";
const char kGSuiteSyncPasswordPageInfoHistogram[] =
"PasswordProtection.PageInfoAction.GSuiteSyncPasswordEntry";
const char kGSuiteSyncPasswordWarningDialogHistogram[] =
"PasswordProtection.ModalWarningDialogAction.GSuiteSyncPasswordEntry";
const char kPasswordOnFocusRequestOutcomeHistogram[] =
"PasswordProtection.RequestOutcome.PasswordFieldOnFocus";
const char kPasswordOnFocusVerdictHistogram[] =
"PasswordProtection.Verdict.PasswordFieldOnFocus";
const char kProtectedPasswordEntryRequestOutcomeHistogram[] =
"PasswordProtection.RequestOutcome.ProtectedPasswordEntry";
const char kProtectedPasswordEntryVerdictHistogram[] =
"PasswordProtection.Verdict.ProtectedPasswordEntry";
const char kSyncPasswordEntryRequestOutcomeHistogram[] =
"PasswordProtection.RequestOutcome.SyncPasswordEntry";
const char kSyncPasswordEntryVerdictHistogram[] =
"PasswordProtection.Verdict.SyncPasswordEntry";
const char kSyncPasswordChromeSettingsHistogram[] =
"PasswordProtection.ChromeSettingsAction.SyncPasswordEntry";
const char kSyncPasswordInterstitialHistogram[] =
"PasswordProtection.InterstitialAction.SyncPasswordEntry";
const char kSyncPasswordPageInfoHistogram[] =
"PasswordProtection.PageInfoAction.SyncPasswordEntry";
const char kSyncPasswordWarningDialogHistogram[] =
"PasswordProtection.ModalWarningDialogAction.SyncPasswordEntry";
void LogPasswordEntryRequestOutcome(RequestOutcome outcome,
ReusedPasswordType password_type,
SyncAccountType sync_account_type) {
UMA_HISTOGRAM_ENUMERATION(kAnyPasswordEntryRequestOutcomeHistogram, outcome);
if (password_type == PasswordReuseEvent::SIGN_IN_PASSWORD) {
if (sync_account_type == PasswordReuseEvent::GSUITE) {
UMA_HISTOGRAM_ENUMERATION(kGSuiteSyncPasswordEntryRequestOutcomeHistogram,
outcome);
}
UMA_HISTOGRAM_ENUMERATION(kSyncPasswordEntryRequestOutcomeHistogram,
outcome);
} else if (password_type == PasswordReuseEvent::ENTERPRISE_PASSWORD) {
UMA_HISTOGRAM_ENUMERATION(kEnterprisePasswordEntryRequestOutcomeHistogram,
outcome);
} else {
UMA_HISTOGRAM_ENUMERATION(kProtectedPasswordEntryRequestOutcomeHistogram,
outcome);
}
}
void LogPasswordOnFocusRequestOutcome(RequestOutcome outcome) {
UMA_HISTOGRAM_ENUMERATION(kPasswordOnFocusRequestOutcomeHistogram, outcome);
}
void LogPasswordAlertModeOutcome(RequestOutcome outcome,
ReusedPasswordType password_type) {
DCHECK(password_type == PasswordReuseEvent::SIGN_IN_PASSWORD ||
password_type == PasswordReuseEvent::ENTERPRISE_PASSWORD);
if (password_type == PasswordReuseEvent::SIGN_IN_PASSWORD) {
UMA_HISTOGRAM_ENUMERATION(
"PasswordProtection.PasswordAlertModeOutcome.GSuiteSyncPasswordEntry",
outcome);
} else {
UMA_HISTOGRAM_ENUMERATION(
"PasswordProtection.PasswordAlertModeOutcome."
"NonGaiaEnterprisePasswordEntry",
outcome);
}
}
void LogNoPingingReason(LoginReputationClientRequest::TriggerType trigger_type,
RequestOutcome reason,
ReusedPasswordType password_type,
SyncAccountType sync_account_type) {
DCHECK(trigger_type == LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE ||
trigger_type == LoginReputationClientRequest::PASSWORD_REUSE_EVENT);
if (trigger_type == LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE) {
UMA_HISTOGRAM_ENUMERATION(kPasswordOnFocusRequestOutcomeHistogram, reason);
} else {
LogPasswordEntryRequestOutcome(reason, password_type, sync_account_type);
}
}
void LogPasswordProtectionVerdict(
LoginReputationClientRequest::TriggerType trigger_type,
ReusedPasswordType password_type,
SyncAccountType sync_account_type,
VerdictType verdict_type) {
switch (trigger_type) {
case LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE:
UMA_HISTOGRAM_ENUMERATION(
kPasswordOnFocusVerdictHistogram, verdict_type,
LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1);
break;
case LoginReputationClientRequest::PASSWORD_REUSE_EVENT:
UMA_HISTOGRAM_ENUMERATION(
kAnyPasswordEntryVerdictHistogram, verdict_type,
LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1);
if (password_type == PasswordReuseEvent::SIGN_IN_PASSWORD) {
if (sync_account_type == PasswordReuseEvent::GSUITE) {
UMA_HISTOGRAM_ENUMERATION(
kGSuiteSyncPasswordEntryVerdictHistogram, verdict_type,
LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1);
}
UMA_HISTOGRAM_ENUMERATION(
kSyncPasswordEntryVerdictHistogram, verdict_type,
LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1);
} else if (password_type == PasswordReuseEvent::ENTERPRISE_PASSWORD) {
UMA_HISTOGRAM_ENUMERATION(
kEnterprisePasswordEntryVerdictHistogram, verdict_type,
LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1);
} else {
UMA_HISTOGRAM_ENUMERATION(
kProtectedPasswordEntryVerdictHistogram, verdict_type,
LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1);
}
break;
default:
NOTREACHED();
}
}
void LogSyncAccountType(SyncAccountType sync_account_type) {
UMA_HISTOGRAM_ENUMERATION(
"PasswordProtection.PasswordReuseSyncAccountType", sync_account_type,
LoginReputationClientRequest::PasswordReuseEvent::SyncAccountType_MAX +
1);
}
void LogPasswordProtectionNetworkResponseAndDuration(
int response_code,
const base::TimeTicks& request_start_time) {
base::UmaHistogramSparse(
"PasswordProtection.PasswordProtectionResponseOrErrorCode",
response_code);
if (response_code == net::HTTP_OK) {
UMA_HISTOGRAM_TIMES("PasswordProtection.RequestNetworkDuration",
base::TimeTicks::Now() - request_start_time);
}
}
void LogWarningAction(WarningUIType ui_type,
WarningAction action,
ReusedPasswordType password_type,
SyncAccountType sync_account_type) {
// |password_type| can be unknown if user directly navigates to
// chrome://reset-password page. In this case, do not record user action.
if (password_type == PasswordReuseEvent::REUSED_PASSWORD_TYPE_UNKNOWN &&
ui_type == WarningUIType::INTERSTITIAL) {
return;
}
bool is_sign_in_password =
password_type == PasswordReuseEvent::SIGN_IN_PASSWORD;
bool is_gsuite_user = sync_account_type == PasswordReuseEvent::GSUITE;
switch (ui_type) {
case WarningUIType::PAGE_INFO:
if (is_sign_in_password) {
UMA_HISTOGRAM_ENUMERATION(kSyncPasswordPageInfoHistogram, action);
if (is_gsuite_user) {
UMA_HISTOGRAM_ENUMERATION(kGSuiteSyncPasswordPageInfoHistogram,
action);
}
} else {
UMA_HISTOGRAM_ENUMERATION(kEnterprisePasswordPageInfoHistogram, action);
}
break;
case WarningUIType::MODAL_DIALOG:
if (is_sign_in_password) {
UMA_HISTOGRAM_ENUMERATION(kSyncPasswordWarningDialogHistogram, action);
if (is_gsuite_user) {
UMA_HISTOGRAM_ENUMERATION(kGSuiteSyncPasswordWarningDialogHistogram,
action);
}
} else {
UMA_HISTOGRAM_ENUMERATION(kEnterprisePasswordWarningDialogHistogram,
action);
}
break;
case WarningUIType::CHROME_SETTINGS:
DCHECK(is_sign_in_password);
UMA_HISTOGRAM_ENUMERATION(kSyncPasswordChromeSettingsHistogram, action);
break;
case WarningUIType::INTERSTITIAL:
if (is_sign_in_password) {
UMA_HISTOGRAM_ENUMERATION(kSyncPasswordInterstitialHistogram, action);
if (is_gsuite_user) {
UMA_HISTOGRAM_ENUMERATION(kGSuiteSyncPasswordInterstitialHistogram,
action);
}
} else {
UMA_HISTOGRAM_ENUMERATION(kEnterprisePasswordInterstitialHistogram,
action);
}
break;
case WarningUIType::NOT_USED:
NOTREACHED();
break;
}
}
void LogNumberOfReuseBeforeSyncPasswordChange(size_t reuse_count) {
UMA_HISTOGRAM_COUNTS_100(
"PasswordProtection.GaiaPasswordReusesBeforeGaiaPasswordChanged",
reuse_count);
}
void LogContentsSize(const gfx::Size& size) {
if (size.width() <= 0 || size.height() <= 0)
return;
UMA_HISTOGRAM_COUNTS_10000("SafeBrowsing.ContentsSize.Width", size.width());
UMA_HISTOGRAM_COUNTS_10000("SafeBrowsing.ContentsSize.Height", size.height());
}
} // namespace safe_browsing