Chromium Code Reviews| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <limits> | 10 #include <limits> |
| (...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 524 if (!db_.Open(db_path_)) { | 524 if (!db_.Open(db_path_)) { |
| 525 LogDatabaseInitError(OPEN_FILE_ERROR); | 525 LogDatabaseInitError(OPEN_FILE_ERROR); |
| 526 LOG(ERROR) << "Unable to open the password store database."; | 526 LOG(ERROR) << "Unable to open the password store database."; |
| 527 return false; | 527 return false; |
| 528 } | 528 } |
| 529 | 529 |
| 530 sql::Transaction transaction(&db_); | 530 sql::Transaction transaction(&db_); |
| 531 if (!transaction.Begin()) { | 531 if (!transaction.Begin()) { |
| 532 LogDatabaseInitError(START_TRANSACTION_ERROR); | 532 LogDatabaseInitError(START_TRANSACTION_ERROR); |
| 533 LOG(ERROR) << "Unable to start a transaction."; | 533 LOG(ERROR) << "Unable to start a transaction."; |
| 534 transaction.Rollback(); | |
|
vasilii
2016/08/22 14:31:54
If it didn't begin there is nothing to rollback. T
vabr (Chromium)
2016/08/22 14:39:48
Done.
| |
| 534 db_.Close(); | 535 db_.Close(); |
| 535 return false; | 536 return false; |
| 536 } | 537 } |
| 537 | 538 |
| 538 // Check the database version. | 539 // Check the database version. |
| 539 if (!meta_table_.Init(&db_, kCurrentVersionNumber, | 540 if (!meta_table_.Init(&db_, kCurrentVersionNumber, |
| 540 kCompatibleVersionNumber)) { | 541 kCompatibleVersionNumber)) { |
| 541 LogDatabaseInitError(META_TABLE_INIT_ERROR); | 542 LogDatabaseInitError(META_TABLE_INIT_ERROR); |
| 542 LOG(ERROR) << "Unable to create the meta table."; | 543 LOG(ERROR) << "Unable to create the meta table."; |
| 544 transaction.Rollback(); | |
| 543 db_.Close(); | 545 db_.Close(); |
| 544 return false; | 546 return false; |
| 545 } | 547 } |
| 546 if (meta_table_.GetCompatibleVersionNumber() > kCurrentVersionNumber) { | 548 if (meta_table_.GetCompatibleVersionNumber() > kCurrentVersionNumber) { |
| 547 LogDatabaseInitError(INCOMPATIBLE_VERSION); | 549 LogDatabaseInitError(INCOMPATIBLE_VERSION); |
| 548 LOG(ERROR) << "Password store database is too new, kCurrentVersionNumber=" | 550 LOG(ERROR) << "Password store database is too new, kCurrentVersionNumber=" |
| 549 << kCurrentVersionNumber << ", GetCompatibleVersionNumber=" | 551 << kCurrentVersionNumber << ", GetCompatibleVersionNumber=" |
| 550 << meta_table_.GetCompatibleVersionNumber(); | 552 << meta_table_.GetCompatibleVersionNumber(); |
| 553 transaction.Rollback(); | |
| 551 db_.Close(); | 554 db_.Close(); |
| 552 return false; | 555 return false; |
| 553 } | 556 } |
| 554 | 557 |
| 555 SQLTableBuilder builder; | 558 SQLTableBuilder builder; |
| 556 InitializeBuilder(&builder); | 559 InitializeBuilder(&builder); |
| 557 InitializeStatementStrings(builder); | 560 InitializeStatementStrings(builder); |
| 558 | 561 |
| 559 if (!db_.DoesTableExist("logins")) { | 562 if (!db_.DoesTableExist("logins")) { |
| 560 if (!builder.CreateTable(&db_)) { | 563 if (!builder.CreateTable(&db_)) { |
| 561 VLOG(0) << "Failed to create the 'logins' table"; | 564 VLOG(0) << "Failed to create the 'logins' table"; |
| 565 transaction.Rollback(); | |
| 562 db_.Close(); | 566 db_.Close(); |
| 563 return false; | 567 return false; |
| 564 } | 568 } |
| 565 } | 569 } |
| 566 | 570 |
| 567 stats_table_.Init(&db_); | 571 stats_table_.Init(&db_); |
| 568 | 572 |
| 569 int current_version = meta_table_.GetVersionNumber(); | 573 int current_version = meta_table_.GetVersionNumber(); |
| 570 bool migration_success = FixVersionIfNeeded(&db_, ¤t_version); | 574 bool migration_success = FixVersionIfNeeded(&db_, ¤t_version); |
| 571 DCHECK_LE(current_version, kCurrentVersionNumber); | 575 DCHECK_LE(current_version, kCurrentVersionNumber); |
| 572 | 576 |
| 573 // If the file on disk is an older database version, bring it up to date. | 577 // If the file on disk is an older database version, bring it up to date. |
| 574 if (migration_success && current_version < kCurrentVersionNumber) { | 578 if (migration_success && current_version < kCurrentVersionNumber) { |
| 575 migration_success = MigrateLogins( | 579 migration_success = MigrateLogins( |
| 576 base::checked_cast<unsigned>(current_version), &builder, &db_); | 580 base::checked_cast<unsigned>(current_version), &builder, &db_); |
| 577 } | 581 } |
| 578 if (migration_success && current_version <= 15) { | 582 if (migration_success && current_version <= 15) { |
| 579 migration_success = stats_table_.MigrateToVersion(16); | 583 migration_success = stats_table_.MigrateToVersion(16); |
| 580 } | 584 } |
| 581 if (migration_success) { | 585 if (migration_success) { |
| 582 meta_table_.SetCompatibleVersionNumber(kCompatibleVersionNumber); | 586 meta_table_.SetCompatibleVersionNumber(kCompatibleVersionNumber); |
| 583 meta_table_.SetVersionNumber(kCurrentVersionNumber); | 587 meta_table_.SetVersionNumber(kCurrentVersionNumber); |
| 584 } else { | 588 } else { |
| 585 LogDatabaseInitError(MIGRATION_ERROR); | 589 LogDatabaseInitError(MIGRATION_ERROR); |
| 586 UMA_HISTOGRAM_SPARSE_SLOWLY("PasswordManager.LoginDatabaseFailedVersion", | 590 UMA_HISTOGRAM_SPARSE_SLOWLY("PasswordManager.LoginDatabaseFailedVersion", |
| 587 meta_table_.GetVersionNumber()); | 591 meta_table_.GetVersionNumber()); |
| 588 LOG(ERROR) << "Unable to migrate database from " | 592 LOG(ERROR) << "Unable to migrate database from " |
| 589 << meta_table_.GetVersionNumber() << " to " | 593 << meta_table_.GetVersionNumber() << " to " |
| 590 << kCurrentVersionNumber; | 594 << kCurrentVersionNumber; |
| 595 transaction.Rollback(); | |
| 591 db_.Close(); | 596 db_.Close(); |
| 592 return false; | 597 return false; |
| 593 } | 598 } |
| 594 | 599 |
| 595 if (!stats_table_.CreateTableIfNecessary()) { | 600 if (!stats_table_.CreateTableIfNecessary()) { |
| 596 LogDatabaseInitError(INIT_STATS_ERROR); | 601 LogDatabaseInitError(INIT_STATS_ERROR); |
| 597 LOG(ERROR) << "Unable to create the stats table."; | 602 LOG(ERROR) << "Unable to create the stats table."; |
| 603 transaction.Rollback(); | |
| 598 db_.Close(); | 604 db_.Close(); |
| 599 return false; | 605 return false; |
| 600 } | 606 } |
| 601 | 607 |
| 602 if (!transaction.Commit()) { | 608 if (!transaction.Commit()) { |
| 603 LogDatabaseInitError(COMMIT_TRANSACTION_ERROR); | 609 LogDatabaseInitError(COMMIT_TRANSACTION_ERROR); |
| 604 LOG(ERROR) << "Unable to commit a transaction."; | 610 LOG(ERROR) << "Unable to commit a transaction."; |
| 611 transaction.Rollback(); | |
|
vasilii
2016/08/22 14:31:54
That's a bug to call Rollback() after Commit().
vabr (Chromium)
2016/08/22 14:39:48
Done.
| |
| 605 db_.Close(); | 612 db_.Close(); |
| 606 return false; | 613 return false; |
| 607 } | 614 } |
| 608 | 615 |
| 609 LogDatabaseInitError(INIT_OK); | 616 LogDatabaseInitError(INIT_OK); |
| 610 return true; | 617 return true; |
| 611 } | 618 } |
| 612 | 619 |
| 613 void LoginDatabase::ReportMetrics(const std::string& sync_username, | 620 void LoginDatabase::ReportMetrics(const std::string& sync_username, |
| 614 bool custom_passphrase_sync_enabled) { | 621 bool custom_passphrase_sync_enabled) { |
| (...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1298 DCHECK(blacklisted_statement_.empty()); | 1305 DCHECK(blacklisted_statement_.empty()); |
| 1299 blacklisted_statement_ = | 1306 blacklisted_statement_ = |
| 1300 "SELECT " + all_column_names + | 1307 "SELECT " + all_column_names + |
| 1301 " FROM logins WHERE blacklisted_by_user == ? ORDER BY origin_url"; | 1308 " FROM logins WHERE blacklisted_by_user == ? ORDER BY origin_url"; |
| 1302 DCHECK(encrypted_statement_.empty()); | 1309 DCHECK(encrypted_statement_.empty()); |
| 1303 encrypted_statement_ = | 1310 encrypted_statement_ = |
| 1304 "SELECT password_value FROM logins WHERE " + all_unique_key_column_names; | 1311 "SELECT password_value FROM logins WHERE " + all_unique_key_column_names; |
| 1305 } | 1312 } |
| 1306 | 1313 |
| 1307 } // namespace password_manager | 1314 } // namespace password_manager |
| OLD | NEW |