From 9d5ac28831f2cda59db7fb38993864ef2a50ff1c Mon Sep 17 00:00:00 2001 From: Eduardo Gulias Davis Date: Thu, 18 Jul 2019 23:53:54 +0200 Subject: [PATCH] Fix #12 - exceptions and address literals (#15) * fix out of bound exception when moving within the tokens list * fix missing closing bracket in literal domains * fix travis issues with xenial dist * Fix infinite loop when AT token is missing --- .travis.yml | 4 +++- src/main/java/emailvalidator4j/lexer/EmailLexer.java | 5 ++++- src/main/java/emailvalidator4j/parser/DomainPart.java | 10 ++++++++++ src/main/java/emailvalidator4j/parser/LocalPart.java | 2 +- src/test/java/emailvalidator4j/EmailValidatorTest.java | 8 ++++++-- 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index c4f11b7..926179f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,5 @@ +dist: trusty language: java jdk: - - oraclejdk8 \ No newline at end of file + - oraclejdk8 + - openjdk8 diff --git a/src/main/java/emailvalidator4j/lexer/EmailLexer.java b/src/main/java/emailvalidator4j/lexer/EmailLexer.java index 44c0908..7d56eb3 100644 --- a/src/main/java/emailvalidator4j/lexer/EmailLexer.java +++ b/src/main/java/emailvalidator4j/lexer/EmailLexer.java @@ -62,7 +62,10 @@ public TokenInterface getCurrent() { */ public void next() { this.position ++; - if (!this.isAtEnd()) { + + if (this.isAtEnd()) { + this.position = this.tokens.size(); + } else { this.current = Optional.of(this.tokens.get(this.position)); this.lexedText += this.tokens.get(this.position).getText(); } diff --git a/src/main/java/emailvalidator4j/parser/DomainPart.java b/src/main/java/emailvalidator4j/parser/DomainPart.java index b8a3dea..72e2f3e 100755 --- a/src/main/java/emailvalidator4j/parser/DomainPart.java +++ b/src/main/java/emailvalidator4j/parser/DomainPart.java @@ -27,6 +27,11 @@ final class DomainPart extends Parser { @Override public void parse(String domainPart) throws InvalidEmail { this.lexer.lex(domainPart); + + if(!this.lexer.getCurrent().equals(Tokens.AT)) { + throw new ExpectedAT("Missing AT token"); + } + this.lexer.next(); if (this.lexer.getCurrent().equals(Tokens.DOT)) { @@ -259,6 +264,7 @@ private void parseLiteralPart() throws InvalidEmail { } } while(!this.lexer.isAtEnd() && !this.lexer.isNextToken(Tokens.CLOSEBRACKET)); + this.warnings.add(Warnings.RFC5321_ADDRESS_LITERAL); addressLiteral = this.lexer.lexedText().replace('[', '\0').replace(']', '\0'); //Remove the initial @ @@ -267,7 +273,11 @@ private void parseLiteralPart() throws InvalidEmail { } else { this.warnings.add(Warnings.RFC5322_DOMAIN_LITERAL); } + this.lexer.next(); + if (!Tokens.CLOSEBRACKET.equals(this.lexer.getCurrent())) { + throw new ExpectedDTEXT("CLOSEBRACKET"); + } } private boolean isObsoleteDTEXT() { diff --git a/src/main/java/emailvalidator4j/parser/LocalPart.java b/src/main/java/emailvalidator4j/parser/LocalPart.java index 8bf4ee2..9e97e74 100644 --- a/src/main/java/emailvalidator4j/parser/LocalPart.java +++ b/src/main/java/emailvalidator4j/parser/LocalPart.java @@ -27,7 +27,7 @@ public void parse(String localpart) throws InvalidEmail { throw new DotAtStart("Found DOT at start"); } - while (!this.lexer.getCurrent().equals(Tokens.AT)) { + while (!this.lexer.getCurrent().equals(Tokens.AT) && !this.lexer.isAtEnd()) { closingQuote = this.checkDoubleQuote(closingQuote); if (closingQuote && parseDQuote) { this.lexer.next(); diff --git a/src/test/java/emailvalidator4j/EmailValidatorTest.java b/src/test/java/emailvalidator4j/EmailValidatorTest.java index 54e8193..73480df 100644 --- a/src/test/java/emailvalidator4j/EmailValidatorTest.java +++ b/src/test/java/emailvalidator4j/EmailValidatorTest.java @@ -57,6 +57,9 @@ public static Object[][] invalidEmailProvider() { {"comment(example))@example.com"}, {"example@example)comment.com"}, {"example@example(comment)).com"}, + {"example@[1.2.3.4"}, + {"example@[IPv6:1:2:3:4:5:6:7:8"}, + {"exam(ple@exam).ple"}, {"example@(example))comment.com"} }; @@ -66,7 +69,7 @@ public static Object[][] invalidEmailProvider() { @UseDataProvider("invalidEmailProvider") public void isInvalidEmail(String email) { EmailValidator validator = new EmailValidator(); - Assert.assertFalse(email + " is an invalid email", validator.isValid(email)); + Assert.assertFalse(email + " should be an invalid email", validator.isValid(email)); } @DataProvider @@ -93,6 +96,7 @@ public static Object[][] validEmailsProvider() { {"\"\\a\"@iana.org"}, {"\"test\\ test\"@iana.org"}, {"\"\"@iana.org"}, + {"\"\"@[]"}/* kind of an edge case, valid for RFC 5322 but address literal is not for 5321 */, {String.format("\"\\%s\"@iana.org", "\"")}, }; } @@ -101,7 +105,7 @@ public static Object[][] validEmailsProvider() { @UseDataProvider("validEmailsProvider") public void isValidEmail(String validEmail) { EmailValidator validator = new EmailValidator(); - Assert.assertTrue(validEmail + " is a valid email", validator.isValid(validEmail)); + Assert.assertTrue(validEmail + " should be a valid email", validator.isValid(validEmail)); } @Test