| OLD | NEW | 
|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/autofill/core/browser/webdata/autofill_table.h" | 5 #include "components/autofill/core/browser/webdata/autofill_table.h" | 
| 6 | 6 | 
| 7 #include <stdint.h> | 7 #include <stdint.h> | 
| 8 | 8 | 
| 9 #include <algorithm> | 9 #include <algorithm> | 
| 10 #include <cmath> | 10 #include <cmath> | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 28 #include "components/autofill/core/browser/autofill_profile.h" | 28 #include "components/autofill/core/browser/autofill_profile.h" | 
| 29 #include "components/autofill/core/browser/autofill_type.h" | 29 #include "components/autofill/core/browser/autofill_type.h" | 
| 30 #include "components/autofill/core/browser/credit_card.h" | 30 #include "components/autofill/core/browser/credit_card.h" | 
| 31 #include "components/autofill/core/browser/personal_data_manager.h" | 31 #include "components/autofill/core/browser/personal_data_manager.h" | 
| 32 #include "components/autofill/core/browser/webdata/autofill_change.h" | 32 #include "components/autofill/core/browser/webdata/autofill_change.h" | 
| 33 #include "components/autofill/core/browser/webdata/autofill_entry.h" | 33 #include "components/autofill/core/browser/webdata/autofill_entry.h" | 
| 34 #include "components/autofill/core/common/autofill_switches.h" | 34 #include "components/autofill/core/common/autofill_switches.h" | 
| 35 #include "components/autofill/core/common/autofill_util.h" | 35 #include "components/autofill/core/common/autofill_util.h" | 
| 36 #include "components/autofill/core/common/form_field_data.h" | 36 #include "components/autofill/core/common/form_field_data.h" | 
| 37 #include "components/os_crypt/os_crypt.h" | 37 #include "components/os_crypt/os_crypt.h" | 
|  | 38 #include "components/sync/base/model_type.h" | 
|  | 39 #include "components/sync/model/metadata_batch.h" | 
|  | 40 #include "components/sync/protocol/entity_metadata.pb.h" | 
|  | 41 #include "components/sync/protocol/model_type_state.pb.h" | 
| 38 #include "components/webdata/common/web_database.h" | 42 #include "components/webdata/common/web_database.h" | 
| 39 #include "sql/statement.h" | 43 #include "sql/statement.h" | 
| 40 #include "sql/transaction.h" | 44 #include "sql/transaction.h" | 
| 41 #include "ui/base/l10n/l10n_util.h" | 45 #include "ui/base/l10n/l10n_util.h" | 
| 42 #include "url/gurl.h" | 46 #include "url/gurl.h" | 
| 43 | 47 | 
| 44 using base::ASCIIToUTF16; | 48 using base::ASCIIToUTF16; | 
| 45 using base::Time; | 49 using base::Time; | 
| 46 using base::TimeDelta; | 50 using base::TimeDelta; | 
| 47 | 51 | 
| (...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 409 WebDatabaseTable::TypeKey AutofillTable::GetTypeKey() const { | 413 WebDatabaseTable::TypeKey AutofillTable::GetTypeKey() const { | 
| 410   return GetKey(); | 414   return GetKey(); | 
| 411 } | 415 } | 
| 412 | 416 | 
| 413 bool AutofillTable::CreateTablesIfNecessary() { | 417 bool AutofillTable::CreateTablesIfNecessary() { | 
| 414   return (InitMainTable() && InitCreditCardsTable() && InitProfilesTable() && | 418   return (InitMainTable() && InitCreditCardsTable() && InitProfilesTable() && | 
| 415           InitProfileNamesTable() && InitProfileEmailsTable() && | 419           InitProfileNamesTable() && InitProfileEmailsTable() && | 
| 416           InitProfilePhonesTable() && InitProfileTrashTable() && | 420           InitProfilePhonesTable() && InitProfileTrashTable() && | 
| 417           InitMaskedCreditCardsTable() && InitUnmaskedCreditCardsTable() && | 421           InitMaskedCreditCardsTable() && InitUnmaskedCreditCardsTable() && | 
| 418           InitServerCardMetadataTable() && InitServerAddressesTable() && | 422           InitServerCardMetadataTable() && InitServerAddressesTable() && | 
| 419           InitServerAddressMetadataTable()); | 423           InitServerAddressMetadataTable() && InitAutofillSyncMetadataTable() && | 
|  | 424           InitModelTypeStateTable()); | 
| 420 } | 425 } | 
| 421 | 426 | 
| 422 bool AutofillTable::IsSyncable() { | 427 bool AutofillTable::IsSyncable() { | 
| 423   return true; | 428   return true; | 
| 424 } | 429 } | 
| 425 | 430 | 
| 426 bool AutofillTable::MigrateToVersion(int version, | 431 bool AutofillTable::MigrateToVersion(int version, | 
| 427                                      bool* update_compatible_version) { | 432                                      bool* update_compatible_version) { | 
| 428   // Migrate if necessary. | 433   // Migrate if necessary. | 
| 429   switch (version) { | 434   switch (version) { | 
| (...skipping 26 matching lines...) Expand all  Loading... | 
| 456       return MigrateToVersion64AddUnmaskDate(); | 461       return MigrateToVersion64AddUnmaskDate(); | 
| 457     case 65: | 462     case 65: | 
| 458       *update_compatible_version = false; | 463       *update_compatible_version = false; | 
| 459       return MigrateToVersion65AddServerMetadataTables(); | 464       return MigrateToVersion65AddServerMetadataTables(); | 
| 460     case 66: | 465     case 66: | 
| 461       *update_compatible_version = false; | 466       *update_compatible_version = false; | 
| 462       return MigrateToVersion66AddCardBillingAddress(); | 467       return MigrateToVersion66AddCardBillingAddress(); | 
| 463     case 67: | 468     case 67: | 
| 464       *update_compatible_version = false; | 469       *update_compatible_version = false; | 
| 465       return MigrateToVersion67AddMaskedCardBillingAddress(); | 470       return MigrateToVersion67AddMaskedCardBillingAddress(); | 
|  | 471     case 70: | 
|  | 472       *update_compatible_version = false; | 
|  | 473       return MigrateToVersion70AddSyncMetadata(); | 
| 466   } | 474   } | 
| 467   return true; | 475   return true; | 
| 468 } | 476 } | 
| 469 | 477 | 
| 470 bool AutofillTable::AddFormFieldValues( | 478 bool AutofillTable::AddFormFieldValues( | 
| 471     const std::vector<FormFieldData>& elements, | 479     const std::vector<FormFieldData>& elements, | 
| 472     std::vector<AutofillChange>* changes) { | 480     std::vector<AutofillChange>* changes) { | 
| 473   return AddFormFieldValuesTime(elements, changes, Time::Now()); | 481   return AddFormFieldValuesTime(elements, changes, Time::Now()); | 
| 474 } | 482 } | 
| 475 | 483 | 
| (...skipping 1197 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1673 bool AutofillTable::IsAutofillGUIDInTrash(const std::string& guid) { | 1681 bool AutofillTable::IsAutofillGUIDInTrash(const std::string& guid) { | 
| 1674   sql::Statement s(db_->GetUniqueStatement( | 1682   sql::Statement s(db_->GetUniqueStatement( | 
| 1675       "SELECT guid " | 1683       "SELECT guid " | 
| 1676       "FROM autofill_profiles_trash " | 1684       "FROM autofill_profiles_trash " | 
| 1677       "WHERE guid = ?")); | 1685       "WHERE guid = ?")); | 
| 1678   s.BindString(0, guid); | 1686   s.BindString(0, guid); | 
| 1679 | 1687 | 
| 1680   return s.Step(); | 1688   return s.Step(); | 
| 1681 } | 1689 } | 
| 1682 | 1690 | 
|  | 1691 bool AutofillTable::GetAllSyncMetadata(syncer::ModelType model_type, | 
|  | 1692                                        syncer::MetadataBatch* metadata_batch) { | 
|  | 1693   DCHECK_EQ(model_type, syncer::AUTOFILL) | 
|  | 1694       << "Only the AUTOFILL model type is supported"; | 
|  | 1695   syncer::EntityMetadataMap metadata_records; | 
|  | 1696   if (GetAllSyncEntityMetadata(model_type, &metadata_records)) { | 
|  | 1697     for (const auto& pair : metadata_records) { | 
|  | 1698       // todo(pnoland): add batch transfer of metadata map | 
|  | 1699       metadata_batch->AddMetadata(pair.first, pair.second); | 
|  | 1700     } | 
|  | 1701   } else { | 
|  | 1702     return false; | 
|  | 1703   } | 
|  | 1704 | 
|  | 1705   sync_pb::ModelTypeState model_type_state; | 
|  | 1706   if (GetModelTypeState(model_type, &model_type_state)) { | 
|  | 1707     metadata_batch->SetModelTypeState(model_type_state); | 
|  | 1708   } else { | 
|  | 1709     return false; | 
|  | 1710   } | 
|  | 1711 | 
|  | 1712   return true; | 
|  | 1713 } | 
|  | 1714 | 
|  | 1715 bool AutofillTable::GetAllSyncEntityMetadata( | 
|  | 1716     syncer::ModelType model_type, | 
|  | 1717     syncer::EntityMetadataMap* metadata_records) { | 
|  | 1718   DCHECK_EQ(model_type, syncer::AUTOFILL) | 
|  | 1719       << "Only the AUTOFILL model type is supported"; | 
|  | 1720 | 
|  | 1721   sql::Statement s(db_->GetUniqueStatement( | 
|  | 1722       "SELECT storage_key, value FROM autofill_sync_metadata")); | 
|  | 1723 | 
|  | 1724   while (s.Step()) { | 
|  | 1725     std::string storage_key = s.ColumnString(0); | 
|  | 1726     std::string serialized_metadata = s.ColumnString(1); | 
|  | 1727     sync_pb::EntityMetadata metadata_record; | 
|  | 1728     if (metadata_record.ParseFromString(serialized_metadata)) { | 
|  | 1729       metadata_records->insert(std::make_pair(storage_key, metadata_record)); | 
|  | 1730     } else { | 
|  | 1731       return false; | 
|  | 1732     } | 
|  | 1733   } | 
|  | 1734   return true; | 
|  | 1735 } | 
|  | 1736 | 
|  | 1737 bool AutofillTable::UpdateSyncMetadata( | 
|  | 1738     syncer::ModelType model_type, | 
|  | 1739     const std::string& storage_key, | 
|  | 1740     const sync_pb::EntityMetadata& metadata) { | 
|  | 1741   DCHECK_EQ(model_type, syncer::AUTOFILL) | 
|  | 1742       << "Only the AUTOFILL model type is supported"; | 
|  | 1743 | 
|  | 1744   sql::Statement s( | 
|  | 1745       db_->GetUniqueStatement("INSERT OR REPLACE INTO autofill_sync_metadata " | 
|  | 1746                               "(storage_key, value) VALUES(?, ?)")); | 
|  | 1747   s.BindString(0, storage_key); | 
|  | 1748   s.BindString(1, metadata.SerializeAsString()); | 
|  | 1749 | 
|  | 1750   return s.Run(); | 
|  | 1751 } | 
|  | 1752 | 
|  | 1753 bool AutofillTable::ClearSyncMetadata(syncer::ModelType model_type, | 
|  | 1754                                       const std::string& storage_key) { | 
|  | 1755   DCHECK_EQ(model_type, syncer::AUTOFILL) | 
|  | 1756       << "Only the AUTOFILL model type is supported"; | 
|  | 1757 | 
|  | 1758   sql::Statement s(db_->GetUniqueStatement( | 
|  | 1759       "DELETE FROM autofill_sync_metadata WHERE storage_key=?")); | 
|  | 1760   s.BindString(0, storage_key); | 
|  | 1761 | 
|  | 1762   return s.Run(); | 
|  | 1763 } | 
|  | 1764 | 
|  | 1765 bool AutofillTable::GetModelTypeState(syncer::ModelType model_type, | 
|  | 1766                                       sync_pb::ModelTypeState* state) { | 
|  | 1767   DCHECK_EQ(model_type, syncer::AUTOFILL) | 
|  | 1768       << "Only the AUTOFILL model type is supported"; | 
|  | 1769 | 
|  | 1770   sql::Statement s(db_->GetUniqueStatement( | 
|  | 1771       "SELECT value FROM autofill_model_type_state WHERE id=1")); | 
|  | 1772 | 
|  | 1773   if (!s.Step()) { | 
|  | 1774     return false; | 
|  | 1775   } | 
|  | 1776 | 
|  | 1777   std::string serialized_state = s.ColumnString(0); | 
|  | 1778   return state->ParseFromString(serialized_state); | 
|  | 1779 } | 
|  | 1780 | 
|  | 1781 bool AutofillTable::UpdateModelTypeState( | 
|  | 1782     syncer::ModelType model_type, | 
|  | 1783     const sync_pb::ModelTypeState& model_type_state) { | 
|  | 1784   DCHECK_EQ(model_type, syncer::AUTOFILL) | 
|  | 1785       << "Only the AUTOFILL model type is supported"; | 
|  | 1786 | 
|  | 1787   // Hardcode the id to force a collision, ensuring that there remains only a | 
|  | 1788   // single entry. | 
|  | 1789   sql::Statement s(db_->GetUniqueStatement( | 
|  | 1790       "INSERT OR REPLACE INTO autofill_model_type_state (id, value) " | 
|  | 1791       "VALUES(1,?)")); | 
|  | 1792   s.BindString(0, model_type_state.SerializeAsString()); | 
|  | 1793 | 
|  | 1794   return s.Run(); | 
|  | 1795 } | 
|  | 1796 | 
|  | 1797 bool AutofillTable::ClearModelTypeState(syncer::ModelType model_type) { | 
|  | 1798   DCHECK_EQ(model_type, syncer::AUTOFILL) | 
|  | 1799       << "Only the AUTOFILL model type is supported"; | 
|  | 1800 | 
|  | 1801   sql::Statement s(db_->GetUniqueStatement( | 
|  | 1802       "DELETE FROM autofill_model_type_state WHERE id=1")); | 
|  | 1803 | 
|  | 1804   return s.Run(); | 
|  | 1805 } | 
|  | 1806 | 
| 1683 bool AutofillTable::InitMainTable() { | 1807 bool AutofillTable::InitMainTable() { | 
| 1684   if (!db_->DoesTableExist("autofill")) { | 1808   if (!db_->DoesTableExist("autofill")) { | 
| 1685     if (!db_->Execute("CREATE TABLE autofill (" | 1809     if (!db_->Execute("CREATE TABLE autofill (" | 
| 1686                       "name VARCHAR, " | 1810                       "name VARCHAR, " | 
| 1687                       "value VARCHAR, " | 1811                       "value VARCHAR, " | 
| 1688                       "value_lower VARCHAR, " | 1812                       "value_lower VARCHAR, " | 
| 1689                       "date_created INTEGER DEFAULT 0, " | 1813                       "date_created INTEGER DEFAULT 0, " | 
| 1690                       "date_last_used INTEGER DEFAULT 0, " | 1814                       "date_last_used INTEGER DEFAULT 0, " | 
| 1691                       "count INTEGER DEFAULT 1, " | 1815                       "count INTEGER DEFAULT 1, " | 
| 1692                       "PRIMARY KEY (name, value))") || | 1816                       "PRIMARY KEY (name, value))") || | 
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1872                       "id VARCHAR NOT NULL," | 1996                       "id VARCHAR NOT NULL," | 
| 1873                       "use_count INTEGER NOT NULL DEFAULT 0, " | 1997                       "use_count INTEGER NOT NULL DEFAULT 0, " | 
| 1874                       "use_date INTEGER NOT NULL DEFAULT 0)")) { | 1998                       "use_date INTEGER NOT NULL DEFAULT 0)")) { | 
| 1875       NOTREACHED(); | 1999       NOTREACHED(); | 
| 1876       return false; | 2000       return false; | 
| 1877     } | 2001     } | 
| 1878   } | 2002   } | 
| 1879   return true; | 2003   return true; | 
| 1880 } | 2004 } | 
| 1881 | 2005 | 
|  | 2006 bool AutofillTable::InitAutofillSyncMetadataTable() { | 
|  | 2007   if (!db_->DoesTableExist("autofill_sync_metadata")) { | 
|  | 2008     if (!db_->Execute("CREATE TABLE autofill_sync_metadata (" | 
|  | 2009                       "storage_key VARCHAR PRIMARY KEY NOT NULL," | 
|  | 2010                       "value BLOB)")) { | 
|  | 2011       NOTREACHED(); | 
|  | 2012       return false; | 
|  | 2013     } | 
|  | 2014   } | 
|  | 2015   return true; | 
|  | 2016 } | 
|  | 2017 | 
|  | 2018 bool AutofillTable::InitModelTypeStateTable() { | 
|  | 2019   if (!db_->DoesTableExist("autofill_model_type_state")) { | 
|  | 2020     if (!db_->Execute("CREATE TABLE autofill_model_type_state (id INTEGER " | 
|  | 2021                       "PRIMARY KEY, value BLOB)")) { | 
|  | 2022       NOTREACHED(); | 
|  | 2023       return false; | 
|  | 2024     } | 
|  | 2025   } | 
|  | 2026   return true; | 
|  | 2027 } | 
|  | 2028 | 
| 1882 bool AutofillTable::MigrateToVersion54AddI18nFieldsAndRemoveDeprecatedFields() { | 2029 bool AutofillTable::MigrateToVersion54AddI18nFieldsAndRemoveDeprecatedFields() { | 
| 1883   sql::Transaction transaction(db_); | 2030   sql::Transaction transaction(db_); | 
| 1884   if (!transaction.Begin()) | 2031   if (!transaction.Begin()) | 
| 1885     return false; | 2032     return false; | 
| 1886 | 2033 | 
| 1887   // Test the existence of the |address_line_1| column as an indication that a | 2034   // Test the existence of the |address_line_1| column as an indication that a | 
| 1888   // migration is needed.  It is possible that the new |autofill_profile_phones| | 2035   // migration is needed.  It is possible that the new |autofill_profile_phones| | 
| 1889   // schema is in place because the table was newly created when migrating from | 2036   // schema is in place because the table was newly created when migrating from | 
| 1890   // a pre-version-23 database. | 2037   // a pre-version-23 database. | 
| 1891   if (db_->DoesColumnExist("autofill_profiles", "address_line_1")) { | 2038   if (db_->DoesColumnExist("autofill_profiles", "address_line_1")) { | 
| (...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2308       "ALTER TABLE credit_cards ADD COLUMN billing_address_id VARCHAR"); | 2455       "ALTER TABLE credit_cards ADD COLUMN billing_address_id VARCHAR"); | 
| 2309 } | 2456 } | 
| 2310 | 2457 | 
| 2311 bool AutofillTable::MigrateToVersion67AddMaskedCardBillingAddress() { | 2458 bool AutofillTable::MigrateToVersion67AddMaskedCardBillingAddress() { | 
| 2312   // The default value for this column is null, but Connection::ColumnString() | 2459   // The default value for this column is null, but Connection::ColumnString() | 
| 2313   // returns an empty string for that. | 2460   // returns an empty string for that. | 
| 2314   return db_->Execute( | 2461   return db_->Execute( | 
| 2315       "ALTER TABLE masked_credit_cards ADD COLUMN billing_address_id VARCHAR"); | 2462       "ALTER TABLE masked_credit_cards ADD COLUMN billing_address_id VARCHAR"); | 
| 2316 } | 2463 } | 
| 2317 | 2464 | 
| 2318 }  // namespace autofill | 2465 bool AutofillTable::MigrateToVersion70AddSyncMetadata() { | 
|  | 2466   if (!db_->Execute("CREATE TABLE autofill_sync_metadata (" | 
|  | 2467                     "storage_key VARCHAR PRIMARY KEY NOT NULL," | 
|  | 2468                     "value BLOB)")) { | 
|  | 2469     return false; | 
|  | 2470   } | 
|  | 2471   return db_->Execute( | 
|  | 2472       "CREATE TABLE autofill_model_type_state (id INTEGER PRIMARY KEY, value " | 
|  | 2473       "BLOB)"); | 
|  | 2474 } | 
|  | 2475 | 
|  | 2476 }  // namespace autofill | 
| OLD | NEW | 
|---|