Commit 563ef4b9 authored by dvadym's avatar dvadym Committed by Commit bot

UMA statistics for Linux password storage backend usage

Our main goal is to understand how often is the situation when no security storage is available on Linux and plain text (actually SQL lite db) is used for password storage.

BUG=355223

Review URL: https://codereview.chromium.org/880943002

Cr-Commit-Position: refs/heads/master@{#313691}
parent fc852b86
......@@ -191,20 +191,21 @@ KeyedService* PasswordStoreFactory::BuildServiceInstanceFor(
// On POSIX systems, we try to use the "native" password management system of
// the desktop environment currently running, allowing GNOME Keyring in XFCE.
// (In all cases we fall back on the basic store in case of failure.)
base::nix::DesktopEnvironment desktop_env;
base::nix::DesktopEnvironment desktop_env = GetDesktopEnvironment();
base::nix::DesktopEnvironment used_desktop_env;
std::string store_type =
base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
switches::kPasswordStore);
LinuxBackendUsed used_backend = PLAINTEXT;
if (store_type == "kwallet") {
desktop_env = base::nix::DESKTOP_ENVIRONMENT_KDE4;
used_desktop_env = base::nix::DESKTOP_ENVIRONMENT_KDE4;
} else if (store_type == "gnome") {
desktop_env = base::nix::DESKTOP_ENVIRONMENT_GNOME;
used_desktop_env = base::nix::DESKTOP_ENVIRONMENT_GNOME;
} else if (store_type == "basic") {
desktop_env = base::nix::DESKTOP_ENVIRONMENT_OTHER;
used_desktop_env = base::nix::DESKTOP_ENVIRONMENT_OTHER;
} else {
// Detect the store to use automatically.
scoped_ptr<base::Environment> env(base::Environment::Create());
desktop_env = base::nix::GetDesktopEnvironment(env.get());
used_desktop_env = desktop_env;
const char* name = base::nix::GetDesktopEnvironmentName(desktop_env);
VLOG(1) << "Password storage detected desktop environment: "
<< (name ? name : "(unknown)");
......@@ -214,25 +215,27 @@ KeyedService* PasswordStoreFactory::BuildServiceInstanceFor(
LocalProfileId id = GetLocalProfileId(prefs);
scoped_ptr<PasswordStoreX::NativeBackend> backend;
if (desktop_env == base::nix::DESKTOP_ENVIRONMENT_KDE4) {
if (used_desktop_env == base::nix::DESKTOP_ENVIRONMENT_KDE4) {
// KDE3 didn't use DBus, which our KWallet store uses.
VLOG(1) << "Trying KWallet for password storage.";
backend.reset(new NativeBackendKWallet(id));
if (backend->Init())
if (backend->Init()) {
VLOG(1) << "Using KWallet for password storage.";
else
used_backend = KWALLET;
} else
backend.reset();
} else if (desktop_env == base::nix::DESKTOP_ENVIRONMENT_GNOME ||
desktop_env == base::nix::DESKTOP_ENVIRONMENT_UNITY ||
desktop_env == base::nix::DESKTOP_ENVIRONMENT_XFCE) {
} else if (used_desktop_env == base::nix::DESKTOP_ENVIRONMENT_GNOME ||
used_desktop_env == base::nix::DESKTOP_ENVIRONMENT_UNITY ||
used_desktop_env == base::nix::DESKTOP_ENVIRONMENT_XFCE) {
#if defined(USE_LIBSECRET)
if (base::FieldTrialList::FindFullName(kLibsecretFieldTrialName) !=
kLibsecretFieldTrialDisabledGroupName) {
VLOG(1) << "Trying libsecret for password storage.";
backend.reset(new NativeBackendLibsecret(id));
if (backend->Init())
if (backend->Init()) {
VLOG(1) << "Using libsecret keyring for password storage.";
else
used_backend = LIBSECRET;
} else
backend.reset();
}
#endif // defined(USE_LIBSECRET)
......@@ -240,9 +243,10 @@ KeyedService* PasswordStoreFactory::BuildServiceInstanceFor(
#if defined(USE_GNOME_KEYRING)
VLOG(1) << "Trying GNOME keyring for password storage.";
backend.reset(new NativeBackendGnome(id));
if (backend->Init())
if (backend->Init()) {
VLOG(1) << "Using GNOME keyring for password storage.";
else
used_backend = GNOME_KEYRING;
} else
backend.reset();
#endif // defined(USE_GNOME_KEYRING)
}
......@@ -256,6 +260,7 @@ KeyedService* PasswordStoreFactory::BuildServiceInstanceFor(
ps = new PasswordStoreX(main_thread_runner, db_thread_runner, login_db.Pass(),
backend.release());
RecordBackendStatistics(desktop_env, store_type, used_backend);
#elif defined(USE_OZONE)
ps = new password_manager::PasswordStoreDefault(
main_thread_runner, db_thread_runner, login_db.Pass());
......@@ -292,3 +297,70 @@ content::BrowserContext* PasswordStoreFactory::GetBrowserContextToUse(
bool PasswordStoreFactory::ServiceIsNULLWhileTesting() const {
return true;
}
#if defined(USE_X11)
base::nix::DesktopEnvironment PasswordStoreFactory::GetDesktopEnvironment() {
scoped_ptr<base::Environment> env(base::Environment::Create());
return base::nix::GetDesktopEnvironment(env.get());
}
void PasswordStoreFactory::RecordBackendStatistics(
base::nix::DesktopEnvironment desktop_env,
const std::string& command_line_flag,
LinuxBackendUsed used_backend) {
LinuxBackendUsage usage = OTHER_PLAINTEXT;
if (desktop_env == base::nix::DESKTOP_ENVIRONMENT_KDE4) {
if (command_line_flag == "kwallet") {
usage = used_backend == KWALLET ? KDE_KWALLETFLAG_KWALLET
: KDE_KWALLETFLAG_PLAINTEXT;
} else if (command_line_flag == "gnome") {
usage = used_backend == PLAINTEXT
? KDE_GNOMEFLAG_PLAINTEXT
: (used_backend == GNOME_KEYRING ? KDE_GNOMEFLAG_KEYRING
: KDE_GNOMEFLAG_LIBSECRET);
} else if (command_line_flag == "basic") {
usage = KDE_BASICFLAG_PLAINTEXT;
} else {
usage =
used_backend == KWALLET ? KDE_NOFLAG_KWALLET : KDE_NOFLAG_PLAINTEXT;
}
} else if (desktop_env == base::nix::DESKTOP_ENVIRONMENT_GNOME ||
desktop_env == base::nix::DESKTOP_ENVIRONMENT_UNITY ||
desktop_env == base::nix::DESKTOP_ENVIRONMENT_XFCE) {
if (command_line_flag == "kwallet") {
usage = used_backend == KWALLET ? GNOME_KWALLETFLAG_KWALLET
: GNOME_KWALLETFLAG_PLAINTEXT;
} else if (command_line_flag == "gnome") {
usage = used_backend == PLAINTEXT
? GNOME_GNOMEFLAG_PLAINTEXT
: (used_backend == GNOME_KEYRING ? GNOME_GNOMEFLAG_KEYRING
: GNOME_GNOMEFLAG_LIBSECRET);
} else if (command_line_flag == "basic") {
usage = GNOME_BASICFLAG_PLAINTEXT;
} else {
usage = used_backend == PLAINTEXT
? GNOME_NOFLAG_PLAINTEXT
: (used_backend == GNOME_KEYRING ? GNOME_NOFLAG_KEYRING
: GNOME_NOFLAG_LIBSECRET);
}
} else {
// It is neither Gnome nor KDE environment.
switch (used_backend) {
case PLAINTEXT:
usage = OTHER_PLAINTEXT;
break;
case KWALLET:
usage = OTHER_KWALLET;
break;
case GNOME_KEYRING:
usage = OTHER_KEYRING;
break;
case LIBSECRET:
usage = OTHER_LIBSECRET;
break;
}
}
UMA_HISTOGRAM_ENUMERATION("PasswordManager.LinuxBackendStatistics", usage,
MAX_BACKEND_USAGE_VALUE);
}
#endif
......@@ -11,6 +11,10 @@
#include "components/keyed_service/core/keyed_service.h"
#include "components/keyed_service/core/service_access_type.h"
#if defined(USE_X11)
#include "base/nix/xdg_util.h"
#endif
class Profile;
namespace password_manager {
......@@ -73,6 +77,40 @@ class PasswordStoreFactory : public BrowserContextKeyedServiceFactory {
content::BrowserContext* context) const override;
bool ServiceIsNULLWhileTesting() const override;
#if defined(USE_X11)
enum LinuxBackendUsage {
KDE_NOFLAG_PLAINTEXT,
KDE_NOFLAG_KWALLET,
KDE_KWALLETFLAG_PLAINTEXT,
KDE_KWALLETFLAG_KWALLET,
KDE_GNOMEFLAG_PLAINTEXT,
KDE_GNOMEFLAG_KEYRING,
KDE_GNOMEFLAG_LIBSECRET,
KDE_BASICFLAG_PLAINTEXT,
GNOME_NOFLAG_PLAINTEXT,
GNOME_NOFLAG_KEYRING,
GNOME_NOFLAG_LIBSECRET,
GNOME_GNOMEFLAG_PLAINTEXT,
GNOME_GNOMEFLAG_KEYRING,
GNOME_GNOMEFLAG_LIBSECRET,
GNOME_KWALLETFLAG_PLAINTEXT,
GNOME_KWALLETFLAG_KWALLET,
GNOME_BASICFLAG_PLAINTEXT,
OTHER_PLAINTEXT,
OTHER_KWALLET,
OTHER_KEYRING,
OTHER_LIBSECRET,
MAX_BACKEND_USAGE_VALUE
};
enum LinuxBackendUsed { PLAINTEXT, GNOME_KEYRING, LIBSECRET, KWALLET };
static base::nix::DesktopEnvironment GetDesktopEnvironment();
static void RecordBackendStatistics(base::nix::DesktopEnvironment desktop_env,
const std::string& command_line_flag,
LinuxBackendUsed used_backend);
#endif
DISALLOW_COPY_AND_ASSIGN(PasswordStoreFactory);
};
......
......@@ -23260,6 +23260,15 @@ Therefore, the affected-histogram name has to have at least one dot in it.
</summary>
</histogram>
<histogram name="PasswordManager.LinuxBackendStatistics">
<owner>dvadym@chromium.org</owner>
<owner>vabr@chromium.org</owner>
<summary>
Information about usage of password storage backends on Linux. It also
includes whether a command line flag for a specific backend is given.
</summary>
</histogram>
<histogram name="PasswordManager.NumPasswordsDeletedByBulkDelete">
<owner>dubroy@chromium.org</owner>
<owner>vabr@chromium.org</owner>
......@@ -50446,6 +50455,30 @@ Therefore, the affected-histogram name has to have at least one dot in it.
<int value="2" label="Cras"/>
</enum>
<enum name="LinuxBackendUsage" type="int">
<int value="0" label="KDE_NOFLAG_PLAINTEXT"/>
<int value="1" label="KDE_NOFLAG_KWALLET"/>
<int value="2" label="KDE_KWALLETFLAG_PLAINTEXT"/>
<int value="3" label="KDE_KWALLETFLAG_KWALLET"/>
<int value="4" label="KDE_GNOMEFLAG_PLAINTEXT"/>
<int value="5" label="KDE_GNOMEFLAG_KEYRING"/>
<int value="6" label="KDE_GNOMEFLAG_LIBSECRET"/>
<int value="7" label="KDE_BASICFLAG_PLAINTEXT"/>
<int value="8" label="GNOME_NOFLAG_PLAINTEXT"/>
<int value="9" label="GNOME_NOFLAG_KEYRING"/>
<int value="10" label="GNOME_NOFLAG_LIBSECRET"/>
<int value="11" label="GNOME_GNOMEFLAG_PLAINTEXT"/>
<int value="12" label="GNOME_GNOMEFLAG_KEYRING"/>
<int value="13" label="GNOME_GNOMEFLAG_LIBSECRET"/>
<int value="14" label="GNOME_KWALLETFLAG_PLAINTEXT"/>
<int value="15" label="GNOME_KWALLETFLAG_KWALLET"/>
<int value="16" label="GNOME_BASICFLAG_PLAINTEXT"/>
<int value="17" label="OTHER_PLAINTEXT"/>
<int value="18" label="OTHER_KWALLET"/>
<int value="19" label="OTHER_KEYRING"/>
<int value="20" label="OTHER_LIBSECRET"/>
</enum>
<enum name="LinuxGlibcVersion" type="int">
<int value="0" label="Not Parseable"/>
<int value="1" label="Unknown"/>
......@@ -62022,6 +62055,7 @@ To add a new entry, add it with any value and run test to compute valid value.
<suffix name="group_19" label="group 19"/>
<suffix name="group_20" label="group 20"/>
<suffix name="" label=""/>
<affected-histogram name="PasswordManager.LinuxBackendStatistics"/>
<affected-histogram name="PasswordManager.ProvisionalSaveFailure"/>
<affected-histogram
name="PasswordManager.SavePasswordPromptDisappearedQuickly"/>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment