Skip to content

Commit afa6e31

Browse files
veliaspedroigor
authored andcommitted
[KEYCLOAK-19006] User Profile: Patched handling of the "whitespace-only"
texts in pattern and length validators
1 parent 269b661 commit afa6e31

File tree

3 files changed

+34
-17
lines changed

3 files changed

+34
-17
lines changed

server-spi-private/src/main/java/org/keycloak/validate/AbstractStringValidator.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
*/
1717
package org.keycloak.validate;
1818

19-
import org.keycloak.utils.StringUtil;
20-
2119
/**
2220
* Base class for String value format validators. Functionality covered in this base class:
2321
* <ul>
@@ -45,7 +43,7 @@ protected void doValidate(Object value, String inputHint, ValidationContext cont
4543
@Override
4644
protected boolean skipValidation(Object value, ValidatorConfig config) {
4745
if (isIgnoreEmptyValuesConfigured(config) && (value == null || value instanceof String)) {
48-
return value == null || StringUtil.isBlank(value.toString());
46+
return value == null || "".equals(value.toString());
4947
}
5048
return false;
5149
}

server-spi-private/src/main/java/org/keycloak/validate/validators/LengthValidator.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ public class LengthValidator extends AbstractStringValidator implements Configur
6868
property.setHelpText("The maximum length");
6969
property.setType(ProviderConfigProperty.STRING_TYPE);
7070
configProperties.add(property);
71+
property = new ProviderConfigProperty();
72+
property.setName(KEY_TRIM_DISABLED);
73+
property.setLabel("Trimming disabled");
74+
property.setHelpText("Disable trimming of the String value before the length check");
75+
property.setType(ProviderConfigProperty.BOOLEAN_TYPE);
76+
configProperties.add(property);
7177
}
7278

7379
@Override

server-spi-private/src/test/java/org/keycloak/validate/BuiltinValidatorsTest.java

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,28 @@ public void validateLength() {
3434
Assert.assertFalse(validator.validate(" ", "name", configFromMap(ImmutableMap.of(LengthValidator.KEY_MIN, 1))).isValid());
3535
Assert.assertTrue(validator.validate(" ", "name", configFromMap(ImmutableMap.of(LengthValidator.KEY_MAX, 10))).isValid());
3636

37-
// empty value ignoration configured
38-
Assert.assertTrue(validator.validate(null, "name", valConfigIgnoreEmptyValues).isValid());
39-
Assert.assertTrue(validator.validate("", "name", valConfigIgnoreEmptyValues).isValid());
40-
Assert.assertTrue(validator.validate(" ", "name", valConfigIgnoreEmptyValues).isValid());
41-
37+
//KEYCLOAK-19006 reproducer
38+
Assert.assertFalse(validator.validate(" ", "name", ValidatorConfig.builder().config(LengthValidator.KEY_MAX, 4).config(AbstractSimpleValidator.IGNORE_EMPTY_VALUE, true).config(LengthValidator.KEY_TRIM_DISABLED, true).build()).isValid());
39+
4240
// min validation only
43-
Assert.assertTrue(validator.validate("tester", "name", configFromMap(ImmutableMap.of(LengthValidator.KEY_MIN, 1))).isValid());
44-
Assert.assertFalse(validator.validate("tester", "name", configFromMap(ImmutableMap.of(LengthValidator.KEY_MIN, 7))).isValid());
41+
Assert.assertTrue(validator.validate("t", "name", ValidatorConfig.builder().config(LengthValidator.KEY_MIN, 1).build()).isValid());
42+
Assert.assertFalse(validator.validate("tester", "name", ValidatorConfig.builder().config(LengthValidator.KEY_MIN, 7).build()).isValid());
43+
44+
//min value validation with "empty value ignoration" configured
45+
Assert.assertTrue(validator.validate(null, "name", ValidatorConfig.builder().config(LengthValidator.KEY_MIN, 1).config(AbstractSimpleValidator.IGNORE_EMPTY_VALUE, true).build()).isValid());
46+
Assert.assertTrue(validator.validate("", "name", ValidatorConfig.builder().config(LengthValidator.KEY_MIN, 1).config(AbstractSimpleValidator.IGNORE_EMPTY_VALUE, true).build()).isValid());
47+
Assert.assertFalse(validator.validate(" ", "name", ValidatorConfig.builder().config(LengthValidator.KEY_MIN, 1).config(AbstractSimpleValidator.IGNORE_EMPTY_VALUE, true).build()).isValid());
48+
Assert.assertTrue(validator.validate("t", "name", ValidatorConfig.builder().config(LengthValidator.KEY_MIN, 1).config(AbstractSimpleValidator.IGNORE_EMPTY_VALUE, true).build()).isValid());
49+
Assert.assertFalse(validator.validate("tester", "name", ValidatorConfig.builder().config(LengthValidator.KEY_MIN, 7).config(AbstractSimpleValidator.IGNORE_EMPTY_VALUE, true).build()).isValid());
4550

4651
// max validation only
47-
Assert.assertTrue(validator.validate("tester", "name", configFromMap(ImmutableMap.of(LengthValidator.KEY_MAX, 8))).isValid());
48-
Assert.assertFalse(validator.validate("tester", "name", configFromMap(ImmutableMap.of(LengthValidator.KEY_MAX, 4))).isValid());
52+
Assert.assertTrue(validator.validate("tester", "name", ValidatorConfig.builder().config(LengthValidator.KEY_MAX, 8).build()).isValid());
53+
Assert.assertFalse(validator.validate("tester", "name", ValidatorConfig.builder().config(LengthValidator.KEY_MAX, 4).build()).isValid());
54+
55+
//max value validation with "empty value ignoration" configured
56+
Assert.assertTrue(validator.validate(null, "name", ValidatorConfig.builder().config(LengthValidator.KEY_MAX, 8).config(AbstractSimpleValidator.IGNORE_EMPTY_VALUE, true).build()).isValid());
57+
Assert.assertTrue(validator.validate("tester", "name", ValidatorConfig.builder().config(LengthValidator.KEY_MAX, 8).config(AbstractSimpleValidator.IGNORE_EMPTY_VALUE, true).build()).isValid());
58+
Assert.assertFalse(validator.validate("tester", "name", ValidatorConfig.builder().config(LengthValidator.KEY_MAX, 4).config(AbstractSimpleValidator.IGNORE_EMPTY_VALUE, true).build()).isValid());
4959

5060
// both validations together
5161
ValidatorConfig config1 = configFromMap(ImmutableMap.of(LengthValidator.KEY_MIN, 3, LengthValidator.KEY_MAX, 4));
@@ -57,9 +67,12 @@ public void validateLength() {
5767
// test value trimming performed by default
5868
Assert.assertFalse("trim not performed", validator.validate("t ", "name", configFromMap(ImmutableMap.of(LengthValidator.KEY_MIN, 2))).isValid());
5969
Assert.assertFalse("trim not performed", validator.validate(" t", "name", configFromMap(ImmutableMap.of(LengthValidator.KEY_MIN, 2))).isValid());
60-
70+
Assert.assertTrue("trim not performed", validator.validate("tr ", "name", configFromMap(ImmutableMap.of(LengthValidator.KEY_MAX, 2))).isValid());
71+
Assert.assertTrue("trim not performed", validator.validate(" tr", "name", configFromMap(ImmutableMap.of(LengthValidator.KEY_MAX, 2))).isValid());
72+
6173
// test value trimming disabled in config
62-
Assert.assertTrue("trim disabled but performed", validator.validate("t ", "name", configFromMap(ImmutableMap.of(LengthValidator.KEY_MIN, 2, LengthValidator.KEY_TRIM_DISABLED, true))).isValid());
74+
Assert.assertTrue("trim disabled but performed", validator.validate("tr ", "name", configFromMap(ImmutableMap.of(LengthValidator.KEY_MIN, 3, LengthValidator.KEY_TRIM_DISABLED, true))).isValid());
75+
Assert.assertFalse("trim disabled but performed", validator.validate("trr ", "name", configFromMap(ImmutableMap.of(LengthValidator.KEY_MAX, 3, LengthValidator.KEY_TRIM_DISABLED, true))).isValid());
6376

6477
//test correct error message selection
6578
Assert.assertEquals(LengthValidator.MESSAGE_INVALID_LENGTH_TOO_SHORT,validator.validate("", "name", ValidatorConfig.builder().config(LengthValidator.KEY_MIN, 1).build()).getErrors().iterator().next().getMessage());
@@ -112,12 +125,12 @@ public void validateEmail() {
112125

113126
Assert.assertFalse(validator.validate(null, "email").isValid());
114127
Assert.assertFalse(validator.validate("", "email").isValid());
128+
Assert.assertFalse(validator.validate(" ", "email").isValid());
115129

116130
// empty value ignoration configured
117131
Assert.assertTrue(validator.validate(null, "emptyString", valConfigIgnoreEmptyValues).isValid());
118132
Assert.assertTrue(validator.validate("", "emptyString", valConfigIgnoreEmptyValues).isValid());
119-
Assert.assertTrue(validator.validate(" ", "blankString", valConfigIgnoreEmptyValues).isValid());
120-
133+
Assert.assertFalse(validator.validate(" ", "blankString", valConfigIgnoreEmptyValues).isValid());
121134

122135
Assert.assertTrue(validator.validate("[email protected]", "email").isValid());
123136
Assert.assertTrue(validator.validate("[email protected]", "email").isValid());
@@ -422,7 +435,7 @@ public void validatePattern() {
422435
// empty value ignoration configured
423436
Assert.assertTrue(validator.validate(null, "value", valConfigIgnoreEmptyValues).isValid());
424437
Assert.assertTrue(validator.validate("", "value", valConfigIgnoreEmptyValues).isValid());
425-
Assert.assertTrue(validator.validate(" ", "value", valConfigIgnoreEmptyValues).isValid());
438+
Assert.assertFalse(validator.validate(" ", "value", ValidatorConfig.builder().config(PatternValidator.CFG_PATTERN, "^[^\\s]$").config(valConfigIgnoreEmptyValues).build()).isValid());
426439

427440
}
428441

0 commit comments

Comments
 (0)