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 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 keychain.Pass(), login_db.Pass()); | 184 keychain.Pass(), login_db.Pass()); |
185 #elif defined(OS_CHROMEOS) || defined(OS_ANDROID) | 185 #elif defined(OS_CHROMEOS) || defined(OS_ANDROID) |
186 // For now, we use PasswordStoreDefault. We might want to make a native | 186 // For now, we use PasswordStoreDefault. We might want to make a native |
187 // backend for PasswordStoreX (see below) in the future though. | 187 // backend for PasswordStoreX (see below) in the future though. |
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 = GetDesktopEnvironment(); |
| 195 base::nix::DesktopEnvironment used_desktop_env; |
195 std::string store_type = | 196 std::string store_type = |
196 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 197 base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
197 switches::kPasswordStore); | 198 switches::kPasswordStore); |
| 199 LinuxBackendUsed used_backend = PLAINTEXT; |
198 if (store_type == "kwallet") { | 200 if (store_type == "kwallet") { |
199 desktop_env = base::nix::DESKTOP_ENVIRONMENT_KDE4; | 201 used_desktop_env = base::nix::DESKTOP_ENVIRONMENT_KDE4; |
200 } else if (store_type == "gnome") { | 202 } else if (store_type == "gnome") { |
201 desktop_env = base::nix::DESKTOP_ENVIRONMENT_GNOME; | 203 used_desktop_env = base::nix::DESKTOP_ENVIRONMENT_GNOME; |
202 } else if (store_type == "basic") { | 204 } else if (store_type == "basic") { |
203 desktop_env = base::nix::DESKTOP_ENVIRONMENT_OTHER; | 205 used_desktop_env = base::nix::DESKTOP_ENVIRONMENT_OTHER; |
204 } else { | 206 } else { |
205 // Detect the store to use automatically. | 207 // Detect the store to use automatically. |
206 scoped_ptr<base::Environment> env(base::Environment::Create()); | 208 used_desktop_env = desktop_env; |
207 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 (used_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 (used_desktop_env == base::nix::DESKTOP_ENVIRONMENT_GNOME || |
226 desktop_env == base::nix::DESKTOP_ENVIRONMENT_UNITY || | 228 used_desktop_env == base::nix::DESKTOP_ENVIRONMENT_UNITY || |
227 desktop_env == base::nix::DESKTOP_ENVIRONMENT_XFCE) { | 229 used_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 base::nix::DesktopEnvironment PasswordStoreFactory::GetDesktopEnvironment() { |
| 303 scoped_ptr<base::Environment> env(base::Environment::Create()); |
| 304 return base::nix::GetDesktopEnvironment(env.get()); |
| 305 } |
| 306 |
| 307 void PasswordStoreFactory::RecordBackendStatistics( |
| 308 base::nix::DesktopEnvironment desktop_env, |
| 309 const std::string& command_line_flag, |
| 310 LinuxBackendUsed used_backend) { |
| 311 LinuxBackendUsage usage = OTHER_PLAINTEXT; |
| 312 if (desktop_env == base::nix::DESKTOP_ENVIRONMENT_KDE4) { |
| 313 if (command_line_flag == "kwallet") { |
| 314 usage = used_backend == KWALLET ? KDE_KWALLETFLAG_KWALLET |
| 315 : KDE_KWALLETFLAG_PLAINTEXT; |
| 316 } else if (command_line_flag == "gnome") { |
| 317 usage = used_backend == PLAINTEXT |
| 318 ? KDE_GNOMEFLAG_PLAINTEXT |
| 319 : (used_backend == GNOME_KEYRING ? KDE_GNOMEFLAG_KEYRING |
| 320 : KDE_GNOMEFLAG_LIBSECRET); |
| 321 } else if (command_line_flag == "basic") { |
| 322 usage = KDE_BASICFLAG_PLAINTEXT; |
| 323 } else { |
| 324 usage = |
| 325 used_backend == KWALLET ? KDE_NOFLAG_KWALLET : KDE_NOFLAG_PLAINTEXT; |
| 326 } |
| 327 } else if (desktop_env == base::nix::DESKTOP_ENVIRONMENT_GNOME || |
| 328 desktop_env == base::nix::DESKTOP_ENVIRONMENT_UNITY || |
| 329 desktop_env == base::nix::DESKTOP_ENVIRONMENT_XFCE) { |
| 330 if (command_line_flag == "kwallet") { |
| 331 usage = used_backend == KWALLET ? GNOME_KWALLETFLAG_KWALLET |
| 332 : GNOME_KWALLETFLAG_PLAINTEXT; |
| 333 } else if (command_line_flag == "gnome") { |
| 334 usage = used_backend == PLAINTEXT |
| 335 ? GNOME_GNOMEFLAG_PLAINTEXT |
| 336 : (used_backend == GNOME_KEYRING ? GNOME_GNOMEFLAG_KEYRING |
| 337 : GNOME_GNOMEFLAG_LIBSECRET); |
| 338 } else if (command_line_flag == "basic") { |
| 339 usage = GNOME_BASICFLAG_PLAINTEXT; |
| 340 } else { |
| 341 usage = used_backend == PLAINTEXT |
| 342 ? GNOME_NOFLAG_PLAINTEXT |
| 343 : (used_backend == GNOME_KEYRING ? GNOME_NOFLAG_KEYRING |
| 344 : GNOME_NOFLAG_LIBSECRET); |
| 345 } |
| 346 } else { |
| 347 // It is neither Gnome nor KDE environment. |
| 348 switch (used_backend) { |
| 349 case PLAINTEXT: |
| 350 usage = OTHER_PLAINTEXT; |
| 351 break; |
| 352 case KWALLET: |
| 353 usage = OTHER_KWALLET; |
| 354 break; |
| 355 case GNOME_KEYRING: |
| 356 usage = OTHER_KEYRING; |
| 357 break; |
| 358 case LIBSECRET: |
| 359 usage = OTHER_LIBSECRET; |
| 360 break; |
| 361 } |
| 362 } |
| 363 UMA_HISTOGRAM_ENUMERATION("PasswordManager.LinuxBackendStatistics", usage, |
| 364 MAX_BACKEND_USAGE_VALUE); |
| 365 } |
| 366 #endif |
OLD | NEW |