| Index: components/autofill/core/browser/webdata/autofill_table.cc
|
| diff --git a/components/autofill/core/browser/webdata/autofill_table.cc b/components/autofill/core/browser/webdata/autofill_table.cc
|
| index 1022e4c6002c082a37f5020d1f4048a6ebbd7a7e..7e5c50327589e203bd413f970a7ce363a2e560bc 100644
|
| --- a/components/autofill/core/browser/webdata/autofill_table.cc
|
| +++ b/components/autofill/core/browser/webdata/autofill_table.cc
|
| @@ -137,6 +137,20 @@ void BindCreditCardToStatement(const CreditCard& credit_card,
|
| s->BindString(index++, credit_card.origin());
|
| }
|
|
|
| +base::string16 UnencryptedCardFromColumn(const sql::Statement& s,
|
| + int column_index) {
|
| + base::string16 credit_card_number;
|
| + int encrypted_number_len = s.ColumnByteLength(column_index);
|
| + if (encrypted_number_len) {
|
| + std::string encrypted_number;
|
| + encrypted_number.resize(encrypted_number_len);
|
| + memcpy(&encrypted_number[0], s.ColumnBlob(column_index),
|
| + encrypted_number_len);
|
| + OSCrypt::DecryptString16(encrypted_number, &credit_card_number);
|
| + }
|
| + return credit_card_number;
|
| +}
|
| +
|
| scoped_ptr<CreditCard> CreditCardFromStatement(const sql::Statement& s) {
|
| scoped_ptr<CreditCard> credit_card(new CreditCard);
|
|
|
| @@ -148,17 +162,8 @@ scoped_ptr<CreditCard> CreditCardFromStatement(const sql::Statement& s) {
|
| credit_card->SetRawInfo(CREDIT_CARD_EXP_MONTH, s.ColumnString16(index++));
|
| credit_card->SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR,
|
| s.ColumnString16(index++));
|
| - int encrypted_number_len = s.ColumnByteLength(index);
|
| - base::string16 credit_card_number;
|
| - if (encrypted_number_len) {
|
| - std::string encrypted_number;
|
| - encrypted_number.resize(encrypted_number_len);
|
| - memcpy(&encrypted_number[0], s.ColumnBlob(index++), encrypted_number_len);
|
| - OSCrypt::DecryptString16(encrypted_number, &credit_card_number);
|
| - } else {
|
| - index++;
|
| - }
|
| - credit_card->SetRawInfo(CREDIT_CARD_NUMBER, credit_card_number);
|
| + credit_card->SetRawInfo(CREDIT_CARD_NUMBER,
|
| + UnencryptedCardFromColumn(s, index++));
|
| // Intentionally skip column 5, which stores the modification date.
|
| index++;
|
| credit_card->set_origin(s.ColumnString(index++));
|
| @@ -1086,6 +1091,71 @@ bool AutofillTable::GetCreditCards(
|
| return s.Succeeded();
|
| }
|
|
|
| +bool AutofillTable::GetWalletCreditCards(
|
| + std::vector<CreditCard*>* credit_cards) {
|
| + credit_cards->clear();
|
| +
|
| + sql::Statement s(db_->GetUniqueStatement(
|
| + "SELECT "
|
| + "card_number_encrypted, " // 0
|
| + "last_four," // 1
|
| + "masked.id," // 2
|
| + "status," // 3
|
| + "name_on_card," // 4
|
| + "exp_month," // 6
|
| + "exp_year " // 7
|
| + "FROM masked_credit_cards masked JOIN unmasked_credit_cards unmasked "
|
| + "ON masked.id = unmasked.id"));
|
| + while (s.Step()) {
|
| + int index = 0;
|
| +
|
| + // If the card_number_encrypted field is nonempty, we can assume this card
|
| + // is a full card, otherwise it's masked.
|
| + base::string16 full_card_number = UnencryptedCardFromColumn(s, index++);
|
| + base::string16 last_four = s.ColumnString16(index++);
|
| + CreditCard::RecordType type = full_card_number.empty() ?
|
| + CreditCard::MASKED_WALLET_CARD :
|
| + CreditCard::FULL_WALLET_CARD;
|
| + std::string wallet_id = s.ColumnString(index++);
|
| +
|
| + CreditCard* card = new CreditCard(wallet_id, type);
|
| + card->SetRawInfo(
|
| + CREDIT_CARD_NUMBER,
|
| + type == CreditCard::MASKED_WALLET_CARD ? last_four : full_card_number);
|
| +
|
| + index++; // TODO(brettw) hook up status. For now, skip over it.
|
| + card->SetRawInfo(CREDIT_CARD_NAME, s.ColumnString16(index++));
|
| + card->SetRawInfo(CREDIT_CARD_EXP_MONTH, s.ColumnString16(index++));
|
| + card->SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(index++));
|
| + credit_cards->push_back(card);
|
| + }
|
| + return s.Succeeded();
|
| +}
|
| +
|
| +void AutofillTable::UnmaskWalletCreditCard(const std::string& id,
|
| + const base::string16& full_number) {
|
| + // Make sure there aren't duplicates for this card.
|
| + MaskWalletCreditCard(id);
|
| + sql::Statement s(db_->GetUniqueStatement(
|
| + "INSERT INTO unmasked_credit_cards(id, card_number_encrypted) "
|
| + "VALUES (?,?)"));
|
| + s.BindString(0, id);
|
| +
|
| + std::string encrypted_data;
|
| + OSCrypt::EncryptString16(full_number, &encrypted_data);
|
| + s.BindBlob(1, encrypted_data.data(),
|
| + static_cast<int>(encrypted_data.length()));
|
| +
|
| + s.Run();
|
| +}
|
| +
|
| +void AutofillTable::MaskWalletCreditCard(const std::string& id) {
|
| + sql::Statement s(db_->GetUniqueStatement(
|
| + "DELETE FROM unmasked_credit_cards WHERE id = ?"));
|
| + s.BindString(0, id);
|
| + s.Run();
|
| +}
|
| +
|
| bool AutofillTable::UpdateCreditCard(const CreditCard& credit_card) {
|
| DCHECK(base::IsValidGUID(credit_card.guid()));
|
|
|
|
|