From 18892a102d2810ec86b2f877a026ce099d38543f Mon Sep 17 00:00:00 2001 From: JamesCollettCGI Date: Tue, 11 Feb 2025 14:48:52 +0000 Subject: [PATCH 1/8] CCD-6096: Disallow less than and greater than symbols in Email addresses --- .../gov/hmcts/ccd/domain/types/EmailValidator.java | 3 +++ .../hmcts/ccd/domain/types/EmailValidatorTest.java | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java index c3c5d361c8..a8da74b3ba 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java @@ -70,6 +70,9 @@ public List validate(final String dataFieldId, } private boolean isValidEmailAddress(final String email) { + if (email.contains("<") || email.contains(">")) { + return false; + } try { new InternetAddress(email).validate(); return true; diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java index 7414e870b7..5487ff2221 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java @@ -66,7 +66,7 @@ void validEmail() { final List result03 = validator.validate(FIELD_ID, NODE_FACTORY.textNode("test@test.org"), caseFieldDefinition); - assertEquals(0, result03.size(), result01.toString()); + assertEquals(0, result03.size(), result03.toString()); final List result04 = validator.validate(FIELD_ID, NODE_FACTORY.textNode("test@test.org.uk"), @@ -94,12 +94,22 @@ void invalidEmail() { final List 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 result03 = validator.validate(FIELD_ID, NODE_FACTORY.textNode("test@test@test"), caseFieldDefinition); assertEquals(1, result03.size(), result03.toString()); + + final List result04 = validator.validate(FIELD_ID, + NODE_FACTORY.textNode(" result05 = validator.validate(FIELD_ID, + NODE_FACTORY.textNode("a@a.a>"), + caseFieldDefinition); + assertEquals(1, result05.size(), result05.toString()); } @Test From a334a77a7fbb7d44a2c0d33ddae017239f86a573 Mon Sep 17 00:00:00 2001 From: JamesCollettCGI Date: Wed, 12 Feb 2025 19:23:17 +0000 Subject: [PATCH 2/8] Updated EmailValidator to invalidate comma or space. Updated EmailValidatorTest to test for invalid comma or space. --- .../ccd/domain/types/EmailValidator.java | 12 +----- .../ccd/domain/types/EmailValidatorTest.java | 38 +++++++++++++------ 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java index a8da74b3ba..3d28d76460 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java @@ -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; @@ -70,14 +68,6 @@ public List validate(final String dataFieldId, } private boolean isValidEmailAddress(final String email) { - if (email.contains("<") || email.contains(">")) { - return false; - } - try { - new InternetAddress(email).validate(); - return true; - } catch (AddressException ex) { - return false; - } + return org.apache.commons.validator.routines.EmailValidator.getInstance().isValid(email); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java index 5487ff2221..9b9f51d73c 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java @@ -59,29 +59,24 @@ void validEmail() { assertEquals(0, result01.size(), result01.toString()); final List 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 result03 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("test@test.org"), + NODE_FACTORY.textNode("test@test.org.uk"), caseFieldDefinition); assertEquals(0, result03.size(), result03.toString()); final List 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 result05 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("test.test@test.com"), - caseFieldDefinition); - assertEquals(0, result05.size(), result05.toString()); - - final List result06 = validator.validate(FIELD_ID, NODE_FACTORY.textNode("test_test@test.xxx"), caseFieldDefinition); - assertEquals(0, result06.size(), result06.toString()); + assertEquals(0, result05.size(), result05.toString()); } @Test @@ -102,14 +97,35 @@ void invalidEmail() { assertEquals(1, result03.size(), result03.toString()); final List result04 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode(" result05 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("a@a.a>"), + NODE_FACTORY.textNode(" result06 = validator.validate(FIELD_ID, + NODE_FACTORY.textNode("a@a.a>"), + caseFieldDefinition); + assertEquals(1, result06.size(), result06.toString()); + + // Email address ending in comma + final List result07 = validator.validate(FIELD_ID, + NODE_FACTORY.textNode("a@a.a,"), + caseFieldDefinition); + assertEquals(1, result07.size(), result07.toString()); + + final List result08 = validator.validate(FIELD_ID, + NODE_FACTORY.textNode("a@a.a and b@b.b"), + caseFieldDefinition); + assertEquals(1, result08.size(), result08.toString()); + + final List result09 = validator.validate(FIELD_ID, + NODE_FACTORY.textNode("a@a.a AND b@b.b"), + caseFieldDefinition); + assertEquals(1, result09.size(), result09.toString()); } @Test From f7b733073f78793f632f33a9fcd9ea8a56e4a70d Mon Sep 17 00:00:00 2001 From: JamesCollettCGI Date: Tue, 4 Mar 2025 14:35:51 +0000 Subject: [PATCH 3/8] Add logging to check EmailValidator regular expressions --- .../ccd/domain/types/EmailValidator.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java index 3d28d76460..57ff25b274 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java @@ -1,6 +1,8 @@ package uk.gov.hmcts.ccd.domain.types; import com.fasterxml.jackson.databind.JsonNode; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import javax.inject.Named; @@ -17,6 +19,16 @@ public class EmailValidator implements BaseTypeValidator { static final String TYPE_ID = "Email"; + private static final Logger LOG = LoggerFactory.getLogger(EmailValidator.class); + + private void jclog(final String message) { + System.out.println("JCDEBUG: " + message); + LOG.debug("JCDEBUG: debug: " + message); + LOG.info("JCDEBUG: info: " + message); + LOG.warn("JCDEBUG: warn: " + message); + LOG.error("JCDEBUG: error: " + message); + } + @Override public BaseType getType() { return BaseType.get(TYPE_ID); @@ -48,12 +60,15 @@ public List validate(final String dataFieldId, } if (!checkRegex(caseFieldDefinition.getFieldTypeDefinition().getRegularExpression(), value)) { + jclog("caseFieldDefinition.getFieldTypeDefinition().getRegularExpression() = " + + caseFieldDefinition.getFieldTypeDefinition().getRegularExpression()); return Collections.singletonList( new ValidationResult(REGEX_GUIDANCE, dataFieldId) ); } if (!checkRegex(getType().getRegularExpression(), value)) { + jclog("getType().getRegularExpression() = " + getType().getRegularExpression()); return Collections.singletonList( new ValidationResult(REGEX_GUIDANCE, dataFieldId) ); @@ -68,6 +83,11 @@ public List validate(final String dataFieldId, } private boolean isValidEmailAddress(final String email) { + /* + if (email.contains("?")) { + return false; + } + */ return org.apache.commons.validator.routines.EmailValidator.getInstance().isValid(email); } } From cfa25bd8ad1d2d09480c1869ffa83aa2b77c9d44 Mon Sep 17 00:00:00 2001 From: JamesCollettCGI Date: Tue, 4 Mar 2025 15:48:24 +0000 Subject: [PATCH 4/8] Update EmailValidator logging --- .../gov/hmcts/ccd/domain/types/EmailValidator.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java index 57ff25b274..dc70e87afa 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java @@ -22,11 +22,11 @@ public class EmailValidator implements BaseTypeValidator { private static final Logger LOG = LoggerFactory.getLogger(EmailValidator.class); private void jclog(final String message) { - System.out.println("JCDEBUG: " + message); - LOG.debug("JCDEBUG: debug: " + message); - LOG.info("JCDEBUG: info: " + message); - LOG.warn("JCDEBUG: warn: " + message); - LOG.error("JCDEBUG: error: " + message); + //System.out.println("JCDEBUG: " + message); + LOG.debug("JCDEBUG: debug: {0}", message); + LOG.info("JCDEBUG: info: {0}", message); + LOG.warn("JCDEBUG: warn: {0}", message); + LOG.error("JCDEBUG: error: {0}", message); } @Override @@ -38,6 +38,8 @@ public BaseType getType() { public List validate(final String dataFieldId, final JsonNode dataValue, final CaseFieldDefinition caseFieldDefinition) { + jclog("validate()"); + if (isNullOrEmpty(dataValue)) { return Collections.emptyList(); } From 663198e54daea5d2c061eafd2a7acc4692e4e7f1 Mon Sep 17 00:00:00 2001 From: JamesCollettCGI Date: Wed, 5 Mar 2025 11:07:41 +0000 Subject: [PATCH 5/8] Update logging --- .../ccd/domain/types/EmailValidator.java | 18 ++++--- .../ccd/domain/types/EmailValidatorTest.java | 48 ++++++++++++++++--- 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java index dc70e87afa..9e340d7e8d 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java @@ -23,10 +23,10 @@ public class EmailValidator implements BaseTypeValidator { private void jclog(final String message) { //System.out.println("JCDEBUG: " + message); - LOG.debug("JCDEBUG: debug: {0}", message); - LOG.info("JCDEBUG: info: {0}", message); - LOG.warn("JCDEBUG: warn: {0}", message); - LOG.error("JCDEBUG: error: {0}", message); + LOG.debug("JCDEBUG: debug: {}", message); + LOG.info("JCDEBUG: info: {}", message); + LOG.warn("JCDEBUG: warn: {}", message); + LOG.error("JCDEBUG: error: {}", message); } @Override @@ -61,7 +61,10 @@ public List validate(final String dataFieldId, + "' requires minimum length " + caseFieldDefinition.getFieldTypeDefinition().getMin(), dataFieldId)); } - if (!checkRegex(caseFieldDefinition.getFieldTypeDefinition().getRegularExpression(), value)) { + final String regex1 = caseFieldDefinition.getFieldTypeDefinition().getRegularExpression(); + final boolean match1 = value.matches(regex1); + jclog(regex1 + " , " + value + " , " + checkRegex(regex1, value) + " , " + match1); + if (!checkRegex(regex1, value)) { jclog("caseFieldDefinition.getFieldTypeDefinition().getRegularExpression() = " + caseFieldDefinition.getFieldTypeDefinition().getRegularExpression()); return Collections.singletonList( @@ -69,7 +72,10 @@ public List validate(final String dataFieldId, ); } - if (!checkRegex(getType().getRegularExpression(), value)) { + final String regex2 = getType().getRegularExpression(); + final boolean match2 = value.matches(regex1); + jclog(regex2 + " , " + value + " , " + checkRegex(regex2, value) + " , " + match2); + if (!checkRegex(regex2, value)) { jclog("getType().getRegularExpression() = " + getType().getRegularExpression()); return Collections.singletonList( new ValidationResult(REGEX_GUIDANCE, dataFieldId) diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java index 9b9f51d73c..78bf37ca74 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java @@ -7,6 +7,8 @@ import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import uk.gov.hmcts.ccd.data.definition.CaseDefinitionRepository; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import uk.gov.hmcts.ccd.test.CaseFieldDefinitionBuilder; @@ -24,6 +26,20 @@ class EmailValidatorTest { private static final JsonNodeFactory NODE_FACTORY = JsonNodeFactory.instance; private static final String FIELD_ID = "TEST_FIELD_ID"; + private static final Logger LOG = LoggerFactory.getLogger(EmailValidatorTest.class); + + // TEMPORARY + private static final String REGEX1 = "^[a-z]\\w*@hmcts.net$"; + private static final String REGEX2 = "\\\\w*@hmcts.net"; + + private void jclog(final String message) { + //System.out.println("JCDEBUG: " + message); + LOG.debug("JCDEBUG: debug: {}", message); + LOG.info("JCDEBUG: info: {}", message); + LOG.warn("JCDEBUG: warn: {}", message); + LOG.error("JCDEBUG: error: {}", message); + } + @Mock private BaseType emailBaseType; @@ -53,6 +69,7 @@ void setUp() { @Test void validEmail() { + jclog("---------------- validEmail() ----------------"); final List result01 = validator.validate(FIELD_ID, NODE_FACTORY.textNode("test@test.com"), caseFieldDefinition); @@ -81,6 +98,7 @@ void validEmail() { @Test void invalidEmail() { + jclog("---------------- invalidEmail() ----------------"); final List result01 = validator.validate(FIELD_ID, NODE_FACTORY.textNode("test.test.com"), caseFieldDefinition); @@ -126,10 +144,23 @@ void invalidEmail() { NODE_FACTORY.textNode("a@a.a AND b@b.b"), caseFieldDefinition); assertEquals(1, result09.size(), result09.toString()); + + // NOTE: assertEquals should be 1 for invalid Email address + final List result10 = validator.validate(FIELD_ID, + NODE_FACTORY.textNode("abc?ca@ae.com"), + caseFieldDefinition); + assertEquals(0, result10.size(), result10.toString()); + + // NOTE: assertEquals should be 1 for invalid Email address + final List result11 = validator.validate(FIELD_ID, + NODE_FACTORY.textNode("abc*ca@ae.com"), + caseFieldDefinition); + assertEquals(0, result11.size(), result11.toString()); } - @Test + //@Test void fieldTypeRegEx() { + jclog("---------------- fieldTypeRegEx() ----------------"); final CaseFieldDefinition regexCaseFieldDefinition = caseField().withRegExp("^[a-z]\\w*@hmcts.net$").build(); final JsonNode validValue = NODE_FACTORY.textNode("k9@hmcts.net"); final List validResult = validator.validate(FIELD_ID, validValue, regexCaseFieldDefinition); @@ -142,8 +173,9 @@ void fieldTypeRegEx() { assertEquals(REGEX_GUIDANCE, invalidResult.get(0).getErrorMessage()); } - @Test + //@Test void baseTypeRegEx() { + jclog("---------------- baseTypeRegEx() ----------------"); when(emailBaseType.getRegularExpression()).thenReturn("\\\\w*@hmcts.net"); final List result01 = @@ -152,8 +184,9 @@ void baseTypeRegEx() { assertEquals(REGEX_GUIDANCE, result01.get(0).getErrorMessage()); } - @Test + //@Test void checkMin() { + jclog("---------------- checkMin() ----------------"); final CaseFieldDefinition caseFieldDefinition = caseField().withMin(new BigDecimal(13)).build(); final JsonNode validValue = NODE_FACTORY.textNode("k99@hmcts.net"); final List validResult = validator.validate(FIELD_ID, validValue, caseFieldDefinition); @@ -165,8 +198,9 @@ void checkMin() { assertEquals("Email 'k9@hmcts.net' requires minimum length 13", invalidResult.get(0).getErrorMessage()); } - @Test + //@Test void checkMax() { + jclog("---------------- checkMax() ----------------"); final CaseFieldDefinition caseFieldDefinition = caseField().withMax(new BigDecimal(12)).build(); final JsonNode validValue = NODE_FACTORY.textNode("k9@hmcts.net"); final List validResult = validator.validate(FIELD_ID, validValue, caseFieldDefinition); @@ -178,13 +212,15 @@ void checkMax() { assertEquals("Email 'k99@hmcts.net' exceeds maximum length 12", invalidResult.get(0).getErrorMessage()); } - @Test + //@Test void nullValue() { + jclog("---------------- nullValue() ----------------"); assertEquals(0, validator.validate(FIELD_ID, null, caseFieldDefinition).size(), "Did not catch NULL"); } - @Test + //@Test void getType() { + jclog("---------------- getType() ----------------"); assertEquals(validator.getType(), BaseType.get("Email"), "Type is incorrect"); } From e1d10740ad8709a586047a26af096ec8d78f987f Mon Sep 17 00:00:00 2001 From: JamesCollettCGI Date: Wed, 5 Mar 2025 11:26:24 +0000 Subject: [PATCH 6/8] Update logging --- .../hmcts/ccd/domain/types/EmailValidator.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java index 9e340d7e8d..5ae033fcc6 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java @@ -62,8 +62,12 @@ public List validate(final String dataFieldId, } final String regex1 = caseFieldDefinition.getFieldTypeDefinition().getRegularExpression(); - final boolean match1 = value.matches(regex1); - jclog(regex1 + " , " + value + " , " + checkRegex(regex1, value) + " , " + match1); + if (regex1 == null) { + jclog(regex1 + " , " + value + " , " + checkRegex(regex1, value) + " , NULL"); + } else { + final boolean match1 = value.matches(regex1); + jclog(regex1 + " , " + value + " , " + checkRegex(regex1, value) + " , " + match1); + } if (!checkRegex(regex1, value)) { jclog("caseFieldDefinition.getFieldTypeDefinition().getRegularExpression() = " + caseFieldDefinition.getFieldTypeDefinition().getRegularExpression()); @@ -73,8 +77,12 @@ public List validate(final String dataFieldId, } final String regex2 = getType().getRegularExpression(); - final boolean match2 = value.matches(regex1); - jclog(regex2 + " , " + value + " , " + checkRegex(regex2, value) + " , " + match2); + if (regex2 == null) { + jclog(regex2 + " , " + value + " , " + checkRegex(regex2, value) + " , NULL"); + } else { + final boolean match2 = value.matches(regex2); + jclog(regex2 + " , " + value + " , " + checkRegex(regex2, value) + " , " + match2); + } if (!checkRegex(regex2, value)) { jclog("getType().getRegularExpression() = " + getType().getRegularExpression()); return Collections.singletonList( From abd1322e91330a00ff679d5dd0d0874f7099cf7d Mon Sep 17 00:00:00 2001 From: JamesCollettCGI Date: Wed, 5 Mar 2025 11:40:29 +0000 Subject: [PATCH 7/8] Temporary build.gradle change --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 9470bf9024..8a441f3dee 100644 --- a/build.gradle +++ b/build.gradle @@ -665,7 +665,7 @@ sonarqube { properties { property "sonar.exclusions", "build/generated-sources/**/*.java," + "**/AppInsightsConfiguration.java," + - "**/TestingSupportController.java" + "**/TestingSupportController.java,**/EmailValidator.java" property "sonar.projectName", "ccd-data-store-api" property "sonar.projectKey", "ccd-data-store-api" property "sonar.coverage.jacoco.xmlReportPaths", "${jacocoTestReport.reports.xml.outputLocation}" From 7672358d9f8e922ec44a61af599a998bf3ce714f Mon Sep 17 00:00:00 2001 From: JamesCollettCGI Date: Wed, 5 Mar 2025 13:07:02 +0000 Subject: [PATCH 8/8] Clean up --- build.gradle | 2 +- .../ccd/domain/types/EmailValidator.java | 44 +++------------ .../ccd/domain/types/EmailValidatorTest.java | 54 +++++++------------ 3 files changed, 28 insertions(+), 72 deletions(-) diff --git a/build.gradle b/build.gradle index 8a441f3dee..9470bf9024 100644 --- a/build.gradle +++ b/build.gradle @@ -665,7 +665,7 @@ sonarqube { properties { property "sonar.exclusions", "build/generated-sources/**/*.java," + "**/AppInsightsConfiguration.java," + - "**/TestingSupportController.java,**/EmailValidator.java" + "**/TestingSupportController.java" property "sonar.projectName", "ccd-data-store-api" property "sonar.projectKey", "ccd-data-store-api" property "sonar.coverage.jacoco.xmlReportPaths", "${jacocoTestReport.reports.xml.outputLocation}" diff --git a/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java b/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java index 5ae033fcc6..de997fd283 100644 --- a/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java +++ b/src/main/java/uk/gov/hmcts/ccd/domain/types/EmailValidator.java @@ -1,8 +1,6 @@ package uk.gov.hmcts.ccd.domain.types; import com.fasterxml.jackson.databind.JsonNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import javax.inject.Named; @@ -19,15 +17,7 @@ public class EmailValidator implements BaseTypeValidator { static final String TYPE_ID = "Email"; - private static final Logger LOG = LoggerFactory.getLogger(EmailValidator.class); - - private void jclog(final String message) { - //System.out.println("JCDEBUG: " + message); - LOG.debug("JCDEBUG: debug: {}", message); - LOG.info("JCDEBUG: info: {}", message); - LOG.warn("JCDEBUG: warn: {}", message); - LOG.error("JCDEBUG: error: {}", message); - } + private static final String EMAIL_REGEX = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"; @Override public BaseType getType() { @@ -38,8 +28,6 @@ public BaseType getType() { public List validate(final String dataFieldId, final JsonNode dataValue, final CaseFieldDefinition caseFieldDefinition) { - jclog("validate()"); - if (isNullOrEmpty(dataValue)) { return Collections.emptyList(); } @@ -61,30 +49,19 @@ public List validate(final String dataFieldId, + "' requires minimum length " + caseFieldDefinition.getFieldTypeDefinition().getMin(), dataFieldId)); } - final String regex1 = caseFieldDefinition.getFieldTypeDefinition().getRegularExpression(); - if (regex1 == null) { - jclog(regex1 + " , " + value + " , " + checkRegex(regex1, value) + " , NULL"); - } else { - final boolean match1 = value.matches(regex1); - jclog(regex1 + " , " + value + " , " + checkRegex(regex1, value) + " , " + match1); - } - if (!checkRegex(regex1, value)) { - jclog("caseFieldDefinition.getFieldTypeDefinition().getRegularExpression() = " - + caseFieldDefinition.getFieldTypeDefinition().getRegularExpression()); + if (!checkRegex(caseFieldDefinition.getFieldTypeDefinition().getRegularExpression(), value)) { return Collections.singletonList( new ValidationResult(REGEX_GUIDANCE, dataFieldId) ); } - final String regex2 = getType().getRegularExpression(); - if (regex2 == null) { - jclog(regex2 + " , " + value + " , " + checkRegex(regex2, value) + " , NULL"); - } else { - final boolean match2 = value.matches(regex2); - jclog(regex2 + " , " + value + " , " + checkRegex(regex2, value) + " , " + match2); + if (!checkRegex(getType().getRegularExpression(), value)) { + return Collections.singletonList( + new ValidationResult(REGEX_GUIDANCE, dataFieldId) + ); } - if (!checkRegex(regex2, value)) { - jclog("getType().getRegularExpression() = " + getType().getRegularExpression()); + + if (!checkRegex(EMAIL_REGEX, value)) { return Collections.singletonList( new ValidationResult(REGEX_GUIDANCE, dataFieldId) ); @@ -99,11 +76,6 @@ public List validate(final String dataFieldId, } private boolean isValidEmailAddress(final String email) { - /* - if (email.contains("?")) { - return false; - } - */ return org.apache.commons.validator.routines.EmailValidator.getInstance().isValid(email); } } diff --git a/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java b/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java index 78bf37ca74..4fce43cbb6 100644 --- a/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java +++ b/src/test/java/uk/gov/hmcts/ccd/domain/types/EmailValidatorTest.java @@ -7,8 +7,6 @@ import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import uk.gov.hmcts.ccd.data.definition.CaseDefinitionRepository; import uk.gov.hmcts.ccd.domain.model.definition.CaseFieldDefinition; import uk.gov.hmcts.ccd.test.CaseFieldDefinitionBuilder; @@ -26,20 +24,6 @@ class EmailValidatorTest { private static final JsonNodeFactory NODE_FACTORY = JsonNodeFactory.instance; private static final String FIELD_ID = "TEST_FIELD_ID"; - private static final Logger LOG = LoggerFactory.getLogger(EmailValidatorTest.class); - - // TEMPORARY - private static final String REGEX1 = "^[a-z]\\w*@hmcts.net$"; - private static final String REGEX2 = "\\\\w*@hmcts.net"; - - private void jclog(final String message) { - //System.out.println("JCDEBUG: " + message); - LOG.debug("JCDEBUG: debug: {}", message); - LOG.info("JCDEBUG: info: {}", message); - LOG.warn("JCDEBUG: warn: {}", message); - LOG.error("JCDEBUG: error: {}", message); - } - @Mock private BaseType emailBaseType; @@ -69,7 +53,6 @@ void setUp() { @Test void validEmail() { - jclog("---------------- validEmail() ----------------"); final List result01 = validator.validate(FIELD_ID, NODE_FACTORY.textNode("test@test.com"), caseFieldDefinition); @@ -98,7 +81,6 @@ void validEmail() { @Test void invalidEmail() { - jclog("---------------- invalidEmail() ----------------"); final List result01 = validator.validate(FIELD_ID, NODE_FACTORY.textNode("test.test.com"), caseFieldDefinition); @@ -145,22 +127,29 @@ void invalidEmail() { caseFieldDefinition); assertEquals(1, result09.size(), result09.toString()); - // NOTE: assertEquals should be 1 for invalid Email address final List result10 = validator.validate(FIELD_ID, NODE_FACTORY.textNode("abc?ca@ae.com"), caseFieldDefinition); - assertEquals(0, result10.size(), result10.toString()); + assertEquals(1, result10.size(), result10.toString()); - // NOTE: assertEquals should be 1 for invalid Email address final List result11 = validator.validate(FIELD_ID, - NODE_FACTORY.textNode("abc*ca@ae.com"), + NODE_FACTORY.textNode("abc*abc@ae.com"), + caseFieldDefinition); + assertEquals(1, result11.size(), result11.toString()); + + final List result12 = validator.validate(FIELD_ID, + NODE_FACTORY.textNode("abcabc@ae.com_"), + caseFieldDefinition); + assertEquals(1, result12.size(), result12.toString()); + + final List result13 = validator.validate(FIELD_ID, + NODE_FACTORY.textNode("abcabc@ae.com-"), caseFieldDefinition); - assertEquals(0, result11.size(), result11.toString()); + assertEquals(1, result13.size(), result13.toString()); } - //@Test + @Test void fieldTypeRegEx() { - jclog("---------------- fieldTypeRegEx() ----------------"); final CaseFieldDefinition regexCaseFieldDefinition = caseField().withRegExp("^[a-z]\\w*@hmcts.net$").build(); final JsonNode validValue = NODE_FACTORY.textNode("k9@hmcts.net"); final List validResult = validator.validate(FIELD_ID, validValue, regexCaseFieldDefinition); @@ -173,9 +162,8 @@ void fieldTypeRegEx() { assertEquals(REGEX_GUIDANCE, invalidResult.get(0).getErrorMessage()); } - //@Test + @Test void baseTypeRegEx() { - jclog("---------------- baseTypeRegEx() ----------------"); when(emailBaseType.getRegularExpression()).thenReturn("\\\\w*@hmcts.net"); final List result01 = @@ -184,9 +172,8 @@ void baseTypeRegEx() { assertEquals(REGEX_GUIDANCE, result01.get(0).getErrorMessage()); } - //@Test + @Test void checkMin() { - jclog("---------------- checkMin() ----------------"); final CaseFieldDefinition caseFieldDefinition = caseField().withMin(new BigDecimal(13)).build(); final JsonNode validValue = NODE_FACTORY.textNode("k99@hmcts.net"); final List validResult = validator.validate(FIELD_ID, validValue, caseFieldDefinition); @@ -198,9 +185,8 @@ void checkMin() { assertEquals("Email 'k9@hmcts.net' requires minimum length 13", invalidResult.get(0).getErrorMessage()); } - //@Test + @Test void checkMax() { - jclog("---------------- checkMax() ----------------"); final CaseFieldDefinition caseFieldDefinition = caseField().withMax(new BigDecimal(12)).build(); final JsonNode validValue = NODE_FACTORY.textNode("k9@hmcts.net"); final List validResult = validator.validate(FIELD_ID, validValue, caseFieldDefinition); @@ -212,15 +198,13 @@ void checkMax() { assertEquals("Email 'k99@hmcts.net' exceeds maximum length 12", invalidResult.get(0).getErrorMessage()); } - //@Test + @Test void nullValue() { - jclog("---------------- nullValue() ----------------"); assertEquals(0, validator.validate(FIELD_ID, null, caseFieldDefinition).size(), "Did not catch NULL"); } - //@Test + @Test void getType() { - jclog("---------------- getType() ----------------"); assertEquals(validator.getType(), BaseType.get("Email"), "Type is incorrect"); }