Chromium Code Reviews| 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/password_manager/password_store_factory.h" | 5 #include "chrome/browser/password_manager/password_store_factory.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/environment.h" | 8 #include "base/environment.h" |
| 9 #include "base/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
| 10 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 188 ps = new password_manager::PasswordStoreDefault( | 188 ps = new password_manager::PasswordStoreDefault( |
| 189 main_thread_runner, db_thread_runner, login_db.Pass()); | 189 main_thread_runner, db_thread_runner, login_db.Pass()); |
| 190 #elif defined(USE_X11) | 190 #elif defined(USE_X11) |
| 191 // On POSIX systems, we try to use the "native" password management system of | 191 // On POSIX systems, we try to use the "native" password management system of |
| 192 // the desktop environment currently running, allowing GNOME Keyring in XFCE. | 192 // the desktop environment currently running, allowing GNOME Keyring in XFCE. |
| 193 // (In all cases we fall back on the basic store in case of failure.) | 193 // (In all cases we fall back on the basic store in case of failure.) |
| 194 base::nix::DesktopEnvironment desktop_env; | 194 base::nix::DesktopEnvironment desktop_env; |
| 195 std::string store_type = | 195 std::string store_type = |
| 196 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 196 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| 197 switches::kPasswordStore); | 197 switches::kPasswordStore); |
| 198 LinuxBackendUsed used_backend = PLAINTEXT; | |
| 198 if (store_type == "kwallet") { | 199 if (store_type == "kwallet") { |
| 199 desktop_env = base::nix::DESKTOP_ENVIRONMENT_KDE4; | 200 desktop_env = base::nix::DESKTOP_ENVIRONMENT_KDE4; |
| 200 } else if (store_type == "gnome") { | 201 } else if (store_type == "gnome") { |
| 201 desktop_env = base::nix::DESKTOP_ENVIRONMENT_GNOME; | 202 desktop_env = base::nix::DESKTOP_ENVIRONMENT_GNOME; |
| 202 } else if (store_type == "basic") { | 203 } else if (store_type == "basic") { |
| 203 desktop_env = base::nix::DESKTOP_ENVIRONMENT_OTHER; | 204 desktop_env = base::nix::DESKTOP_ENVIRONMENT_OTHER; |
| 204 } else { | 205 } else { |
| 205 // Detect the store to use automatically. | 206 // Detect the store to use automatically. |
| 206 scoped_ptr<base::Environment> env(base::Environment::Create()); | 207 scoped_ptr<base::Environment> env(base::Environment::Create()); |
| 207 desktop_env = base::nix::GetDesktopEnvironment(env.get()); | 208 desktop_env = base::nix::GetDesktopEnvironment(env.get()); |
| 208 const char* name = base::nix::GetDesktopEnvironmentName(desktop_env); | 209 const char* name = base::nix::GetDesktopEnvironmentName(desktop_env); |
| 209 VLOG(1) << "Password storage detected desktop environment: " | 210 VLOG(1) << "Password storage detected desktop environment: " |
| 210 << (name ? name : "(unknown)"); | 211 << (name ? name : "(unknown)"); |
| 211 } | 212 } |
| 212 | 213 |
| 213 PrefService* prefs = profile->GetPrefs(); | 214 PrefService* prefs = profile->GetPrefs(); |
| 214 LocalProfileId id = GetLocalProfileId(prefs); | 215 LocalProfileId id = GetLocalProfileId(prefs); |
| 215 | 216 |
| 216 scoped_ptr<PasswordStoreX::NativeBackend> backend; | 217 scoped_ptr<PasswordStoreX::NativeBackend> backend; |
| 217 if (desktop_env == base::nix::DESKTOP_ENVIRONMENT_KDE4) { | 218 if (desktop_env == base::nix::DESKTOP_ENVIRONMENT_KDE4) { |
| 218 // KDE3 didn't use DBus, which our KWallet store uses. | 219 // KDE3 didn't use DBus, which our KWallet store uses. |
| 219 VLOG(1) << "Trying KWallet for password storage."; | 220 VLOG(1) << "Trying KWallet for password storage."; |
| 220 backend.reset(new NativeBackendKWallet(id)); | 221 backend.reset(new NativeBackendKWallet(id)); |
| 221 if (backend->Init()) | 222 if (backend->Init()) { |
| 222 VLOG(1) << "Using KWallet for password storage."; | 223 VLOG(1) << "Using KWallet for password storage."; |
| 223 else | 224 used_backend = KWALLET; |
| 225 } else | |
| 224 backend.reset(); | 226 backend.reset(); |
| 225 } else if (desktop_env == base::nix::DESKTOP_ENVIRONMENT_GNOME || | 227 } else if (desktop_env == base::nix::DESKTOP_ENVIRONMENT_GNOME || |
| 226 desktop_env == base::nix::DESKTOP_ENVIRONMENT_UNITY || | 228 desktop_env == base::nix::DESKTOP_ENVIRONMENT_UNITY || |
| 227 desktop_env == base::nix::DESKTOP_ENVIRONMENT_XFCE) { | 229 desktop_env == base::nix::DESKTOP_ENVIRONMENT_XFCE) { |
| 228 #if defined(USE_LIBSECRET) | 230 #if defined(USE_LIBSECRET) |
| 229 if (base::FieldTrialList::FindFullName(kLibsecretFieldTrialName) != | 231 if (base::FieldTrialList::FindFullName(kLibsecretFieldTrialName) != |
| 230 kLibsecretFieldTrialDisabledGroupName) { | 232 kLibsecretFieldTrialDisabledGroupName) { |
| 231 VLOG(1) << "Trying libsecret for password storage."; | 233 VLOG(1) << "Trying libsecret for password storage."; |
| 232 backend.reset(new NativeBackendLibsecret(id)); | 234 backend.reset(new NativeBackendLibsecret(id)); |
| 233 if (backend->Init()) | 235 if (backend->Init()) { |
| 234 VLOG(1) << "Using libsecret keyring for password storage."; | 236 VLOG(1) << "Using libsecret keyring for password storage."; |
| 235 else | 237 used_backend = LIBSECRET; |
| 238 } else | |
| 236 backend.reset(); | 239 backend.reset(); |
| 237 } | 240 } |
| 238 #endif // defined(USE_LIBSECRET) | 241 #endif // defined(USE_LIBSECRET) |
| 239 if (!backend.get()) { | 242 if (!backend.get()) { |
| 240 #if defined(USE_GNOME_KEYRING) | 243 #if defined(USE_GNOME_KEYRING) |
| 241 VLOG(1) << "Trying GNOME keyring for password storage."; | 244 VLOG(1) << "Trying GNOME keyring for password storage."; |
| 242 backend.reset(new NativeBackendGnome(id)); | 245 backend.reset(new NativeBackendGnome(id)); |
| 243 if (backend->Init()) | 246 if (backend->Init()) { |
| 244 VLOG(1) << "Using GNOME keyring for password storage."; | 247 VLOG(1) << "Using GNOME keyring for password storage."; |
| 245 else | 248 used_backend = GNOME_KEYRING; |
| 249 } else | |
| 246 backend.reset(); | 250 backend.reset(); |
| 247 #endif // defined(USE_GNOME_KEYRING) | 251 #endif // defined(USE_GNOME_KEYRING) |
| 248 } | 252 } |
| 249 } | 253 } |
| 250 | 254 |
| 251 if (!backend.get()) { | 255 if (!backend.get()) { |
| 252 LOG(WARNING) << "Using basic (unencrypted) store for password storage. " | 256 LOG(WARNING) << "Using basic (unencrypted) store for password storage. " |
| 253 "See http://code.google.com/p/chromium/wiki/LinuxPasswordStorage for " | 257 "See http://code.google.com/p/chromium/wiki/LinuxPasswordStorage for " |
| 254 "more information about password storage options."; | 258 "more information about password storage options."; |
| 255 } | 259 } |
| 256 | 260 |
| 257 ps = new PasswordStoreX(main_thread_runner, db_thread_runner, login_db.Pass(), | 261 ps = new PasswordStoreX(main_thread_runner, db_thread_runner, login_db.Pass(), |
| 258 backend.release()); | 262 backend.release()); |
| 263 RecordBackendStatistics(desktop_env, store_type, used_backend); | |
| 259 #elif defined(USE_OZONE) | 264 #elif defined(USE_OZONE) |
| 260 ps = new password_manager::PasswordStoreDefault( | 265 ps = new password_manager::PasswordStoreDefault( |
| 261 main_thread_runner, db_thread_runner, login_db.Pass()); | 266 main_thread_runner, db_thread_runner, login_db.Pass()); |
| 262 #else | 267 #else |
| 263 NOTIMPLEMENTED(); | 268 NOTIMPLEMENTED(); |
| 264 #endif | 269 #endif |
| 265 if (!ps.get() || | 270 if (!ps.get() || |
| 266 !ps->Init( | 271 !ps->Init( |
| 267 sync_start_util::GetFlareForSyncableService(profile->GetPath()))) { | 272 sync_start_util::GetFlareForSyncableService(profile->GetPath()))) { |
| 268 NOTREACHED() << "Could not initialize password manager."; | 273 NOTREACHED() << "Could not initialize password manager."; |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 285 } | 290 } |
| 286 | 291 |
| 287 content::BrowserContext* PasswordStoreFactory::GetBrowserContextToUse( | 292 content::BrowserContext* PasswordStoreFactory::GetBrowserContextToUse( |
| 288 content::BrowserContext* context) const { | 293 content::BrowserContext* context) const { |
| 289 return chrome::GetBrowserContextRedirectedInIncognito(context); | 294 return chrome::GetBrowserContextRedirectedInIncognito(context); |
| 290 } | 295 } |
| 291 | 296 |
| 292 bool PasswordStoreFactory::ServiceIsNULLWhileTesting() const { | 297 bool PasswordStoreFactory::ServiceIsNULLWhileTesting() const { |
| 293 return true; | 298 return true; |
| 294 } | 299 } |
| 300 | |
| 301 #if defined(USE_X11) | |
| 302 void PasswordStoreFactory::RecordBackendStatistics( | |
| 303 base::nix::DesktopEnvironment desktop_env, | |
| 304 const std::string& store_type, | |
| 305 LinuxBackendUsed used_backend) { | |
| 306 LinuxBackendUsage usage = OTHER_PLAINTEXT; | |
|
vabr (Chromium)
2015/01/27 16:15:51
But what about cases when the user forces a store
dvadym
2015/01/28 11:47:40
Done.
| |
| 307 if (desktop_env == base::nix::DESKTOP_ENVIRONMENT_KDE4) { | |
| 308 bool is_flag_used = store_type == "kwallet"; | |
| 309 switch (used_backend) { | |
| 310 case KWALLET: | |
| 311 usage = is_flag_used ? KDE_FLAG_KWALLET : KDE_NOFLAG_KWALLET; | |
| 312 break; | |
| 313 case PLAINTEXT: | |
| 314 usage = is_flag_used ? KDE_FLAG_PLAINTEXT : KDE_NOFLAG_PLAINTEXT; | |
| 315 break; | |
| 316 case GNOME_KEYRING: | |
| 317 case LIBSECRET: | |
| 318 NOTREACHED(); | |
| 319 } | |
| 320 } else if (desktop_env == base::nix::DESKTOP_ENVIRONMENT_GNOME || | |
| 321 desktop_env == base::nix::DESKTOP_ENVIRONMENT_UNITY || | |
| 322 desktop_env == base::nix::DESKTOP_ENVIRONMENT_XFCE) { | |
| 323 bool is_flag_used = store_type == "gnome"; | |
| 324 switch (used_backend) { | |
| 325 case GNOME_KEYRING: | |
| 326 usage = is_flag_used ? GNOME_FLAG_KEYRING : GNOME_NOFLAG_KEYRING; | |
| 327 break; | |
| 328 case LIBSECRET: | |
| 329 usage = is_flag_used ? GNOME_FLAG_LIBSECRET : GNOME_NOFLAG_LIBSECRET; | |
| 330 break; | |
| 331 case PLAINTEXT: | |
| 332 usage = is_flag_used ? GNOME_FLAG_PLAINTEXT : GNOME_NOFLAG_PLAINTEXT; | |
| 333 break; | |
| 334 case KWALLET: | |
| 335 NOTREACHED(); | |
| 336 } | |
| 337 } | |
| 338 UMA_HISTOGRAM_ENUMERATION("PasswordManager.LinuxBackendStatistics", usage, | |
| 339 MAX_BACKEND_USAGE_VALUE); | |
| 340 } | |
| 341 #endif | |
| OLD | NEW |