diff options
author | isherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-17 06:54:47 +0000 |
---|---|---|
committer | isherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-17 06:54:47 +0000 |
commit | 7e8d3aa931dd4c5010291ef3ad78de2a1f0ff56b (patch) | |
tree | c6380e4a2d1fb1927354fcedaac0cac2521f30b8 /components/autofill | |
parent | 65654eebc3c45cd54d1705416a1ddd868f364627 (diff) | |
download | chromium_src-7e8d3aa931dd4c5010291ef3ad78de2a1f0ff56b.zip chromium_src-7e8d3aa931dd4c5010291ef3ad78de2a1f0ff56b.tar.gz chromium_src-7e8d3aa931dd4c5010291ef3ad78de2a1f0ff56b.tar.bz2 |
[Autofill] Don't validate China UnionPay cards with the Luhn checksum.
BUG=242274
TEST=unit_tests
R=abodenha@chromium.org
Review URL: https://chromiumcodereview.appspot.com/18927003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@211986 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'components/autofill')
5 files changed, 32 insertions, 2 deletions
diff --git a/components/autofill/core/browser/credit_card.cc b/components/autofill/core/browser/credit_card.cc index 9906f27..5907cfd 100644 --- a/components/autofill/core/browser/credit_card.cc +++ b/components/autofill/core/browser/credit_card.cc @@ -151,6 +151,8 @@ base::string16 CreditCard::TypeForDisplay(const std::string& type) { return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_JCB); if (type == kMasterCard) return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_MASTERCARD); + if (type == kUnionPay) + return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_UNION_PAY); if (type == kVisaCard) return l10n_util::GetStringUTF16(IDS_AUTOFILL_CC_VISA); @@ -172,6 +174,8 @@ int CreditCard::IconResourceId(const std::string& type) { return IDR_AUTOFILL_CC_JCB; if (type == kMasterCard) return IDR_AUTOFILL_CC_MASTERCARD; + if (type == kUnionPay) + return IDR_AUTOFILL_CC_GENERIC; // Needs resource: http://crbug.com/259211 if (type == kVisaCard) return IDR_AUTOFILL_CC_VISA; @@ -185,8 +189,12 @@ int CreditCard::IconResourceId(const std::string& type) { std::string CreditCard::GetCreditCardType(const base::string16& number) { // Credit card number specifications taken from: // http://en.wikipedia.org/wiki/Credit_card_numbers, + // http://en.wikipedia.org/wiki/List_of_Issuer_Identification_Numbers, // http://www.discovernetwork.com/merchants/images/Merchant_Marketing_PDF.pdf, - // http://www.regular-expressions.info/creditcard.html, and + // http://www.regular-expressions.info/creditcard.html, + // http://developer.ean.com/general_info/Valid_Credit_Card_Types, + // http://www.bincodes.com/, + // http://www.fraudpractice.com/FL-binCC.html, and // http://www.beachnet.com/~hstiles/cardtype.html // // The last site is currently unavailable, but a cached version remains at @@ -200,6 +208,7 @@ std::string CreditCard::GetCreditCardType(const base::string16& number) { // Discover Card 6011,644-649,65 16 // JCB 3528-3589 16 // MasterCard 51-55 16 + // UnionPay 62 16-19 // Check for prefixes of length 1. if (number.empty()) @@ -227,6 +236,9 @@ std::string CreditCard::GetCreditCardType(const base::string16& number) { if (first_two_digits >= 51 && first_two_digits <= 55) return kMasterCard; + if (first_two_digits == 62) + return kUnionPay; + if (first_two_digits == 65) return kDiscoverCard; @@ -692,6 +704,7 @@ const char* const kDiscoverCard = "discoverCC"; const char* const kGenericCard = "genericCC"; const char* const kJCBCard = "jcbCC"; const char* const kMasterCard = "masterCardCC"; +const char* const kUnionPay = "unionPayCC"; const char* const kVisaCard = "visaCC"; } // namespace autofill diff --git a/components/autofill/core/browser/credit_card.h b/components/autofill/core/browser/credit_card.h index 98ab9e03..cf6384e 100644 --- a/components/autofill/core/browser/credit_card.h +++ b/components/autofill/core/browser/credit_card.h @@ -165,6 +165,7 @@ extern const char* const kDiscoverCard; extern const char* const kGenericCard; extern const char* const kJCBCard; extern const char* const kMasterCard; +extern const char* const kUnionPay; extern const char* const kVisaCard; } // namespace autofill diff --git a/components/autofill/core/browser/credit_card_unittest.cc b/components/autofill/core/browser/credit_card_unittest.cc index b92488d..c8b77bf 100644 --- a/components/autofill/core/browser/credit_card_unittest.cc +++ b/components/autofill/core/browser/credit_card_unittest.cc @@ -34,6 +34,9 @@ const char* const kValidNumbers[] = { "4222-2222-2222-2", "5019717010103742", "6331101999990016", + + // A UnionPay card that doesn't pass the Luhn checksum + "6200000000000000", }; const char* const kInvalidNumbers[] = { "4111 1111 112", /* too short */ @@ -559,6 +562,9 @@ TEST(CreditCardTest, GetCreditCardType) { { "5112345112345114", kMasterCard, true }, { "5115915115915118", kMasterCard, true }, + // A UnionPay card that doesn't pass the Luhn checksum + { "6200000000000000", kUnionPay, true }, + // Empty string { std::string(), kGenericCard, false }, @@ -603,6 +609,7 @@ TEST(CreditCardTest, GetCreditCardType) { { "53", kMasterCard, false }, { "54", kMasterCard, false }, { "55", kMasterCard, false }, + { "62", kUnionPay, false }, // Not enough data to determine an IIN uniquely. { "3", kGenericCard, false }, @@ -646,7 +653,6 @@ TEST(CreditCardTest, GetCreditCardType) { { "608", kGenericCard, false }, { "609", kGenericCard, false }, { "61", kGenericCard, false }, - { "62", kGenericCard, false }, { "63", kGenericCard, false }, { "640", kGenericCard, false }, { "641", kGenericCard, false }, diff --git a/components/autofill/core/browser/validation.cc b/components/autofill/core/browser/validation.cc index 9d561f51..a8aef35 100644 --- a/components/autofill/core/browser/validation.cc +++ b/components/autofill/core/browser/validation.cc @@ -78,11 +78,18 @@ bool IsValidCreditCardNumber(const base::string16& text) { return false; if (type == kMasterCard && number.size() != 16) return false; + if (type == kUnionPay && (number.size() < 16 || number.size() > 19)) + return false; if (type == kVisaCard && number.size() != 13 && number.size() != 16) return false; if (type == kGenericCard && (number.size() < 12 || number.size() > 19)) return false; + // Unlike all the other supported types, UnionPay cards lack Luhn checksum + // validation. + if (type == kUnionPay) + return true; + // Use the Luhn formula [3] to validate the number. // [3] http://en.wikipedia.org/wiki/Luhn_algorithm int sum = 0; diff --git a/components/autofill/core/browser/validation_unittest.cc b/components/autofill/core/browser/validation_unittest.cc index c6f6e65..171dc5f 100644 --- a/components/autofill/core/browser/validation_unittest.cc +++ b/components/autofill/core/browser/validation_unittest.cc @@ -39,6 +39,9 @@ const char* const kValidNumbers[] = { "4222-2222-2222-2", "5019717010103742", "6331101999990016", + + // A UnionPay card that doesn't pass the Luhn checksum + "6200000000000000", }; const char* const kInvalidNumbers[] = { "4111 1111 112", /* too short */ |