Skip to content

CCD-6096: Disallow invalid characters in Email addresses #2528

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
17 changes: 9 additions & 8 deletions src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@

import javax.inject.Named;
import javax.inject.Singleton;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import java.util.Collections;
import java.util.List;

Expand All @@ -19,6 +17,8 @@
public class EmailValidator implements BaseTypeValidator {
static final String TYPE_ID = "Email";

private static final String EMAIL_REGEX = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$";

@Override
public BaseType getType() {
return BaseType.get(TYPE_ID);
Expand Down Expand Up @@ -61,6 +61,12 @@ public List<ValidationResult> validate(final String dataFieldId,
);
}

if (!checkRegex(EMAIL_REGEX, value)) {
return Collections.singletonList(
new ValidationResult(REGEX_GUIDANCE, dataFieldId)
);
}

if (!isValidEmailAddress(value)) {
return Collections.singletonList(new ValidationResult(value + " is not a valid Email address",
dataFieldId));
Expand All @@ -70,11 +76,6 @@ public List<ValidationResult> validate(final String dataFieldId,
}

private boolean isValidEmailAddress(final String email) {
try {
new InternetAddress(email).validate();
return true;
} catch (AddressException ex) {
return false;
}
return org.apache.commons.validator.routines.EmailValidator.getInstance().isValid(email);
}
}
68 changes: 57 additions & 11 deletions src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,29 +59,24 @@ void validEmail() {
assertEquals(0, result01.size(), result01.toString());

final List<ValidationResult> result02 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("test@test"),
NODE_FACTORY.textNode("test@test.org"),
caseFieldDefinition);
assertEquals(0, result02.size(), result02.toString());

final List<ValidationResult> result03 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("[email protected]"),
NODE_FACTORY.textNode("[email protected].uk"),
caseFieldDefinition);
assertEquals(0, result03.size(), result01.toString());
assertEquals(0, result03.size(), result03.toString());

final List<ValidationResult> result04 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("test@test.org.uk"),
NODE_FACTORY.textNode("test.test@test.com"),
caseFieldDefinition);
assertEquals(0, result04.size(), result04.toString());

final List<ValidationResult> result05 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("[email protected]"),
caseFieldDefinition);
assertEquals(0, result05.size(), result05.toString());

final List<ValidationResult> result06 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("[email protected]"),
caseFieldDefinition);
assertEquals(0, result06.size(), result06.toString());
assertEquals(0, result05.size(), result05.toString());
}

@Test
Expand All @@ -94,12 +89,63 @@ void invalidEmail() {
final List<ValidationResult> result02 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("test.com"),
caseFieldDefinition);
assertEquals(1, result01.size(), result02.toString());
assertEquals(1, result02.size(), result02.toString());

final List<ValidationResult> result03 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("test@test@test"),
caseFieldDefinition);
assertEquals(1, result03.size(), result03.toString());

final List<ValidationResult> result04 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("test@test"),
caseFieldDefinition);
assertEquals(1, result04.size(), result04.toString());

final List<ValidationResult> result05 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("<[email protected]"),
caseFieldDefinition);
assertEquals(1, result05.size(), result05.toString());

final List<ValidationResult> result06 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("[email protected]>"),
caseFieldDefinition);
assertEquals(1, result06.size(), result06.toString());

// Email address ending in comma
final List<ValidationResult> result07 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("[email protected],"),
caseFieldDefinition);
assertEquals(1, result07.size(), result07.toString());

final List<ValidationResult> result08 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("[email protected] and [email protected]"),
caseFieldDefinition);
assertEquals(1, result08.size(), result08.toString());

final List<ValidationResult> result09 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("[email protected] AND [email protected]"),
caseFieldDefinition);
assertEquals(1, result09.size(), result09.toString());

final List<ValidationResult> result10 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("[email protected]"),
caseFieldDefinition);
assertEquals(1, result10.size(), result10.toString());

final List<ValidationResult> result11 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("abc*[email protected]"),
caseFieldDefinition);
assertEquals(1, result11.size(), result11.toString());

final List<ValidationResult> result12 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("[email protected]_"),
caseFieldDefinition);
assertEquals(1, result12.size(), result12.toString());

final List<ValidationResult> result13 = validator.validate(FIELD_ID,
NODE_FACTORY.textNode("[email protected]"),
caseFieldDefinition);
assertEquals(1, result13.size(), result13.toString());
}

@Test
Expand Down