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