Merge branch 'hotfix/1.9.11'

This commit is contained in:
Zaripov Emil 2025-04-01 13:19:22 +03:00
commit 866a648425
196 changed files with 1104 additions and 566 deletions

1
.gitignore vendored
View file

@ -67,3 +67,4 @@ npm-debug.log
*.sublime-workspace *.sublime-workspace
sync-backend.ps1 sync-backend.ps1
sync-frontend.ps1 sync-frontend.ps1
config/kafka_data

20
Dockerfile Normal file
View file

@ -0,0 +1,20 @@
#Dockerfile for TeamCity build "run in docker"
FROM repo.asd.center.cg:8082/alt/alt-tomcat:c10f1-9.0.59-20240917
USER root
COPY config/tomcat /
RUN cat /etc/tomcat/webbpm.properties >> /etc/tomcat/catalina.properties \
&& chown root:tomcat /var/lib/tomcat/webapps \
&& chmod g+rw /var/lib/tomcat/webapps
COPY frontend/target/frontend*.war /var/lib/tomcat/webapps/ROOT.war
COPY backend/target/*.war /var/lib/tomcat/webapps/
USER tomcat
EXPOSE 8080
ENTRYPOINT ["/entrypoint.sh"]

View file

@ -5,7 +5,7 @@
<parent> <parent>
<groupId>ru.micord.ervu.lkrp</groupId> <groupId>ru.micord.ervu.lkrp</groupId>
<artifactId>fl</artifactId> <artifactId>fl</artifactId>
<version>1.9.10</version> <version>1.9.11</version>
</parent> </parent>
<groupId>ru.micord.ervu.lkrp.fl</groupId> <groupId>ru.micord.ervu.lkrp.fl</groupId>
<artifactId>backend</artifactId> <artifactId>backend</artifactId>

View file

@ -21,6 +21,7 @@ import ru.micord.ervu.audit.constants.AuditConstants;
import ru.micord.ervu.audit.service.AuditService; import ru.micord.ervu.audit.service.AuditService;
import ru.micord.ervu.dto.ExtractEmptyRequestDto; import ru.micord.ervu.dto.ExtractEmptyRequestDto;
import ru.micord.ervu.dto.ExtractRequestDto; import ru.micord.ervu.dto.ExtractRequestDto;
import ru.micord.ervu.exception.ProtobufParsingException;
import ru.micord.ervu.kafka.dto.EmptyExtract; import ru.micord.ervu.kafka.dto.EmptyExtract;
import ru.micord.ervu.kafka.dto.Extract; import ru.micord.ervu.kafka.dto.Extract;
import ru.micord.ervu.kafka.dto.FullExtract; import ru.micord.ervu.kafka.dto.FullExtract;
@ -114,7 +115,7 @@ public class ExtractController {
auditService.processDownloadEvent(servletRequest, size, fileName, formatRegistry, auditService.processDownloadEvent(servletRequest, size, fileName, formatRegistry,
AuditConstants.FAILURE_STATUS AuditConstants.FAILURE_STATUS
); );
throw new RuntimeException("Failed to parse data", e); throw new ProtobufParsingException("Failed to parse data", e);
} }
} }
} }

View file

@ -0,0 +1,19 @@
package ru.micord.ervu.exception;
/**
* @author Adel Kalimullin
*/
public class ProtobufParsingException extends RuntimeException{
public ProtobufParsingException(String message) {
super(message);
}
public ProtobufParsingException(String message, Throwable cause) {
super(message, cause);
}
public ProtobufParsingException(Throwable cause) {
super(cause);
}
}

View file

@ -29,17 +29,17 @@ import java.util.UUID;
@EnableKafka @EnableKafka
public class ReplyingKafkaConfig { public class ReplyingKafkaConfig {
@Value("${ervu.kafka.bootstrap.servers}") @Value("${kafka.hosts}")
private String bootstrapServers; private String bootstrapServers;
@Value("${ervu.kafka.security.protocol}") @Value("${kafka.auth_sec_proto}")
private String securityProtocol; private String securityProtocol;
@Value("${ervu.kafka.doc.login.module}") @Value("${kafka.auth_sasl_module}")
private String loginModule; private String loginModule;
@Value("${ervu.kafka.username}") @Value("${kafka.user}")
private String username; private String username;
@Value("${ervu.kafka.password}") @Value("${kafka.pass}")
private String password; private String password;
@Value("${ervu.kafka.sasl.mechanism}") @Value("${kafka.auth_sasl_mech}")
private String saslMechanism; private String saslMechanism;
@Value("${ervu.kafka.reply.topic}") @Value("${ervu.kafka.reply.topic}")
@ -101,6 +101,7 @@ public class ReplyingKafkaConfig {
+ username + "\" password=\"" + password + "\";"); + username + "\" password=\"" + password + "\";");
configProps.put(SaslConfigs.SASL_MECHANISM, saslMechanism); configProps.put(SaslConfigs.SASL_MECHANISM, saslMechanism);
configProps.put(ConsumerConfig.GROUP_ID_CONFIG, groupId + "-" + UUID.randomUUID()); configProps.put(ConsumerConfig.GROUP_ID_CONFIG, groupId + "-" + UUID.randomUUID());
configProps.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
configProps.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); configProps.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
return configProps; return configProps;
} }

View file

@ -0,0 +1,19 @@
package ru.micord.ervu.kafka.exception;
/**
* @author Adel Kalimullin
*/
public class KafkaMessageException extends RuntimeException {
public KafkaMessageException(String message) {
super(message);
}
public KafkaMessageException(String message, Throwable cause) {
super(message, cause);
}
public KafkaMessageException(Throwable cause) {
super(cause);
}
}

View file

@ -10,6 +10,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.kafka.requestreply.ReplyingKafkaTemplate; import org.springframework.kafka.requestreply.ReplyingKafkaTemplate;
import org.springframework.kafka.requestreply.RequestReplyFuture; import org.springframework.kafka.requestreply.RequestReplyFuture;
import ru.micord.ervu.kafka.exception.KafkaMessageException;
import ru.micord.ervu.kafka.exception.KafkaMessageReplyTimeoutException; import ru.micord.ervu.kafka.exception.KafkaMessageReplyTimeoutException;
import ru.micord.ervu.kafka.service.ReplyingKafkaService; import ru.micord.ervu.kafka.service.ReplyingKafkaService;
@ -27,7 +28,7 @@ public abstract class BaseReplyingKafkaService<T, V> implements ReplyingKafkaSer
try { try {
ConsumerRecord<String, V> result = Optional.ofNullable(replyFuture.get()) ConsumerRecord<String, V> result = Optional.ofNullable(replyFuture.get())
.orElseThrow(() -> new RuntimeException("Kafka return result is null")); .orElseThrow(() -> new KafkaMessageException("Kafka return result is null"));
LOGGER.info("Thread {} - KafkaSendMessageAndGetReply: {} ms", LOGGER.info("Thread {} - KafkaSendMessageAndGetReply: {} ms",
Thread.currentThread().getId(), System.currentTimeMillis() - startTime); Thread.currentThread().getId(), System.currentTimeMillis() - startTime);
return result; return result;

View file

@ -17,23 +17,23 @@ import ru.micord.ervu.security.esia.model.ExpiringToken;
*/ */
public class EsiaAuthInfoStore { public class EsiaAuthInfoStore {
private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private static final Map<String, ExpiringToken> accessTokensMap = new ConcurrentHashMap<>(); private static final Map<String, ExpiringToken> ACCESS_TOKENS_MAP = new ConcurrentHashMap<>();
private static final Map<String, ExpiringToken> refreshTokensMap = new ConcurrentHashMap<>(); private static final Map<String, ExpiringToken> REFRESH_TOKENS_MAP = new ConcurrentHashMap<>();
private static final Map<String, List<ExpiringState>> prnsUuidStateMap = new ConcurrentHashMap<>(); private static final Map<String, List<ExpiringState>> PRNS_UUID_STATE_MAP = new ConcurrentHashMap<>();
public static void addAccessToken(String prnOid, String token, long expiresIn) { public static void addAccessToken(String prnOid, String token, long expiresIn) {
if (token != null) { if (token != null) {
long expiryTime = System.currentTimeMillis() + 1000L * expiresIn; long expiryTime = System.currentTimeMillis() + 1000L * expiresIn;
accessTokensMap.put(prnOid, new ExpiringToken(token, expiryTime)); ACCESS_TOKENS_MAP.put(prnOid, new ExpiringToken(token, expiryTime));
} }
} }
public static String getAccessToken(String prnOid) { public static String getAccessToken(String prnOid) {
return accessTokensMap.get(prnOid).getAccessToken(); return ACCESS_TOKENS_MAP.get(prnOid).getAccessToken();
} }
public static boolean validateAccessToken(String prnOid) { public static boolean validateAccessToken(String prnOid) {
ExpiringToken token = accessTokensMap.get(prnOid); ExpiringToken token = ACCESS_TOKENS_MAP.get(prnOid);
if (token == null || token.getAccessToken() == null) { if (token == null || token.getAccessToken() == null) {
LOGGER.error("No ESIA access token for prnOid: " + prnOid); LOGGER.error("No ESIA access token for prnOid: " + prnOid);
return false; return false;
@ -46,46 +46,46 @@ public class EsiaAuthInfoStore {
} }
public static void removeExpiredAccessToken() { public static void removeExpiredAccessToken() {
for (String key : accessTokensMap.keySet()) { for (String key : ACCESS_TOKENS_MAP.keySet()) {
ExpiringToken token = accessTokensMap.get(key); ExpiringToken token = ACCESS_TOKENS_MAP.get(key);
if (token != null && token.isExpired()) { if (token != null && token.isExpired()) {
accessTokensMap.remove(key); ACCESS_TOKENS_MAP.remove(key);
} }
} }
} }
public static void removeExpiredRefreshToken() { public static void removeExpiredRefreshToken() {
for (String key : refreshTokensMap.keySet()) { for (String key : REFRESH_TOKENS_MAP.keySet()) {
ExpiringToken token = refreshTokensMap.get(key); ExpiringToken token = REFRESH_TOKENS_MAP.get(key);
if (token != null && token.isExpired()) { if (token != null && token.isExpired()) {
refreshTokensMap.remove(key); REFRESH_TOKENS_MAP.remove(key);
} }
} }
} }
public static void removeAccessToken(String prnOid) { public static void removeAccessToken(String prnOid) {
accessTokensMap.remove(prnOid); ACCESS_TOKENS_MAP.remove(prnOid);
} }
public static void addRefreshToken(String prnOid, String token, long expiresIn) { public static void addRefreshToken(String prnOid, String token, long expiresIn) {
if (token != null) { if (token != null) {
long expiryTime = System.currentTimeMillis() + 1000L * expiresIn; long expiryTime = System.currentTimeMillis() + 1000L * expiresIn;
refreshTokensMap.put(prnOid, new ExpiringToken(token, expiryTime)); REFRESH_TOKENS_MAP.put(prnOid, new ExpiringToken(token, expiryTime));
} }
} }
public static String getRefreshToken(String prnOid) { public static String getRefreshToken(String prnOid) {
return refreshTokensMap.get(prnOid).getAccessToken(); return REFRESH_TOKENS_MAP.get(prnOid).getAccessToken();
} }
public static void removeRefreshToken(String prnOid) { public static void removeRefreshToken(String prnOid) {
refreshTokensMap.remove(prnOid); REFRESH_TOKENS_MAP.remove(prnOid);
} }
public static void addState(String prnsUUID, String state, long expiresIn, long attemptsCount) { public static void addState(String prnsUUID, String state, long expiresIn, long attemptsCount) {
long expiryTime = System.currentTimeMillis() + expiresIn * 1000L; long expiryTime = System.currentTimeMillis() + expiresIn * 1000L;
ExpiringState newState = new ExpiringState(state, expiryTime); ExpiringState newState = new ExpiringState(state, expiryTime);
prnsUuidStateMap.compute(prnsUUID, (key, states) -> { PRNS_UUID_STATE_MAP.compute(prnsUUID, (key, states) -> {
if (states == null) { if (states == null) {
states = new CopyOnWriteArrayList<>(); states = new CopyOnWriteArrayList<>();
} }
@ -98,7 +98,7 @@ public class EsiaAuthInfoStore {
} }
public static boolean containsState(String prnsUUID, String state) { public static boolean containsState(String prnsUUID, String state) {
List<ExpiringState> states = prnsUuidStateMap.get(prnsUUID); List<ExpiringState> states = PRNS_UUID_STATE_MAP.get(prnsUUID);
if (states == null) { if (states == null) {
return false; return false;
} }
@ -113,12 +113,12 @@ public class EsiaAuthInfoStore {
} }
public static void removeState(String prnsUUID) { public static void removeState(String prnsUUID) {
prnsUuidStateMap.remove(prnsUUID); PRNS_UUID_STATE_MAP.remove(prnsUUID);
} }
public static void removeExpiredState() { public static void removeExpiredState() {
for (String key : prnsUuidStateMap.keySet()) { for (String key : PRNS_UUID_STATE_MAP.keySet()) {
prnsUuidStateMap.computeIfPresent(key, (k, states) -> { PRNS_UUID_STATE_MAP.computeIfPresent(key, (k, states) -> {
states.removeIf(ExpiringState::isExpired); states.removeIf(ExpiringState::isExpired);
return states.isEmpty() ? null : states; return states.isEmpty() ? null : states;
}); });

View file

@ -25,9 +25,9 @@ public class EsiaAccessToken implements Serializable {
private String sid; private String sid;
@JsonProperty("urn:esia:sbj_id") @JsonProperty("urn:esia:sbj_id")
private String sbj_id; private String sbjId;
@JsonProperty("client_id")
private String client_id; private String clientId;
private Long iat; private Long iat;
@ -71,20 +71,20 @@ public class EsiaAccessToken implements Serializable {
this.sid = sid; this.sid = sid;
} }
public String getSbj_id() { public String getSbjId() {
return sbj_id; return sbjId;
} }
public void setSbj_id(String sbj_id) { public void setSbjId(String sbjId) {
this.sbj_id = sbj_id; this.sbjId = sbjId;
} }
public String getClient_id() { public String getClientId() {
return client_id; return clientId;
} }
public void setClient_id(String client_id) { public void setClientId(String clientId) {
this.client_id = client_id; this.clientId = clientId;
} }
public Long getIat() { public Long getIat() {

View file

@ -3,6 +3,7 @@ package ru.micord.ervu.security.esia.model;
import java.io.Serializable; import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
/** /**
* @author Eduard Tihomirov * @author Eduard Tihomirov
@ -12,44 +13,46 @@ public class EsiaTokenResponse implements Serializable {
private static final long serialVersionUID = 7655328287602576975L; private static final long serialVersionUID = 7655328287602576975L;
private String id_token; @JsonProperty("id_token")
private String tokenId;
private String access_token; @JsonProperty("access_token")
private String accessToken;
private String refresh_token; @JsonProperty("refresh_token")
private String refreshToken;
private String state; private String state;
@JsonProperty("token_type")
private String token_type; private String tokenType;
@JsonProperty("expires_in")
private Long expires_in; private Long expiresIn;
private String error; private String error;
private String error_description; @JsonProperty("error_description")
private String errorDescription;
public String getId_token() { public String getTokenId() {
return id_token; return tokenId;
} }
public void setId_token(String id_token) { public void setTokenId(String tokenId) {
this.id_token = id_token; this.tokenId = tokenId;
} }
public String getAccess_token() { public String getAccessToken() {
return access_token; return accessToken;
} }
public void setAccess_token(String access_token) { public void setAccessToken(String accessToken) {
this.access_token = access_token; this.accessToken = accessToken;
} }
public String getRefresh_token() { public String getRefreshToken() {
return refresh_token; return refreshToken;
} }
public void setRefresh_token(String refresh_token) { public void setRefreshToken(String refreshToken) {
this.refresh_token = refresh_token; this.refreshToken = refreshToken;
} }
public String getState() { public String getState() {
@ -60,20 +63,20 @@ public class EsiaTokenResponse implements Serializable {
this.state = state; this.state = state;
} }
public String getToken_type() { public String getTokenType() {
return token_type; return tokenType;
} }
public void setToken_type(String token_type) { public void setTokenType(String tokenType) {
this.token_type = token_type; this.tokenType = tokenType;
} }
public Long getExpires_in() { public Long getExpiresIn() {
return expires_in; return expiresIn;
} }
public void setExpires_in(Long expires_in) { public void setExpiresIn(Long expiresIn) {
this.expires_in = expires_in; this.expiresIn = expiresIn;
} }
public String getError() { public String getError() {
@ -84,11 +87,11 @@ public class EsiaTokenResponse implements Serializable {
this.error = error; this.error = error;
} }
public String getError_description() { public String getErrorDescription() {
return error_description; return errorDescription;
} }
public void setError_description(String error_description) { public void setErrorDescription(String errorDescription) {
this.error_description = error_description; this.errorDescription = errorDescription;
} }
} }

View file

@ -0,0 +1,32 @@
package ru.micord.ervu.security.esia.model;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
/**
* @author Eduard Tihomirov
*/
@JsonIgnoreProperties(ignoreUnknown = true)
public class SignResponse implements Serializable {
private static final long serialVersionUID = 1L;
private String signature;
private String state;
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}

View file

@ -34,6 +34,8 @@ import org.springframework.security.core.context.SecurityContext;
import ru.micord.ervu.audit.constants.AuditConstants; import ru.micord.ervu.audit.constants.AuditConstants;
import ru.micord.ervu.audit.service.AuditService; import ru.micord.ervu.audit.service.AuditService;
import org.springframework.web.util.WebUtils; import org.springframework.web.util.WebUtils;
import ru.micord.ervu.audit.constants.AuditConstants;
import ru.micord.ervu.audit.service.AuditService;
import ru.micord.ervu.kafka.model.Document; import ru.micord.ervu.kafka.model.Document;
import ru.micord.ervu.kafka.model.Person; import ru.micord.ervu.kafka.model.Person;
import ru.micord.ervu.kafka.model.Response; import ru.micord.ervu.kafka.model.Response;
@ -58,6 +60,9 @@ import ru.micord.ervu.security.webbpm.jwt.model.Token;
import ru.cg.webbpm.modules.core.runtime.api.MessageBundleUtils; import ru.cg.webbpm.modules.core.runtime.api.MessageBundleUtils;
import static ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil.getCurrentUserEsiaId;
import ru.cg.webbpm.modules.core.runtime.api.MessageBundleUtils;
/** /**
* @author Eduard Tihomirov * @author Eduard Tihomirov
*/ */
@ -233,23 +238,23 @@ public class EsiaAuthService {
if (tokenResponse == null || tokenResponse.getError() != null) { if (tokenResponse == null || tokenResponse.getError() != null) {
String errMsg = String errMsg =
tokenResponse != null ? tokenResponse.getError_description() : "response is empty"; tokenResponse != null ? tokenResponse.getErrorDescription() : "response is empty";
throw new IllegalStateException("Esia response error. " + errMsg); throw new IllegalStateException("Esia response error. " + errMsg);
} }
if (!tokenResponse.getState().equals(newState)) { if (!tokenResponse.getState().equals(newState)) {
throw new EsiaException("Token invalid. State from request not equals with state from response."); throw new EsiaException("Token invalid. State from request not equals with state from response.");
} }
esiaAccessTokenStr = tokenResponse.getAccess_token(); esiaAccessTokenStr = tokenResponse.getAccessToken();
startTime = System.currentTimeMillis(); startTime = System.currentTimeMillis();
String verifyResult = verifyToken(esiaAccessTokenStr); String verifyResult = verifyToken(esiaAccessTokenStr);
verifySecret = System.currentTimeMillis() - startTime; verifySecret = System.currentTimeMillis() - startTime;
if (verifyResult != null) { if (verifyResult != null) {
throw new EsiaException(verifyResult); throw new EsiaException(verifyResult);
} }
String esiaRefreshTokenStr = tokenResponse.getRefresh_token(); String esiaRefreshTokenStr = tokenResponse.getRefreshToken();
EsiaAccessToken esiaAccessToken = personalDataService.readToken(esiaAccessTokenStr); EsiaAccessToken esiaAccessToken = personalDataService.readToken(esiaAccessTokenStr);
prnOid = esiaAccessToken.getSbj_id(); prnOid = esiaAccessToken.getSbjId();
expiresIn = tokenResponse.getExpires_in(); expiresIn = tokenResponse.getExpiresIn();
EsiaAuthInfoStore.addAccessToken(prnOid, esiaAccessTokenStr, expiresIn); EsiaAuthInfoStore.addAccessToken(prnOid, esiaAccessTokenStr, expiresIn);
EsiaAuthInfoStore.addRefreshToken(prnOid, esiaRefreshTokenStr, expiresIn); EsiaAuthInfoStore.addRefreshToken(prnOid, esiaRefreshTokenStr, expiresIn);
} }
@ -329,26 +334,26 @@ public class EsiaAuthService {
EsiaTokenResponse tokenResponse = objectMapper.readValue(responseString, EsiaTokenResponse.class); EsiaTokenResponse tokenResponse = objectMapper.readValue(responseString, EsiaTokenResponse.class);
if (tokenResponse == null || tokenResponse.getError() != null) { if (tokenResponse == null || tokenResponse.getError() != null) {
String errMsg = String errMsg =
tokenResponse != null ? tokenResponse.getError_description() : "response is empty"; tokenResponse != null ? tokenResponse.getErrorDescription() : "response is empty";
throw new IllegalStateException("Esia response error. " + errMsg); throw new IllegalStateException("Esia response error. " + errMsg);
} }
if (!tokenResponse.getState().equals(state)) { if (!tokenResponse.getState().equals(state)) {
throw new EsiaException("Token invalid. State from request not equals with state from response."); throw new EsiaException("Token invalid. State from request not equals with state from response.");
} }
String esiaAccessTokenStr = tokenResponse.getAccess_token(); String esiaAccessTokenStr = tokenResponse.getAccessToken();
String verifyResult = verifyToken(esiaAccessTokenStr); String verifyResult = verifyToken(esiaAccessTokenStr);
if (verifyResult != null) { if (verifyResult != null) {
throw new EsiaException(verifyResult); throw new EsiaException(verifyResult);
} }
String esiaNewRefreshTokenStr = tokenResponse.getRefresh_token(); String esiaNewRefreshTokenStr = tokenResponse.getRefreshToken();
EsiaAccessToken esiaAccessToken = personalDataService.readToken(esiaAccessTokenStr); EsiaAccessToken esiaAccessToken = personalDataService.readToken(esiaAccessTokenStr);
String prnOid = esiaAccessToken.getSbj_id(); String prnOid = esiaAccessToken.getSbjId();
Long expiresIn = tokenResponse.getExpires_in(); Long expiresIn = tokenResponse.getExpiresIn();
EsiaAuthInfoStore.addAccessToken(prnOid, esiaAccessTokenStr, expiresIn); EsiaAuthInfoStore.addAccessToken(prnOid, esiaAccessTokenStr, expiresIn);
EsiaAuthInfoStore.addRefreshToken(prnOid, esiaNewRefreshTokenStr, expiresIn); EsiaAuthInfoStore.addRefreshToken(prnOid, esiaNewRefreshTokenStr, expiresIn);
PersonModel personModel = personalDataService.getPersonModel(esiaAccessTokenStr); PersonModel personModel = personalDataService.getPersonModel(esiaAccessTokenStr);
Response ervuIdResponse = getErvuIdResponse(personModel); Response ervuIdResponse = getErvuIdResponse(personModel);
createTokenAndAddCookie(response, esiaAccessToken.getSbj_id(), ervuIdResponse.getErvuId(), expiresIn); createTokenAndAddCookie(response, esiaAccessToken.getSbjId(), ervuIdResponse.getErvuId(), expiresIn);
} }
catch (Exception e) { catch (Exception e) {
throw new EsiaException(e); throw new EsiaException(e);
@ -469,8 +474,8 @@ public class EsiaAuthService {
if (!esiaHeader.getTyp().equals("JWT")) { if (!esiaHeader.getTyp().equals("JWT")) {
return "Token invalid. Token type: " + esiaHeader.getTyp() + " invalid"; return "Token invalid. Token type: " + esiaHeader.getTyp() + " invalid";
} }
if (!esiaAccessToken.getClient_id().equals(esiaConfig.getClientId())) { if (!esiaAccessToken.getClientId().equals(esiaConfig.getClientId())) {
return "Token invalid. Token clientId: " + esiaAccessToken.getClient_id() + " invalid"; return "Token invalid. Token clientId: " + esiaAccessToken.getClientId() + " invalid";
} }
if (!esiaAccessToken.getIss().equals(esiaConfig.getEsiaIssuerUrl())) { if (!esiaAccessToken.getIss().equals(esiaConfig.getEsiaIssuerUrl())) {
return "Token invalid. Token issuer:" + esiaAccessToken.getIss() + " invalid"; return "Token invalid. Token issuer:" + esiaAccessToken.getIss() + " invalid";

View file

@ -39,7 +39,7 @@ public class EsiaPersonalDataService implements PersonalDataService {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
try { try {
EsiaAccessToken esiaAccessToken = readToken(accessToken); EsiaAccessToken esiaAccessToken = readToken(accessToken);
String prnsId = esiaAccessToken.getSbj_id(); String prnsId = esiaAccessToken.getSbjId();
PersonModel personModel = getPersonData(prnsId, accessToken); PersonModel personModel = getPersonData(prnsId, accessToken);
personModel.setPassportModel( personModel.setPassportModel(
getPassportModel(prnsId, accessToken, personModel.getrIdDoc())); getPassportModel(prnsId, accessToken, personModel.getrIdDoc()));
@ -49,7 +49,7 @@ public class EsiaPersonalDataService implements PersonalDataService {
} }
catch (Exception e) { catch (Exception e) {
LOGGER.error("Thread {} - RequestPersonData: {} ms", Thread.currentThread().getId(), System.currentTimeMillis() - startTime); LOGGER.error("Thread {} - RequestPersonData: {} ms", Thread.currentThread().getId(), System.currentTimeMillis() - startTime);
throw new RuntimeException(e); throw new EsiaException(e);
} }
} }
@ -70,7 +70,7 @@ public class EsiaPersonalDataService implements PersonalDataService {
return objectMapper.readValue(getRespDoc.body(), PassportModel.class); return objectMapper.readValue(getRespDoc.body(), PassportModel.class);
} }
catch (Exception e) { catch (Exception e) {
throw new RuntimeException(e); throw new EsiaException(e);
} }
} }
@ -90,7 +90,7 @@ public class EsiaPersonalDataService implements PersonalDataService {
return objectMapper.readValue(getResp.body(), PersonModel.class); return objectMapper.readValue(getResp.body(), PersonModel.class);
} }
catch (Exception e) { catch (Exception e) {
throw new RuntimeException(e); throw new EsiaException(e);
} }
} }
@ -109,7 +109,7 @@ public class EsiaPersonalDataService implements PersonalDataService {
return esiaAccessToken; return esiaAccessToken;
} }
catch (Exception e) { catch (Exception e) {
throw new RuntimeException(e); throw new EsiaException(e);
} }
} }

View file

@ -0,0 +1,19 @@
package ru.micord.ervu.security.exception;
/**
* @author Adel Kalimullin
*/
public class UnauthorizedException extends RuntimeException{
public UnauthorizedException(String message) {
super(message);
}
public UnauthorizedException(String message, Throwable cause) {
super(message, cause);
}
public UnauthorizedException(Throwable cause) {
super(cause);
}
}

View file

@ -15,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import ru.micord.ervu.security.esia.EsiaAuthInfoStore; import ru.micord.ervu.security.esia.EsiaAuthInfoStore;
import ru.micord.ervu.security.exception.UnauthorizedException;
import ru.micord.ervu.security.webbpm.jwt.UserIdsPair; import ru.micord.ervu.security.webbpm.jwt.UserIdsPair;
import ru.micord.ervu.security.webbpm.jwt.model.Token; import ru.micord.ervu.security.webbpm.jwt.model.Token;
@ -33,13 +34,13 @@ public class JwtTokenService {
@Value("${webbpm.security.token.issuer:#{null}}") @Value("${webbpm.security.token.issuer:#{null}}")
private final String tokenIssuerName = private final String tokenIssuerName =
ResourceMetadataUtils.PROJECT_GROUP_ID + "." + ResourceMetadataUtils.PROJECT_ARTIFACT_ID; ResourceMetadataUtils.PROJECT_GROUP_ID + "." + ResourceMetadataUtils.PROJECT_ARTIFACT_ID;
private final SecretKey SIGNING_KEY; private final SecretKey signingKey;
@Autowired @Autowired
public JwtTokenService(@Value("${webbpm.security.token.secret.key:ZjE5ZjMxNmYtODViZC00ZTQ5LWIxZmYtOGEzYzE3Yjc1MDVk}") public JwtTokenService(@Value("${webbpm.security.token.secret.key:ZjE5ZjMxNmYtODViZC00ZTQ5LWIxZmYtOGEzYzE3Yjc1MDVk}")
String secretKey) { String secretKey) {
byte[] encodedKey = Base64.getDecoder().decode(secretKey); byte[] encodedKey = Base64.getDecoder().decode(secretKey);
this.SIGNING_KEY = Keys.hmacShaKeyFor(encodedKey); this.signingKey = Keys.hmacShaKeyFor(encodedKey);
} }
public Token createAccessToken(String userAccountId, Long expiresIn, String ervuId) { public Token createAccessToken(String userAccountId, Long expiresIn, String ervuId) {
@ -51,7 +52,7 @@ public class JwtTokenService {
.setIssuer(tokenIssuerName) .setIssuer(tokenIssuerName)
.setIssuedAt(new Date(System.currentTimeMillis())) .setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(expirationDate) .setExpiration(expirationDate)
.signWith(SIGNING_KEY) .signWith(signingKey)
.compact(); .compact();
return new Token(idsConcatenated, tokenIssuerName, expirationDate, value); return new Token(idsConcatenated, tokenIssuerName, expirationDate, value);
} }
@ -72,7 +73,7 @@ public class JwtTokenService {
public Token getToken(String token) { public Token getToken(String token) {
Claims claims = Jwts.parser() Claims claims = Jwts.parser()
.setSigningKey(SIGNING_KEY) .setSigningKey(signingKey)
.parseClaimsJws(token) .parseClaimsJws(token)
.getBody(); .getBody();
@ -95,7 +96,7 @@ public class JwtTokenService {
return esiaUserId; return esiaUserId;
} }
else { else {
throw new RuntimeException("Failed to get auth data. User unauthorized."); throw new UnauthorizedException("Failed to get auth data. User unauthorized.");
} }
} }
} }

View file

@ -1,2 +1,2 @@
kafka_reply_timeout=Превышено время ожидания ответа от сервера. Попробуйте повторить запрос позже или обратитесь к системному администратору kafka_reply_timeout=Превышено время ожидания ответа от сервера.
access_denied=Доступ запрещен. Пользователь должен быть включен в группу "Сотрудник, ответственный за военно-учетную работу" в ЕСИА access_denied=Доступ запрещен. Пользователь должен быть включен в группу "Сотрудник, ответственный за военно-учетную работу" в ЕСИА

View file

@ -1,2 +1,2 @@
kafka_reply_timeout=Превышено время ожидания ответа от сервера. Попробуйте повторить запрос позже или обратитесь к системному администратору kafka_reply_timeout=Превышено время ожидания ответа от сервера.
access_denied=Доступ запрещен. Пользователь должен быть включен в группу "Сотрудник, ответственный за военно-учетную работу" в ЕСИА access_denied=Доступ запрещен. Пользователь должен быть включен в группу "Сотрудник, ответственный за военно-учетную работу" в ЕСИА

View file

@ -769,12 +769,12 @@ JBPM использует 3 корневых категории логирова
- `ESIA_CLIENT_CERT_HASH` - параметр, содержащий хэш сертификата (fingerprint сертификата) системы-клиента в hexформате - `ESIA_CLIENT_CERT_HASH` - параметр, содержащий хэш сертификата (fingerprint сертификата) системы-клиента в hexформате
#### Конфигурация и топики Kafka #### Конфигурация и топики Kafka
- `ERVU_KAFKA_BOOTSTRAP_SERVERS` - список пар хост:порт, использующихся для установки первоначального соединения с кластером Kafka - `KAFKA_HOSTS` - список пар хост:порт, использующихся для установки первоначального соединения с кластером Kafka
- `ERVU_KAFKA_USERNAME` - пользователь для подключения к Kafka - `KAFKA_USER` - пользователь для подключения к Kafka
- `ERVU_KAFKA_PASSWORD` - пароль для подключения к Kafka - `KAFKA_PASS` - пароль для подключения к Kafka
- `ERVU_KAFKA_SASL_MECHANISM` - механизм SASL, используемый для клиентских подключений - `KAFKA_AUTH_SASL_MECH` - механизм SASL, используемый для клиентских подключений
- `ERVU_KAFKA_SECURITY_PROTOCOL` - протокол, используемый для взаимодействия с брокерами - `KAFKA_AUTH_SEC_PROTO` - протокол, используемый для взаимодействия с брокерами
- `ERVU_KAFKA_DOC_LOGIN_MODULE` - имя класса для входа в систему для SASL-соединений в формате, используемом конфигурационными файлами JAAS - `KAFKA_AUTH_SASL_MODULE` - имя класса для входа в систему для SASL-соединений в формате, используемом конфигурационными файлами JAAS
- `ERVU_KAFKA_GROUP_ID` - идентификатор группы потребителей, который отвечает за создание группы для объединения нескольких потребителей - `ERVU_KAFKA_GROUP_ID` - идентификатор группы потребителей, который отвечает за создание группы для объединения нескольких потребителей
- `ERVU_KAFKA_REPLY_TIMEOUT` - таймаут ожидания ответа - `ERVU_KAFKA_REPLY_TIMEOUT` - таймаут ожидания ответа
- `ERVU_KAFKA_REQUEST_TOPIC` - топик для отправки запроса на получение id пользователя в системе ЕРВУ - `ERVU_KAFKA_REQUEST_TOPIC` - топик для отправки запроса на получение id пользователя в системе ЕРВУ

View file

@ -1,6 +1,6 @@
ARG BUILDER_IMAGE=registry.altlinux.org/basealt/altsp:c10f1 ARG BUILDER_IMAGE=registry.altlinux.org/basealt/altsp:c10f1
ARG BACKEND_IMAGE=repo.micord.ru/alt/alt-tomcat:c10f1-9.0.59-20240903 ARG BACKEND_IMAGE=repo.micord.ru/alt/alt-tomcat:c10f1-9.0.59-20240903
ARG FRONTEND_IMAGE=nginx:1.24-alpine-slim ARG FRONTEND_IMAGE=nginx:1.26.2-alpine-slim
FROM $BUILDER_IMAGE AS builder FROM $BUILDER_IMAGE AS builder

View file

@ -1,5 +1,5 @@
ARG BUILDER_IMAGE=registry.altlinux.org/basealt/altsp:c10f1 ARG BUILDER_IMAGE=registry.altlinux.org/basealt/altsp:c10f1
ARG RUNTIME_IMAGE=nginx:1.24-alpine-slim ARG RUNTIME_IMAGE=nginx:1.26.2-alpine-slim
FROM $BUILDER_IMAGE AS builder FROM $BUILDER_IMAGE AS builder

View file

@ -0,0 +1,5 @@
JCSP_KEYSTORE_ALIAS=aef8d0e0-bcaa-4e07-8bbe-4953c6eea458
JCSP_KEYSTORE_PASS=1234567890
SF_OFFLINE_CRL_ENABLED=false
CRYPTO_OFFLINE_CRL_ENABLED=false

View file

@ -0,0 +1,19 @@
PG_HOST=10.10.31.119
PG_PORT=5432
PG_DATABASE=ervu_decision_document_local
PG_USER=ervu_decision_document
PG_PASSWORD=ervu_decision_document
KAFKA_HOSTS=local-kafka:9094
KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
KAFKA_AUTH_SEC_PROTO=PLAINTEXT
KAFKA_AUTH_SASL_MECH=PLAIN
KAFKA_USER=user2
KAFKA_PASS=Blfi9d2OFG
EXTERNAL_KAFKA_HOSTS=local-kafka:9094
EXTERNAL_KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
EXTERNAL_KAFKA_AUTH_SEC_PROTO=PLAINTEXT
EXTERNAL_KAFKA_AUTH_SASL_MECH=PLAIN
EXTERNAL_KAFKA_USER=user2
EXTERNAL_KAFKA_PASS=Blfi9d2OFG

View file

@ -0,0 +1,25 @@
PG_HOST=10.10.31.119
PG_PORT=5432
PG_DATABASE=ervu_extract_from_registry_provider
PG_USER=ervu_extract_from_registry_provider
PG_PASSWORD=ervu_extract_from_registry_provider
KAFKA_HOSTS=local-kafka:9094
KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
KAFKA_AUTH_SEC_PROTO=PLAINTEXT
KAFKA_AUTH_SASL_MECH=PLAIN
KAFKA_USER=user2
KAFKA_PASS=Blfi9d2OFG
EXTERNAL_KAFKA_HOSTS=local-kafka:9094
EXTERNAL_KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
EXTERNAL_KAFKA_AUTH_SEC_PROTO=PLAINTEXT
EXTERNAL_KAFKA_AUTH_SASL_MECH=PLAIN
EXTERNAL_KAFKA_USER=user2
EXTERNAL_KAFKA_PASS=Blfi9d2OFG
AWS_ENDPOINT=http://ervu-minio.k8s.micord.ru:31900
AWS_ACCESS_KEY_ID=rlTdTvkmSXu9FsLhfecw
AWS_SECRET_ACCESS_KEY=NUmY0wwRIEyAd98GCKd1cOgJWvLQYAcMMul5Ulu0
CRYPTO_GATEWAY_URL=http://crypto-gateway:8080

View file

@ -0,0 +1,19 @@
PG_HOST=10.10.31.119
PG_PORT=5432
PG_DATABASE=ervu_journal
PG_USER=ervu_journal
PG_PASSWORD=ervu_journal
KAFKA_HOSTS=local-kafka:9094
KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
KAFKA_AUTH_SEC_PROTO=PLAINTEXT
KAFKA_AUTH_SASL_MECH=PLAIN
KAFKA_USER=user2
KAFKA_PASS=Blfi9d2OFG
EXTERNAL_KAFKA_HOSTS=local-kafka:9094
EXTERNAL_KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
EXTERNAL_KAFKA_AUTH_SEC_PROTO=PLAINTEXT
EXTERNAL_KAFKA_AUTH_SASL_MECH=PLAIN
EXTERNAL_KAFKA_USER=user2
EXTERNAL_KAFKA_PASS=Blfi9d2OFG

View file

@ -0,0 +1,13 @@
KAFKA_HOSTS=local-kafka:9094
KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
KAFKA_AUTH_SEC_PROTO=PLAINTEXT
KAFKA_AUTH_SASL_MECH=PLAIN
KAFKA_USER=user2
KAFKA_PASS=Blfi9d2OFG
EXTERNAL_KAFKA_HOSTS=local-kafka:9094
EXTERNAL_KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
EXTERNAL_KAFKA_AUTH_SEC_PROTO=PLAINTEXT
EXTERNAL_KAFKA_AUTH_SASL_MECH=PLAIN
EXTERNAL_KAFKA_USER=user2
EXTERNAL_KAFKA_PASS=Blfi9d2OFG

View file

@ -0,0 +1,21 @@
PG_HOST=10.10.31.119
PG_PORT=5432
PG_DATABASE=ervu_journal
PG_USER=ervu_journal
PG_PASSWORD=ervu_journal
KAFKA_HOSTS=local-kafka:9094
KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
KAFKA_AUTH_SEC_PROTO=PLAINTEXT
KAFKA_AUTH_SASL_MECH=PLAIN
KAFKA_USER=user2
KAFKA_PASS=Blfi9d2OFG
EXTERNAL_KAFKA_HOSTS=local-kafka:9094
EXTERNAL_KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
EXTERNAL_KAFKA_AUTH_SEC_PROTO=PLAINTEXT
EXTERNAL_KAFKA_AUTH_SASL_MECH=PLAIN
EXTERNAL_KAFKA_USER=user2
EXTERNAL_KAFKA_PASS=Blfi9d2OFG
OBJECT_DIFF_CALC_URL=http://ervu-object-diff-calc:8080/

View file

@ -0,0 +1,23 @@
PG_HOST=10.10.31.119
PG_PORT=5432
PG_DATABASE=ervu_person_registry_local
PG_USER=ervu_person_registry
PG_PASSWORD=ervu_person_registry
KAFKA_HOSTS=local-kafka:9094
KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
KAFKA_AUTH_SEC_PROTO=PLAINTEXT
KAFKA_AUTH_SASL_MECH=PLAIN
KAFKA_USER=user2
KAFKA_PASS=Blfi9d2OFG
EXTERNAL_KAFKA_HOSTS=local-kafka:9094
EXTERNAL_KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
EXTERNAL_KAFKA_AUTH_SEC_PROTO=PLAINTEXT
EXTERNAL_KAFKA_AUTH_SASL_MECH=PLAIN
EXTERNAL_KAFKA_USER=user2
EXTERNAL_KAFKA_PASS=Blfi9d2OFG
AWS_ENDPOINT=http://ervu-minio.k8s.micord.ru:31900
AWS_ACCESS_KEY_ID=rlTdTvkmSXu9FsLhfecw
AWS_SECRET_ACCESS_KEY=NUmY0wwRIEyAd98GCKd1cOgJWvLQYAcMMul5Ulu0

View file

@ -0,0 +1,19 @@
PGHOST=10.10.31.119
PGPORT=5432
PGDATABASE=ervu_rp_summons_service
PGUSER=ervu_rp_summons_service
PGPASSWORD=ervu_rp_summons_service
KAFKA_HOSTS=local-kafka:9094
KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
KAFKA_AUTH_SEC_PROTO=PLAINTEXT
KAFKA_AUTH_SASL_MECH=PLAIN
KAFKA_USER=user2
KAFKA_PASS=Blfi9d2OFG
EXTERNAL_KAFKA_HOSTS=local-kafka:9094
EXTERNAL_KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
EXTERNAL_KAFKA_AUTH_SEC_PROTO=PLAINTEXT
EXTERNAL_KAFKA_AUTH_SASL_MECH=PLAIN
EXTERNAL_KAFKA_USER=user2
EXTERNAL_KAFKA_PASS=Blfi9d2OFG

View file

@ -0,0 +1,19 @@
PG_HOST=10.10.31.119
PG_PORT=5432
PG_DATABASE=ervu_subpoena_registry_local
PG_USER=ervu_subpoena_registry
PG_PASSWORD=ervu_subpoena_registry
KAFKA_HOSTS=local-kafka:9094
KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
KAFKA_AUTH_SEC_PROTO=PLAINTEXT
KAFKA_AUTH_SASL_MECH=PLAIN
KAFKA_USER=user2
KAFKA_PASS=Blfi9d2OFG
EXTERNAL_KAFKA_HOSTS=local-kafka:9094
EXTERNAL_KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
EXTERNAL_KAFKA_AUTH_SEC_PROTO=PLAINTEXT
EXTERNAL_KAFKA_AUTH_SASL_MECH=PLAIN
EXTERNAL_KAFKA_USER=user2
EXTERNAL_KAFKA_PASS=Blfi9d2OFG

2
config/kafdrop.env Normal file
View file

@ -0,0 +1,2 @@
KAFKA_BROKERCONNECT=local-kafka:9094
KAFKA_PROPERTIES=c2VjdXJpdHkucHJvdG9jb2w9UExBSU5URVhUDQpzYXNsLm1lY2hhbmlzbT1QTEFJTg0Kc2FzbC5qYWFzLmNvbmZpZz1vcmcuYXBhY2hlLmthZmthLmNvbW1vbi5zZWN1cml0eS5wbGFpbi5QbGFpbkxvZ2luTW9kdWxlIHJlcXVpcmVkIHVzZXJuYW1lPSd1c2VyMicgcGFzc3dvcmQ9J0JsZmk5ZDJPRkcnOw==

23
config/kafka.env Normal file
View file

@ -0,0 +1,23 @@
KAFKA_CFG_NODE_ID=0
KAFKA_CFG_PROCESS_ROLES=controller,broker
KAFKA_CFG_LISTENERS=CLIENT://:9092,INTERNAL://:9094,CONTROLLER://:9093
KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://local-kafka:9092,INTERNAL://local-kafka:9094,CONTROLLER://localhost:9093
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:SASL_PLAINTEXT,INTERNAL:PLAINTEXT,CONTROLLER:SASL_PLAINTEXT,
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@local-kafka:9093
KAFKA_KRAFT_BOOTSTRAP_SCRAM_USERS=true
# Controller
KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
#KAFKA_CONTROLLER_USER=controller_user
#KAFKA_CONTROLLER_PASSWORD=Blfi9d2OFG
KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL=PLAIN
# Client CLIENT
KAFKA_CLIENT_USERS=user2
KAFKA_CLIENT_PASSWORDS=Blfi9d2OFG
KAFKA_CLIENT_LISTENER_NAME=CLIENT
KAFKA_CFG_SASL_JAAS_CONFIG=org.apache.kafka.common.security.scram.ScramLoginModule required username="user2" password="Blfi9d2OFG";
# Client internal
KAFKA_INTER_BROKER_LISTENER_NAME=INTERNAL
KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL=PLAIN

3
config/kafka.properties Normal file
View file

@ -0,0 +1,3 @@
security.protocol=PLAINTEXT
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username='user2' password='Blfi9d2OFG';

View file

@ -17,11 +17,12 @@ ESIA_REDIRECT_URL=http://localhost:8080/
SIGN_URL=https://ervu-sign-dev.k8s.micord.ru/sign SIGN_URL=https://ervu-sign-dev.k8s.micord.ru/sign
SIGN_VERIFY_URL=https://ervu-sign-dev.k8s.micord.ru/verify SIGN_VERIFY_URL=https://ervu-sign-dev.k8s.micord.ru/verify
ERVU_KAFKA_BOOTSTRAP_SERVERS=local-kafka:9094 KAFKA_HOSTS=local-kafka:9094
ERVU_KAFKA_USERNAME=user2 KAFKA_USER=user2
ERVU_KAFKA_PASSWORD=Blfi9d2OFG KAFKA_PASS=Blfi9d2OFG
ERVU_KAFKA_SASL_MECHANISM=PLAIN KAFKA_AUTH_SASL_MECH=PLAIN
ERVU_KAFKA_SECURITY_PROTOCOL=PLAINTEXT KAFKA_AUTH_SEC_PROTO=PLAINTEXT
KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
ERVU_KAFKA_GROUP_ID=ervu-lkrp-fl-new ERVU_KAFKA_GROUP_ID=ervu-lkrp-fl-new
ERVU_KAFKA_REPLY_TOPIC=ervu.lkpr.person.search.response ERVU_KAFKA_REPLY_TOPIC=ervu.lkpr.person.search.response
ERVU_KAFKA_REQUEST_TOPIC=ervu.lkpr.person.search.request ERVU_KAFKA_REQUEST_TOPIC=ervu.lkpr.person.search.request
@ -33,7 +34,6 @@ ERVU_KAFKA_REGISTRY_EXTRACT_EMPTY_REQUEST_TOPIC=ervu.extract.empty.request
ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC=ervu.extract.info.request ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC=ervu.extract.info.request
ERVU_KAFKA_REGISTRY_EXTRACT_REPLY_TOPIC=ervu.extract.info.response ERVU_KAFKA_REGISTRY_EXTRACT_REPLY_TOPIC=ervu.extract.info.response
ERVU_KAFKA_EXTRACT_HEADER_CLASS=request@urn://rostelekom.ru/ERVU-extractFromRegistryTR/1.0.3 ERVU_KAFKA_EXTRACT_HEADER_CLASS=request@urn://rostelekom.ru/ERVU-extractFromRegistryTR/1.0.3
ERVU_KAFKA_DOC_LOGIN_MODULE=org.apache.kafka.common.security.plain.PlainLoginModule
ESIA_AUTH_INFO_CLEAR_CRON=0 0 */1 * * * ESIA_AUTH_INFO_CLEAR_CRON=0 0 */1 * * *
COOKIE_PATH=/fl COOKIE_PATH=/fl

View file

@ -1,26 +1,28 @@
TZ=Europe/Moscow TZ=Europe/Moscow
# App datasource # App datasource
DB_APP_USERNAME=ervu-lkrp-fl DB_APP_USERNAME=ervu_lkrp_fl
DB_APP_PASSWORD=ervu-lkrp-fl DB_APP_PASSWORD=ervu_lkrp_fl
DB_APP_HOST=10.10.31.119 DB_APP_HOST=10.10.31.119
DB_APP_PORT=5432 DB_APP_PORT=5432
DB_APP_NAME=ervu-lkrp-fl DB_APP_NAME=ervu_lkrp_fl
ESIA_SCOPES=snils, fullname, birthdate, id_doc ESIA_SCOPES=snils, fullname, birthdate, id_doc
ESIA_BASE_URI=https://esia-portal1.test.gosuslugi.ru/ ESIA_BASE_URI=https://esia-portal1.test.gosuslugi.ru/
ESIA_BASE_URI=https://esia-portal1.test.gosuslugi.ru/
ESIA_CLIENT_ID=MNSV89 ESIA_CLIENT_ID=MNSV89
ESIA_CLIENT_CERT_HASH=04508B4B0B58776A954A0E15F574B4E58799D74C61EE020B3330716C203E3BDD ESIA_CLIENT_CERT_HASH=04508B4B0B58776A954A0E15F574B4E58799D74C61EE020B3330716C203E3BDD
ESIA_REDIRECT_URL=https://lkrp-dev.micord.ru/fl/ ESIA_REDIRECT_URL=https://lkrp-dev.micord.ru/fl/
ESIA_LOGOUT_REDIRECT_URL=https://lkrp-dev.micord.ru/fl/home.html ESIA_LOGOUT_REDIRECT_URL=https://lkrp-dev.micord.ru/fl/home.html
SIGN_URL=https://ervu-sign-dev.k8s.micord.ru/sign SIGN_URL=https://ervu-sign-dev.k8s.micord.ru/sign
SIGN_VERIFY_URL=https://ervu-sign-dev.k8s.micord.ru/verify
ERVU_KAFKA_BOOTSTRAP_SERVERS=http://10.10.31.11:32609 KAFKA_HOSTS=http://10.10.31.11:32609
ERVU_KAFKA_USERNAME=user1 KAFKA_USER=user1
ERVU_KAFKA_PASSWORD=Blfi9d2OFG KAFKA_PASS=Blfi9d2OFG
ERVU_KAFKA_SASL_MECHANISM=SCRAM-SHA-256 KAFKA_AUTH_SASL_MECH=SCRAM-SHA-256
ERVU_KAFKA_SECURITY_PROTOCOL=SASL_PLAINTEXT KAFKA_AUTH_SEC_PROTO=SASL_PLAINTEXT
ERVU_KAFKA_GROUP_ID=1 ERVU_KAFKA_GROUP_ID=1
ERVU_KAFKA_REPLY_TOPIC=ervu.lkpr.person.search.response ERVU_KAFKA_REPLY_TOPIC=ervu.lkpr.person.search.response
ERVU_KAFKA_REQUEST_TOPIC=ervu.lkpr.person.search.request ERVU_KAFKA_REQUEST_TOPIC=ervu.lkpr.person.search.request
@ -32,7 +34,7 @@ ERVU_KAFKA_REGISTRY_EXTRACT_EMPTY_REQUEST_TOPIC=ervu.extract.empty.request
ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC=ervu.extract.info.request ERVU_KAFKA_REGISTRY_EXTRACT_REQUEST_TOPIC=ervu.extract.info.request
ERVU_KAFKA_REGISTRY_EXTRACT_REPLY_TOPIC=ervu.extract.info.response ERVU_KAFKA_REGISTRY_EXTRACT_REPLY_TOPIC=ervu.extract.info.response
ERVU_KAFKA_EXTRACT_HEADER_CLASS=request@urn://rostelekom.ru/ERVU-extractFromRegistryTR/1.0.3 ERVU_KAFKA_EXTRACT_HEADER_CLASS=request@urn://rostelekom.ru/ERVU-extractFromRegistryTR/1.0.3
ERVU_KAFKA_DOC_LOGIN_MODULE=org.apache.kafka.common.security.scram.ScramLoginModule KAFKA_AUTH_SASL_MODULE=org.apache.kafka.common.security.scram.ScramLoginModule
AUDIT_KAFKA_AUTHORIZATION_TOPIC=ervu.lkrp.auth.events AUDIT_KAFKA_AUTHORIZATION_TOPIC=ervu.lkrp.auth.events
AUDIT_KAFKA_ACTION_TOPIC=ervu.lkrp.action.events AUDIT_KAFKA_ACTION_TOPIC=ervu.lkrp.action.events
AUDIT_KAFKA_FILE_DOWNLOAD_TOPIC=ervu.lkrp.import.file AUDIT_KAFKA_FILE_DOWNLOAD_TOPIC=ervu.lkrp.import.file

15
config/printer.env Normal file
View file

@ -0,0 +1,15 @@
MICRONAUT_ENVIRONMENTS=local
MICRONAUT_SERVER_PORT=8080
MICRONAUT_SECURITY_ENABLED=false
KAFKA_BOOTSTRAP_SERVERS=local-kafka:9094
KAFKA_SASL_MECHANISM=PLAIN
KAFKA_SASL_JAAS_CONFIG=''
KAKFA_SECURITY_PROTOCOL=PLAINTEXT
S3_CLIENTS_DEFAULT_ENDPOINT=http://ervu-minio.k8s.micord.ru:31900
S3_CLIENTS_DEFAULT_ACCESS_KEY=rlTdTvkmSXu9FsLhfecw
S3_CLIENTS_DEFAULT_SECRET_KEY=NUmY0wwRIEyAd98GCKd1cOgJWvLQYAcMMul5Ulu0
S3_CLIENTS_DEFAULT_BUCKET=printer
REDIS_URI=redis://:@redis:6379
RTL_MONITORING_HEALTH_INDICATOR_LIBREOFFICE_ENABLED=false
TOKEN_MANAGER_ENABLED=false
LIBREOFFICE_PORT_NUMBERS=8101,8102,8103,8104,8105,8106,8107,8108

View file

@ -56,22 +56,23 @@
<property name="com.arjuna.ats.arjuna.allowMultipleLastResources" value="true"/> <property name="com.arjuna.ats.arjuna.allowMultipleLastResources" value="true"/>
<property name="esia.scopes" value="snils, fullname, birthdate, id_doc"/> <property name="esia.scopes" value="snils, fullname, birthdate, id_doc"/>
<property name="esia.base.uri" value="https://esia-portal1.test.gosuslugi.ru/"/> <property name="esia.base.uri" value="https://esia-portal1.test.gosuslugi.ru/"/>
<property name="esia.issuer.url" value="http://esia-portal1.test.gosuslugi.ru/"/>
<property name="esia.client.id" value="MNSV89"/> <property name="esia.client.id" value="MNSV89"/>
<property name="esia.redirect.url" value="https://lkrp.micord.ru"/> <property name="esia.redirect.url" value="https://lkrp.micord.ru"/>
<property name="sign.url" value="https://ervu-sign-dev.k8s.micord.ru/sign"/> <property name="sign.url" value="https://ervu-sign-dev.k8s.micord.ru/sign"/>
<property name="esia.client.cert.hash" value="04508B4B0B58776A954A0E15F574B4E58799D74C61EE020B3330716C203E3BDD"/> <property name="esia.client.cert.hash" value="04508B4B0B58776A954A0E15F574B4E58799D74C61EE020B3330716C203E3BDD"/>
<property name="bpmn.enable" value="false"/> <property name="bpmn.enable" value="false"/>
<property name="ervu.kafka.bootstrap.servers" value="localhost:9092"/> <property name="kafka.hosts" value="localhost:9092"/>
<property name="ervu.kafka.reply.topic" value="ervu.lkpr.person.search.response"/> <property name="ervu.kafka.reply.topic" value="ervu.lkpr.person.search.response"/>
<property name="ervu.kafka.group.id" value="1"/> <property name="ervu.kafka.group.id" value="1"/>
<property name="ervu.kafka.request.topic" value="ervu.lkpr.person.search.request"/> <property name="ervu.kafka.request.topic" value="ervu.lkpr.person.search.request"/>
<property name="ervu.kafka.reply.timeout" value="30"/> <property name="ervu.kafka.reply.timeout" value="30"/>
<property name="bpmn.enable" value="false"/> <property name="bpmn.enable" value="false"/>
<property name="ervu.kafka.security.protocol" value="SASL_PLAINTEXT"/> <property name="kafka.auth_sec_proto" value="SASL_PLAINTEXT"/>
<property name="ervu.kafka.doc.login.module" value="org.apache.kafka.common.security.scram.ScramLoginModule"/> <property name="kafka.auth_sasl_module" value="org.apache.kafka.common.security.scram.ScramLoginModule"/>
<property name="ervu.kafka.sasl.mechanism" value="SCRAM-SHA-256"/> <property name="kafka.auth_sasl_mech" value="SCRAM-SHA-256"/>
<property name="ervu.kafka.username" value="user1"/> <property name="kafka.user" value="user1"/>
<property name="ervu.kafka.password" value="Blfi9d2OFG"/> <property name="kafka.pass" value="Blfi9d2OFG"/>
<property name="ervu.kafka.recruit.request.topic" value="ervu.recruit.info.request"/> <property name="ervu.kafka.recruit.request.topic" value="ervu.recruit.info.request"/>
<property name="ervu.kafka.recruit.reply.topic" value="ervu.recruit.info.response"/> <property name="ervu.kafka.recruit.reply.topic" value="ervu.recruit.info.response"/>
<property name="ervu.kafka.recruit.header.class" value="Request@urn://rostelekom.ru/RP-SummonsTR/1.0.5"/> <property name="ervu.kafka.recruit.header.class" value="Request@urn://rostelekom.ru/RP-SummonsTR/1.0.5"/>
@ -80,6 +81,7 @@
<property name="ervu.kafka.registry.extract.reply.topic" value="ervu.extract.info.response"/> <property name="ervu.kafka.registry.extract.reply.topic" value="ervu.extract.info.response"/>
<property name="ervu.kafka.extract.header.class" value="request@urn://rostelekom.ru/ERVU-extractFromRegistryTR/1.0.3"/> <property name="ervu.kafka.extract.header.class" value="request@urn://rostelekom.ru/ERVU-extractFromRegistryTR/1.0.3"/>
<property name="esia.auth.info.clear.cron" value="0 0 */1 * * *"/> <property name="esia.auth.info.clear.cron" value="0 0 */1 * * *"/>
<property name="sign.verify.url" value="https://ervu-sign-dev.k8s.micord.ru/verify"/>
<property name="audit.kafka.bootstrap.servers" value="localhost:9092"/> <property name="audit.kafka.bootstrap.servers" value="localhost:9092"/>
<property name="audit.kafka.authorization.topic" value="ervu.lkrp.auth.events"/> <property name="audit.kafka.authorization.topic" value="ervu.lkrp.auth.events"/>
<property name="audit.kafka.file.download.topic" value="ervu.lkrp.import.file"/> <property name="audit.kafka.file.download.topic" value="ervu.lkrp.import.file"/>

View file

@ -1,39 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<!--
By default, no user is included in the "manager-gui" role required
to operate the "/manager/html" web application. If you wish to use this app,
you must define such a user - the username and password are arbitrary.
Built-in Tomcat manager roles:
- manager-gui - allows access to the HTML GUI and the status pages
- manager-script - allows access to the HTTP API and the status pages
- manager-jmx - allows access to the JMX proxy and the status pages
- manager-status - allows access to the status pages only
The users below are wrapped in a comment and are therefore ignored. If you
wish to configure one or more of these users for use with the manager web
application, do not forget to remove the <!.. ..> that surrounds them. You
will also need to set the passwords to something appropriate.
-->
<user username="admin" password="<must-be-changed>" roles="manager-gui"/>
</tomcat-users>

View file

@ -1,26 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<Context antiResourceLocking="false" privileged="true" >
<CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
sameSiteCookies="strict" />
<!--
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="d+\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

View file

@ -4,7 +4,7 @@
<parent> <parent>
<groupId>ru.micord.ervu.lkrp</groupId> <groupId>ru.micord.ervu.lkrp</groupId>
<artifactId>fl</artifactId> <artifactId>fl</artifactId>
<version>1.9.10</version> <version>1.9.11</version>
</parent> </parent>
<groupId>ru.micord.ervu.lkrp.fl</groupId> <groupId>ru.micord.ervu.lkrp.fl</groupId>

166
docker-compose.yaml Normal file
View file

@ -0,0 +1,166 @@
services:
local-kafka:
image: docker.io/bitnami/kafka:3.9.0
container_name: kafka-fl
ports:
- 9092:9092
- 9094:9094
volumes:
- ./config/kafka_data:/bitnami/kafka
env_file:
- config/kafka.env
healthcheck:
test: ["CMD", "kafka-topics.sh", "--list", "--bootstrap-server", "localhost:9094"]
interval: 30s
timeout: 10s
retries: 4
kafdrop:
container_name: kafdrop-fl
image: obsidiandynamics/kafdrop
restart: "no"
ports:
- 9000:9000
env_file:
config/kafdrop.env
depends_on:
local-kafka:
condition: service_healthy
redis:
image: redis/redis-stack:latest
container_name: redis
ports:
- 6379:6379
ervu-rp-summons-service:
image: registry-dev.pgs.rtlabs.ru/ervu/ervu-rp-summons-service:0.0.1-sha05ea36ab
container_name: rp-summons-service
env_file:
- config/ervu-rp-summons-service.env
depends_on:
local-kafka:
condition: service_healthy
ervu-person-registry:
container_name: person-registry
image: registry-dev.pgs.rtlabs.ru/ervu/ervu-person-registry:0.0.1-shad32a31f0
env_file:
- config/ervu-person-registry.env
depends_on:
local-kafka:
condition: service_healthy
crypto-gateway:
image: registry-dev.pgs.rtlabs.ru/ervu/crypto-gateway:0.0.1-shada76e6e7
container_name: crypto-gateway
ports:
- 8080
env_file:
config/crypto-gateway.env
printer:
image: registry-dev.pgs.rtlabs.ru/ervu/printer:0.0.1-shabd591b88
container_name: printer
depends_on:
redis:
condition: service_started
local-kafka:
condition: service_healthy
ports:
- 8080
- 5005
env_file:
- config/printer.env
ervu-object-diff-calc:
container_name: object-diff-calc
image: registry-dev.pgs.rtlabs.ru/ervu/ervu-object-diff-calc:0.0.1-sha4142b581
env_file:
- config/ervu-subpoena-registry.env
depends_on:
local-kafka:
condition: service_healthy
ports:
- 8080
ervu-extract-from-registry-provider:
container_name: extract-from-registry-provider
image: registry-dev.pgs.rtlabs.ru/ervu/ervu-extract-from-registry-provider:0.0.1-shaa6a2261f
env_file:
- config/ervu-extract-from-registry-provider.env
depends_on:
local-kafka:
condition: service_healthy
ervu-person-registry:
condition: service_started
ervu-subpoena-registry:
condition: service_started
ervu-decision-document-service:
condition: service_started
ervu-object-history-service:
condition: service_started
crypto-gateway:
condition: service_started
printer:
condition: service_started
ervu-object-diff-calc:
condition: service_started
ervu-subpoena-registry:
container_name: subpoena-registry
image: registry-dev.pgs.rtlabs.ru/ervu/ervu-subpoena-registry:0.0.1-shacb5d0dbb
env_file:
- config/ervu-subpoena-registry.env
depends_on:
local-kafka:
condition: service_healthy
ervu-decision-document-service:
container_name: decision-document-service
image: registry-dev.pgs.rtlabs.ru/ervu/ervu-decision-document-service:0.0.1-sha238f27f3
env_file:
- config/ervu-decision-document-service.env
depends_on:
local-kafka:
condition: service_healthy
# ervu-object-history-service uses database, created in this service
ervu-journal-service:
container_name: journal-service
image: registry-dev.pgs.rtlabs.ru/ervu/ervu-journal-service:0.0.1-sha74f87e3c
env_file:
- config/ervu-journal-service.env
depends_on:
local-kafka:
condition: service_healthy
ervu-object-history-service:
container_name: object-history-service
image: registry-dev.pgs.rtlabs.ru/ervu/ervu-object-history-service:0.0.1-shae5cd29cc
env_file:
- config/ervu-object-history-service.env
depends_on:
local-kafka:
condition: service_healthy
ervu-journal-service:
condition: service_started
lkrp-fl:
container_name: lkrp-fl
build:
context: .
dockerfile: Dockerfile
ports:
- 8080:8080
env_file:
- config/local.env
depends_on:
local-kafka:
condition: service_healthy
ervu-extract-from-registry-provider:
condition: service_started
ervu-person-registry:
condition: service_started
ervu-rp-summons-service:
condition: service_started

105
ervu_lkrp_fl-openapi.yaml Normal file
View file

@ -0,0 +1,105 @@
openapi: 3.0.3
info:
title: ervu-lkrp-fl API
description: API сервиса ervu-lkrp-fl
version: 1.9.1
servers:
- url: https://fl-lkrp-ervu-test.pgs.rtlabs.ru
paths:
/esia/auth:
get:
summary: Получение маркера доступа
operationId: esiaAuth
description: Получение маркера доступа в обмен на код от ЕСИА и создание внутреннего токена
parameters:
- name: code
in: query
required: true
description: Код, присланный ЕСИА после успешной авторизации
schema:
type: string
responses:
"200":
description: Authentication successful
/esia/person:
get:
summary: Получение информации о пользователе
operationId: getPersonModel
description: Получение информации о пользователе ЕСИА
responses:
"200":
description: OK
content:
application/json:
schema:
type: object
/esia/refresh:
post:
summary: Обновление токена
operationId: refreshToken
description: Обновление токена
responses:
"200":
description: OK
/esia/url:
get:
summary: Получение URL ЕСИА
operationId: getEsiaUrl
description: Получение URL ЕСИА
responses:
"200":
description: OK
content:
application/json:
schema:
type: string
/esia/userfullname:
get:
summary: Получение полного имени пользователя
operationId: getUserFullname
description: Получение полного имени пользователя ЕСИА
responses:
"200":
description: OK
content:
application/json:
schema:
type: string
/extract/{formatRegistry}:
get:
summary: Получение выписки
operationId: getExtract
description: Получение выписки из реестров повесток и воинского учета
parameters:
- name: formatRegistry
in: path
required: true
description: Формат выписки (1 - по воинскому учету; 2 - по повесткам)
schema:
type: string
responses:
"200":
description: OK
headers:
Content-Disposition:
schema:
type: string
example: attachment; filename*=UTF-8''encodedfilename.zip
content:
application/octet-stream:
schema:
type: object
"204":
description: No Content
/recruit:
get:
summary: Получение информации о повестке, временных мерах и воинскому учету
operationId: getData
description: Получение информации о повестке, временных мерах и воинскому учету
responses:
"200":
description: OK
content:
application/json:
schema:
type: object

View file

@ -1748,9 +1748,9 @@
} }
}, },
"@webbpm/base-package": { "@webbpm/base-package": {
"version": "3.187.4", "version": "3.192.4",
"resolved": "https://repo.micord.ru/repository/npm-all/@webbpm/base-package/-/base-package-3.187.4.tgz", "resolved": "https://repo.micord.ru/repository/npm-all/@webbpm/base-package/-/base-package-3.192.4.tgz",
"integrity": "sha512-2MrVersJ+No7/DMDxJPuBXGoy3NmLNPtTsa4Ua0kooZmR1er7w7YnrIUtkakEXrWSODt0ki7XB9w3f1RFVAGtg==", "integrity": "sha512-x2SFa7O/aUf4fyfiHrJMVuQZAMMOuQoqHuuVJiuBUI3nLTfUmdb+Pnqu+nCcKc+qahT6PYzzJ0t0Wub3bw/JGQ==",
"requires": { "requires": {
"tslib": "^1.9.0" "tslib": "^1.9.0"
} }

View file

@ -26,7 +26,7 @@
"@angular/platform-browser-dynamic": "7.2.15", "@angular/platform-browser-dynamic": "7.2.15",
"@angular/router": "7.2.15", "@angular/router": "7.2.15",
"@ng-bootstrap/ng-bootstrap": "4.2.2-micord.1", "@ng-bootstrap/ng-bootstrap": "4.2.2-micord.1",
"@webbpm/base-package": "3.187.4", "@webbpm/base-package": "3.192.4",
"ag-grid-angular": "29.0.0-micord.4", "ag-grid-angular": "29.0.0-micord.4",
"ag-grid-community": "29.0.0-micord.4", "ag-grid-community": "29.0.0-micord.4",
"angular-calendar": "0.28.28", "angular-calendar": "0.28.28",

View file

@ -4,7 +4,7 @@
<parent> <parent>
<groupId>ru.micord.ervu.lkrp</groupId> <groupId>ru.micord.ervu.lkrp</groupId>
<artifactId>fl</artifactId> <artifactId>fl</artifactId>
<version>1.9.10</version> <version>1.9.11</version>
</parent> </parent>
<groupId>ru.micord.ervu.lkrp.fl</groupId> <groupId>ru.micord.ervu.lkrp.fl</groupId>

View file

@ -7,6 +7,6 @@ export class EsiaErrorDetail {
}; };
public static getDescription(code: string): string { public static getDescription(code: string): string {
return this.errors[code] || 'Доступ запрещен. Обратитесь к системному администратору. Ошибка ' + code; return this.errors[code] || 'Система временно недоступна. Пожалуйста, повторите попытку позже. Ошибка ЕСИА ' + code;
} }
} }

View file

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>ru.cg.webbpm.packages.base</groupId> <groupId>ru.cg.webbpm.packages.base</groupId>
<artifactId>resources</artifactId> <artifactId>resources</artifactId>
<version>3.187.4</version> <version>3.192.4</version>
<organization> <organization>
<name>Micord</name> <name>Micord</name>
</organization> </organization>
@ -28,13 +28,13 @@
<jooq.version>3.19.3</jooq.version> <jooq.version>3.19.3</jooq.version>
<jupiter.version>5.10.2</jupiter.version> <jupiter.version>5.10.2</jupiter.version>
<enforcer.manageVersions>true</enforcer.manageVersions> <enforcer.manageVersions>true</enforcer.manageVersions>
<webbpm-platform.version>3.187.4</webbpm-platform.version> <webbpm-platform.version>3.192.4</webbpm-platform.version>
<h2.version>1.4.200</h2.version> <h2.version>1.4.200</h2.version>
<build.timestamp>0226064041</build.timestamp> <build.timestamp>0324074119</build.timestamp>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<junit.platform.version>1.10.0</junit.platform.version> <junit.platform.version>1.10.0</junit.platform.version>
<enforcer.manageExclusions>true</enforcer.manageExclusions> <enforcer.manageExclusions>true</enforcer.manageExclusions>
<revision>3.187.4</revision> <revision>3.192.4</revision>
<metadata.ts.filename>typescript.metadata.json</metadata.ts.filename> <metadata.ts.filename>typescript.metadata.json</metadata.ts.filename>
<package.repository.url>https://repo.micord.ru</package.repository.url> <package.repository.url>https://repo.micord.ru</package.repository.url>
<maven.build.timestamp.format>MMddHHmmss</maven.build.timestamp.format> <maven.build.timestamp.format>MMddHHmmss</maven.build.timestamp.format>
@ -47,19 +47,19 @@
<dependency> <dependency>
<groupId>ru.cg.webbpm.packages.base</groupId> <groupId>ru.cg.webbpm.packages.base</groupId>
<artifactId>converters</artifactId> <artifactId>converters</artifactId>
<version>3.187.4</version> <version>3.192.4</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ru.cg.webbpm.packages.base</groupId> <groupId>ru.cg.webbpm.packages.base</groupId>
<artifactId>backend</artifactId> <artifactId>backend</artifactId>
<version>3.187.4</version> <version>3.192.4</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>ru.cg.webbpm.packages.base</groupId> <groupId>ru.cg.webbpm.packages.base</groupId>
<artifactId>frontend</artifactId> <artifactId>frontend</artifactId>
<version>3.187.4</version> <version>3.192.4</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
</dependencies> </dependencies>

View file

@ -60,7 +60,7 @@
<ul> <ul>
<li>&#x41e;&#x431;&#x440;&#x430;&#x437;&#x435;&#x446; &#x432;&#x43d;&#x435;&#x448;&#x43d;&#x435;&#x439; &#x441;&#x441;&#x44b;&#x43b;&#x43a;&#x438;: <code>https://www.wildberries.ru/catalog/${sku}/detail.aspx</code></li> <li>&#x41e;&#x431;&#x440;&#x430;&#x437;&#x435;&#x446; &#x432;&#x43d;&#x435;&#x448;&#x43d;&#x435;&#x439; &#x441;&#x441;&#x44b;&#x43b;&#x43a;&#x438;: <code>https://www.wildberries.ru/catalog/${sku}/detail.aspx</code></li>
<li>&#x41e;&#x431;&#x440;&#x430;&#x437;&#x435;&#x446; &#x432;&#x43d;&#x443;&#x442;&#x440;&#x435;&#x43d;&#x43d;&#x435;&#x439; &#x441;&#x441;&#x44b;&#x43b;&#x43a;&#x438;: <code>products/ru.cg.webbpm.packages.base:resources:jar:3.187.4</code></li> <li>&#x41e;&#x431;&#x440;&#x430;&#x437;&#x435;&#x446; &#x432;&#x43d;&#x443;&#x442;&#x440;&#x435;&#x43d;&#x43d;&#x435;&#x439; &#x441;&#x441;&#x44b;&#x43b;&#x43a;&#x438;: <code>products/ru.cg.webbpm.packages.base:resources:jar:3.192.4</code></li>
</ul> </ul>
</li> </li>
<li> <li>

View file

@ -4,17 +4,17 @@
<description>Base webbpm package</description> <description>Base webbpm package</description>
<groupId>ru.cg.webbpm.packages.base</groupId> <groupId>ru.cg.webbpm.packages.base</groupId>
<artifactId>resources</artifactId> <artifactId>resources</artifactId>
<version>3.187.4</version> <version>3.192.4</version>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<backendModule> <backendModule>
<groupId>ru.cg.webbpm.packages.base</groupId> <groupId>ru.cg.webbpm.packages.base</groupId>
<artifactId>backend</artifactId> <artifactId>backend</artifactId>
<version>3.187.4</version> <version>3.192.4</version>
</backendModule> </backendModule>
<frontendModule> <frontendModule>
<packageName>@webbpm/base-package</packageName> <packageName>@webbpm/base-package</packageName>
<version>3.187.4</version> <version>3.192.4</version>
</frontendModule> </frontendModule>
</packageInfo> </packageInfo>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка.html</documentation> <documentation>component/buttons/Кнопка.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_отмены.html</documentation> <documentation>component/buttons/Кнопка_отмены.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_очистки_фильтра.html</documentation> <documentation>component/buttons/Кнопка_очистки_фильтра.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_удаления.html</documentation> <documentation>component/buttons/Кнопка_удаления.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопкаагрузки.html</documentation> <documentation>component/buttons/Кнопкаагрузки.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_вызова_ошибки.html</documentation> <documentation>component/buttons/Кнопка_вызова_ошибки.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<documentation>component/buttons/Кнопка_выполнения_бизнес-процесса.html</documentation> <documentation>component/buttons/Кнопка_выполнения_бизнес-процесса.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_выполнения_SQL.html</documentation> <documentation>component/buttons/Кнопка_выполнения_SQL.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_для_фильтрации.html</documentation> <documentation>component/buttons/Кнопка_для_фильтрации.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопкаавигации.html</documentation> <documentation>component/buttons/Кнопкаавигации.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_сохранения.html</documentation> <documentation>component/buttons/Кнопка_сохранения.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_выбора.html</documentation> <documentation>component/buttons/Кнопка_выбора.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопка_подписи.html</documentation> <documentation>component/buttons/Кнопка_подписи.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/Кнопкаапуска_бизнес-процесса.html</documentation> <documentation>component/buttons/Кнопкаапуска_бизнес-процесса.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/reporting/Кнопка_печати_из_графа_сущности.html</documentation> <documentation>component/buttons/reporting/Кнопка_печати_из_графа_сущности.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/buttons/reporting/Кнопка_печати_отчета_из_формы.html</documentation> <documentation>component/buttons/reporting/Кнопка_печати_отчета_из_формы.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Сворачиваемая_панель.html</documentation> <documentation>component/containers/Сворачиваемая_панель.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Диалог.html</documentation> <documentation>component/containers/Диалог.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Контейнер_с_кнопками.html</documentation> <documentation>component/containers/Контейнер_с_кнопками.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Группа_полей.html</documentation> <documentation>component/containers/Группа_полей.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Набор_фильтров.html</documentation> <documentation>component/containers/Набор_фильтров.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Форма.html</documentation> <documentation>component/containers/Форма.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Горизонтальный_контейнер.html</documentation> <documentation>component/containers/Горизонтальный_контейнер.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Контейнер_вкладок.html</documentation> <documentation>component/containers/Контейнер_вкладок.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Вкладка.html</documentation> <documentation>component/containers/Вкладка.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Вертикальный_контейнер.html</documentation> <documentation>component/containers/Вертикальный_контейнер.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/containers/Окно.html</documentation> <documentation>component/containers/Окно.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/editable-grids/EditableGrid.html</documentation> <documentation>component/editable-grids/EditableGrid.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/autocomplete</localization> <localization>META-INF/components/localization/editable-grids/autocomplete</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/check-box</localization> <localization>META-INF/components/localization/editable-grids/check-box</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/combo-box</localization> <localization>META-INF/components/localization/editable-grids/combo-box</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/date-time-picker</localization> <localization>META-INF/components/localization/editable-grids/date-time-picker</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/money-field</localization> <localization>META-INF/components/localization/editable-grids/money-field</localization>
<internal>true</internal> <internal>true</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/number-field</localization> <localization>META-INF/components/localization/editable-grids/number-field</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/one-to-many</localization> <localization>META-INF/components/localization/editable-grids/one-to-many</localization>
<internal>true</internal> <internal>true</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/one-to-many</localization> <localization>META-INF/components/localization/editable-grids/one-to-many</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -6,11 +6,11 @@
<localization>META-INF/components/localization/editable-grids/read-only</localization> <localization>META-INF/components/localization/editable-grids/read-only</localization>
<internal>true</internal> <internal>true</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -5,11 +5,11 @@
<category>editable-grids</category> <category>editable-grids</category>
<internal>true</internal> <internal>true</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>Статичный_выпадающий_список_колонки_таблицы.html</documentation> <documentation>Статичный_выпадающий_список_колонки_таблицы.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/text-area</localization> <localization>META-INF/components/localization/editable-grids/text-area</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/text-field</localization> <localization>META-INF/components/localization/editable-grids/text-field</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -7,11 +7,11 @@
<localization>META-INF/components/localization/editable-grids/time-picker</localization> <localization>META-INF/components/localization/editable-grids/time-picker</localization>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/ФИАС.html</documentation> <documentation>component/fields/ФИАС.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Поле_ввода_с_подбором_значения.html</documentation> <documentation>component/fields/Поле_ввода_с_подбором_значения.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Флаг.html</documentation> <documentation>component/fields/Флаг.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Выпадающий_список.html</documentation> <documentation>component/fields/Выпадающий_список.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Дата.html</documentation> <documentation>component/fields/Дата.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/EditableOneToMany.html</documentation> <documentation>component/fields/EditableOneToMany.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Файл.html</documentation> <documentation>component/fields/Файл.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Файл.html</documentation> <documentation>component/fields/Файл.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/ManyToMany.html</documentation> <documentation>component/fields/ManyToMany.html</documentation>
<internal>false</internal> <internal>false</internal>
<versions> <versions>
<studioVersion>3.187.4</studioVersion> <studioVersion>3.192.4</studioVersion>
<packageVersions> <packageVersions>
<entry> <entry>
<key>ru.cg.webbpm.packages.base.resources</key> <key>ru.cg.webbpm.packages.base.resources</key>
<value>3.187.4</value> <value>3.192.4</value>
</entry> </entry>
</packageVersions> </packageVersions>
</versions> </versions>

Some files were not shown because too many files have changed in this diff Show more