Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(539)

Unified Diff: chrome/browser/password_manager/password_store_proxy_mac.cc

Issue 1213043003: Start the migration of passwords from the Keychain. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/password_manager/password_store_proxy_mac.cc
diff --git a/chrome/browser/password_manager/password_store_proxy_mac.cc b/chrome/browser/password_manager/password_store_proxy_mac.cc
index 2d16b7ecfef43b1104d789ce34c678d0ad4f26a1..27aed505a4afe537243beeafca419945a2b69559 100644
--- a/chrome/browser/password_manager/password_store_proxy_mac.cc
+++ b/chrome/browser/password_manager/password_store_proxy_mac.cc
@@ -4,8 +4,10 @@
#include "chrome/browser/password_manager/password_store_proxy_mac.h"
+#include "base/metrics/histogram_macros.h"
#include "chrome/browser/password_manager/password_store_mac.h"
#include "chrome/browser/password_manager/simple_password_store_mac.h"
+#include "components/password_manager/core/common/password_manager_pref_names.h"
#include "content/public/browser/browser_thread.h"
#include "crypto/apple_keychain.h"
@@ -14,13 +16,23 @@ using password_manager::PasswordStoreChangeList;
PasswordStoreProxyMac::PasswordStoreProxyMac(
scoped_refptr<base::SingleThreadTaskRunner> main_thread_runner,
scoped_ptr<crypto::AppleKeychain> keychain,
- scoped_ptr<password_manager::LoginDatabase> login_db)
+ scoped_ptr<password_manager::LoginDatabase> login_db,
+ PrefService* prefs)
: PasswordStore(main_thread_runner, nullptr),
- login_metadata_db_(login_db.Pass()) {
+ login_metadata_db_(login_db.Pass()),
+ migration_completion_(true, false) {
DCHECK(login_metadata_db_);
- // TODO(vasilii): for now the class is just a wrapper around PasswordStoreMac.
- password_store_mac_ =
- new PasswordStoreMac(main_thread_runner, nullptr, keychain.Pass());
+ migration_status_.Init(password_manager::prefs::kKeychainMigrationStatus,
+ prefs);
+ if (migration_status_.GetValue() == MIGRATED) {
+ // The login database will be set later after initialization.
+ password_store_simple_ = new SimplePasswordStoreMac(
+ main_thread_runner, nullptr,
+ scoped_ptr<password_manager::LoginDatabase>());
vabr (Chromium) 2015/07/03 08:40:48 optional: I believe nullptr should work here as we
vasilii 2015/07/03 12:59:11 Done.
+ } else {
+ password_store_mac_ =
+ new PasswordStoreMac(main_thread_runner, nullptr, keychain.Pass());
+ }
}
PasswordStoreProxyMac::~PasswordStoreProxyMac() {
@@ -37,15 +49,20 @@ bool PasswordStoreProxyMac::Init(
return false;
}
- ScheduleTask(
- base::Bind(&PasswordStoreProxyMac::InitOnBackgroundThread, this));
- password_store_mac_->InitWithTaskRunner(GetBackgroundTaskRunner());
- return password_manager::PasswordStore::Init(flare);
+ if (!password_manager::PasswordStore::Init(flare))
+ return false;
+
+ return ScheduleTask(
+ base::Bind(&PasswordStoreProxyMac::InitOnBackgroundThread, this,
+ static_cast<MigrationStatus>(migration_status_.GetValue())));
}
void PasswordStoreProxyMac::Shutdown() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
PasswordStore::Shutdown();
+ // Wait for InitOnBackgroundThread completion so GetBackend() returns a
+ // correct pointer.
+ migration_completion_.Wait();
GetBackend()->Shutdown();
thread_->Stop();
}
@@ -61,15 +78,55 @@ password_manager::PasswordStore* PasswordStoreProxyMac::GetBackend() const {
return password_store_simple_.get();
}
-void PasswordStoreProxyMac::InitOnBackgroundThread() {
+void PasswordStoreProxyMac::InitOnBackgroundThread(MigrationStatus status) {
DCHECK(GetBackgroundTaskRunner()->BelongsToCurrentThread());
if (!login_metadata_db_->Init()) {
login_metadata_db_.reset();
LOG(ERROR) << "Could not create/open login database.";
- return;
}
- if (password_store_mac_)
+
+ if (status == MIGRATED) {
+ password_store_simple_->InitWithTaskRunner(GetBackgroundTaskRunner(),
+ login_metadata_db_.Pass());
+ } else {
password_store_mac_->set_login_metadata_db(login_metadata_db_.get());
+ password_store_mac_->InitWithTaskRunner(GetBackgroundTaskRunner());
+ if (login_metadata_db_ &&
+ (status == NOT_STARTED || status == FAILED_ONCE)) {
+ // Let's try to migrate the passwords.
+ if (password_store_mac_->ImportFromKeychain() ==
+ PasswordStoreMac::MIGRATION_OK) {
+ status = MIGRATED;
+ // Switch from |password_store_mac_| to |password_store_simple_|.
+ password_store_mac_->set_login_metadata_db(nullptr);
+ main_thread_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&PasswordStoreMac::Shutdown, password_store_mac_));
+ password_store_mac_ = nullptr;
+ password_store_simple_ = new SimplePasswordStoreMac(
+ main_thread_runner_, GetBackgroundTaskRunner(),
+ login_metadata_db_.Pass());
+ } else {
+ status = (status == FAILED_ONCE ? FAILED_TWICE : FAILED_ONCE);
+ }
+ main_thread_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&PasswordStoreProxyMac::UpdateStatusPref, this, status));
+ }
+ }
+ migration_completion_.Signal();
+ ReportStatusPref(status);
+ DCHECK(GetBackend());
+}
+
+void PasswordStoreProxyMac::UpdateStatusPref(MigrationStatus status) {
+ migration_status_.SetValue(status);
+}
+
+// static
+void PasswordStoreProxyMac::ReportStatusPref(MigrationStatus status) {
+ UMA_HISTOGRAM_ENUMERATION("PasswordManager.KeychainMigration.Status", status,
+ NUM_MIGRATION_STATUS);
}
void PasswordStoreProxyMac::ReportMetricsImpl(

Powered by Google App Engine
This is Rietveld 408576698