diff --git a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java index 92ad10fd..9d8e3587 100644 --- a/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java +++ b/backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java @@ -5,10 +5,8 @@ import java.nio.charset.StandardCharsets; import java.sql.Timestamp; import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; -import java.util.List; import java.util.Locale; import java.util.Map; import java.util.UUID; @@ -552,7 +550,10 @@ public class EmployeeInfoFileUploadService { private void validateMchd(MultipartFile mchdFile, String ogrn, String snils) { String mchdGuid; try { - mchdGuid = getMchdGuid(mchdFile); + mchdGuid = validatePowerAndGetMchdGuid(mchdFile); + } + catch (LocalizedException e) { + throw e; } catch (Exception e) { throw new LocalizedException("mchd_cant_parse", MESSAGE_SOURCE); @@ -611,15 +612,23 @@ public class EmployeeInfoFileUploadService { return map; } - private String getMchdGuid(MultipartFile mchdFile) throws Exception { + private String validatePowerAndGetMchdGuid(MultipartFile mchdFile) throws Exception { Document doc = DocumentBuilderFactory .newInstance() .newDocumentBuilder() .parse(mchdFile.getInputStream()); doc.getDocumentElement().normalize(); - Node node = doc.getElementsByTagName("СвДов").item(0); - if (node != null && node.getAttributes().getNamedItem("НомДовер") != null) { - return node.getAttributes().getNamedItem("НомДовер").getNodeValue(); + Node nodePol = doc.getElementsByTagName("МашПолн").item(0); + if (nodePol == null || nodePol.getAttributes().getNamedItem("КодПолн") == null + || !nodePol.getAttributes() + .getNamedItem("КодПолн") + .getNodeValue() + .equals(esiaConfig.getEsiaMchdUploadAuthority())) { + throw new LocalizedException("mchd_no_sign_rights", MESSAGE_SOURCE); + } + Node nodeSvDov = doc.getElementsByTagName("СвДов").item(0); + if (nodeSvDov != null && nodeSvDov.getAttributes().getNamedItem("НомДовер") != null) { + return nodeSvDov.getAttributes().getNamedItem("НомДовер").getNodeValue(); } else { throw new FileUploadException("Cannot parse mchd guid"); diff --git a/backend/src/main/java/ru/micord/ervu/security/esia/config/EsiaConfig.java b/backend/src/main/java/ru/micord/ervu/security/esia/config/EsiaConfig.java index 4b0fbd52..7a5c9baa 100644 --- a/backend/src/main/java/ru/micord/ervu/security/esia/config/EsiaConfig.java +++ b/backend/src/main/java/ru/micord/ervu/security/esia/config/EsiaConfig.java @@ -77,6 +77,9 @@ public class EsiaConfig { @Value("${esia.system.scope: pow_reg, pow_reg_search}") private String esiaSystemScope; + @Value("${esia.mchd.upload.authority: GISERVU_LKUL_UPLOAD}") + private String esiaMchdUploadAuthority; + public String getEsiaOrgScopes() { String[] scopeItems = esiaOrgScopes.split(","); return String.join(" ", Arrays.stream(scopeItems).map(item -> orgScopeUrl + item.trim()).toArray(String[]::new)); @@ -161,4 +164,8 @@ public class EsiaConfig { String[] scopeItems = esiaSystemScope.split(","); return String.join(" ", Arrays.stream(scopeItems).map(String::trim).toArray(String[]::new)); } + + public String getEsiaMchdUploadAuthority() { + return esiaMchdUploadAuthority; + } } diff --git a/backend/src/main/java/ru/micord/ervu/util/DateUtils.java b/backend/src/main/java/ru/micord/ervu/util/DateUtils.java index 1a18127b..5147027a 100644 --- a/backend/src/main/java/ru/micord/ervu/util/DateUtils.java +++ b/backend/src/main/java/ru/micord/ervu/util/DateUtils.java @@ -67,7 +67,7 @@ public final class DateUtils { public static ZonedDateTime convertToZoneDateTime(String dateTime) { return hasText(dateTime) - ? ZonedDateTime.parse(dateTime, DATE_TIME_FORMATTER) + ? LocalDateTime.parse(dateTime, DATE_TIME_FORMATTER).atZone(ZoneOffset.UTC) : null; } diff --git a/backend/src/main/resources/messages/common_errors_messages.properties b/backend/src/main/resources/messages/common_errors_messages.properties index 59b110cf..10efca07 100644 --- a/backend/src/main/resources/messages/common_errors_messages.properties +++ b/backend/src/main/resources/messages/common_errors_messages.properties @@ -19,4 +19,5 @@ mchd_tree_expired=У одной из родительских доверенно mchd_validate_principal=Некорректная машиночитаемая доверенность. Доверенность выдана не той организацией, под которой была осуществлена загрузка файлов. av_file_infected=Файлы заражены вирусом mchd_cant_parse=Некорректный формат машиночитаемой доверенности -mchd_esia_error=Некорректная машиночитаемая доверенность. Доверенность не найдена. \ No newline at end of file +mchd_esia_error=Некорректная машиночитаемая доверенность. Доверенность не найдена. +mchd_no_sign_rights=В доверенности (МЧД) нет полномочия "Подписание сведений о воинском учете организации для загрузки в личный кабинет юридических лиц ГИС ЕРВУ" \ No newline at end of file diff --git a/backend/src/main/resources/messages/common_errors_messages_ru_RU.properties b/backend/src/main/resources/messages/common_errors_messages_ru_RU.properties index da376823..ca3b8cc6 100644 --- a/backend/src/main/resources/messages/common_errors_messages_ru_RU.properties +++ b/backend/src/main/resources/messages/common_errors_messages_ru_RU.properties @@ -19,4 +19,5 @@ mchd_tree_expired=У одной из родительских доверенно mchd_validate_principal=Некорректная машиночитаемая доверенность. Доверенность выдана не той организацией, под которой была осуществлена загрузка файлов. av_file_infected=Файлы заражены вирусом mchd_cant_parse=Некорректный формат машиночитаемой доверенности -mchd_esia_error=Некорректная машиночитаемая доверенность. Доверенность не найдена. \ No newline at end of file +mchd_esia_error=Некорректная машиночитаемая доверенность. Доверенность не найдена. +mchd_no_sign_rights=В доверенности (МЧД) нет полномочия "Подписание сведений о воинском учете организации для загрузки в личный кабинет юридических лиц ГИС ЕРВУ" \ No newline at end of file