SUPPORT-9509: Fix

This commit is contained in:
Eduard Tihomiorv 2025-10-28 10:42:18 +03:00
parent 47e44facb8
commit d756543745
5 changed files with 60 additions and 16 deletions

View file

@ -3,9 +3,12 @@ package ervu.service.fileupload;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
@ -53,7 +56,11 @@ import ru.micord.ervu.exception.JsonParsingException;
import ru.micord.ervu.journal.SenderInfo; import ru.micord.ervu.journal.SenderInfo;
import ru.micord.ervu.kafka.service.ReplyingKafkaService; import ru.micord.ervu.kafka.service.ReplyingKafkaService;
import ru.micord.ervu.security.esia.config.EsiaConfig; import ru.micord.ervu.security.esia.config.EsiaConfig;
import ru.micord.ervu.security.esia.model.*; import ru.micord.ervu.security.esia.model.EmployeeModel;
import ru.micord.ervu.security.esia.model.MchdInfoModel;
import ru.micord.ervu.security.esia.model.OrganizationModel;
import ru.micord.ervu.security.esia.model.PersonModel;
import ru.micord.ervu.security.esia.model.VerifyDocumentSignResponse;
import ru.micord.ervu.security.esia.service.MchdService; import ru.micord.ervu.security.esia.service.MchdService;
import ru.micord.ervu.security.esia.service.UlDataService; import ru.micord.ervu.security.esia.service.UlDataService;
import ru.micord.ervu.security.esia.EsiaAuthInfoStore; import ru.micord.ervu.security.esia.EsiaAuthInfoStore;
@ -336,13 +343,12 @@ public class EmployeeInfoFileUploadService {
String chiefMiddleName = chiefModel.getPerson().getMiddleName(); String chiefMiddleName = chiefModel.getPerson().getMiddleName();
String chiefLastName = chiefModel.getPerson().getLastName(); String chiefLastName = chiefModel.getPerson().getLastName();
String chiefFirstName = chiefModel.getPerson().getFirstName(); String chiefFirstName = chiefModel.getPerson().getFirstName();
boolean isSignerLastName = signerInfoMap.get("SN").equalsIgnoreCase(chiefLastName);
boolean isSignerFirstNameAndMiddleName = signerInfoMap.get("G")
.equalsIgnoreCase(chiefFirstName + " " + chiefMiddleName);
boolean isSignerOgrn = signerInfoMap.get("ОГРН").equalsIgnoreCase(ogrn);
boolean isSignerValid = signerInfoMap.get("SN").equalsIgnoreCase(chiefLastName) && if (isSignerLastName && isSignerFirstNameAndMiddleName && isSignerOgrn) {
signerInfoMap.get("G")
.equalsIgnoreCase(chiefFirstName + " " + chiefMiddleName) &&
signerInfoMap.get("O").equalsIgnoreCase(uploadOrgInfo.getOrgName());
if (isSignerValid) {
FileStatusResponse fileStatusResponse = new FileStatusResponse(uploadOrgInfo, FileStatusResponse fileStatusResponse = new FileStatusResponse(uploadOrgInfo,
new FileInfo[] {fileInfo, signFileInfo}, fileInfo.getFileStatus() new FileInfo[] {fileInfo, signFileInfo}, fileInfo.getFileStatus()
); );
@ -366,7 +372,18 @@ public class EmployeeInfoFileUploadService {
if (mchdFile == null) { if (mchdFile == null) {
handleMchdValidationError(uploadOrgInfo, fileInfo, signFileInfo, null, ervuId, response handleMchdValidationError(uploadOrgInfo, fileInfo, signFileInfo, null, ervuId, response
); );
throw new LocalizedException("mchd_null", MESSAGE_SOURCE); List<String> falseResults = new ArrayList<>();
if (!isSignerLastName) {
falseResults.add("фамилия");
}
if (!isSignerFirstNameAndMiddleName) {
falseResults.add("имя или отчество");
}
if (!isSignerOgrn) {
falseResults.add("организация");
}
String result = String.join(", ", falseResults);
throw new LocalizedException("mchd_null", MESSAGE_SOURCE, result);
} }
FileStatusResponse fileStatusResponse = new FileStatusResponse(uploadOrgInfo, FileStatusResponse fileStatusResponse = new FileStatusResponse(uploadOrgInfo,
new FileInfo[] {fileInfo, signFileInfo, mchdFileInfo}, fileInfo.getFileStatus() new FileInfo[] {fileInfo, signFileInfo, mchdFileInfo}, fileInfo.getFileStatus()
@ -549,13 +566,15 @@ public class EmployeeInfoFileUploadService {
throw new LocalizedException("mchd_cant_parse", MESSAGE_SOURCE); throw new LocalizedException("mchd_cant_parse", MESSAGE_SOURCE);
} }
MchdInfoModel mchdInfoModel = mchdService.getMchdInfoModel(mchdGuid); MchdInfoModel mchdInfoModel = mchdService.getMchdInfoModel(mchdGuid);
if (!mchdInfoModel.getStatus().equals("A")) { LocalDate now = LocalDate.now();
if (!mchdInfoModel.getStatus().equals("A") || now.isAfter(mchdInfoModel.getExpiredOn())
|| mchdInfoModel.getIssuedOn().isAfter(now)) {
throw new LocalizedException("mchd_expired", MESSAGE_SOURCE); throw new LocalizedException("mchd_expired", MESSAGE_SOURCE);
} }
boolean validAgent = mchdInfoModel.getAgents() boolean validAgent = mchdInfoModel.getAgents()
.getElements() .getElements()
.stream() .stream()
.anyMatch(agent1 -> agent1.getPerson().getSnils().equals(snils)); .anyMatch(agent1 -> agent1.getPerson().getSnils().replaceAll("[\\s-]", "").equals(snils));
if (!validAgent) { if (!validAgent) {
throw new LocalizedException("mchd_validate_agent", MESSAGE_SOURCE); throw new LocalizedException("mchd_validate_agent", MESSAGE_SOURCE);
} }
@ -669,4 +688,4 @@ public class EmployeeInfoFileUploadService {
auditService.processUploadEvent(uploadOrgInfo, new FileInfo[] {fileInfo, signFileInfo}, packInfo); auditService.processUploadEvent(uploadOrgInfo, new FileInfo[] {fileInfo, signFileInfo}, packInfo);
clearS3(response); clearS3(response);
} }
} }

View file

@ -1,9 +1,12 @@
package ru.micord.ervu.security.esia.model; package ru.micord.ervu.security.esia.model;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDate;
import java.util.List; import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
/** /**
@ -17,6 +20,10 @@ public class MchdInfoModel implements Serializable {
private String parentGuid; private String parentGuid;
private Member principals; private Member principals;
private Member agents; private Member agents;
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate issuedOn;
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate expiredOn;
public String getGuid() { public String getGuid() {
return guid; return guid;
@ -58,6 +65,22 @@ public class MchdInfoModel implements Serializable {
this.agents = agents; this.agents = agents;
} }
public LocalDate getIssuedOn() {
return issuedOn;
}
public void setIssuedOn(LocalDate issuedOn) {
this.issuedOn = issuedOn;
}
public LocalDate getExpiredOn() {
return expiredOn;
}
public void setExpiredOn(LocalDate expiredOn) {
this.expiredOn = expiredOn;
}
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
public static class Member implements Serializable { public static class Member implements Serializable {
private List<Element> elements; private List<Element> elements;

View file

@ -676,7 +676,7 @@ public class EsiaAuthService {
SignResponse signResponse = signMap(parameters); SignResponse signResponse = signMap(parameters);
String newState = signResponse.getState(); String newState = signResponse.getState();
String clientSecret = signResponse.getSignature(); String clientSecret = signResponse.getSignature();
String authUrl = esiaConfig.getEsiaBaseUri() + esiaConfig.getEsiaSystemTokenUrl(); String authUrl = esiaConfig.getEsiaBaseUri() + esiaConfig.getEsiaTokenUrl();
String postBody = new FormUrlencoded() String postBody = new FormUrlencoded()
.setParameter("client_id", clientId) .setParameter("client_id", clientId)
.setParameter("grant_type", "client_credentials") .setParameter("grant_type", "client_credentials")
@ -685,6 +685,7 @@ public class EsiaAuthService {
.setParameter("scope", scope) .setParameter("scope", scope)
.setParameter("timestamp", timestamp) .setParameter("timestamp", timestamp)
.setParameter("token_type", "Bearer") .setParameter("token_type", "Bearer")
.setParameter("client_certificate_hash", esiaConfig.getClientCertHash())
.setParameter("redirect_uri", esiaConfig.getRedirectUrl()) .setParameter("redirect_uri", esiaConfig.getRedirectUrl())
.toFormUrlencodedString(); .toFormUrlencodedString();
HttpRequest postReq = HttpRequest.newBuilder(URI.create(authUrl)) HttpRequest postReq = HttpRequest.newBuilder(URI.create(authUrl))

View file

@ -7,9 +7,10 @@ cert_untrusted_root=Сертификат или цепочка сертифик
cert_is_not_time_valid=Этот сертификат или один из сертификатов в цепочке сертификатов является недопустимым по времени cert_is_not_time_valid=Этот сертификат или один из сертификатов в цепочке сертификатов является недопустимым по времени
file_sign_validate=Ошибка проверки файлов. Некорректная электронная подпись file_sign_validate=Ошибка проверки файлов. Некорректная электронная подпись
mchd_validate_agent=Ошибка проверки файлов. Некорректная машиночитаемая доверенность. Представитель не совпадает с подписантом mchd_validate_agent=Ошибка проверки файлов. Некорректная машиночитаемая доверенность. Представитель не совпадает с подписантом
mchd_null=Ошибка проверки файлов. Отсутствует машиночитаемая доверенность. Подписант не является руководителем организации mchd_null=Ошибка проверки файлов. Отсутствует машиночитаемая доверенность. Подписант не является руководителем организации. Не совпадает {0}
temp_sign_error=Ошибка проверки файлов. Подписант не является руководителем организации. Приложите подпись руководителя
mchd_expired=Ошибка проверки файлов. Недействующая машиночитаемая доверенность. mchd_expired=Ошибка проверки файлов. Недействующая машиночитаемая доверенность.
mchd_tree_expired=Ошибка проверки файлов. Одна из родительских доверенностей недействующая. mchd_tree_expired=Ошибка проверки файлов. Одна из родительских доверенностей недействующая.
mchd_validate_principal=Ошибка проверки файлов. Некорректная машиночитаемая доверенность. Доверитель не совпадает с руководителем организации mchd_validate_principal=Ошибка проверки файлов. Некорректная машиночитаемая доверенность. Доверенность выдана не той организацией, под которой была осуществлена загрузка файлов.
av_file_infected=Ошибка проверки файлов. Файлы заражены вирусом av_file_infected=Ошибка проверки файлов. Файлы заражены вирусом
mchd_cant_parse=Ошибка проверки файлов. Некорректный формат машиночитаемой доверенности mchd_cant_parse=Ошибка проверки файлов. Некорректный формат машиночитаемой доверенности

View file

@ -7,9 +7,9 @@ cert_untrusted_root=Сертификат или цепочка сертифик
cert_is_not_time_valid=Этот сертификат или один из сертификатов в цепочке сертификатов является недопустимым по времени cert_is_not_time_valid=Этот сертификат или один из сертификатов в цепочке сертификатов является недопустимым по времени
file_sign_validate=Ошибка проверки файлов. Некорректная электронная подпись file_sign_validate=Ошибка проверки файлов. Некорректная электронная подпись
mchd_validate_agent=Ошибка проверки файлов. Некорректная машиночитаемая доверенность. Представитель не совпадает с подписантом mchd_validate_agent=Ошибка проверки файлов. Некорректная машиночитаемая доверенность. Представитель не совпадает с подписантом
mchd_null=Ошибка проверки файлов. Отсутствует машиночитаемая доверенность. Подписант не является руководителем организации mchd_null=Ошибка проверки файлов. Отсутствует машиночитаемая доверенность. Подписант не является руководителем организации. Не совпадает {0}
mchd_expired=Ошибка проверки файлов. Недействующая машиночитаемая доверенность. mchd_expired=Ошибка проверки файлов. Недействующая машиночитаемая доверенность.
mchd_tree_expired=Ошибка проверки файлов. Одна из родительских доверенностей недействующая. mchd_tree_expired=Ошибка проверки файлов. Одна из родительских доверенностей недействующая.
mchd_validate_principal=Ошибка проверки файлов. Некорректная машиночитаемая доверенность. Доверитель не совпадает с руководителем организации mchd_validate_principal=Ошибка проверки файлов. Некорректная машиночитаемая доверенность. Доверенность выдана не той организацией, под которой была осуществлена загрузка файлов.
av_file_infected=Ошибка проверки файлов. Файлы заражены вирусом av_file_infected=Ошибка проверки файлов. Файлы заражены вирусом
mchd_cant_parse=Ошибка проверки файлов. Некорректный формат машиночитаемой доверенности mchd_cant_parse=Ошибка проверки файлов. Некорректный формат машиночитаемой доверенности