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 <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 #include <limits> | 9 #include <limits> |
10 #include <map> | 10 #include <map> |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 | 430 |
431 WebDatabaseTable::TypeKey AutofillTable::GetTypeKey() const { | 431 WebDatabaseTable::TypeKey AutofillTable::GetTypeKey() const { |
432 return GetKey(); | 432 return GetKey(); |
433 } | 433 } |
434 | 434 |
435 bool AutofillTable::CreateTablesIfNecessary() { | 435 bool AutofillTable::CreateTablesIfNecessary() { |
436 return (InitMainTable() && InitCreditCardsTable() && InitProfilesTable() && | 436 return (InitMainTable() && InitCreditCardsTable() && InitProfilesTable() && |
437 InitProfileNamesTable() && InitProfileEmailsTable() && | 437 InitProfileNamesTable() && InitProfileEmailsTable() && |
438 InitProfilePhonesTable() && InitProfileTrashTable() && | 438 InitProfilePhonesTable() && InitProfileTrashTable() && |
439 InitMaskedCreditCardsTable() && InitUnmaskedCreditCardsTable() && | 439 InitMaskedCreditCardsTable() && InitUnmaskedCreditCardsTable() && |
440 InitServerAddressesTable()); | 440 InitServerCardMetadataTable() && InitServerAddressesTable() && |
| 441 InitServerAddressMetadataTable()); |
441 } | 442 } |
442 | 443 |
443 bool AutofillTable::IsSyncable() { | 444 bool AutofillTable::IsSyncable() { |
444 return true; | 445 return true; |
445 } | 446 } |
446 | 447 |
447 bool AutofillTable::MigrateToVersion(int version, | 448 bool AutofillTable::MigrateToVersion(int version, |
448 bool* update_compatible_version) { | 449 bool* update_compatible_version) { |
449 // Migrate if necessary. | 450 // Migrate if necessary. |
450 switch (version) { | 451 switch (version) { |
(...skipping 17 matching lines...) Expand all Loading... |
468 return MigrateToVersion61AddUsageStats(); | 469 return MigrateToVersion61AddUsageStats(); |
469 case 62: | 470 case 62: |
470 *update_compatible_version = false; | 471 *update_compatible_version = false; |
471 return MigrateToVersion62AddUsageStatsForUnmaskedCards(); | 472 return MigrateToVersion62AddUsageStatsForUnmaskedCards(); |
472 case 63: | 473 case 63: |
473 *update_compatible_version = false; | 474 *update_compatible_version = false; |
474 return MigrateToVersion63AddServerRecipientName(); | 475 return MigrateToVersion63AddServerRecipientName(); |
475 case 64: | 476 case 64: |
476 *update_compatible_version = false; | 477 *update_compatible_version = false; |
477 return MigrateToVersion64AddUnmaskDate(); | 478 return MigrateToVersion64AddUnmaskDate(); |
| 479 case 65: |
| 480 *update_compatible_version = false; |
| 481 return MigrateToVersion65AddServerMetadataTables(); |
478 } | 482 } |
479 return true; | 483 return true; |
480 } | 484 } |
481 | 485 |
482 bool AutofillTable::AddFormFieldValues( | 486 bool AutofillTable::AddFormFieldValues( |
483 const std::vector<FormFieldData>& elements, | 487 const std::vector<FormFieldData>& elements, |
484 std::vector<AutofillChange>* changes) { | 488 std::vector<AutofillChange>* changes) { |
485 return AddFormFieldValuesTime(elements, changes, Time::Now()); | 489 return AddFormFieldValuesTime(elements, changes, Time::Now()); |
486 } | 490 } |
487 | 491 |
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
897 | 901 |
898 return s.Succeeded(); | 902 return s.Succeeded(); |
899 } | 903 } |
900 | 904 |
901 bool AutofillTable::GetServerProfiles(std::vector<AutofillProfile*>* profiles) { | 905 bool AutofillTable::GetServerProfiles(std::vector<AutofillProfile*>* profiles) { |
902 profiles->clear(); | 906 profiles->clear(); |
903 | 907 |
904 sql::Statement s(db_->GetUniqueStatement( | 908 sql::Statement s(db_->GetUniqueStatement( |
905 "SELECT " | 909 "SELECT " |
906 "id," | 910 "id," |
| 911 "use_count," |
| 912 "use_date," |
907 "recipient_name," | 913 "recipient_name," |
908 "company_name," | 914 "company_name," |
909 "street_address," | 915 "street_address," |
910 "address_1," // ADDRESS_HOME_STATE | 916 "address_1," // ADDRESS_HOME_STATE |
911 "address_2," // ADDRESS_HOME_CITY | 917 "address_2," // ADDRESS_HOME_CITY |
912 "address_3," // ADDRESS_HOME_DEPENDENT_LOCALITY | 918 "address_3," // ADDRESS_HOME_DEPENDENT_LOCALITY |
913 "address_4," // Not supported in AutofillProfile yet. | 919 "address_4," // Not supported in AutofillProfile yet. |
914 "postal_code," // ADDRESS_HOME_ZIP | 920 "postal_code," // ADDRESS_HOME_ZIP |
915 "sorting_code," // ADDRESS_HOME_SORTING_CODE | 921 "sorting_code," // ADDRESS_HOME_SORTING_CODE |
916 "country_code," // ADDRESS_HOME_COUNTRY | 922 "country_code," // ADDRESS_HOME_COUNTRY |
917 "phone_number," // PHONE_HOME_WHOLE_NUMBER | 923 "phone_number," // PHONE_HOME_WHOLE_NUMBER |
918 "language_code " | 924 "language_code " |
919 "FROM server_addresses")); | 925 "FROM server_addresses addresses " |
| 926 "LEFT OUTER JOIN server_address_metadata USING (id)")); |
920 | 927 |
921 while (s.Step()) { | 928 while (s.Step()) { |
922 int index = 0; | 929 int index = 0; |
923 scoped_ptr<AutofillProfile> profile(new AutofillProfile( | 930 scoped_ptr<AutofillProfile> profile(new AutofillProfile( |
924 AutofillProfile::SERVER_PROFILE, s.ColumnString(index++))); | 931 AutofillProfile::SERVER_PROFILE, s.ColumnString(index++))); |
| 932 profile->set_use_count(s.ColumnInt64(index++)); |
| 933 profile->set_use_date( |
| 934 base::Time::FromInternalValue(s.ColumnInt64(index++))); |
925 | 935 |
926 base::string16 recipient_name = s.ColumnString16(index++); | 936 base::string16 recipient_name = s.ColumnString16(index++); |
927 profile->SetRawInfo(COMPANY_NAME, s.ColumnString16(index++)); | 937 profile->SetRawInfo(COMPANY_NAME, s.ColumnString16(index++)); |
928 profile->SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, s.ColumnString16(index++)); | 938 profile->SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, s.ColumnString16(index++)); |
929 profile->SetRawInfo(ADDRESS_HOME_STATE, s.ColumnString16(index++)); | 939 profile->SetRawInfo(ADDRESS_HOME_STATE, s.ColumnString16(index++)); |
930 profile->SetRawInfo(ADDRESS_HOME_CITY, s.ColumnString16(index++)); | 940 profile->SetRawInfo(ADDRESS_HOME_CITY, s.ColumnString16(index++)); |
931 profile->SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, | 941 profile->SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, |
932 s.ColumnString16(index++)); | 942 s.ColumnString16(index++)); |
933 index++; // Skip address_4 which we haven't added to AutofillProfile yet. | 943 index++; // Skip address_4 which we haven't added to AutofillProfile yet. |
934 profile->SetRawInfo(ADDRESS_HOME_ZIP, s.ColumnString16(index++)); | 944 profile->SetRawInfo(ADDRESS_HOME_ZIP, s.ColumnString16(index++)); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
994 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_ZIP)); | 1004 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_ZIP)); |
995 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_SORTING_CODE)); | 1005 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_SORTING_CODE)); |
996 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_COUNTRY)); | 1006 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_COUNTRY)); |
997 insert.BindString16(index++, profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)); | 1007 insert.BindString16(index++, profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)); |
998 insert.BindString(index++, profile.language_code()); | 1008 insert.BindString(index++, profile.language_code()); |
999 | 1009 |
1000 insert.Run(); | 1010 insert.Run(); |
1001 insert.Reset(true); | 1011 insert.Reset(true); |
1002 } | 1012 } |
1003 | 1013 |
| 1014 // Delete metadata that's no longer relevant. |
| 1015 sql::Statement metadata_delete(db_->GetUniqueStatement( |
| 1016 "DELETE FROM server_address_metadata WHERE id NOT IN " |
| 1017 "(SELECT id FROM server_addresses)")); |
| 1018 metadata_delete.Run(); |
| 1019 |
1004 transaction.Commit(); | 1020 transaction.Commit(); |
1005 } | 1021 } |
1006 | 1022 |
1007 bool AutofillTable::UpdateAutofillProfile(const AutofillProfile& profile) { | 1023 bool AutofillTable::UpdateAutofillProfile(const AutofillProfile& profile) { |
1008 DCHECK(base::IsValidGUID(profile.guid())); | 1024 DCHECK(base::IsValidGUID(profile.guid())); |
1009 | 1025 |
1010 // Don't update anything until the trash has been emptied. There may be | 1026 // Don't update anything until the trash has been emptied. There may be |
1011 // pending modifications to process. | 1027 // pending modifications to process. |
1012 if (!IsAutofillProfilesTrashEmpty()) | 1028 if (!IsAutofillProfilesTrashEmpty()) |
1013 return true; | 1029 return true; |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1148 | 1164 |
1149 bool AutofillTable::GetServerCreditCards( | 1165 bool AutofillTable::GetServerCreditCards( |
1150 std::vector<CreditCard*>* credit_cards) { | 1166 std::vector<CreditCard*>* credit_cards) { |
1151 credit_cards->clear(); | 1167 credit_cards->clear(); |
1152 | 1168 |
1153 sql::Statement s(db_->GetUniqueStatement( | 1169 sql::Statement s(db_->GetUniqueStatement( |
1154 "SELECT " | 1170 "SELECT " |
1155 "card_number_encrypted, " // 0 | 1171 "card_number_encrypted, " // 0 |
1156 "last_four," // 1 | 1172 "last_four," // 1 |
1157 "masked.id," // 2 | 1173 "masked.id," // 2 |
1158 "use_count," // 3 | 1174 "metadata.use_count," // 3 |
1159 "use_date," // 4 | 1175 "metadata.use_date," // 4 |
1160 "type," // 5 | 1176 "type," // 5 |
1161 "status," // 6 | 1177 "status," // 6 |
1162 "name_on_card," // 7 | 1178 "name_on_card," // 7 |
1163 "exp_month," // 8 | 1179 "exp_month," // 8 |
1164 "exp_year " // 9 | 1180 "exp_year " // 9 |
1165 "FROM masked_credit_cards masked " | 1181 "FROM masked_credit_cards masked " |
1166 "LEFT OUTER JOIN unmasked_credit_cards unmasked " | 1182 "LEFT OUTER JOIN unmasked_credit_cards USING (id) " |
1167 "ON masked.id = unmasked.id")); | 1183 "LEFT OUTER JOIN server_card_metadata metadata USING (id)")); |
1168 while (s.Step()) { | 1184 while (s.Step()) { |
1169 int index = 0; | 1185 int index = 0; |
1170 | 1186 |
1171 // If the card_number_encrypted field is nonempty, we can assume this card | 1187 // If the card_number_encrypted field is nonempty, we can assume this card |
1172 // is a full card, otherwise it's masked. | 1188 // is a full card, otherwise it's masked. |
1173 base::string16 full_card_number = UnencryptedCardFromColumn(s, index++); | 1189 base::string16 full_card_number = UnencryptedCardFromColumn(s, index++); |
1174 base::string16 last_four = s.ColumnString16(index++); | 1190 base::string16 last_four = s.ColumnString16(index++); |
1175 CreditCard::RecordType record_type = full_card_number.empty() ? | 1191 CreditCard::RecordType record_type = full_card_number.empty() ? |
1176 CreditCard::MASKED_SERVER_CARD : | 1192 CreditCard::MASKED_SERVER_CARD : |
1177 CreditCard::FULL_SERVER_CARD; | 1193 CreditCard::FULL_SERVER_CARD; |
1178 std::string server_id = s.ColumnString(index++); | 1194 std::string server_id = s.ColumnString(index++); |
1179 | 1195 |
1180 CreditCard* card = new CreditCard(record_type, server_id); | 1196 CreditCard* card = new CreditCard(record_type, server_id); |
1181 card->SetRawInfo( | 1197 card->SetRawInfo( |
1182 CREDIT_CARD_NUMBER, | 1198 CREDIT_CARD_NUMBER, |
1183 record_type == CreditCard::MASKED_SERVER_CARD ? last_four | 1199 record_type == CreditCard::MASKED_SERVER_CARD ? last_four |
1184 : full_card_number); | 1200 : full_card_number); |
1185 int64 use_count = s.ColumnInt64(index++); | 1201 card->set_use_count(s.ColumnInt64(index++)); |
1186 int64 use_date = s.ColumnInt64(index++); | 1202 card->set_use_date(base::Time::FromInternalValue(s.ColumnInt64(index++))); |
| 1203 |
1187 std::string card_type = s.ColumnString(index++); | 1204 std::string card_type = s.ColumnString(index++); |
1188 if (record_type == CreditCard::MASKED_SERVER_CARD) { | 1205 if (record_type == CreditCard::MASKED_SERVER_CARD) { |
1189 // The type must be set after setting the number to override the | 1206 // The type must be set after setting the number to override the |
1190 // autodectected type. | 1207 // autodectected type. |
1191 card->SetTypeForMaskedCard(card_type.c_str()); | 1208 card->SetTypeForMaskedCard(card_type.c_str()); |
1192 DCHECK_EQ(0, use_count); | |
1193 DCHECK_EQ(0, use_date); | |
1194 } else { | 1209 } else { |
1195 DCHECK_EQ(CreditCard::GetCreditCardType(full_card_number), card_type); | 1210 DCHECK_EQ(CreditCard::GetCreditCardType(full_card_number), card_type); |
1196 card->set_use_count(use_count); | |
1197 card->set_use_date(base::Time::FromInternalValue(use_date)); | |
1198 } | 1211 } |
1199 | 1212 |
1200 card->SetServerStatus(ServerStatusStringToEnum(s.ColumnString(index++))); | 1213 card->SetServerStatus(ServerStatusStringToEnum(s.ColumnString(index++))); |
1201 card->SetRawInfo(CREDIT_CARD_NAME, s.ColumnString16(index++)); | 1214 card->SetRawInfo(CREDIT_CARD_NAME, s.ColumnString16(index++)); |
1202 card->SetRawInfo(CREDIT_CARD_EXP_MONTH, s.ColumnString16(index++)); | 1215 card->SetRawInfo(CREDIT_CARD_EXP_MONTH, s.ColumnString16(index++)); |
1203 card->SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(index++)); | 1216 card->SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(index++)); |
1204 credit_cards->push_back(card); | 1217 credit_cards->push_back(card); |
1205 } | 1218 } |
1206 | 1219 |
1207 return s.Succeeded(); | 1220 return s.Succeeded(); |
1208 } | 1221 } |
1209 | 1222 |
1210 void AutofillTable::SetServerCreditCards( | 1223 void AutofillTable::SetServerCreditCards( |
1211 const std::vector<CreditCard>& credit_cards) { | 1224 const std::vector<CreditCard>& credit_cards) { |
1212 sql::Transaction transaction(db_); | 1225 sql::Transaction transaction(db_); |
1213 if (!transaction.Begin()) | 1226 if (!transaction.Begin()) |
1214 return; | 1227 return; |
1215 | 1228 |
1216 // Delete all old values. | 1229 // Delete all old values. |
1217 sql::Statement masked_delete(db_->GetUniqueStatement( | 1230 sql::Statement masked_delete(db_->GetUniqueStatement( |
1218 "DELETE FROM masked_credit_cards")); | 1231 "DELETE FROM masked_credit_cards")); |
1219 masked_delete.Run(); | 1232 masked_delete.Run(); |
1220 | 1233 |
1221 // Delete all items in the unmasked table that aren't in the new set. | |
1222 sql::Statement get_unmasked(db_->GetUniqueStatement( | |
1223 "SELECT id FROM unmasked_credit_cards")); | |
1224 while (get_unmasked.Step()) { | |
1225 // We expect relatively few cards, just do brute-force. | |
1226 std::string server_id = get_unmasked.ColumnString(0); | |
1227 bool found_card = false; | |
1228 for (const CreditCard& cur_card : credit_cards) { | |
1229 if (cur_card.server_id() == server_id) { | |
1230 found_card = true; | |
1231 break; | |
1232 } | |
1233 } | |
1234 if (!found_card) { | |
1235 // This unmasked card in the DB isn't present in the input. The statement | |
1236 // is compiled every time because it's much more likely that this is never | |
1237 // executed than it runs more than once. | |
1238 sql::Statement unmasked_delete(db_->GetUniqueStatement( | |
1239 "DELETE FROM unmasked_credit_cards WHERE id = ?")); | |
1240 unmasked_delete.BindString(0, server_id); | |
1241 unmasked_delete.Run(); | |
1242 DCHECK_EQ(1, db_->GetLastChangeCount()); | |
1243 } | |
1244 } | |
1245 | |
1246 sql::Statement masked_insert(db_->GetUniqueStatement( | 1234 sql::Statement masked_insert(db_->GetUniqueStatement( |
1247 "INSERT INTO masked_credit_cards(" | 1235 "INSERT INTO masked_credit_cards(" |
1248 "id," // 0 | 1236 "id," // 0 |
1249 "type," // 1 | 1237 "type," // 1 |
1250 "status," // 2 | 1238 "status," // 2 |
1251 "name_on_card," // 3 | 1239 "name_on_card," // 3 |
1252 "last_four," // 4 | 1240 "last_four," // 4 |
1253 "exp_month," // 4 | 1241 "exp_month," // 4 |
1254 "exp_year) " // 5 | 1242 "exp_year) " // 5 |
1255 "VALUES (?,?,?,?,?,?,?)")); | 1243 "VALUES (?,?,?,?,?,?,?)")); |
1256 for (const CreditCard& card : credit_cards) { | 1244 for (const CreditCard& card : credit_cards) { |
1257 DCHECK_EQ(CreditCard::MASKED_SERVER_CARD, card.record_type()); | 1245 DCHECK_EQ(CreditCard::MASKED_SERVER_CARD, card.record_type()); |
1258 | 1246 |
1259 masked_insert.BindString(0, card.server_id()); | 1247 masked_insert.BindString(0, card.server_id()); |
1260 masked_insert.BindString(1, card.type()); | 1248 masked_insert.BindString(1, card.type()); |
1261 masked_insert.BindString(2, | 1249 masked_insert.BindString(2, |
1262 ServerStatusEnumToString(card.GetServerStatus())); | 1250 ServerStatusEnumToString(card.GetServerStatus())); |
1263 masked_insert.BindString16(3, card.GetRawInfo(CREDIT_CARD_NAME)); | 1251 masked_insert.BindString16(3, card.GetRawInfo(CREDIT_CARD_NAME)); |
1264 masked_insert.BindString16(4, card.LastFourDigits()); | 1252 masked_insert.BindString16(4, card.LastFourDigits()); |
1265 masked_insert.BindString16(5, card.GetRawInfo(CREDIT_CARD_EXP_MONTH)); | 1253 masked_insert.BindString16(5, card.GetRawInfo(CREDIT_CARD_EXP_MONTH)); |
1266 masked_insert.BindString16(6, | 1254 masked_insert.BindString16(6, |
1267 card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR)); | 1255 card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR)); |
1268 | 1256 |
1269 masked_insert.Run(); | 1257 masked_insert.Run(); |
1270 masked_insert.Reset(true); | 1258 masked_insert.Reset(true); |
1271 } | 1259 } |
1272 | 1260 |
| 1261 // Delete all items in the unmasked table that aren't in the new set. |
| 1262 sql::Statement unmasked_delete(db_->GetUniqueStatement( |
| 1263 "DELETE FROM unmasked_credit_cards WHERE id NOT IN " |
| 1264 "(SELECT id FROM masked_credit_cards)")); |
| 1265 unmasked_delete.Run(); |
| 1266 // Do the same for metadata. |
| 1267 sql::Statement metadata_delete(db_->GetUniqueStatement( |
| 1268 "DELETE FROM server_card_metadata WHERE id NOT IN " |
| 1269 "(SELECT id FROM masked_credit_cards)")); |
| 1270 metadata_delete.Run(); |
| 1271 |
1273 transaction.Commit(); | 1272 transaction.Commit(); |
1274 } | 1273 } |
1275 | 1274 |
1276 bool AutofillTable::UnmaskServerCreditCard(const std::string& id, | 1275 bool AutofillTable::UnmaskServerCreditCard(const CreditCard& masked, |
1277 const base::string16& full_number) { | 1276 const base::string16& full_number) { |
1278 // Make sure there aren't duplicates for this card. | 1277 // Make sure there aren't duplicates for this card. |
1279 MaskServerCreditCard(id); | 1278 MaskServerCreditCard(masked.server_id()); |
1280 sql::Statement s(db_->GetUniqueStatement( | 1279 sql::Statement s(db_->GetUniqueStatement( |
1281 "INSERT INTO unmasked_credit_cards(" | 1280 "INSERT INTO unmasked_credit_cards(" |
1282 "id," | 1281 "id," |
1283 "card_number_encrypted," | 1282 "card_number_encrypted," |
1284 "use_count," | |
1285 "use_date," | |
1286 "unmask_date)" | 1283 "unmask_date)" |
1287 "VALUES (?,?,?,?,?)")); | 1284 "VALUES (?,?,?)")); |
1288 s.BindString(0, id); | 1285 s.BindString(0, masked.server_id()); |
1289 | 1286 |
1290 std::string encrypted_data; | 1287 std::string encrypted_data; |
1291 OSCrypt::EncryptString16(full_number, &encrypted_data); | 1288 OSCrypt::EncryptString16(full_number, &encrypted_data); |
1292 s.BindBlob(1, encrypted_data.data(), | 1289 s.BindBlob(1, encrypted_data.data(), |
1293 static_cast<int>(encrypted_data.length())); | 1290 static_cast<int>(encrypted_data.length())); |
1294 | 1291 s.BindInt64(2, base::Time::Now().ToInternalValue()); // unmask_date |
1295 // Unmasking counts as a usage, so set the stats accordingly. | |
1296 base::Time now = base::Time::Now(); | |
1297 s.BindInt64(2, 1); // use_count | |
1298 s.BindInt64(3, now.ToInternalValue()); // use_date | |
1299 | |
1300 s.BindInt64(4, now.ToInternalValue()); // unmask_date | |
1301 | 1292 |
1302 s.Run(); | 1293 s.Run(); |
| 1294 |
| 1295 CreditCard unmasked = masked; |
| 1296 unmasked.set_record_type(CreditCard::FULL_SERVER_CARD); |
| 1297 unmasked.SetNumber(full_number); |
| 1298 unmasked.RecordUse(); |
| 1299 UpdateServerCardUsageStats(unmasked); |
| 1300 |
1303 return db_->GetLastChangeCount() > 0; | 1301 return db_->GetLastChangeCount() > 0; |
1304 } | 1302 } |
1305 | 1303 |
1306 bool AutofillTable::MaskServerCreditCard(const std::string& id) { | 1304 bool AutofillTable::MaskServerCreditCard(const std::string& id) { |
1307 sql::Statement s(db_->GetUniqueStatement( | 1305 sql::Statement s(db_->GetUniqueStatement( |
1308 "DELETE FROM unmasked_credit_cards WHERE id = ?")); | 1306 "DELETE FROM unmasked_credit_cards WHERE id = ?")); |
1309 s.BindString(0, id); | 1307 s.BindString(0, id); |
1310 s.Run(); | 1308 s.Run(); |
1311 return db_->GetLastChangeCount() > 0; | 1309 return db_->GetLastChangeCount() > 0; |
1312 } | 1310 } |
1313 | 1311 |
1314 bool AutofillTable::UpdateUnmaskedCardUsageStats( | 1312 bool AutofillTable::UpdateServerCardUsageStats( |
1315 const CreditCard& credit_card) { | 1313 const CreditCard& credit_card) { |
1316 DCHECK_EQ(CreditCard::FULL_SERVER_CARD, credit_card.record_type()); | 1314 DCHECK_NE(CreditCard::LOCAL_CARD, credit_card.record_type()); |
| 1315 sql::Transaction transaction(db_); |
| 1316 if (!transaction.Begin()) |
| 1317 return false; |
| 1318 |
| 1319 sql::Statement remove(db_->GetUniqueStatement( |
| 1320 "DELETE FROM server_card_metadata WHERE id = ?")); |
| 1321 remove.BindString(0, credit_card.server_id()); |
| 1322 remove.Run(); |
1317 | 1323 |
1318 sql::Statement s(db_->GetUniqueStatement( | 1324 sql::Statement s(db_->GetUniqueStatement( |
1319 "UPDATE unmasked_credit_cards " | 1325 "INSERT INTO server_card_metadata(use_count, use_date, id)" |
1320 "SET use_count=?, use_date=? " | 1326 "VALUES (?,?,?)")); |
1321 "WHERE id=?")); | |
1322 s.BindInt64(0, credit_card.use_count()); | 1327 s.BindInt64(0, credit_card.use_count()); |
1323 s.BindInt64(1, credit_card.use_date().ToInternalValue()); | 1328 s.BindInt64(1, credit_card.use_date().ToInternalValue()); |
1324 s.BindString(2, credit_card.server_id()); | 1329 s.BindString(2, credit_card.server_id()); |
1325 s.Run(); | 1330 s.Run(); |
| 1331 |
| 1332 transaction.Commit(); |
| 1333 |
1326 return db_->GetLastChangeCount() > 0; | 1334 return db_->GetLastChangeCount() > 0; |
1327 } | 1335 } |
1328 | 1336 |
| 1337 bool AutofillTable::UpdateServerAddressUsageStats( |
| 1338 const AutofillProfile& profile) { |
| 1339 DCHECK_EQ(AutofillProfile::SERVER_PROFILE, profile.record_type()); |
| 1340 |
| 1341 sql::Transaction transaction(db_); |
| 1342 if (!transaction.Begin()) |
| 1343 return false; |
| 1344 |
| 1345 sql::Statement remove(db_->GetUniqueStatement( |
| 1346 "DELETE FROM server_address_metadata WHERE id = ?")); |
| 1347 remove.BindString(0, profile.server_id()); |
| 1348 remove.Run(); |
| 1349 |
| 1350 sql::Statement s(db_->GetUniqueStatement( |
| 1351 "INSERT INTO server_address_metadata(use_count, use_date, id)" |
| 1352 "VALUES (?,?,?)")); |
| 1353 s.BindInt64(0, profile.use_count()); |
| 1354 s.BindInt64(1, profile.use_date().ToInternalValue()); |
| 1355 s.BindString(2, profile.server_id()); |
| 1356 s.Run(); |
| 1357 |
| 1358 transaction.Commit(); |
| 1359 |
| 1360 return db_->GetLastChangeCount() > 0; |
| 1361 } |
| 1362 |
1329 bool AutofillTable::ClearAllServerData() { | 1363 bool AutofillTable::ClearAllServerData() { |
1330 sql::Transaction transaction(db_); | 1364 sql::Transaction transaction(db_); |
1331 if (!transaction.Begin()) | 1365 if (!transaction.Begin()) |
1332 return false; // Some error, nothing was changed. | 1366 return false; // Some error, nothing was changed. |
1333 | 1367 |
1334 sql::Statement masked(db_->GetUniqueStatement( | 1368 sql::Statement masked(db_->GetUniqueStatement( |
1335 "DELETE FROM masked_credit_cards")); | 1369 "DELETE FROM masked_credit_cards")); |
1336 masked.Run(); | 1370 masked.Run(); |
1337 bool changed = db_->GetLastChangeCount() > 0; | 1371 bool changed = db_->GetLastChangeCount() > 0; |
1338 | 1372 |
1339 sql::Statement unmasked(db_->GetUniqueStatement( | 1373 sql::Statement unmasked(db_->GetUniqueStatement( |
1340 "DELETE FROM unmasked_credit_cards")); | 1374 "DELETE FROM unmasked_credit_cards")); |
1341 unmasked.Run(); | 1375 unmasked.Run(); |
1342 changed |= db_->GetLastChangeCount() > 0; | 1376 changed |= db_->GetLastChangeCount() > 0; |
1343 | 1377 |
1344 sql::Statement addresses(db_->GetUniqueStatement( | 1378 sql::Statement addresses(db_->GetUniqueStatement( |
1345 "DELETE FROM server_addresses")); | 1379 "DELETE FROM server_addresses")); |
1346 addresses.Run(); | 1380 addresses.Run(); |
1347 changed |= db_->GetLastChangeCount() > 0; | 1381 changed |= db_->GetLastChangeCount() > 0; |
1348 | 1382 |
| 1383 sql::Statement card_metadata(db_->GetUniqueStatement( |
| 1384 "DELETE FROM server_card_metadata")); |
| 1385 card_metadata.Run(); |
| 1386 changed |= db_->GetLastChangeCount() > 0; |
| 1387 |
| 1388 sql::Statement address_metadata(db_->GetUniqueStatement( |
| 1389 "DELETE FROM server_address_metadata")); |
| 1390 address_metadata.Run(); |
| 1391 changed |= db_->GetLastChangeCount() > 0; |
| 1392 |
1349 transaction.Commit(); | 1393 transaction.Commit(); |
1350 return changed; | 1394 return changed; |
1351 } | 1395 } |
1352 | 1396 |
1353 bool AutofillTable::UpdateCreditCard(const CreditCard& credit_card) { | 1397 bool AutofillTable::UpdateCreditCard(const CreditCard& credit_card) { |
1354 DCHECK(base::IsValidGUID(credit_card.guid())); | 1398 DCHECK(base::IsValidGUID(credit_card.guid())); |
1355 | 1399 |
1356 CreditCard* tmp_credit_card = NULL; | 1400 CreditCard* tmp_credit_card = NULL; |
1357 if (!GetCreditCard(credit_card.guid(), &tmp_credit_card)) | 1401 if (!GetCreditCard(credit_card.guid(), &tmp_credit_card)) |
1358 return false; | 1402 return false; |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1718 "use_count INTEGER NOT NULL DEFAULT 0, " | 1762 "use_count INTEGER NOT NULL DEFAULT 0, " |
1719 "use_date INTEGER NOT NULL DEFAULT 0, " | 1763 "use_date INTEGER NOT NULL DEFAULT 0, " |
1720 "unmask_date INTEGER NOT NULL DEFAULT 0)")) { | 1764 "unmask_date INTEGER NOT NULL DEFAULT 0)")) { |
1721 NOTREACHED(); | 1765 NOTREACHED(); |
1722 return false; | 1766 return false; |
1723 } | 1767 } |
1724 } | 1768 } |
1725 return true; | 1769 return true; |
1726 } | 1770 } |
1727 | 1771 |
| 1772 bool AutofillTable::InitServerCardMetadataTable() { |
| 1773 if (!db_->DoesTableExist("server_card_metadata")) { |
| 1774 if (!db_->Execute("CREATE TABLE server_card_metadata (" |
| 1775 "id VARCHAR NOT NULL," |
| 1776 "use_count INTEGER NOT NULL DEFAULT 0, " |
| 1777 "use_date INTEGER NOT NULL DEFAULT 0)")) { |
| 1778 NOTREACHED(); |
| 1779 return false; |
| 1780 } |
| 1781 } |
| 1782 return true; |
| 1783 } |
| 1784 |
1728 bool AutofillTable::InitServerAddressesTable() { | 1785 bool AutofillTable::InitServerAddressesTable() { |
1729 if (!db_->DoesTableExist("server_addresses")) { | 1786 if (!db_->DoesTableExist("server_addresses")) { |
1730 // The space after language_code is necessary to match what sqlite does | 1787 // The space after language_code is necessary to match what sqlite does |
1731 // when it appends the column in migration. | 1788 // when it appends the column in migration. |
1732 if (!db_->Execute("CREATE TABLE server_addresses (" | 1789 if (!db_->Execute("CREATE TABLE server_addresses (" |
1733 "id VARCHAR," | 1790 "id VARCHAR," |
1734 "company_name VARCHAR," | 1791 "company_name VARCHAR," |
1735 "street_address VARCHAR," | 1792 "street_address VARCHAR," |
1736 "address_1 VARCHAR," | 1793 "address_1 VARCHAR," |
1737 "address_2 VARCHAR," | 1794 "address_2 VARCHAR," |
1738 "address_3 VARCHAR," | 1795 "address_3 VARCHAR," |
1739 "address_4 VARCHAR," | 1796 "address_4 VARCHAR," |
1740 "postal_code VARCHAR," | 1797 "postal_code VARCHAR," |
1741 "sorting_code VARCHAR," | 1798 "sorting_code VARCHAR," |
1742 "country_code VARCHAR," | 1799 "country_code VARCHAR," |
1743 "language_code VARCHAR, " // Space required. | 1800 "language_code VARCHAR, " // Space required. |
1744 "recipient_name VARCHAR, " // Ditto. | 1801 "recipient_name VARCHAR, " // Ditto. |
1745 "phone_number VARCHAR)")) { | 1802 "phone_number VARCHAR)")) { |
1746 NOTREACHED(); | 1803 NOTREACHED(); |
1747 return false; | 1804 return false; |
1748 } | 1805 } |
1749 } | 1806 } |
1750 return true; | 1807 return true; |
1751 } | 1808 } |
1752 | 1809 |
| 1810 bool AutofillTable::InitServerAddressMetadataTable() { |
| 1811 if (!db_->DoesTableExist("server_address_metadata")) { |
| 1812 if (!db_->Execute("CREATE TABLE server_address_metadata (" |
| 1813 "id VARCHAR NOT NULL," |
| 1814 "use_count INTEGER NOT NULL DEFAULT 0, " |
| 1815 "use_date INTEGER NOT NULL DEFAULT 0)")) { |
| 1816 NOTREACHED(); |
| 1817 return false; |
| 1818 } |
| 1819 } |
| 1820 return true; |
| 1821 } |
| 1822 |
1753 bool AutofillTable::MigrateToVersion54AddI18nFieldsAndRemoveDeprecatedFields() { | 1823 bool AutofillTable::MigrateToVersion54AddI18nFieldsAndRemoveDeprecatedFields() { |
1754 sql::Transaction transaction(db_); | 1824 sql::Transaction transaction(db_); |
1755 if (!transaction.Begin()) | 1825 if (!transaction.Begin()) |
1756 return false; | 1826 return false; |
1757 | 1827 |
1758 // Test the existence of the |address_line_1| column as an indication that a | 1828 // Test the existence of the |address_line_1| column as an indication that a |
1759 // migration is needed. It is possible that the new |autofill_profile_phones| | 1829 // migration is needed. It is possible that the new |autofill_profile_phones| |
1760 // schema is in place because the table was newly created when migrating from | 1830 // schema is in place because the table was newly created when migrating from |
1761 // a pre-version-23 database. | 1831 // a pre-version-23 database. |
1762 if (db_->DoesColumnExist("autofill_profiles", "address_line_1")) { | 1832 if (db_->DoesColumnExist("autofill_profiles", "address_line_1")) { |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2047 } | 2117 } |
2048 if (!db_->DoesColumnExist("server_addresses", "phone_number") && | 2118 if (!db_->DoesColumnExist("server_addresses", "phone_number") && |
2049 !db_->Execute("ALTER TABLE server_addresses ADD COLUMN " | 2119 !db_->Execute("ALTER TABLE server_addresses ADD COLUMN " |
2050 "phone_number VARCHAR")) { | 2120 "phone_number VARCHAR")) { |
2051 return false; | 2121 return false; |
2052 } | 2122 } |
2053 | 2123 |
2054 return transaction.Commit(); | 2124 return transaction.Commit(); |
2055 } | 2125 } |
2056 | 2126 |
| 2127 bool AutofillTable::MigrateToVersion65AddServerMetadataTables() { |
| 2128 sql::Transaction transaction(db_); |
| 2129 if (!transaction.Begin()) |
| 2130 return false; |
| 2131 |
| 2132 if (!db_->DoesTableExist("server_card_metadata") && |
| 2133 !db_->Execute("CREATE TABLE server_card_metadata (" |
| 2134 "id VARCHAR NOT NULL," |
| 2135 "use_count INTEGER NOT NULL DEFAULT 0, " |
| 2136 "use_date INTEGER NOT NULL DEFAULT 0)")) { |
| 2137 return false; |
| 2138 } |
| 2139 |
| 2140 // This clobbers existing usage metadata, which is not synced and only |
| 2141 // applies to unmasked cards. Trying to migrate the usage metadata would be |
| 2142 // tricky as multiple devices for the same user get DB upgrades. |
| 2143 if (!db_->Execute("UPDATE unmasked_credit_cards " |
| 2144 "SET use_count=0, use_date=0")) { |
| 2145 return false; |
| 2146 } |
| 2147 |
| 2148 if (!db_->DoesTableExist("server_address_metadata") && |
| 2149 !db_->Execute("CREATE TABLE server_address_metadata (" |
| 2150 "id VARCHAR NOT NULL," |
| 2151 "use_count INTEGER NOT NULL DEFAULT 0, " |
| 2152 "use_date INTEGER NOT NULL DEFAULT 0)")) { |
| 2153 return false; |
| 2154 } |
| 2155 |
| 2156 // Get existing server addresses and generate IDs for them. |
| 2157 sql::Statement s(db_->GetUniqueStatement( |
| 2158 "SELECT " |
| 2159 "id," |
| 2160 "recipient_name," |
| 2161 "company_name," |
| 2162 "street_address," |
| 2163 "address_1," // ADDRESS_HOME_STATE |
| 2164 "address_2," // ADDRESS_HOME_CITY |
| 2165 "address_3," // ADDRESS_HOME_DEPENDENT_LOCALITY |
| 2166 "address_4," // Not supported in AutofillProfile yet. |
| 2167 "postal_code," // ADDRESS_HOME_ZIP |
| 2168 "sorting_code," // ADDRESS_HOME_SORTING_CODE |
| 2169 "country_code," // ADDRESS_HOME_COUNTRY |
| 2170 "phone_number," // PHONE_HOME_WHOLE_NUMBER |
| 2171 "language_code " |
| 2172 "FROM server_addresses addresses")); |
| 2173 std::vector<AutofillProfile> profiles; |
| 2174 while (s.Step()) { |
| 2175 int index = 0; |
| 2176 AutofillProfile profile( |
| 2177 AutofillProfile::SERVER_PROFILE, s.ColumnString(index++)); |
| 2178 |
| 2179 base::string16 recipient_name = s.ColumnString16(index++); |
| 2180 profile.SetRawInfo(COMPANY_NAME, s.ColumnString16(index++)); |
| 2181 profile.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, s.ColumnString16(index++)); |
| 2182 profile.SetRawInfo(ADDRESS_HOME_STATE, s.ColumnString16(index++)); |
| 2183 profile.SetRawInfo(ADDRESS_HOME_CITY, s.ColumnString16(index++)); |
| 2184 profile.SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, |
| 2185 s.ColumnString16(index++)); |
| 2186 index++; // Skip address_4 which we haven't added to AutofillProfile yet. |
| 2187 profile.SetRawInfo(ADDRESS_HOME_ZIP, s.ColumnString16(index++)); |
| 2188 profile.SetRawInfo(ADDRESS_HOME_SORTING_CODE, s.ColumnString16(index++)); |
| 2189 profile.SetRawInfo(ADDRESS_HOME_COUNTRY, s.ColumnString16(index++)); |
| 2190 base::string16 phone_number = s.ColumnString16(index++); |
| 2191 profile.set_language_code(s.ColumnString(index++)); |
| 2192 profile.SetInfo(AutofillType(NAME_FULL), recipient_name, |
| 2193 profile.language_code()); |
| 2194 profile.SetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER), phone_number, |
| 2195 profile.language_code()); |
| 2196 profile.GenerateServerProfileIdentifier(); |
| 2197 profiles.push_back(profile); |
| 2198 } |
| 2199 |
| 2200 // Reinsert with the generated IDs. |
| 2201 sql::Statement delete_old(db_->GetUniqueStatement( |
| 2202 "DELETE FROM server_addresses")); |
| 2203 delete_old.Run(); |
| 2204 |
| 2205 sql::Statement insert(db_->GetUniqueStatement( |
| 2206 "INSERT INTO server_addresses(" |
| 2207 "id," |
| 2208 "recipient_name," |
| 2209 "company_name," |
| 2210 "street_address," |
| 2211 "address_1," // ADDRESS_HOME_STATE |
| 2212 "address_2," // ADDRESS_HOME_CITY |
| 2213 "address_3," // ADDRESS_HOME_DEPENDENT_LOCALITY |
| 2214 "address_4," // Not supported in AutofillProfile yet. |
| 2215 "postal_code," // ADDRESS_HOME_ZIP |
| 2216 "sorting_code," // ADDRESS_HOME_SORTING_CODE |
| 2217 "country_code," // ADDRESS_HOME_COUNTRY |
| 2218 "phone_number," // PHONE_HOME_WHOLE_NUMBER |
| 2219 "language_code) " |
| 2220 "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)")); |
| 2221 for (const AutofillProfile& profile : profiles) { |
| 2222 int index = 0; |
| 2223 insert.BindString(index++, profile.server_id()); |
| 2224 insert.BindString16(index++, profile.GetRawInfo(NAME_FULL)); |
| 2225 insert.BindString16(index++, profile.GetRawInfo(COMPANY_NAME)); |
| 2226 insert.BindString16(index++, |
| 2227 profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)); |
| 2228 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_STATE)); |
| 2229 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_CITY)); |
| 2230 insert.BindString16(index++, |
| 2231 profile.GetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY)); |
| 2232 index++; // SKip address_4 which we haven't added to AutofillProfile yet. |
| 2233 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_ZIP)); |
| 2234 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_SORTING_CODE)); |
| 2235 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_COUNTRY)); |
| 2236 insert.BindString16(index++, profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)); |
| 2237 insert.BindString(index++, profile.language_code()); |
| 2238 insert.Run(); |
| 2239 insert.Reset(true); |
| 2240 } |
| 2241 |
| 2242 return transaction.Commit(); |
| 2243 } |
| 2244 |
2057 } // namespace autofill | 2245 } // namespace autofill |
OLD | NEW |