| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/password_manager/core/browser/login_database.h" | 5 #include "components/password_manager/core/browser/login_database.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/files/file_path.h" | 11 #include "base/files/file_path.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
| 14 #include "base/pickle.h" | 14 #include "base/pickle.h" |
| 15 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
| 16 #include "base/strings/stringprintf.h" | 16 #include "base/strings/stringprintf.h" |
| 17 #include "base/time/time.h" | 17 #include "base/time/time.h" |
| 18 #include "components/autofill/core/common/password_form.h" | 18 #include "components/autofill/core/common/password_form.h" |
| 19 #include "components/password_manager/core/browser/password_manager_client.h" | 19 #include "components/password_manager/core/browser/password_manager_client.h" |
| 20 #include "google_apis/gaia/gaia_auth_util.h" | 20 #include "google_apis/gaia/gaia_auth_util.h" |
| 21 #include "google_apis/gaia/gaia_urls.h" | 21 #include "google_apis/gaia/gaia_urls.h" |
| 22 #include "sql/connection.h" | 22 #include "sql/connection.h" |
| 23 #include "sql/statement.h" | 23 #include "sql/statement.h" |
| 24 #include "sql/transaction.h" | 24 #include "sql/transaction.h" |
| 25 | 25 |
| 26 using autofill::PasswordForm; | 26 using autofill::PasswordForm; |
| 27 | 27 |
| 28 namespace password_manager { | 28 namespace password_manager { |
| 29 | 29 |
| 30 const int kCurrentVersionNumber = 11; | 30 const int kCurrentVersionNumber = 12; |
| 31 static const int kCompatibleVersionNumber = 1; | 31 static const int kCompatibleVersionNumber = 1; |
| 32 | 32 |
| 33 Pickle SerializeVector(const std::vector<base::string16>& vec) { | 33 Pickle SerializeVector(const std::vector<base::string16>& vec) { |
| 34 Pickle p; | 34 Pickle p; |
| 35 for (size_t i = 0; i < vec.size(); ++i) { | 35 for (size_t i = 0; i < vec.size(); ++i) { |
| 36 p.WriteString16(vec[i]); | 36 p.WriteString16(vec[i]); |
| 37 } | 37 } |
| 38 return p; | 38 return p; |
| 39 } | 39 } |
| 40 | 40 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 68 COLUMN_SCHEME, | 68 COLUMN_SCHEME, |
| 69 COLUMN_PASSWORD_TYPE, | 69 COLUMN_PASSWORD_TYPE, |
| 70 COLUMN_POSSIBLE_USERNAMES, | 70 COLUMN_POSSIBLE_USERNAMES, |
| 71 COLUMN_TIMES_USED, | 71 COLUMN_TIMES_USED, |
| 72 COLUMN_FORM_DATA, | 72 COLUMN_FORM_DATA, |
| 73 COLUMN_DATE_SYNCED, | 73 COLUMN_DATE_SYNCED, |
| 74 COLUMN_DISPLAY_NAME, | 74 COLUMN_DISPLAY_NAME, |
| 75 COLUMN_AVATAR_URL, | 75 COLUMN_AVATAR_URL, |
| 76 COLUMN_FEDERATION_URL, | 76 COLUMN_FEDERATION_URL, |
| 77 COLUMN_SKIP_ZERO_CLICK, | 77 COLUMN_SKIP_ZERO_CLICK, |
| 78 COLUMN_GENERATION_UPLOAD_STATUS, |
| 78 }; | 79 }; |
| 79 | 80 |
| 80 void BindAddStatement(const PasswordForm& form, | 81 void BindAddStatement(const PasswordForm& form, |
| 81 const std::string& encrypted_password, | 82 const std::string& encrypted_password, |
| 82 sql::Statement* s) { | 83 sql::Statement* s) { |
| 83 s->BindString(COLUMN_ORIGIN_URL, form.origin.spec()); | 84 s->BindString(COLUMN_ORIGIN_URL, form.origin.spec()); |
| 84 s->BindString(COLUMN_ACTION_URL, form.action.spec()); | 85 s->BindString(COLUMN_ACTION_URL, form.action.spec()); |
| 85 s->BindString16(COLUMN_USERNAME_ELEMENT, form.username_element); | 86 s->BindString16(COLUMN_USERNAME_ELEMENT, form.username_element); |
| 86 s->BindString16(COLUMN_USERNAME_VALUE, form.username_value); | 87 s->BindString16(COLUMN_USERNAME_VALUE, form.username_value); |
| 87 s->BindString16(COLUMN_PASSWORD_ELEMENT, form.password_element); | 88 s->BindString16(COLUMN_PASSWORD_ELEMENT, form.password_element); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 103 Pickle form_data_pickle; | 104 Pickle form_data_pickle; |
| 104 autofill::SerializeFormData(form.form_data, &form_data_pickle); | 105 autofill::SerializeFormData(form.form_data, &form_data_pickle); |
| 105 s->BindBlob(COLUMN_FORM_DATA, | 106 s->BindBlob(COLUMN_FORM_DATA, |
| 106 form_data_pickle.data(), | 107 form_data_pickle.data(), |
| 107 form_data_pickle.size()); | 108 form_data_pickle.size()); |
| 108 s->BindInt64(COLUMN_DATE_SYNCED, form.date_synced.ToInternalValue()); | 109 s->BindInt64(COLUMN_DATE_SYNCED, form.date_synced.ToInternalValue()); |
| 109 s->BindString16(COLUMN_DISPLAY_NAME, form.display_name); | 110 s->BindString16(COLUMN_DISPLAY_NAME, form.display_name); |
| 110 s->BindString(COLUMN_AVATAR_URL, form.avatar_url.spec()); | 111 s->BindString(COLUMN_AVATAR_URL, form.avatar_url.spec()); |
| 111 s->BindString(COLUMN_FEDERATION_URL, form.federation_url.spec()); | 112 s->BindString(COLUMN_FEDERATION_URL, form.federation_url.spec()); |
| 112 s->BindInt(COLUMN_SKIP_ZERO_CLICK, form.skip_zero_click); | 113 s->BindInt(COLUMN_SKIP_ZERO_CLICK, form.skip_zero_click); |
| 114 s->BindInt(COLUMN_GENERATION_UPLOAD_STATUS, form.generation_upload_status); |
| 113 } | 115 } |
| 114 | 116 |
| 115 void AddCallback(int err, sql::Statement* /*stmt*/) { | 117 void AddCallback(int err, sql::Statement* /*stmt*/) { |
| 116 if (err == 19 /*SQLITE_CONSTRAINT*/) | 118 if (err == 19 /*SQLITE_CONSTRAINT*/) |
| 117 DLOG(WARNING) << "LoginDatabase::AddLogin updated an existing form"; | 119 DLOG(WARNING) << "LoginDatabase::AddLogin updated an existing form"; |
| 118 } | 120 } |
| 119 | 121 |
| 120 bool DoesMatchConstraints(const PasswordForm& form) { | 122 bool DoesMatchConstraints(const PasswordForm& form) { |
| 121 if (form.origin.is_empty()) { | 123 if (form.origin.is_empty()) { |
| 122 DLOG(ERROR) << "Constraint violation: form.origin is empty"; | 124 DLOG(ERROR) << "Constraint violation: form.origin is empty"; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 "scheme INTEGER NOT NULL," | 171 "scheme INTEGER NOT NULL," |
| 170 "password_type INTEGER," | 172 "password_type INTEGER," |
| 171 "possible_usernames BLOB," | 173 "possible_usernames BLOB," |
| 172 "times_used INTEGER," | 174 "times_used INTEGER," |
| 173 "form_data BLOB," | 175 "form_data BLOB," |
| 174 "date_synced INTEGER," | 176 "date_synced INTEGER," |
| 175 "display_name VARCHAR," | 177 "display_name VARCHAR," |
| 176 "avatar_url VARCHAR," | 178 "avatar_url VARCHAR," |
| 177 "federation_url VARCHAR," | 179 "federation_url VARCHAR," |
| 178 "skip_zero_click INTEGER," | 180 "skip_zero_click INTEGER," |
| 181 "generation_upload_status INTEGER," |
| 179 "UNIQUE (origin_url, username_element, username_value, " | 182 "UNIQUE (origin_url, username_element, username_value, " |
| 180 "password_element, signon_realm))", table_name); | 183 "password_element, signon_realm))", |
| 184 table_name); |
| 181 return db->Execute(query.c_str()); | 185 return db->Execute(query.c_str()); |
| 182 } | 186 } |
| 183 | 187 |
| 184 bool CreateIndexOnSignonRealm(sql::Connection* db, const char* table_name) { | 188 bool CreateIndexOnSignonRealm(sql::Connection* db, const char* table_name) { |
| 185 std::string query = base::StringPrintf( | 189 std::string query = base::StringPrintf( |
| 186 "CREATE INDEX logins_signon ON %s (signon_realm)", table_name); | 190 "CREATE INDEX logins_signon ON %s (signon_realm)", table_name); |
| 187 return db->Execute(query.c_str()); | 191 return db->Execute(query.c_str()); |
| 188 } | 192 } |
| 189 | 193 |
| 190 } // namespace | 194 } // namespace |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 "date_synced, display_name, avatar_url, federation_url, is_zero_click" | 358 "date_synced, display_name, avatar_url, federation_url, is_zero_click" |
| 355 " FROM logins"; | 359 " FROM logins"; |
| 356 if (!CreateNewTable(&db_, "logins_new") || | 360 if (!CreateNewTable(&db_, "logins_new") || |
| 357 !db_.Execute(copy_query) || | 361 !db_.Execute(copy_query) || |
| 358 !db_.Execute("DROP TABLE logins") || | 362 !db_.Execute("DROP TABLE logins") || |
| 359 !db_.Execute("ALTER TABLE logins_new RENAME TO logins") || | 363 !db_.Execute("ALTER TABLE logins_new RENAME TO logins") || |
| 360 !CreateIndexOnSignonRealm(&db_, "logins")) | 364 !CreateIndexOnSignonRealm(&db_, "logins")) |
| 361 return false; | 365 return false; |
| 362 meta_table_.SetVersionNumber(11); | 366 meta_table_.SetVersionNumber(11); |
| 363 } | 367 } |
| 368 case 11: |
| 369 if (!db_.Execute( |
| 370 "ALTER TABLE logins ADD COLUMN " |
| 371 "generation_upload_status INTEGER")) |
| 372 return false; |
| 373 meta_table_.SetVersionNumber(12); |
| 364 case kCurrentVersionNumber: | 374 case kCurrentVersionNumber: |
| 365 // Already up to date | 375 // Already up to date |
| 366 return true; | 376 return true; |
| 367 default: | 377 default: |
| 368 NOTREACHED(); | 378 NOTREACHED(); |
| 369 return false; | 379 return false; |
| 370 } | 380 } |
| 371 } | 381 } |
| 372 | 382 |
| 373 bool LoginDatabase::InitLoginsTable() { | 383 bool LoginDatabase::InitLoginsTable() { |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 | 514 |
| 505 // You *must* change LoginTableColumns if this query changes. | 515 // You *must* change LoginTableColumns if this query changes. |
| 506 sql::Statement s(db_.GetCachedStatement( | 516 sql::Statement s(db_.GetCachedStatement( |
| 507 SQL_FROM_HERE, | 517 SQL_FROM_HERE, |
| 508 "INSERT INTO logins " | 518 "INSERT INTO logins " |
| 509 "(origin_url, action_url, username_element, username_value, " | 519 "(origin_url, action_url, username_element, username_value, " |
| 510 " password_element, password_value, submit_element, " | 520 " password_element, password_value, submit_element, " |
| 511 " signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " | 521 " signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " |
| 512 " scheme, password_type, possible_usernames, times_used, form_data, " | 522 " scheme, password_type, possible_usernames, times_used, form_data, " |
| 513 " date_synced, display_name, avatar_url," | 523 " date_synced, display_name, avatar_url," |
| 514 " federation_url, skip_zero_click) VALUES " | 524 " federation_url, skip_zero_click, generation_upload_status) VALUES " |
| 515 "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); | 525 "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); |
| 516 BindAddStatement(form, encrypted_password, &s); | 526 BindAddStatement(form, encrypted_password, &s); |
| 517 db_.set_error_callback(base::Bind(&AddCallback)); | 527 db_.set_error_callback(base::Bind(&AddCallback)); |
| 518 const bool success = s.Run(); | 528 const bool success = s.Run(); |
| 519 db_.reset_error_callback(); | 529 db_.reset_error_callback(); |
| 520 if (success) { | 530 if (success) { |
| 521 list.push_back(PasswordStoreChange(PasswordStoreChange::ADD, form)); | 531 list.push_back(PasswordStoreChange(PasswordStoreChange::ADD, form)); |
| 522 return list; | 532 return list; |
| 523 } | 533 } |
| 524 // Repeat the same statement but with REPLACE semantic. | 534 // Repeat the same statement but with REPLACE semantic. |
| 525 s.Assign(db_.GetCachedStatement( | 535 s.Assign(db_.GetCachedStatement( |
| 526 SQL_FROM_HERE, | 536 SQL_FROM_HERE, |
| 527 "INSERT OR REPLACE INTO logins " | 537 "INSERT OR REPLACE INTO logins " |
| 528 "(origin_url, action_url, username_element, username_value, " | 538 "(origin_url, action_url, username_element, username_value, " |
| 529 " password_element, password_value, submit_element, " | 539 " password_element, password_value, submit_element, " |
| 530 " signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " | 540 " signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " |
| 531 " scheme, password_type, possible_usernames, times_used, form_data, " | 541 " scheme, password_type, possible_usernames, times_used, form_data, " |
| 532 " date_synced, display_name, avatar_url," | 542 " date_synced, display_name, avatar_url," |
| 533 " federation_url, skip_zero_click) VALUES " | 543 " federation_url, skip_zero_click, generation_upload_status) VALUES " |
| 534 "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); | 544 "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); |
| 535 BindAddStatement(form, encrypted_password, &s); | 545 BindAddStatement(form, encrypted_password, &s); |
| 536 if (s.Run()) { | 546 if (s.Run()) { |
| 537 list.push_back(PasswordStoreChange(PasswordStoreChange::REMOVE, form)); | 547 list.push_back(PasswordStoreChange(PasswordStoreChange::REMOVE, form)); |
| 538 list.push_back(PasswordStoreChange(PasswordStoreChange::ADD, form)); | 548 list.push_back(PasswordStoreChange(PasswordStoreChange::ADD, form)); |
| 539 } | 549 } |
| 540 return list; | 550 return list; |
| 541 } | 551 } |
| 542 | 552 |
| 543 PasswordStoreChangeList LoginDatabase::UpdateLogin(const PasswordForm& form) { | 553 PasswordStoreChangeList LoginDatabase::UpdateLogin(const PasswordForm& form) { |
| 544 std::string encrypted_password; | 554 std::string encrypted_password; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 558 "times_used = ?, " | 568 "times_used = ?, " |
| 559 "submit_element = ?, " | 569 "submit_element = ?, " |
| 560 "date_synced = ?, " | 570 "date_synced = ?, " |
| 561 "date_created = ?, " | 571 "date_created = ?, " |
| 562 "blacklisted_by_user = ?, " | 572 "blacklisted_by_user = ?, " |
| 563 "scheme = ?, " | 573 "scheme = ?, " |
| 564 "password_type = ?, " | 574 "password_type = ?, " |
| 565 "display_name = ?, " | 575 "display_name = ?, " |
| 566 "avatar_url = ?, " | 576 "avatar_url = ?, " |
| 567 "federation_url = ?, " | 577 "federation_url = ?, " |
| 568 "skip_zero_click = ? " | 578 "skip_zero_click = ?, " |
| 579 "generation_upload_status = ? " |
| 569 "WHERE origin_url = ? AND " | 580 "WHERE origin_url = ? AND " |
| 570 "username_element = ? AND " | 581 "username_element = ? AND " |
| 571 "username_value = ? AND " | 582 "username_value = ? AND " |
| 572 "password_element = ? AND " | 583 "password_element = ? AND " |
| 573 "signon_realm = ?")); | 584 "signon_realm = ?")); |
| 574 s.BindString(0, form.action.spec()); | 585 s.BindString(0, form.action.spec()); |
| 575 s.BindBlob(1, encrypted_password.data(), | 586 s.BindBlob(1, encrypted_password.data(), |
| 576 static_cast<int>(encrypted_password.length())); | 587 static_cast<int>(encrypted_password.length())); |
| 577 s.BindInt(2, form.ssl_valid); | 588 s.BindInt(2, form.ssl_valid); |
| 578 s.BindInt(3, form.preferred); | 589 s.BindInt(3, form.preferred); |
| 579 Pickle pickle = SerializeVector(form.other_possible_usernames); | 590 Pickle pickle = SerializeVector(form.other_possible_usernames); |
| 580 s.BindBlob(4, pickle.data(), pickle.size()); | 591 s.BindBlob(4, pickle.data(), pickle.size()); |
| 581 s.BindInt(5, form.times_used); | 592 s.BindInt(5, form.times_used); |
| 582 s.BindString16(6, form.submit_element); | 593 s.BindString16(6, form.submit_element); |
| 583 s.BindInt64(7, form.date_synced.ToInternalValue()); | 594 s.BindInt64(7, form.date_synced.ToInternalValue()); |
| 584 s.BindInt64(8, form.date_created.ToInternalValue()); | 595 s.BindInt64(8, form.date_created.ToInternalValue()); |
| 585 s.BindInt(9, form.blacklisted_by_user); | 596 s.BindInt(9, form.blacklisted_by_user); |
| 586 s.BindInt(10, form.scheme); | 597 s.BindInt(10, form.scheme); |
| 587 s.BindInt(11, form.type); | 598 s.BindInt(11, form.type); |
| 588 s.BindString16(12, form.display_name); | 599 s.BindString16(12, form.display_name); |
| 589 s.BindString(13, form.avatar_url.spec()); | 600 s.BindString(13, form.avatar_url.spec()); |
| 590 s.BindString(14, form.federation_url.spec()); | 601 s.BindString(14, form.federation_url.spec()); |
| 591 s.BindInt(15, form.skip_zero_click); | 602 s.BindInt(15, form.skip_zero_click); |
| 603 s.BindInt(16, form.generation_upload_status); |
| 592 | 604 |
| 593 // WHERE starts here. | 605 // WHERE starts here. |
| 594 s.BindString(16, form.origin.spec()); | 606 s.BindString(17, form.origin.spec()); |
| 595 s.BindString16(17, form.username_element); | 607 s.BindString16(18, form.username_element); |
| 596 s.BindString16(18, form.username_value); | 608 s.BindString16(19, form.username_value); |
| 597 s.BindString16(19, form.password_element); | 609 s.BindString16(20, form.password_element); |
| 598 s.BindString(20, form.signon_realm); | 610 s.BindString(21, form.signon_realm); |
| 599 | 611 |
| 600 if (!s.Run()) | 612 if (!s.Run()) |
| 601 return PasswordStoreChangeList(); | 613 return PasswordStoreChangeList(); |
| 602 | 614 |
| 603 PasswordStoreChangeList list; | 615 PasswordStoreChangeList list; |
| 604 if (db_.GetLastChangeCount()) | 616 if (db_.GetLastChangeCount()) |
| 605 list.push_back(PasswordStoreChange(PasswordStoreChange::UPDATE, form)); | 617 list.push_back(PasswordStoreChange(PasswordStoreChange::UPDATE, form)); |
| 606 | 618 |
| 607 return list; | 619 return list; |
| 608 } | 620 } |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 703 s.ColumnByteLength(COLUMN_FORM_DATA)); | 715 s.ColumnByteLength(COLUMN_FORM_DATA)); |
| 704 PickleIterator form_data_iter(form_data_pickle); | 716 PickleIterator form_data_iter(form_data_pickle); |
| 705 autofill::DeserializeFormData(&form_data_iter, &form->form_data); | 717 autofill::DeserializeFormData(&form_data_iter, &form->form_data); |
| 706 } | 718 } |
| 707 form->date_synced = | 719 form->date_synced = |
| 708 base::Time::FromInternalValue(s.ColumnInt64(COLUMN_DATE_SYNCED)); | 720 base::Time::FromInternalValue(s.ColumnInt64(COLUMN_DATE_SYNCED)); |
| 709 form->display_name = s.ColumnString16(COLUMN_DISPLAY_NAME); | 721 form->display_name = s.ColumnString16(COLUMN_DISPLAY_NAME); |
| 710 form->avatar_url = GURL(s.ColumnString(COLUMN_AVATAR_URL)); | 722 form->avatar_url = GURL(s.ColumnString(COLUMN_AVATAR_URL)); |
| 711 form->federation_url = GURL(s.ColumnString(COLUMN_FEDERATION_URL)); | 723 form->federation_url = GURL(s.ColumnString(COLUMN_FEDERATION_URL)); |
| 712 form->skip_zero_click = (s.ColumnInt(COLUMN_SKIP_ZERO_CLICK) > 0); | 724 form->skip_zero_click = (s.ColumnInt(COLUMN_SKIP_ZERO_CLICK) > 0); |
| 725 int generation_upload_status_int = |
| 726 s.ColumnInt(COLUMN_GENERATION_UPLOAD_STATUS); |
| 727 DCHECK(generation_upload_status_int >= 0 && |
| 728 generation_upload_status_int <= PasswordForm::UNKNOWN_STATUS); |
| 729 form->generation_upload_status = |
| 730 static_cast<PasswordForm::GenerationUploadStatus>( |
| 731 generation_upload_status_int); |
| 713 return ENCRYPTION_RESULT_SUCCESS; | 732 return ENCRYPTION_RESULT_SUCCESS; |
| 714 } | 733 } |
| 715 | 734 |
| 716 bool LoginDatabase::GetLogins( | 735 bool LoginDatabase::GetLogins( |
| 717 const PasswordForm& form, | 736 const PasswordForm& form, |
| 718 ScopedVector<autofill::PasswordForm>* forms) const { | 737 ScopedVector<autofill::PasswordForm>* forms) const { |
| 719 DCHECK(forms); | 738 DCHECK(forms); |
| 720 // You *must* change LoginTableColumns if this query changes. | 739 // You *must* change LoginTableColumns if this query changes. |
| 721 const std::string sql_query = | 740 const std::string sql_query = |
| 722 "SELECT origin_url, action_url, " | 741 "SELECT origin_url, action_url, " |
| 723 "username_element, username_value, " | 742 "username_element, username_value, " |
| 724 "password_element, password_value, submit_element, " | 743 "password_element, password_value, submit_element, " |
| 725 "signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " | 744 "signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " |
| 726 "scheme, password_type, possible_usernames, times_used, form_data, " | 745 "scheme, password_type, possible_usernames, times_used, form_data, " |
| 727 "date_synced, display_name, avatar_url, " | 746 "date_synced, display_name, avatar_url, " |
| 728 "federation_url, skip_zero_click " | 747 "federation_url, skip_zero_click, generation_upload_status " |
| 729 "FROM logins WHERE signon_realm == ? "; | 748 "FROM logins WHERE signon_realm == ? "; |
| 730 sql::Statement s; | 749 sql::Statement s; |
| 731 const GURL signon_realm(form.signon_realm); | 750 const GURL signon_realm(form.signon_realm); |
| 732 std::string registered_domain = GetRegistryControlledDomain(signon_realm); | 751 std::string registered_domain = GetRegistryControlledDomain(signon_realm); |
| 733 PSLDomainMatchMetric psl_domain_match_metric = PSL_DOMAIN_MATCH_NONE; | 752 PSLDomainMatchMetric psl_domain_match_metric = PSL_DOMAIN_MATCH_NONE; |
| 734 const bool should_PSL_matching_apply = | 753 const bool should_PSL_matching_apply = |
| 735 form.scheme == PasswordForm::SCHEME_HTML && | 754 form.scheme == PasswordForm::SCHEME_HTML && |
| 736 ShouldPSLDomainMatchingApply(registered_domain); | 755 ShouldPSLDomainMatchingApply(registered_domain); |
| 737 // PSL matching only applies to HTML forms. | 756 // PSL matching only applies to HTML forms. |
| 738 if (should_PSL_matching_apply) { | 757 if (should_PSL_matching_apply) { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 816 ScopedVector<autofill::PasswordForm>* forms) const { | 835 ScopedVector<autofill::PasswordForm>* forms) const { |
| 817 DCHECK(forms); | 836 DCHECK(forms); |
| 818 sql::Statement s(db_.GetCachedStatement( | 837 sql::Statement s(db_.GetCachedStatement( |
| 819 SQL_FROM_HERE, | 838 SQL_FROM_HERE, |
| 820 "SELECT origin_url, action_url, " | 839 "SELECT origin_url, action_url, " |
| 821 "username_element, username_value, " | 840 "username_element, username_value, " |
| 822 "password_element, password_value, submit_element, " | 841 "password_element, password_value, submit_element, " |
| 823 "signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " | 842 "signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " |
| 824 "scheme, password_type, possible_usernames, times_used, form_data, " | 843 "scheme, password_type, possible_usernames, times_used, form_data, " |
| 825 "date_synced, display_name, avatar_url, " | 844 "date_synced, display_name, avatar_url, " |
| 826 "federation_url, skip_zero_click FROM logins " | 845 "federation_url, skip_zero_click, generation_upload_status FROM logins " |
| 827 "WHERE date_created >= ? AND date_created < ?" | 846 "WHERE date_created >= ? AND date_created < ?" |
| 828 "ORDER BY origin_url")); | 847 "ORDER BY origin_url")); |
| 829 s.BindInt64(0, begin.ToInternalValue()); | 848 s.BindInt64(0, begin.ToInternalValue()); |
| 830 s.BindInt64(1, end.is_null() ? std::numeric_limits<int64>::max() | 849 s.BindInt64(1, end.is_null() ? std::numeric_limits<int64>::max() |
| 831 : end.ToInternalValue()); | 850 : end.ToInternalValue()); |
| 832 | 851 |
| 833 while (s.Step()) { | 852 while (s.Step()) { |
| 834 scoped_ptr<PasswordForm> new_form(new PasswordForm()); | 853 scoped_ptr<PasswordForm> new_form(new PasswordForm()); |
| 835 EncryptionResult result = InitPasswordFormFromStatement(new_form.get(), s); | 854 EncryptionResult result = InitPasswordFormFromStatement(new_form.get(), s); |
| 836 if (result == ENCRYPTION_RESULT_SERVICE_FAILURE) | 855 if (result == ENCRYPTION_RESULT_SERVICE_FAILURE) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 848 const base::Time end, | 867 const base::Time end, |
| 849 ScopedVector<autofill::PasswordForm>* forms) const { | 868 ScopedVector<autofill::PasswordForm>* forms) const { |
| 850 DCHECK(forms); | 869 DCHECK(forms); |
| 851 sql::Statement s(db_.GetCachedStatement( | 870 sql::Statement s(db_.GetCachedStatement( |
| 852 SQL_FROM_HERE, | 871 SQL_FROM_HERE, |
| 853 "SELECT origin_url, action_url, username_element, username_value, " | 872 "SELECT origin_url, action_url, username_element, username_value, " |
| 854 "password_element, password_value, submit_element, signon_realm, " | 873 "password_element, password_value, submit_element, signon_realm, " |
| 855 "ssl_valid, preferred, date_created, blacklisted_by_user, " | 874 "ssl_valid, preferred, date_created, blacklisted_by_user, " |
| 856 "scheme, password_type, possible_usernames, times_used, form_data, " | 875 "scheme, password_type, possible_usernames, times_used, form_data, " |
| 857 "date_synced, display_name, avatar_url, " | 876 "date_synced, display_name, avatar_url, " |
| 858 "federation_url, skip_zero_click FROM logins " | 877 "federation_url, skip_zero_click, generation_upload_status FROM logins " |
| 859 "WHERE date_synced >= ? AND date_synced < ?" | 878 "WHERE date_synced >= ? AND date_synced < ?" |
| 860 "ORDER BY origin_url")); | 879 "ORDER BY origin_url")); |
| 861 s.BindInt64(0, begin.ToInternalValue()); | 880 s.BindInt64(0, begin.ToInternalValue()); |
| 862 s.BindInt64(1, | 881 s.BindInt64(1, |
| 863 end.is_null() ? base::Time::Max().ToInternalValue() | 882 end.is_null() ? base::Time::Max().ToInternalValue() |
| 864 : end.ToInternalValue()); | 883 : end.ToInternalValue()); |
| 865 | 884 |
| 866 while (s.Step()) { | 885 while (s.Step()) { |
| 867 scoped_ptr<PasswordForm> new_form(new PasswordForm()); | 886 scoped_ptr<PasswordForm> new_form(new PasswordForm()); |
| 868 EncryptionResult result = InitPasswordFormFromStatement(new_form.get(), s); | 887 EncryptionResult result = InitPasswordFormFromStatement(new_form.get(), s); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 892 DCHECK(forms); | 911 DCHECK(forms); |
| 893 // You *must* change LoginTableColumns if this query changes. | 912 // You *must* change LoginTableColumns if this query changes. |
| 894 sql::Statement s(db_.GetCachedStatement( | 913 sql::Statement s(db_.GetCachedStatement( |
| 895 SQL_FROM_HERE, | 914 SQL_FROM_HERE, |
| 896 "SELECT origin_url, action_url, " | 915 "SELECT origin_url, action_url, " |
| 897 "username_element, username_value, " | 916 "username_element, username_value, " |
| 898 "password_element, password_value, submit_element, " | 917 "password_element, password_value, submit_element, " |
| 899 "signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " | 918 "signon_realm, ssl_valid, preferred, date_created, blacklisted_by_user, " |
| 900 "scheme, password_type, possible_usernames, times_used, form_data, " | 919 "scheme, password_type, possible_usernames, times_used, form_data, " |
| 901 "date_synced, display_name, avatar_url, " | 920 "date_synced, display_name, avatar_url, " |
| 902 "federation_url, skip_zero_click FROM logins " | 921 "federation_url, skip_zero_click, generation_upload_status FROM logins " |
| 903 "WHERE blacklisted_by_user == ? ORDER BY origin_url")); | 922 "WHERE blacklisted_by_user == ? ORDER BY origin_url")); |
| 904 s.BindInt(0, blacklisted ? 1 : 0); | 923 s.BindInt(0, blacklisted ? 1 : 0); |
| 905 | 924 |
| 906 while (s.Step()) { | 925 while (s.Step()) { |
| 907 scoped_ptr<PasswordForm> new_form(new PasswordForm()); | 926 scoped_ptr<PasswordForm> new_form(new PasswordForm()); |
| 908 EncryptionResult result = InitPasswordFormFromStatement(new_form.get(), s); | 927 EncryptionResult result = InitPasswordFormFromStatement(new_form.get(), s); |
| 909 if (result == ENCRYPTION_RESULT_SERVICE_FAILURE) | 928 if (result == ENCRYPTION_RESULT_SERVICE_FAILURE) |
| 910 return false; | 929 return false; |
| 911 if (result == ENCRYPTION_RESULT_ITEM_FAILURE) | 930 if (result == ENCRYPTION_RESULT_ITEM_FAILURE) |
| 912 continue; | 931 continue; |
| 913 DCHECK(result == ENCRYPTION_RESULT_SUCCESS); | 932 DCHECK(result == ENCRYPTION_RESULT_SUCCESS); |
| 914 forms->push_back(new_form.release()); | 933 forms->push_back(new_form.release()); |
| 915 } | 934 } |
| 916 return s.Succeeded(); | 935 return s.Succeeded(); |
| 917 } | 936 } |
| 918 | 937 |
| 919 bool LoginDatabase::DeleteAndRecreateDatabaseFile() { | 938 bool LoginDatabase::DeleteAndRecreateDatabaseFile() { |
| 920 DCHECK(db_.is_open()); | 939 DCHECK(db_.is_open()); |
| 921 meta_table_.Reset(); | 940 meta_table_.Reset(); |
| 922 db_.Close(); | 941 db_.Close(); |
| 923 sql::Connection::Delete(db_path_); | 942 sql::Connection::Delete(db_path_); |
| 924 return Init(); | 943 return Init(); |
| 925 } | 944 } |
| 926 | 945 |
| 927 } // namespace password_manager | 946 } // namespace password_manager |
| OLD | NEW |