Chromium Code Reviews| 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 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 130 std::string encrypted_data; | 130 std::string encrypted_data; |
| 131 OSCrypt::EncryptString16(credit_card.GetRawInfo(CREDIT_CARD_NUMBER), | 131 OSCrypt::EncryptString16(credit_card.GetRawInfo(CREDIT_CARD_NUMBER), |
| 132 &encrypted_data); | 132 &encrypted_data); |
| 133 s->BindBlob(index++, encrypted_data.data(), | 133 s->BindBlob(index++, encrypted_data.data(), |
| 134 static_cast<int>(encrypted_data.length())); | 134 static_cast<int>(encrypted_data.length())); |
| 135 | 135 |
| 136 s->BindInt64(index++, Time::Now().ToTimeT()); | 136 s->BindInt64(index++, Time::Now().ToTimeT()); |
| 137 s->BindString(index++, credit_card.origin()); | 137 s->BindString(index++, credit_card.origin()); |
| 138 } | 138 } |
| 139 | 139 |
| 140 base::string16 UnencryptedCardFromColumn(const sql::Statement& s, | |
| 141 int column_index) { | |
| 142 base::string16 credit_card_number; | |
| 143 int encrypted_number_len = s.ColumnByteLength(column_index); | |
| 144 if (encrypted_number_len) { | |
| 145 std::string encrypted_number; | |
| 146 encrypted_number.resize(encrypted_number_len); | |
| 147 memcpy(&encrypted_number[0], s.ColumnBlob(column_index), | |
| 148 encrypted_number_len); | |
| 149 OSCrypt::DecryptString16(encrypted_number, &credit_card_number); | |
| 150 } | |
| 151 return credit_card_number; | |
| 152 } | |
| 153 | |
| 140 scoped_ptr<CreditCard> CreditCardFromStatement(const sql::Statement& s) { | 154 scoped_ptr<CreditCard> CreditCardFromStatement(const sql::Statement& s) { |
| 141 scoped_ptr<CreditCard> credit_card(new CreditCard); | 155 scoped_ptr<CreditCard> credit_card(new CreditCard); |
| 142 | 156 |
| 143 int index = 0; | 157 int index = 0; |
| 144 credit_card->set_guid(s.ColumnString(index++)); | 158 credit_card->set_guid(s.ColumnString(index++)); |
| 145 DCHECK(base::IsValidGUID(credit_card->guid())); | 159 DCHECK(base::IsValidGUID(credit_card->guid())); |
| 146 | 160 |
| 147 credit_card->SetRawInfo(CREDIT_CARD_NAME, s.ColumnString16(index++)); | 161 credit_card->SetRawInfo(CREDIT_CARD_NAME, s.ColumnString16(index++)); |
| 148 credit_card->SetRawInfo(CREDIT_CARD_EXP_MONTH, s.ColumnString16(index++)); | 162 credit_card->SetRawInfo(CREDIT_CARD_EXP_MONTH, s.ColumnString16(index++)); |
| 149 credit_card->SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, | 163 credit_card->SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, |
| 150 s.ColumnString16(index++)); | 164 s.ColumnString16(index++)); |
| 151 int encrypted_number_len = s.ColumnByteLength(index); | 165 credit_card->SetRawInfo(CREDIT_CARD_NUMBER, |
| 152 base::string16 credit_card_number; | 166 UnencryptedCardFromColumn(s, index++)); |
| 153 if (encrypted_number_len) { | |
| 154 std::string encrypted_number; | |
| 155 encrypted_number.resize(encrypted_number_len); | |
| 156 memcpy(&encrypted_number[0], s.ColumnBlob(index++), encrypted_number_len); | |
| 157 OSCrypt::DecryptString16(encrypted_number, &credit_card_number); | |
| 158 } else { | |
| 159 index++; | |
| 160 } | |
| 161 credit_card->SetRawInfo(CREDIT_CARD_NUMBER, credit_card_number); | |
| 162 // Intentionally skip column 5, which stores the modification date. | 167 // Intentionally skip column 5, which stores the modification date. |
| 163 index++; | 168 index++; |
| 164 credit_card->set_origin(s.ColumnString(index++)); | 169 credit_card->set_origin(s.ColumnString(index++)); |
| 165 | 170 |
| 166 return credit_card.Pass(); | 171 return credit_card.Pass(); |
| 167 } | 172 } |
| 168 | 173 |
| 169 // Obsolete version of AddAutofillProfileNamesToProfile, but still needed | 174 // Obsolete version of AddAutofillProfileNamesToProfile, but still needed |
| 170 // for MigrateToVersion37MergeAndCullOlderProfiles(). | 175 // for MigrateToVersion37MergeAndCullOlderProfiles(). |
| 171 bool AddAutofillProfileNamesToProfileForVersion37(sql::Connection* db, | 176 bool AddAutofillProfileNamesToProfileForVersion37(sql::Connection* db, |
| (...skipping 907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1079 std::string guid = s.ColumnString(0); | 1084 std::string guid = s.ColumnString(0); |
| 1080 CreditCard* credit_card = NULL; | 1085 CreditCard* credit_card = NULL; |
| 1081 if (!GetCreditCard(guid, &credit_card)) | 1086 if (!GetCreditCard(guid, &credit_card)) |
| 1082 return false; | 1087 return false; |
| 1083 credit_cards->push_back(credit_card); | 1088 credit_cards->push_back(credit_card); |
| 1084 } | 1089 } |
| 1085 | 1090 |
| 1086 return s.Succeeded(); | 1091 return s.Succeeded(); |
| 1087 } | 1092 } |
| 1088 | 1093 |
| 1094 bool AutofillTable::GetWalletCreditCards( | |
| 1095 std::vector<CreditCard*>* credit_cards) { | |
| 1096 credit_cards->clear(); | |
| 1097 | |
| 1098 sql::Statement s(db_->GetUniqueStatement( | |
| 1099 "SELECT " | |
| 1100 "card_number_encrypted, " // 0 | |
| 1101 "last_four," // 1 | |
| 1102 "masked.id," // 2 | |
| 1103 "status," // 3 | |
| 1104 "name_on_card," // 4 | |
| 1105 "exp_month," // 6 | |
| 1106 "exp_year " // 7 | |
| 1107 "FROM masked_credit_cards masked JOIN unmasked_credit_cards unmasked " | |
| 1108 "ON masked.id = unmasked.id")); | |
| 1109 while (s.Step()) { | |
| 1110 int index = 0; | |
| 1111 | |
| 1112 // If the card_number_encrypted field is nonempty, we can assume this card | |
| 1113 // is a full card, otherwise it's masked. | |
| 1114 base::string16 card_number = UnencryptedCardFromColumn(s, index++); | |
| 1115 CreditCard::RecordType type; | |
| 1116 if (card_number.empty()) { | |
| 1117 // Empty full number field, assume masked card and just use 4 digits. | |
| 1118 type = CreditCard::MASKED_WALLET_CARD; | |
| 1119 card_number = s.ColumnString16(index++); | |
|
Evan Stade
2014/12/10 23:11:14
I think this would be slightly easier to follow if
| |
| 1120 } else { | |
| 1121 type = CreditCard::FULL_WALLET_CARD; | |
| 1122 index++; // Skip last_four field since we have a full number. | |
| 1123 } | |
| 1124 std::string wallet_id = s.ColumnString(index++); | |
| 1125 | |
| 1126 CreditCard* card = new CreditCard(wallet_id, type); | |
| 1127 card->SetRawInfo(CREDIT_CARD_NUMBER, card_number); | |
| 1128 | |
| 1129 index++; // TODO(brettw) hook up status. For now, skip over it. | |
| 1130 card->SetRawInfo(CREDIT_CARD_NAME, s.ColumnString16(index++)); | |
| 1131 card->SetRawInfo(CREDIT_CARD_EXP_MONTH, s.ColumnString16(index++)); | |
| 1132 card->SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(index++)); | |
| 1133 credit_cards->push_back(card); | |
| 1134 } | |
| 1135 return s.Succeeded(); | |
| 1136 } | |
| 1137 | |
| 1138 void AutofillTable::UnmaskWalletCreditCard(const std::string& id, | |
| 1139 const base::string16& full_number) { | |
| 1140 // Make sure there aren't duplicates for this card. | |
| 1141 MaskWalletCreditCard(id); | |
| 1142 sql::Statement s(db_->GetUniqueStatement( | |
| 1143 "INSERT INTO unmasked_credit_cards(id, card_number_encrypted) " | |
| 1144 "VALUES (?,?)")); | |
| 1145 s.BindString(0, id); | |
| 1146 | |
| 1147 std::string encrypted_data; | |
| 1148 OSCrypt::EncryptString16(full_number, &encrypted_data); | |
| 1149 s.BindBlob(1, encrypted_data.data(), | |
| 1150 static_cast<int>(encrypted_data.length())); | |
| 1151 | |
| 1152 s.Run(); | |
| 1153 } | |
| 1154 | |
| 1155 void AutofillTable::MaskWalletCreditCard(const std::string& id) { | |
| 1156 sql::Statement s(db_->GetUniqueStatement( | |
| 1157 "DELETE FROM unmasked_credit_cards WHERE id = ?")); | |
| 1158 s.BindString(0, id); | |
| 1159 s.Run(); | |
| 1160 } | |
| 1161 | |
| 1089 bool AutofillTable::UpdateCreditCard(const CreditCard& credit_card) { | 1162 bool AutofillTable::UpdateCreditCard(const CreditCard& credit_card) { |
| 1090 DCHECK(base::IsValidGUID(credit_card.guid())); | 1163 DCHECK(base::IsValidGUID(credit_card.guid())); |
| 1091 | 1164 |
| 1092 CreditCard* tmp_credit_card = NULL; | 1165 CreditCard* tmp_credit_card = NULL; |
| 1093 if (!GetCreditCard(credit_card.guid(), &tmp_credit_card)) | 1166 if (!GetCreditCard(credit_card.guid(), &tmp_credit_card)) |
| 1094 return false; | 1167 return false; |
| 1095 | 1168 |
| 1096 // Preserve appropriate modification dates by not updating unchanged cards. | 1169 // Preserve appropriate modification dates by not updating unchanged cards. |
| 1097 scoped_ptr<CreditCard> old_credit_card(tmp_credit_card); | 1170 scoped_ptr<CreditCard> old_credit_card(tmp_credit_card); |
| 1098 if (*old_credit_card == credit_card) | 1171 if (*old_credit_card == credit_card) |
| (...skipping 1314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2413 "ADD COLUMN full_name VARCHAR"); | 2486 "ADD COLUMN full_name VARCHAR"); |
| 2414 } | 2487 } |
| 2415 | 2488 |
| 2416 bool AutofillTable::MigrateToVersion60AddServerCards() { | 2489 bool AutofillTable::MigrateToVersion60AddServerCards() { |
| 2417 return InitMaskedCreditCardsTable() && | 2490 return InitMaskedCreditCardsTable() && |
| 2418 InitUnmaskedCreditCardsTable() && | 2491 InitUnmaskedCreditCardsTable() && |
| 2419 InitServerAddressesTable(); | 2492 InitServerAddressesTable(); |
| 2420 } | 2493 } |
| 2421 | 2494 |
| 2422 } // namespace autofill | 2495 } // namespace autofill |
| OLD | NEW |