| Index: components/password_manager/core/browser/login_database.cc
|
| diff --git a/components/password_manager/core/browser/login_database.cc b/components/password_manager/core/browser/login_database.cc
|
| index 5bb071f5e7a932e41aa277d6eaf196ae8fd1ee3a..90526e2ccb00952604fc9645334d8f0f25d98492 100644
|
| --- a/components/password_manager/core/browser/login_database.cc
|
| +++ b/components/password_manager/core/browser/login_database.cc
|
| @@ -354,19 +354,20 @@ PasswordStoreChangeList LoginDatabase::UpdateLogin(const PasswordForm& form) {
|
| // Replacement is necessary to deal with updating imported credentials. See
|
| // crbug.com/349138 for details.
|
| sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE,
|
| - "UPDATE OR REPLACE logins SET "
|
| - "action_url = ?, "
|
| - "password_value = ?, "
|
| - "ssl_valid = ?, "
|
| - "preferred = ?, "
|
| - "possible_usernames = ?, "
|
| - "times_used = ?, "
|
| - "submit_element = ? "
|
| - "WHERE origin_url = ? AND "
|
| - "username_element = ? AND "
|
| - "username_value = ? AND "
|
| - "password_element = ? AND "
|
| - "signon_realm = ?"));
|
| + "UPDATE OR REPLACE logins SET "
|
| + "action_url = ?, "
|
| + "password_value = ?, "
|
| + "ssl_valid = ?, "
|
| + "preferred = ?, "
|
| + "possible_usernames = ?, "
|
| + "times_used = ?, "
|
| + "submit_element = ?, "
|
| + "date_synced = ? "
|
| + "WHERE origin_url = ? AND "
|
| + "username_element = ? AND "
|
| + "username_value = ? AND "
|
| + "password_element = ? AND "
|
| + "signon_realm = ?"));
|
| s.BindString(0, form.action.spec());
|
| s.BindBlob(1, encrypted_password.data(),
|
| static_cast<int>(encrypted_password.length()));
|
| @@ -376,12 +377,13 @@ PasswordStoreChangeList LoginDatabase::UpdateLogin(const PasswordForm& form) {
|
| s.BindBlob(4, pickle.data(), pickle.size());
|
| s.BindInt(5, form.times_used);
|
| s.BindString16(6, form.submit_element);
|
| + s.BindInt64(7, form.date_synced.ToInternalValue());
|
|
|
| - s.BindString(7, form.origin.spec());
|
| - s.BindString16(8, form.username_element);
|
| - s.BindString16(9, form.username_value);
|
| - s.BindString16(10, form.password_element);
|
| - s.BindString(11, form.signon_realm);
|
| + s.BindString(8, form.origin.spec());
|
| + s.BindString16(9, form.username_element);
|
| + s.BindString16(10, form.username_value);
|
| + s.BindString16(11, form.password_element);
|
| + s.BindString(12, form.signon_realm);
|
|
|
| if (!s.Run())
|
| return PasswordStoreChangeList();
|
| @@ -425,6 +427,19 @@ bool LoginDatabase::RemoveLoginsCreatedBetween(const base::Time delete_begin,
|
| return s.Run();
|
| }
|
|
|
| +bool LoginDatabase::RemoveLoginsSyncedBetween(base::Time delete_begin,
|
| + base::Time delete_end) {
|
| + sql::Statement s(db_.GetCachedStatement(
|
| + SQL_FROM_HERE,
|
| + "DELETE FROM logins WHERE date_synced >= ? AND date_synced < ?"));
|
| + s.BindInt64(0, delete_begin.ToInternalValue());
|
| + s.BindInt64(1,
|
| + delete_end.is_null() ? base::Time::Max().ToInternalValue()
|
| + : delete_end.ToInternalValue());
|
| +
|
| + return s.Run();
|
| +}
|
| +
|
| LoginDatabase::EncryptionResult LoginDatabase::InitPasswordFormFromStatement(
|
| PasswordForm* form,
|
| sql::Statement& s) const {
|
| @@ -603,6 +618,38 @@ bool LoginDatabase::GetLoginsCreatedBetween(
|
| return s.Succeeded();
|
| }
|
|
|
| +bool LoginDatabase::GetLoginsSyncedBetween(
|
| + const base::Time begin,
|
| + const base::Time end,
|
| + std::vector<autofill::PasswordForm*>* forms) const {
|
| + DCHECK(forms);
|
| + sql::Statement s(db_.GetCachedStatement(
|
| + SQL_FROM_HERE,
|
| + "SELECT origin_url, action_url, username_element, username_value, "
|
| + "password_element, password_value, submit_element, signon_realm, "
|
| + "ssl_valid, preferred, date_created, blacklisted_by_user, "
|
| + "scheme, password_type, possible_usernames, times_used, form_data, "
|
| + "use_additional_auth, date_synced FROM logins "
|
| + "WHERE date_synced >= ? AND date_synced < ?"
|
| + "ORDER BY origin_url"));
|
| + s.BindInt64(0, begin.ToInternalValue());
|
| + s.BindInt64(1,
|
| + end.is_null() ? base::Time::Max().ToInternalValue()
|
| + : end.ToInternalValue());
|
| +
|
| + while (s.Step()) {
|
| + scoped_ptr<PasswordForm> new_form(new PasswordForm());
|
| + EncryptionResult result = InitPasswordFormFromStatement(new_form.get(), s);
|
| + if (result == ENCRYPTION_RESULT_SERVICE_FAILURE)
|
| + return false;
|
| + if (result == ENCRYPTION_RESULT_ITEM_FAILURE)
|
| + continue;
|
| + DCHECK(result == ENCRYPTION_RESULT_SUCCESS);
|
| + forms->push_back(new_form.release());
|
| + }
|
| + return s.Succeeded();
|
| +}
|
| +
|
| bool LoginDatabase::GetAutofillableLogins(
|
| std::vector<PasswordForm*>* forms) const {
|
| return GetAllLoginsWithBlacklistSetting(false, forms);
|
|
|