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 |