blob: ac61553f9afca74b914456847ae731905b0b9298 [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 kGmailSyncPasswordEntryRequestOutcomeHistogram[] =
"PasswordProtection.RequestOutcome.GmailSyncPasswordEntry";
const char kGmailNonSyncPasswordEntryRequestOutcomeHistogram[] =
"PasswordProtection.RequestOutcome.GmailNonSyncPasswordEntry";
const char kGSuiteSyncPasswordEntryRequestOutcomeHistogram[] =
"PasswordProtection.RequestOutcome.GSuiteSyncPasswordEntry";
const char kGSuiteNonSyncPasswordEntryRequestOutcomeHistogram[] =
"PasswordProtection.RequestOutcome.GSuiteNonSyncPasswordEntry";
const char kSavedPasswordEntryRequestOutcomeHistogram[] =
"PasswordProtection.RequestOutcome.SavedPasswordEntry";
const char kGSuiteSyncPasswordEntryVerdictHistogram[] =
"PasswordProtection.Verdict.GSuiteSyncPasswordEntry";
const char kGSuiteNonSyncPasswordEntryVerdictHistogram[] =
"PasswordProtection.Verdict.GSuiteNonSyncPasswordEntry";
const char kGmailSyncPasswordEntryVerdictHistogram[] =
"PasswordProtection.Verdict.GmailSyncPasswordEntry";
const char kGmailNonSyncPasswordEntryVerdictHistogram[] =
"PasswordProtection.Verdict.GmailNonSyncPasswordEntry";
const char kSavedPasswordEntryVerdictHistogram[] =
"PasswordProtection.Verdict.SavedPasswordEntry";
const char kGmailNonSyncPasswordInterstitialHistogram[] =
"PasswordProtection.InterstitialAction.GmailNonSyncPasswordEntry";
const char kGmailSyncPasswordPageInfoHistogram[] =
"PasswordProtection.PageInfoAction.GmailSyncPasswordEntry";
const char kGmailNonSyncPasswordPageInfoHistogram[] =
"PasswordProtection.PageInfoAction.GmailNonSyncPasswordEntry";
const char kSavedPasswordPageInfoHistogram[] =
"PasswordProtection.PageInfoAction.SavedPasswordEntry";
const char kGmailSyncPasswordWarningDialogHistogram[] =
"PasswordProtection.ModalWarningDialogAction.GmailSyncPasswordEntry";
const char kGmailNonSyncPasswordWarningDialogHistogram[] =
"PasswordProtection.ModalWarningDialogAction.GmailNonSyncPasswordEntry";
const char kNonSyncPasswordInterstitialHistogram[] =
"PasswordProtection.InterstitialAction.NonSyncPasswordEntry";
const char kNonSyncPasswordPageInfoHistogram[] =
"PasswordProtection.PageInfoAction.NonSyncPasswordEntry";
const char kGSuiteSyncPasswordInterstitialHistogram[] =
"PasswordProtection.InterstitialAction.GSuiteSyncPasswordEntry";
const char kGSuiteNonSyncPasswordInterstitialHistogram[] =
"PasswordProtection.InterstitialAction.GSuiteNonSyncPasswordEntry";
const char kGSuiteSyncPasswordPageInfoHistogram[] =
"PasswordProtection.PageInfoAction.GSuiteSyncPasswordEntry";
const char kGSuiteNonSyncPasswordPageInfoHistogram[] =
"PasswordProtection.PageInfoAction.GSuiteNonSyncPasswordEntry";
const char kGSuiteSyncPasswordWarningDialogHistogram[] =
"PasswordProtection.ModalWarningDialogAction.GSuiteSyncPasswordEntry";
const char kGSuiteNonSyncPasswordWarningDialogHistogram[] =
"PasswordProtection.ModalWarningDialogAction.GSuiteNonSyncPasswordEntry";
const char kSavedPasswordWarningDialogHistogram[] =
"PasswordProtection.ModalWarningDialogAction.SavedPasswordEntry";
const char kNonSyncPasswordWarningDialogHistogram[] =
"PasswordProtection.ModalWarningDialogAction.NonSyncPasswordEntry";
const char kPasswordOnFocusRequestOutcomeHistogram[] =
"PasswordProtection.RequestOutcome.PasswordFieldOnFocus";
const char kPasswordOnFocusVerdictHistogram[] =
"PasswordProtection.Verdict.PasswordFieldOnFocus";
const char kNonSyncPasswordEntryRequestOutcomeHistogram[] =
"PasswordProtection.RequestOutcome.NonSyncPasswordEntry";
const char kSyncPasswordEntryRequestOutcomeHistogram[] =
"PasswordProtection.RequestOutcome.SyncPasswordEntry";
const char kSyncPasswordEntryVerdictHistogram[] =
"PasswordProtection.Verdict.SyncPasswordEntry";
const char kNonSyncPasswordEntryVerdictHistogram[] =
"PasswordProtection.Verdict.NonSyncPasswordEntry";
const char kSyncPasswordChromeSettingsHistogram[] =
"PasswordProtection.ChromeSettingsAction.SyncPasswordEntry";
const char kSyncPasswordInterstitialHistogram[] =
"PasswordProtection.InterstitialAction.SyncPasswordEntry";
const char kSyncPasswordPageInfoHistogram[] =
"PasswordProtection.PageInfoAction.SyncPasswordEntry";
const char kSyncPasswordWarningDialogHistogram[] =
"PasswordProtection.ModalWarningDialogAction.SyncPasswordEntry";
const char kEnterprisePasswordAlertHistogram[] =
"PasswordProtection.PasswordAlertModeOutcome."
"NonGaiaEnterprisePasswordEntry";
const char kGsuiteSyncPasswordAlertHistogram[] =
"PasswordProtection.PasswordAlertModeOutcome.GSuiteSyncPasswordEntry";
const char kGsuiteNonSyncPasswordAlertHistogram[] =
"PasswordProtection.PasswordAlertModeOutcome.GSuiteNonSyncPasswordEntry";
void LogPasswordEntryRequestOutcome(
RequestOutcome outcome,
ReusedPasswordAccountType password_account_type) {
UMA_HISTOGRAM_ENUMERATION(kAnyPasswordEntryRequestOutcomeHistogram, outcome);
bool is_gsuite_user =
password_account_type.account_type() == ReusedPasswordAccountType::GSUITE;
bool is_primary_account_password = password_account_type.is_account_syncing();
if (is_primary_account_password) {
if (is_gsuite_user) {
UMA_HISTOGRAM_ENUMERATION(kGSuiteSyncPasswordEntryRequestOutcomeHistogram,
outcome);
} else {
UMA_HISTOGRAM_ENUMERATION(kGmailSyncPasswordEntryRequestOutcomeHistogram,
outcome);
}
UMA_HISTOGRAM_ENUMERATION(kSyncPasswordEntryRequestOutcomeHistogram,
outcome);
} else if (password_account_type.account_type() ==
ReusedPasswordAccountType::NON_GAIA_ENTERPRISE) {
UMA_HISTOGRAM_ENUMERATION(kEnterprisePasswordEntryRequestOutcomeHistogram,
outcome);
} else if (password_account_type.account_type() ==
ReusedPasswordAccountType::SAVED_PASSWORD) {
UMA_HISTOGRAM_ENUMERATION(kSavedPasswordEntryRequestOutcomeHistogram,
outcome);
} else {
if (is_gsuite_user) {
UMA_HISTOGRAM_ENUMERATION(
kGSuiteNonSyncPasswordEntryRequestOutcomeHistogram, outcome);
} else {
UMA_HISTOGRAM_ENUMERATION(
kGmailNonSyncPasswordEntryRequestOutcomeHistogram, outcome);
}
UMA_HISTOGRAM_ENUMERATION(kNonSyncPasswordEntryRequestOutcomeHistogram,
outcome);
}
}
void LogPasswordOnFocusRequestOutcome(RequestOutcome outcome) {
UMA_HISTOGRAM_ENUMERATION(kPasswordOnFocusRequestOutcomeHistogram, outcome);
}
void LogPasswordAlertModeOutcome(
RequestOutcome outcome,
ReusedPasswordAccountType password_account_type) {
DCHECK_NE(ReusedPasswordAccountType::GMAIL,
password_account_type.account_type());
if (password_account_type.account_type() ==
ReusedPasswordAccountType::NON_GAIA_ENTERPRISE) {
UMA_HISTOGRAM_ENUMERATION(kEnterprisePasswordAlertHistogram, outcome);
} else {
if (password_account_type.is_account_syncing()) {
UMA_HISTOGRAM_ENUMERATION(kGsuiteSyncPasswordAlertHistogram, outcome);
} else {
UMA_HISTOGRAM_ENUMERATION(kGsuiteNonSyncPasswordAlertHistogram, outcome);
}
}
}
void LogNoPingingReason(LoginReputationClientRequest::TriggerType trigger_type,
RequestOutcome reason,
ReusedPasswordAccountType password_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_account_type);
}
}
void LogPasswordProtectionVerdict(
LoginReputationClientRequest::TriggerType trigger_type,
ReusedPasswordAccountType password_account_type,
VerdictType verdict_type) {
bool is_gsuite_user =
password_account_type.account_type() == ReusedPasswordAccountType::GSUITE;
bool is_gmail_user =
password_account_type.account_type() == ReusedPasswordAccountType::GMAIL;
bool is_account_syncing = password_account_type.is_account_syncing();
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 (is_account_syncing) {
UMA_HISTOGRAM_ENUMERATION(
kSyncPasswordEntryVerdictHistogram, verdict_type,
(LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1));
} else if (is_gsuite_user || is_gmail_user) {
UMA_HISTOGRAM_ENUMERATION(
kNonSyncPasswordEntryVerdictHistogram, verdict_type,
(LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1));
}
if (is_gsuite_user) {
if (is_account_syncing) {
UMA_HISTOGRAM_ENUMERATION(
kGSuiteSyncPasswordEntryVerdictHistogram, verdict_type,
(LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1));
} else {
UMA_HISTOGRAM_ENUMERATION(
kGSuiteNonSyncPasswordEntryVerdictHistogram, verdict_type,
(LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1));
}
} else if (is_gmail_user) {
if (is_account_syncing) {
UMA_HISTOGRAM_ENUMERATION(
kGmailSyncPasswordEntryVerdictHistogram, verdict_type,
(LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1));
} else {
UMA_HISTOGRAM_ENUMERATION(
kGmailNonSyncPasswordEntryVerdictHistogram, verdict_type,
(LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1));
}
} else if (password_account_type.account_type() ==
ReusedPasswordAccountType::NON_GAIA_ENTERPRISE) {
UMA_HISTOGRAM_ENUMERATION(
kEnterprisePasswordEntryVerdictHistogram, verdict_type,
(LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1));
} else if (password_account_type.account_type() ==
ReusedPasswordAccountType::SAVED_PASSWORD) {
UMA_HISTOGRAM_ENUMERATION(
kSavedPasswordEntryVerdictHistogram, 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 LogPasswordProtectionSampleReportSent() {
base::UmaHistogramBoolean("PasswordProtection.SampleReportSent", true);
}
void LogWarningAction(WarningUIType ui_type,
WarningAction action,
ReusedPasswordAccountType password_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_account_type.account_type() ==
ReusedPasswordAccountType::UNKNOWN &&
ui_type == WarningUIType::INTERSTITIAL) {
return;
}
bool is_gsuite_user =
password_account_type.account_type() == ReusedPasswordAccountType::GSUITE;
bool is_primary_account_password = password_account_type.is_account_syncing();
switch (ui_type) {
case WarningUIType::PAGE_INFO:
if (is_primary_account_password) {
UMA_HISTOGRAM_ENUMERATION(kSyncPasswordPageInfoHistogram, action);
if (is_gsuite_user) {
UMA_HISTOGRAM_ENUMERATION(kGSuiteSyncPasswordPageInfoHistogram,
action);
} else {
UMA_HISTOGRAM_ENUMERATION(kGmailSyncPasswordPageInfoHistogram,
action);
}
} else if (password_account_type.account_type() ==
ReusedPasswordAccountType::NON_GAIA_ENTERPRISE) {
UMA_HISTOGRAM_ENUMERATION(kEnterprisePasswordPageInfoHistogram, action);
} else if (password_account_type.account_type() ==
ReusedPasswordAccountType::SAVED_PASSWORD) {
UMA_HISTOGRAM_ENUMERATION(kSavedPasswordPageInfoHistogram, action);
} else {
UMA_HISTOGRAM_ENUMERATION(kNonSyncPasswordPageInfoHistogram, action);
if (is_gsuite_user) {
UMA_HISTOGRAM_ENUMERATION(kGSuiteNonSyncPasswordPageInfoHistogram,
action);
} else {
UMA_HISTOGRAM_ENUMERATION(kGmailNonSyncPasswordPageInfoHistogram,
action);
}
}
break;
case WarningUIType::MODAL_DIALOG:
if (is_primary_account_password) {
UMA_HISTOGRAM_ENUMERATION(kSyncPasswordWarningDialogHistogram, action);
if (is_gsuite_user) {
UMA_HISTOGRAM_ENUMERATION(kGSuiteSyncPasswordWarningDialogHistogram,
action);
} else {
UMA_HISTOGRAM_ENUMERATION(kGmailSyncPasswordWarningDialogHistogram,
action);
}
} else if (password_account_type.account_type() ==
ReusedPasswordAccountType::NON_GAIA_ENTERPRISE) {
UMA_HISTOGRAM_ENUMERATION(kEnterprisePasswordWarningDialogHistogram,
action);
} else if (password_account_type.account_type() ==
ReusedPasswordAccountType::SAVED_PASSWORD) {
UMA_HISTOGRAM_ENUMERATION(kSavedPasswordWarningDialogHistogram, action);
} else {
UMA_HISTOGRAM_ENUMERATION(kNonSyncPasswordWarningDialogHistogram,
action);
if (is_gsuite_user) {
UMA_HISTOGRAM_ENUMERATION(
kGSuiteNonSyncPasswordWarningDialogHistogram, action);
} else {
UMA_HISTOGRAM_ENUMERATION(kGmailNonSyncPasswordWarningDialogHistogram,
action);
}
}
break;
case WarningUIType::CHROME_SETTINGS:
DCHECK(is_primary_account_password);
UMA_HISTOGRAM_ENUMERATION(kSyncPasswordChromeSettingsHistogram, action);
break;
case WarningUIType::INTERSTITIAL:
if (is_primary_account_password) {
UMA_HISTOGRAM_ENUMERATION(kSyncPasswordInterstitialHistogram, action);
if (is_gsuite_user) {
UMA_HISTOGRAM_ENUMERATION(kGSuiteSyncPasswordInterstitialHistogram,
action);
}
} else if (password_account_type.account_type() ==
ReusedPasswordAccountType::NON_GAIA_ENTERPRISE) {
UMA_HISTOGRAM_ENUMERATION(kEnterprisePasswordInterstitialHistogram,
action);
} else {
UMA_HISTOGRAM_ENUMERATION(kNonSyncPasswordInterstitialHistogram,
action);
if (is_gsuite_user) {
UMA_HISTOGRAM_ENUMERATION(kGSuiteNonSyncPasswordInterstitialHistogram,
action);
} else {
UMA_HISTOGRAM_ENUMERATION(kGmailNonSyncPasswordInterstitialHistogram,
action);
}
}
break;
case WarningUIType::NOT_USED:
NOTREACHED();
break;
}
}
void LogNumberOfReuseBeforeSyncPasswordChange(size_t reuse_count) {
UMA_HISTOGRAM_COUNTS_100(
"PasswordProtection.GaiaPasswordReusesBeforeGaiaPasswordChanged",
reuse_count);
}
} // namespace safe_browsing