| 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_x.h" | 5 #include "chrome/browser/password_manager/password_store_x.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 ScopedVector<autofill::PasswordForm> PasswordStoreX::FillMatchingLogins( | 139 ScopedVector<autofill::PasswordForm> PasswordStoreX::FillMatchingLogins( |
| 140 const autofill::PasswordForm& form, | 140 const autofill::PasswordForm& form, |
| 141 AuthorizationPromptPolicy prompt_policy) { | 141 AuthorizationPromptPolicy prompt_policy) { |
| 142 CheckMigration(); | 142 CheckMigration(); |
| 143 ScopedVector<autofill::PasswordForm> matched_forms; | 143 ScopedVector<autofill::PasswordForm> matched_forms; |
| 144 if (use_native_backend() && backend_->GetLogins(form, &matched_forms)) { | 144 if (use_native_backend() && backend_->GetLogins(form, &matched_forms)) { |
| 145 SortLoginsByOrigin(&matched_forms.get()); | 145 SortLoginsByOrigin(&matched_forms.get()); |
| 146 // The native backend may succeed and return no data even while locked, if | 146 // The native backend may succeed and return no data even while locked, if |
| 147 // the query did not match anything stored. So we continue to allow fallback | 147 // the query did not match anything stored. So we continue to allow fallback |
| 148 // until we perform a write operation, or until a read returns actual data. | 148 // until we perform a write operation, or until a read returns actual data. |
| 149 if (matched_forms.size() > 0) | 149 if (!matched_forms.empty()) |
| 150 allow_fallback_ = false; | 150 allow_fallback_ = false; |
| 151 } else if (allow_default_store()) { | 151 return matched_forms.Pass(); |
| 152 DCHECK(matched_forms.empty()); | 152 } |
| 153 if (allow_default_store()) |
| 153 return PasswordStoreDefault::FillMatchingLogins(form, prompt_policy); | 154 return PasswordStoreDefault::FillMatchingLogins(form, prompt_policy); |
| 154 } | 155 return ScopedVector<autofill::PasswordForm>(); |
| 155 return matched_forms.Pass(); | |
| 156 } | 156 } |
| 157 | 157 |
| 158 bool PasswordStoreX::FillAutofillableLogins( | 158 bool PasswordStoreX::FillAutofillableLogins( |
| 159 ScopedVector<autofill::PasswordForm>* forms) { | 159 ScopedVector<autofill::PasswordForm>* forms) { |
| 160 forms->clear(); |
| 160 CheckMigration(); | 161 CheckMigration(); |
| 161 if (use_native_backend() && backend_->GetAutofillableLogins(forms)) { | 162 if (use_native_backend() && backend_->GetAutofillableLogins(forms)) { |
| 162 SortLoginsByOrigin(&forms->get()); | 163 SortLoginsByOrigin(&forms->get()); |
| 163 // See GetLoginsImpl() for why we disallow fallback conditionally here. | 164 // See GetLoginsImpl() for why we disallow fallback conditionally here. |
| 164 if (!forms->empty()) | 165 if (!forms->empty()) |
| 165 allow_fallback_ = false; | 166 allow_fallback_ = false; |
| 166 return true; | 167 return true; |
| 167 } | 168 } |
| 168 if (allow_default_store()) | 169 if (allow_default_store()) |
| 169 return PasswordStoreDefault::FillAutofillableLogins(forms); | 170 return PasswordStoreDefault::FillAutofillableLogins(forms); |
| 170 return false; | 171 return false; |
| 171 } | 172 } |
| 172 | 173 |
| 173 bool PasswordStoreX::FillBlacklistLogins( | 174 bool PasswordStoreX::FillBlacklistLogins( |
| 174 ScopedVector<autofill::PasswordForm>* forms) { | 175 ScopedVector<autofill::PasswordForm>* forms) { |
| 176 forms->clear(); |
| 175 CheckMigration(); | 177 CheckMigration(); |
| 176 if (use_native_backend() && backend_->GetBlacklistLogins(forms)) { | 178 if (use_native_backend() && backend_->GetBlacklistLogins(forms)) { |
| 177 // See GetLoginsImpl() for why we disallow fallback conditionally here. | 179 // See GetLoginsImpl() for why we disallow fallback conditionally here. |
| 178 SortLoginsByOrigin(&forms->get()); | 180 SortLoginsByOrigin(&forms->get()); |
| 179 if (!forms->empty()) | 181 if (!forms->empty()) |
| 180 allow_fallback_ = false; | 182 allow_fallback_ = false; |
| 181 return true; | 183 return true; |
| 182 } | 184 } |
| 183 if (allow_default_store()) | 185 if (allow_default_store()) |
| 184 return PasswordStoreDefault::FillBlacklistLogins(forms); | 186 return PasswordStoreDefault::FillBlacklistLogins(forms); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 214 backend_.reset(); | 216 backend_.reset(); |
| 215 // Don't warn again. We'll use the default store because backend_ is NULL. | 217 // Don't warn again. We'll use the default store because backend_ is NULL. |
| 216 allow_fallback_ = false; | 218 allow_fallback_ = false; |
| 217 } | 219 } |
| 218 return !backend_.get(); | 220 return !backend_.get(); |
| 219 } | 221 } |
| 220 | 222 |
| 221 ssize_t PasswordStoreX::MigrateLogins() { | 223 ssize_t PasswordStoreX::MigrateLogins() { |
| 222 DCHECK(backend_.get()); | 224 DCHECK(backend_.get()); |
| 223 ScopedVector<autofill::PasswordForm> forms; | 225 ScopedVector<autofill::PasswordForm> forms; |
| 226 ScopedVector<autofill::PasswordForm> blacklist_forms; |
| 224 bool ok = PasswordStoreDefault::FillAutofillableLogins(&forms) && | 227 bool ok = PasswordStoreDefault::FillAutofillableLogins(&forms) && |
| 225 PasswordStoreDefault::FillBlacklistLogins(&forms); | 228 PasswordStoreDefault::FillBlacklistLogins(&blacklist_forms); |
| 229 forms.reserve(forms.size() + blacklist_forms.size()); |
| 230 forms.insert(forms.end(), blacklist_forms.begin(), blacklist_forms.end()); |
| 231 blacklist_forms.weak_clear(); |
| 226 if (ok) { | 232 if (ok) { |
| 227 // We add all the passwords (and blacklist entries) to the native backend | 233 // We add all the passwords (and blacklist entries) to the native backend |
| 228 // before attempting to remove any from the login database, to make sure we | 234 // before attempting to remove any from the login database, to make sure we |
| 229 // don't somehow end up with some of the passwords in one store and some in | 235 // don't somehow end up with some of the passwords in one store and some in |
| 230 // another. We'll always have at least one intact store this way. | 236 // another. We'll always have at least one intact store this way. |
| 231 for (size_t i = 0; i < forms.size(); ++i) { | 237 for (size_t i = 0; i < forms.size(); ++i) { |
| 232 PasswordStoreChangeList changes; | 238 PasswordStoreChangeList changes; |
| 233 if (!AddLoginToBackend(backend_, *forms[i], &changes)) { | 239 if (!AddLoginToBackend(backend_, *forms[i], &changes)) { |
| 234 ok = false; | 240 ok = false; |
| 235 break; | 241 break; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 248 // Finally, delete the database file itself. We remove the passwords from | 254 // Finally, delete the database file itself. We remove the passwords from |
| 249 // it before deleting the file just in case there is some problem deleting | 255 // it before deleting the file just in case there is some problem deleting |
| 250 // the file (e.g. directory is not writable, but file is), which would | 256 // the file (e.g. directory is not writable, but file is), which would |
| 251 // otherwise cause passwords to re-migrate next (or maybe every) time. | 257 // otherwise cause passwords to re-migrate next (or maybe every) time. |
| 252 DeleteAndRecreateDatabaseFile(); | 258 DeleteAndRecreateDatabaseFile(); |
| 253 } | 259 } |
| 254 } | 260 } |
| 255 ssize_t result = ok ? forms.size() : -1; | 261 ssize_t result = ok ? forms.size() : -1; |
| 256 return result; | 262 return result; |
| 257 } | 263 } |
| OLD | NEW |