| Index: chrome/browser/password_manager/password_store_mac.cc
|
| diff --git a/chrome/browser/password_manager/password_store_mac.cc b/chrome/browser/password_manager/password_store_mac.cc
|
| index 416bab57ddb8d6d2f554b248cf953150344c4c98..86b1858f83c243a941a6add109978a36ee17a504 100644
|
| --- a/chrome/browser/password_manager/password_store_mac.cc
|
| +++ b/chrome/browser/password_manager/password_store_mac.cc
|
| @@ -863,11 +863,11 @@ OSType MacKeychainPasswordFormAdapter::CreatorCodeForSearch() {
|
| PasswordStoreMac::PasswordStoreMac(
|
| scoped_refptr<base::SingleThreadTaskRunner> main_thread_runner,
|
| scoped_refptr<base::SingleThreadTaskRunner> db_thread_runner,
|
| - AppleKeychain* keychain,
|
| - password_manager::LoginDatabase* login_db)
|
| + scoped_ptr<AppleKeychain> keychain,
|
| + scoped_ptr<password_manager::LoginDatabase> login_db)
|
| : password_manager::PasswordStore(main_thread_runner, db_thread_runner),
|
| - keychain_(keychain),
|
| - login_metadata_db_(login_db) {
|
| + keychain_(keychain.Pass()),
|
| + login_metadata_db_(login_db.Pass()) {
|
| DCHECK(keychain_.get());
|
| DCHECK(login_metadata_db_.get());
|
| }
|
| @@ -883,9 +883,20 @@ bool PasswordStoreMac::Init(
|
| thread_.reset(NULL);
|
| return false;
|
| }
|
| +
|
| + ScheduleTask(base::Bind(&PasswordStoreMac::InitOnBackgroundThread, this));
|
| return password_manager::PasswordStore::Init(flare);
|
| }
|
|
|
| +void PasswordStoreMac::InitOnBackgroundThread() {
|
| + DCHECK(thread_->message_loop() == base::MessageLoop::current());
|
| + DCHECK(login_metadata_db_);
|
| + if (!login_metadata_db_->Init()) {
|
| + login_metadata_db_.reset();
|
| + LOG(ERROR) << "Could not create/open login database.";
|
| + }
|
| +}
|
| +
|
| void PasswordStoreMac::Shutdown() {
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| password_manager::PasswordStore::Shutdown();
|
| @@ -903,6 +914,8 @@ PasswordStoreMac::GetBackgroundTaskRunner() {
|
|
|
| void PasswordStoreMac::ReportMetricsImpl(const std::string& sync_username,
|
| bool custom_passphrase_sync_enabled) {
|
| + if (!login_metadata_db_)
|
| + return;
|
| login_metadata_db_->ReportMetrics(sync_username,
|
| custom_passphrase_sync_enabled);
|
| }
|
| @@ -910,16 +923,17 @@ void PasswordStoreMac::ReportMetricsImpl(const std::string& sync_username,
|
| PasswordStoreChangeList PasswordStoreMac::AddLoginImpl(
|
| const PasswordForm& form) {
|
| DCHECK(thread_->message_loop() == base::MessageLoop::current());
|
| - PasswordStoreChangeList changes;
|
| - if (AddToKeychainIfNecessary(form)) {
|
| - changes = login_metadata_db_->AddLogin(form);
|
| - }
|
| - return changes;
|
| + if (!login_metadata_db_ && AddToKeychainIfNecessary(form))
|
| + return login_metadata_db_->AddLogin(form);
|
| + return PasswordStoreChangeList();
|
| }
|
|
|
| PasswordStoreChangeList PasswordStoreMac::UpdateLoginImpl(
|
| const PasswordForm& form) {
|
| DCHECK(thread_->message_loop() == base::MessageLoop::current());
|
| + if (!login_metadata_db_)
|
| + return PasswordStoreChangeList();
|
| +
|
| PasswordStoreChangeList changes = login_metadata_db_->UpdateLogin(form);
|
|
|
| MacKeychainPasswordFormAdapter keychain_adapter(keychain_.get());
|
| @@ -942,7 +956,7 @@ PasswordStoreChangeList PasswordStoreMac::RemoveLoginImpl(
|
| const PasswordForm& form) {
|
| DCHECK(thread_->message_loop() == base::MessageLoop::current());
|
| PasswordStoreChangeList changes;
|
| - if (login_metadata_db_->RemoveLogin(form)) {
|
| + if (login_metadata_db_ && login_metadata_db_->RemoveLogin(form)) {
|
| // See if we own a Keychain item associated with this item. We can do an
|
| // exact search rather than messing around with trying to do fuzzy matching
|
| // because passwords that we created will always have an exact-match
|
| @@ -970,15 +984,15 @@ PasswordStoreChangeList PasswordStoreMac::RemoveLoginsCreatedBetweenImpl(
|
| base::Time delete_end) {
|
| PasswordStoreChangeList changes;
|
| ScopedVector<PasswordForm> forms;
|
| - if (login_metadata_db_->GetLoginsCreatedBetween(delete_begin, delete_end,
|
| - &forms.get())) {
|
| - if (login_metadata_db_->RemoveLoginsCreatedBetween(delete_begin,
|
| - delete_end)) {
|
| - RemoveKeychainForms(forms.get());
|
| - CleanOrphanedForms(&forms.get());
|
| - changes = FormsToRemoveChangeList(forms.get());
|
| - LogStatsForBulkDeletion(changes.size());
|
| - }
|
| + if (login_metadata_db_ &&
|
| + login_metadata_db_->GetLoginsCreatedBetween(delete_begin, delete_end,
|
| + &forms.get()) &&
|
| + login_metadata_db_->RemoveLoginsCreatedBetween(delete_begin,
|
| + delete_end)) {
|
| + RemoveKeychainForms(forms.get());
|
| + CleanOrphanedForms(&forms.get());
|
| + changes = FormsToRemoveChangeList(forms.get());
|
| + LogStatsForBulkDeletion(changes.size());
|
| }
|
| return changes;
|
| }
|
| @@ -988,15 +1002,14 @@ PasswordStoreChangeList PasswordStoreMac::RemoveLoginsSyncedBetweenImpl(
|
| base::Time delete_end) {
|
| PasswordStoreChangeList changes;
|
| ScopedVector<PasswordForm> forms;
|
| - if (login_metadata_db_->GetLoginsSyncedBetween(
|
| - delete_begin, delete_end, &forms.get())) {
|
| - if (login_metadata_db_->RemoveLoginsSyncedBetween(delete_begin,
|
| - delete_end)) {
|
| - RemoveKeychainForms(forms.get());
|
| - CleanOrphanedForms(&forms.get());
|
| - changes = FormsToRemoveChangeList(forms.get());
|
| - LogStatsForBulkDeletionDuringRollback(changes.size());
|
| - }
|
| + if (login_metadata_db_ &&
|
| + login_metadata_db_->GetLoginsSyncedBetween(delete_begin, delete_end,
|
| + &forms.get()) &&
|
| + login_metadata_db_->RemoveLoginsSyncedBetween(delete_begin, delete_end)) {
|
| + RemoveKeychainForms(forms.get());
|
| + CleanOrphanedForms(&forms.get());
|
| + changes = FormsToRemoveChangeList(forms.get());
|
| + LogStatsForBulkDeletionDuringRollback(changes.size());
|
| }
|
| return changes;
|
| }
|
| @@ -1008,6 +1021,11 @@ void PasswordStoreMac::GetLoginsImpl(
|
| chrome::ScopedSecKeychainSetUserInteractionAllowed user_interaction_allowed(
|
| prompt_policy == ALLOW_PROMPT);
|
|
|
| + if (!login_metadata_db_) {
|
| + callback_runner.Run(std::vector<PasswordForm*>());
|
| + return;
|
| + }
|
| +
|
| ScopedVector<PasswordForm> database_forms;
|
| login_metadata_db_->GetLogins(form, &database_forms.get());
|
|
|
| @@ -1076,7 +1094,8 @@ bool PasswordStoreMac::FillAutofillableLogins(
|
| DCHECK(thread_->message_loop() == base::MessageLoop::current());
|
|
|
| ScopedVector<PasswordForm> database_forms;
|
| - if (!login_metadata_db_->GetAutofillableLogins(&database_forms.get()))
|
| + if (!login_metadata_db_ ||
|
| + !login_metadata_db_->GetAutofillableLogins(&database_forms.get()))
|
| return false;
|
|
|
| std::vector<PasswordForm*> merged_forms =
|
| @@ -1095,7 +1114,7 @@ bool PasswordStoreMac::FillAutofillableLogins(
|
| bool PasswordStoreMac::FillBlacklistLogins(
|
| std::vector<PasswordForm*>* forms) {
|
| DCHECK(thread_->message_loop() == base::MessageLoop::current());
|
| - return login_metadata_db_->GetBlacklistLogins(forms);
|
| + return login_metadata_db_ && login_metadata_db_->GetBlacklistLogins(forms);
|
| }
|
|
|
| bool PasswordStoreMac::AddToKeychainIfNecessary(const PasswordForm& form) {
|
| @@ -1108,6 +1127,7 @@ bool PasswordStoreMac::AddToKeychainIfNecessary(const PasswordForm& form) {
|
|
|
| bool PasswordStoreMac::DatabaseHasFormMatchingKeychainForm(
|
| const autofill::PasswordForm& form) {
|
| + DCHECK(login_metadata_db_);
|
| bool has_match = false;
|
| std::vector<PasswordForm*> database_forms;
|
| login_metadata_db_->GetLogins(form, &database_forms);
|
| @@ -1129,6 +1149,7 @@ bool PasswordStoreMac::DatabaseHasFormMatchingKeychainForm(
|
|
|
| void PasswordStoreMac::RemoveDatabaseForms(
|
| const std::vector<PasswordForm*>& forms) {
|
| + DCHECK(login_metadata_db_);
|
| for (std::vector<PasswordForm*>::const_iterator i = forms.begin();
|
| i != forms.end(); ++i) {
|
| login_metadata_db_->RemoveLogin(**i);
|
| @@ -1147,6 +1168,8 @@ void PasswordStoreMac::RemoveKeychainForms(
|
|
|
| void PasswordStoreMac::CleanOrphanedForms(std::vector<PasswordForm*>* forms) {
|
| DCHECK(forms);
|
| + DCHECK(login_metadata_db_);
|
| +
|
| std::vector<PasswordForm*> database_forms;
|
| login_metadata_db_->GetAutofillableLogins(&database_forms);
|
|
|
|
|