Skip to content

Commit 20271ae

Browse files
committed
Update CreditCard Validation class
Update documentation Add additional self tests Add tests to verify canonicalization output
1 parent 58be169 commit 20271ae

2 files changed

Lines changed: 52 additions & 11 deletions

File tree

‎src/main/java/org/owasp/esapi/Validator.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,12 @@ public interface Validator {
382382
/**
383383
* Returns a canonicalized and validated credit card number as a String.
384384
* <p>
385+
* Valid input is four groups of four decimal digits. Each group can be separated by an optional space or hyphen.
386+
* Validation is performed using a regular expression. Validation includes the Checksum Digit using the Luhn
387+
* Algorithm, but <i>does not</i> include validating the Bank Identification Number (BIN) or the Account
388+
* Identifier. Examples of valid input are {@code 1234 9876 0000 0008}, {@code 1234-9876-0000-0008} and
389+
* {@code 1234987600000008}. Canonicalized output is {@code 1234987600000008}.
390+
* </p><p>
385391
* Invalid input will generate a descriptive ValidationException,
386392
* and input that is clearly an attack will generate a descriptive IntrusionException.
387393
*

‎src/test/java/org/owasp/esapi/reference/ValidatorTest.java‎

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -105,27 +105,62 @@ public void testGetValidCreditCard() {
105105
Validator instance = ESAPI.validator();
106106
ValidationErrorList errors = new ValidationErrorList();
107107

108+
// Validator.CreditCard=^(\\d{4}[- ]?){3}\\d{4}$
109+
// These have correct check digit
108110
assertTrue(instance.isValidCreditCard("cctest1", "1234 9876 0000 0008", false));
109-
assertTrue(instance.isValidCreditCard("cctest2", "1234987600000008", false));
110-
assertFalse(instance.isValidCreditCard("cctest3", "12349876000000081", false));
111-
assertFalse(instance.isValidCreditCard("cctest4", "4417 1234 5678 9112", false));
111+
assertTrue(instance.isValidCreditCard("cctest2", "1234-9876-0000-0008", false));
112+
assertTrue(instance.isValidCreditCard("cctest3", "1234987600000008", false));
113+
assertTrue(instance.isValidCreditCard("cctest4", "12349876 00000008", false));
114+
assertTrue(instance.isValidCreditCard("cctest5", "12349876-00000008", false));
115+
assertTrue(instance.isValidCreditCard("cctest6", "1234 98760000 0008", false));
116+
assertTrue(instance.isValidCreditCard("cctest7", "1234-98760000-0008", false));
117+
118+
// A curve ball... use a tab and non-breaking space
119+
assertFalse(instance.isValidCreditCard("cctest8", "1234\t9876\t0000\t0008", false));
120+
assertFalse(instance.isValidCreditCard("cctest9", "1234\u00A09876\u00A00000\u00A00008", false));
121+
122+
// 1234987600000008 dec is 0x46336F5333408 hex
123+
assertFalse(instance.isValidCreditCard("cctest10", "46336F5333408", false));
124+
assertFalse(instance.isValidCreditCard("cctest11", "0x46336F5333408", false));
125+
126+
// And other negative tests, like extra digits, wrong separators and bad checksum
127+
assertFalse(instance.isValidCreditCard("cctest12", "1234*9876*0000*0008", false));
128+
assertFalse(instance.isValidCreditCard("cctest13", "1234/9876/0000/0008", false));
129+
assertFalse(instance.isValidCreditCard("cctest14", "12349876000000081", false));
130+
assertFalse(instance.isValidCreditCard("cctest15", "4417 1234 5678 9112", false));
112131

113-
instance.getValidCreditCard("cctest5", "1234 9876 0000 0008", false, errors);
132+
try {
133+
// Verify canonicalization
134+
assertEquals("1234987600000008", instance.getValidCreditCard("cctest16", "1234987600000008", false));
135+
assertEquals("1234987600000008", instance.getValidCreditCard("cctest17", "1234 9876 0000 0008", false));
136+
assertEquals("1234987600000008", instance.getValidCreditCard("cctest18", "1234-9876-0000-0008", false));
137+
assertEquals("1234987600000008", instance.getValidCreditCard("cctest19", "12349876 00000008", false));
138+
assertEquals("1234987600000008", instance.getValidCreditCard("cctest20", "12349876-00000008", false));
139+
assertEquals("1234987600000008", instance.getValidCreditCard("cctest21", "1234 98760000 0008", false));
140+
assertEquals("1234987600000008", instance.getValidCreditCard("cctest22", "1234-98760000-0008", false));
141+
}
142+
catch (ValidationException e) {
143+
fail("Verify canonicalization");
144+
}
145+
146+
// Check error lists
147+
instance.getValidCreditCard("cctest23", "1234 9876 0000 0008", false, errors);
114148
assertEquals(0, errors.size());
115-
instance.getValidCreditCard("cctest6", "1234987600000008", false, errors);
149+
instance.getValidCreditCard("cctest24", "1234987600000008", false, errors);
116150
assertEquals(0, errors.size());
117-
instance.getValidCreditCard("cctest7", "12349876000000081", false, errors);
151+
instance.getValidCreditCard("cctest25", "12349876000000081", false, errors);
118152
assertEquals(1, errors.size());
119-
instance.getValidCreditCard("cctest8", "4417 1234 5678 9112", false, errors);
153+
instance.getValidCreditCard("cctest26", "4417 1234 5678 9112", false, errors);
120154
assertEquals(2, errors.size());
121155

122-
assertTrue(instance.isValidCreditCard("cctest1", "1234 9876 0000 0008", false, errors));
156+
// Check error lists
157+
assertTrue(instance.isValidCreditCard("cctest27", "1234 9876 0000 0008", false, errors));
123158
assertEquals(2, errors.size());
124-
assertTrue(instance.isValidCreditCard("cctest2", "1234987600000008", false, errors));
159+
assertTrue(instance.isValidCreditCard("cctest28", "1234987600000008", false, errors));
125160
assertEquals(2, errors.size());
126-
assertFalse(instance.isValidCreditCard("cctest3", "12349876000000081", false, errors));
161+
assertFalse(instance.isValidCreditCard("cctest29", "12349876000000081", false, errors));
127162
assertEquals(3, errors.size());
128-
assertFalse(instance.isValidCreditCard("cctest4", "4417 1234 5678 9112", false, errors));
163+
assertFalse(instance.isValidCreditCard("cctest30", "4417 1234 5678 9112", false, errors));
129164
assertEquals(4, errors.size());
130165
}
131166

0 commit comments

Comments
 (0)