summaryrefslogtreecommitdiffstats
path: root/components/autofill
diff options
context:
space:
mode:
authorisherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-17 06:54:47 +0000
committerisherman@chromium.org <isherman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-17 06:54:47 +0000
commit7e8d3aa931dd4c5010291ef3ad78de2a1f0ff56b (patch)
treec6380e4a2d1fb1927354fcedaac0cac2521f30b8 /components/autofill
parent65654eebc3c45cd54d1705416a1ddd868f364627 (diff)
downloadchromium_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')
-rw-r--r--components/autofill/core/browser/credit_card.cc15
-rw-r--r--components/autofill/core/browser/credit_card.h1
-rw-r--r--components/autofill/core/browser/credit_card_unittest.cc8
-rw-r--r--components/autofill/core/browser/validation.cc7
-rw-r--r--components/autofill/core/browser/validation_unittest.cc3
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 */