add check adress
Test Workflow / test (push) Successful in 4s

This commit is contained in:
vladp
2025-12-12 13:07:46 +07:00
parent 015f2f516c
commit f164370989
2 changed files with 34 additions and 44 deletions
+7 -1
View File
@@ -29,13 +29,19 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.security:spring-security-crypto:6.5.3' implementation 'org.springframework.security:spring-security-crypto:6.5.3'
implementation 'org.mapstruct:mapstruct:1.5.5.Final' implementation 'org.mapstruct:mapstruct:1.5.5.Final'
implementation 'commons-validator:commons-validator:1.7'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final' annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'
annotationProcessor 'org.projectlombok:lombok'
compileOnly 'org.projectlombok:lombok' compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools' developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.microsoft.sqlserver:mssql-jdbc' runtimeOnly 'com.microsoft.sqlserver:mssql-jdbc'
runtimeOnly 'com.mysql:mysql-connector-j' runtimeOnly 'com.mysql:mysql-connector-j'
runtimeOnly 'org.postgresql:postgresql' runtimeOnly 'org.postgresql:postgresql'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.mockito:mockito-core:5.3.1' testImplementation 'org.mockito:mockito-core:5.3.1'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
@@ -1,10 +1,14 @@
package ru.soune.nocopy.handler.validator; package ru.soune.nocopy.handler.validator;
import org.apache.commons.validator.routines.DomainValidator;
import org.apache.commons.validator.routines.EmailValidator;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.validation.Errors; import org.springframework.validation.Errors;
import org.springframework.validation.Validator; import org.springframework.validation.Validator;
import ru.soune.nocopy.dto.RegRequest; import ru.soune.nocopy.dto.RegRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*; import java.util.*;
@Component @Component
@@ -89,64 +93,44 @@ public class RegRequestValidator implements Validator {
private void validateEmail(String email, Errors errors) { private void validateEmail(String email, Errors errors) {
if (email == null || email.trim().isEmpty()) { if (email == null || email.trim().isEmpty()) {
errors.rejectValue("email", "email.is.empty", errors.rejectValue("email", "email.is.empty", "Email must not be empty");
"Email must not be empty");
return; return;
} }
String trimmedEmail = email.trim().toLowerCase(); String trimmedEmail = email.trim().toLowerCase();
if (trimmedEmail.length() > 128) { if (trimmedEmail.length() > 254) {
errors.rejectValue("email", "email.too.long", errors.rejectValue("email", "email.too.long", "Email is too long");
"Email must be less than 128 characters");
return; return;
} }
if (!trimmedEmail.matches("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$")) { EmailValidator emailValidator = EmailValidator.getInstance(true, true);
errors.rejectValue("email", "email.invalid.format", if (!emailValidator.isValid(trimmedEmail)) {
"Invalid email format"); errors.rejectValue("email", "email.invalid", "Invalid email address");
return; return;
} }
String[] parts = trimmedEmail.split("@"); String[] parts = trimmedEmail.split("@");
if (parts.length != 2) { if (parts.length == 2) {
return;
}
String localPart = parts[0];
String domain = parts[1]; String domain = parts[1];
DomainValidator domainValidator = DomainValidator.getInstance();
if (localPart.length() > 64) { if (!checkDomainExists(domain)) {
errors.rejectValue("email", "email.local.too.long", errors.rejectValue("email", "email.domain.not.found",
"Email username too long"); "Domain does not exist");
}
}
} }
if (!localPart.matches("^[a-z0-9+_.-]+$")) { private boolean checkDomainExists(String domain) {
errors.rejectValue("email", "email.local.invalid.chars", try {
"Email contains invalid characters"); InetAddress.getByName(domain);
return true;
} catch (UnknownHostException e) {
return false;
}
} }
validateEmailDomain(domain, errors);
}
private void validateEmailDomain(String domain, Errors errors) {
if (domain.length() > 255) {
errors.rejectValue("email", "email.domain.too.long",
"Email domain too long");
}
String[] domainParts = domain.split("\\.");
if (domainParts.length < 2) {
errors.rejectValue("email", "email.domain.invalid",
"Invalid domain name");
}
String tld = domainParts[domainParts.length - 1];
if (tld.length() < 2) {
errors.rejectValue("email", "email.tld.invalid",
"Invalid domain extension");
}
}
private void validatePhone(String phone, Errors errors) { private void validatePhone(String phone, Errors errors) {
if (phone == null || phone.trim().isEmpty()) { if (phone == null || phone.trim().isEmpty()) {