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 |