Merge branch 'hotfix/1.9.5' into develop

# Conflicts:
#	backend/pom.xml
#	backend/src/main/java/ervu/controller/EmployeeInfoFileUploadController.java
#	backend/src/main/java/ervu/service/fileupload/EmployeeInfoFileUploadService.java
#	backend/src/main/java/ru/micord/ervu/security/esia/service/EsiaAuthService.java
#	backend/src/main/java/ru/micord/ervu/security/webbpm/jwt/util/SecurityUtil.java
#	config/nginx.conf
#	distribution/pom.xml
#	frontend/pom.xml
#	pom.xml
#	resources/pom.xml
This commit is contained in:
kochetkov 2025-01-15 13:31:11 +03:00
commit fe42948496
140 changed files with 676 additions and 354 deletions

View file

@ -97,6 +97,14 @@
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
</dependency>
<dependency>
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>
</dependency>
<dependency>
<groupId>ru.cg.webbpm.modules</groupId>
<artifactId>inject</artifactId>
@ -190,6 +198,10 @@
<groupId>com.github.lookfirst</groupId>
<artifactId>sardine</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.parent.artifactId}</finalName>

View file

@ -25,18 +25,16 @@ public class EmployeeInfoFileUploadController {
}
@RequestMapping(value = "/employee/document", method = RequestMethod.POST)
public ResponseEntity<?> saveEmployeeInformationFile(@RequestParam("file") MultipartFile multipartFile,
public ResponseEntity<?> saveEmployeeInformationFile(
@RequestParam("file") MultipartFile multipartFile,
@RequestHeader("X-Employee-Info-File-Form-Type") String formType,
@RequestHeader("Client-Time-Zone") String clientTimeZone) {
String userAccountId = SecurityUtil.getUserAccountId();
if (userAccountId != null) {
String offset = ZonedDateTime.now(TimeZone.getTimeZone(clientTimeZone).toZoneId())
.getOffset().getId();
String offset = ZonedDateTime.now(TimeZone.getTimeZone(clientTimeZone).toZoneId())
.getOffset().getId();
if (this.fileUploadService.saveEmployeeInformationFile(multipartFile, formType, userAccountId, offset)) {
return ResponseEntity.ok("File successfully uploaded.");
}
if (this.fileUploadService.saveEmployeeInformationFile(multipartFile, formType, offset)) {
return ResponseEntity.ok("File successfully uploaded.");
}
return ResponseEntity.internalServerError().body("An error occurred while uploading file.");

View file

@ -1,10 +1,12 @@
package ervu.service.fileupload;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Locale;
import java.util.UUID;
import com.fasterxml.jackson.core.JsonProcessingException;
@ -16,6 +18,11 @@ import ervu.model.fileupload.EmployeeInfoKafkaMessage;
import ervu.model.fileupload.FileInfo;
import ervu.model.fileupload.FileStatus;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.tika.Tika;
import org.apache.tika.mime.MediaType;
import org.apache.tika.mime.MimeType;
import org.apache.tika.mime.MimeTypeException;
import org.apache.tika.mime.MimeTypes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
@ -24,14 +31,19 @@ import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import ru.micord.ervu.security.esia.token.EsiaTokensStore;
import ru.micord.ervu.exception.JsonParsingException;
import ru.micord.ervu.security.esia.model.EmployeeModel;
import ru.micord.ervu.security.esia.model.PersonModel;
import ru.micord.ervu.security.esia.service.UlDataService;
import ru.micord.ervu.security.esia.token.EsiaTokensStore;
import ru.micord.ervu.security.webbpm.jwt.UserIdsPair;
import ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil;
import ru.micord.ervu.service.InteractionService;
import static ervu.enums.FileStatusCode.*;
import static ervu.enums.FileStatusCode.FILE_CLEAN;
import static ervu.enums.FileStatusCode.FILE_INFECTED;
import static ervu.enums.FileStatusCode.FILE_NOT_CHECKED;
import static ervu.enums.FileStatusCode.FILE_UPLOADED;
import static ru.micord.ervu.util.StringUtils.convertToFio;
/**
@ -65,14 +77,19 @@ public class EmployeeInfoFileUploadService {
}
public boolean saveEmployeeInformationFile(MultipartFile multipartFile, String formType,
String userAccountId, String offset) {
String offset) {
if (!isValid(multipartFile)) {
return false;
}
String fileId = UUID.randomUUID().toString();
String fileName = multipartFile.getOriginalFilename();
EmployeeInfoFileFormType employeeInfoFileFormType = EmployeeInfoFileFormType.valueOf(formType);
String[] ids = userAccountId.split(":");
String userId = ids[0];
String ervuId = ids[1];
String accessToken = EsiaTokensStore.getAccessToken(userId);
EmployeeInfoFileFormType employeeInfoFileFormType = EmployeeInfoFileFormType.valueOf(
formType);
UserIdsPair userIdsPair = SecurityUtil.getUserIdsPair();
String esiaUserId = userIdsPair.getEsiaUserId();
String ervuId = userIdsPair.getErvuId();
String accessToken = EsiaTokensStore.getAccessToken(esiaUserId);
EmployeeModel employeeModel = ulDataService.getEmployeeModel(accessToken);
PersonModel personModel = employeeModel.getPerson();
@ -100,9 +117,16 @@ public class EmployeeInfoFileUploadService {
offset,
fileStatus,
ervuId,
userId,
esiaUserId,
personModel
)
)
);
interactionService.setStatus(fileId, fileStatus.getStatus(), fileName,
employeeInfoFileFormType.getFilePatternCode(), Timestamp.valueOf(now),
convertToFio(personModel.getFirstName(), personModel.getMiddleName(),
personModel.getLastName()
),
ervuId
);
return sendMessage(jsonMessage);
}
@ -112,9 +136,43 @@ public class EmployeeInfoFileUploadService {
}
}
private boolean isValid(MultipartFile multipartFile) {
if (multipartFile == null || multipartFile.getOriginalFilename() == null) {
return false;
}
String fileName = multipartFile.getOriginalFilename();
try {
String contentType = new Tika().detect(multipartFile.getBytes());
MimeTypes defaultMimeTypes = MimeTypes.getDefaultMimeTypes();
MimeType mimeType = defaultMimeTypes.forName(contentType);
boolean isCsv = mimeType.getType().equals(MediaType.TEXT_PLAIN)
&& fileName.toLowerCase(Locale.getDefault()).endsWith(".csv");
if (!isCsv) {
LOGGER.info("Trying to upload file={} with wrong mime type={}",
fileName, mimeType
);
}
return isCsv;
}
catch (MimeTypeException e) {
LOGGER.error(
"Couldn't get mime type from bytes for file=" + fileName, e);
return false;
}
catch (IOException e) {
LOGGER.error("Error while checking file type, file=" + fileName,
e
);
return false;
}
}
private boolean sendMessage(String message) {
ProducerRecord<String, String> record = new ProducerRecord<>(this.kafkaTopicName, message);
record.headers().add("messageId", UUID.randomUUID().toString().getBytes(StandardCharsets.UTF_8));
record.headers()
.add("messageId", UUID.randomUUID().toString().getBytes(StandardCharsets.UTF_8));
try {
this.kafkaTemplate.send(record).get();

View file

@ -0,0 +1,30 @@
package ru.micord.ervu.security;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
public class AccessDeniedHandlerImpl implements AccessDeniedHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(
MethodHandles.lookup().lookupClass());
@Override
public void handle(HttpServletRequest request, HttpServletResponse response,
AccessDeniedException accessDeniedException) throws IOException {
if (response.isCommitted()) {
LOGGER.trace("Did not write to response since already committed");
return;
}
response.setStatus(HttpStatus.FORBIDDEN.value());
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write("\"" + HttpStatus.FORBIDDEN.getReasonPhrase() + "\"");
}
}

View file

@ -9,7 +9,6 @@ import org.springframework.security.config.annotation.authentication.configurati
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutFilter;
@ -25,7 +24,6 @@ import ru.micord.ervu.security.webbpm.jwt.JwtMatcher;
import ru.micord.ervu.security.webbpm.jwt.UnauthorizedEntryPoint;
import ru.micord.ervu.security.webbpm.jwt.filter.JwtAuthenticationFilter;
import ru.micord.ervu.security.webbpm.jwt.helper.SecurityHelper;
import ru.micord.ervu.security.webbpm.jwt.service.JwtTokenService;
import static ru.micord.ervu.security.SecurityConstants.ESIA_LOGOUT;
@ -33,7 +31,7 @@ import static ru.micord.ervu.security.SecurityConstants.ESIA_LOGOUT;
@EnableWebSecurity
public class SecurityConfig {
private static final String[] PERMIT_ALL = new String[] {
"/version", "/esia/url", "/esia/auth", "esia/refresh"
"/version", "/esia/url", "/esia/auth", "esia/refresh", "/esia/logout",
};
@Autowired
private JwtAuthenticationFilter jwtAuthenticationFilter;
@ -51,7 +49,8 @@ public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http,
CookieCsrfTokenRepository tokenRepository)
CookieCsrfTokenRepository tokenRepository,
UnauthorizedEntryPoint entryPoint)
throws Exception {
XorCsrfTokenRequestAttributeHandler delegate = new XorCsrfTokenRequestAttributeHandler();
delegate.setCsrfRequestAttributeName(null);
@ -69,7 +68,8 @@ public class SecurityConfig {
.logout((logout) -> logout.logoutUrl(ESIA_LOGOUT)
.logoutSuccessHandler(new LogoutSuccessHandler(tokenRepository, esiaAuthService)))
.exceptionHandling()
.authenticationEntryPoint(entryPoint())
.authenticationEntryPoint(entryPoint)
.accessDeniedHandler(new AccessDeniedHandlerImpl())
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
@ -88,8 +88,9 @@ public class SecurityConfig {
return tokenRepository;
}
public AuthenticationEntryPoint entryPoint() {
return new UnauthorizedEntryPoint();
@Bean
public UnauthorizedEntryPoint entryPoint(SecurityHelper securityHelper) {
return new UnauthorizedEntryPoint(securityHelper);
}
@Bean
@ -105,9 +106,10 @@ public class SecurityConfig {
@Bean
public JwtAuthenticationFilter jwtAuthenticationFilter(SecurityHelper securityHelper,
AuthenticationManager manager) {
AuthenticationManager manager,
UnauthorizedEntryPoint entryPoint) {
JwtAuthenticationFilter jwtAuthenticationFilter = new JwtAuthenticationFilter(
new JwtMatcher("/**", PERMIT_ALL), entryPoint(), securityHelper);
new JwtMatcher("/**", PERMIT_ALL), entryPoint, securityHelper);
jwtAuthenticationFilter.setAuthenticationManager(manager);
return jwtAuthenticationFilter;
}

View file

@ -1,6 +1,5 @@
package ru.micord.ervu.security.esia.service;
import java.io.UnsupportedEncodingException;
import java.lang.invoke.MethodHandles;
import java.net.URI;
import java.net.URL;
@ -22,9 +21,9 @@ import javax.servlet.http.HttpServletResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import ervu.service.okopf.OkopfService;
import org.springframework.security.authentication.AuthenticationManager;
import ru.micord.ervu.security.esia.token.EsiaTokensStore;
import ru.micord.ervu.security.esia.exception.EsiaException;
import ru.micord.ervu.security.esia.model.EsiaHeader;
import ru.micord.ervu.security.esia.token.EsiaTokensStore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
@ -45,7 +44,6 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import ru.micord.ervu.security.esia.model.EmployeeModel;
import ru.micord.ervu.security.esia.model.EsiaAccessToken;
import ru.micord.ervu.security.esia.model.EsiaHeader;
import ru.micord.ervu.security.esia.model.EsiaTokenResponse;
import ru.micord.ervu.security.esia.model.FormUrlencoded;
import ru.micord.ervu.security.esia.model.OrganizationModel;
@ -62,7 +60,6 @@ import static ru.micord.ervu.security.webbpm.jwt.util.SecurityUtil.getCurrentUse
@Service
public class EsiaAuthService {
private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private static final Long EXPIRES_IN = 3600L;
@Autowired
private ObjectMapper objectMapper;
@Autowired
@ -77,9 +74,6 @@ public class EsiaAuthService {
private OkopfService okopfService;
@Autowired
private SecurityHelper securityHelper;
@Autowired
private AuthenticationManager authenticationManager;
@Value("${ervu.kafka.org.reply.topic}")
private String requestReplyTopic;
@ -145,12 +139,8 @@ public class EsiaAuthService {
}
private static String urlEncode(String s) {
try {
return URLEncoder.encode(s, "UTF-8")
.replace("+", "%20");
} catch (UnsupportedEncodingException e) {
throw new EsiaException(e);
}
return URLEncoder.encode(s, StandardCharsets.UTF_8)
.replace("+", "%20");
}
private static String buildUrl(URL url, Map<String, String> params) {
@ -165,14 +155,17 @@ public class EsiaAuthService {
public ResponseEntity<?> getEsiaTokensByCode(String esiaAuthCode, String error,
HttpServletRequest request, HttpServletResponse response) {
if (error != null && !error.equals("null")) {
return new ResponseEntity<>(
"Произошла неизвестная ошибка. Обратитесь к системному администратору",
HttpStatus.FORBIDDEN
);
}
String esiaAccessTokenStr = null;
String prnOid = null;
Long expiresIn = null;
boolean hasRole = false;
try {
if (error != null && !error.equals("null")) {
createTokenAndAddCookie(response, null, null, false, EXPIRES_IN);
return new ResponseEntity<>(
"Произошла неизвестная ошибка. Обратитесь к системному администратору",
HttpStatus.FORBIDDEN
);
}
String clientId = esiaConfig.getClientId();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss xx");
ZonedDateTime dt = ZonedDateTime.now();
@ -220,27 +213,30 @@ public class EsiaAuthService {
EsiaTokenResponse.class
);
if (tokenResponse == null) {
throw new IllegalStateException("Got empty esia response");
if (tokenResponse == null || tokenResponse.getError() != null) {
String errMsg =
tokenResponse != null ? tokenResponse.getErrorDescription() : "response is empty";
throw new IllegalStateException("Esia response error. " + errMsg);
}
if (tokenResponse.getError() != null) {
throw new EsiaException(tokenResponse.getErrorDescription());
}
String esiaAccessTokenStr = tokenResponse.getAccessToken();
esiaAccessTokenStr = tokenResponse.getAccessToken();
String esiaRefreshTokenStr = tokenResponse.getRefreshToken();
String verifyResult = verifyToken(esiaAccessTokenStr);
if (verifyResult != null) {
throw new EsiaException(verifyResult);
}
boolean hasRole = ulDataService.checkRole(esiaAccessTokenStr);
EsiaAccessToken esiaAccessToken = ulDataService.readToken(esiaAccessTokenStr);
String prnOid = esiaAccessToken.getSbjId();
String ervuId = getErvuId(esiaAccessTokenStr, prnOid);
Long expiresIn = tokenResponse.getExpiresIn();
prnOid = esiaAccessToken.getSbjId();
expiresIn = tokenResponse.getExpiresIn();
EsiaTokensStore.addAccessToken(prnOid, esiaAccessTokenStr, expiresIn);
EsiaTokensStore.addRefreshToken(prnOid, esiaRefreshTokenStr, expiresIn);
createTokenAndAddCookie(response, esiaAccessToken.getSbjId(), ervuId, hasRole, expiresIn);
}
catch (Exception e) {
throw new EsiaException(e);
}
try {
hasRole = ulDataService.checkRole(esiaAccessTokenStr);
String ervuId = getErvuId(esiaAccessTokenStr, prnOid);
createTokenAndAddCookie(response, prnOid, ervuId, hasRole, expiresIn);
if (!hasRole) {
LOGGER.error("The user with id = " + prnOid + " does not have the required role");
return new ResponseEntity<>(
@ -251,7 +247,7 @@ public class EsiaAuthService {
return ResponseEntity.ok("Authentication successful");
}
catch (Exception e) {
createTokenAndAddCookie(response, null, null, false, EXPIRES_IN);
createTokenAndAddCookie(response, prnOid, null, hasRole , expiresIn);
String messageId = getMessageId(e);
String messageWithId = String.format("[%s] %s", messageId, e.getMessage());
LOGGER.error(messageWithId, e);
@ -309,21 +305,24 @@ public class EsiaAuthService {
.send(postReq, HttpResponse.BodyHandlers.ofString());
String responseString = postResp.body();
EsiaTokenResponse tokenResponse = objectMapper.readValue(responseString, EsiaTokenResponse.class);
if (tokenResponse != null && tokenResponse.getError() != null) {
throw new EsiaException(tokenResponse.getErrorDescription());
if (tokenResponse == null || tokenResponse.getError() != null) {
String errMsg =
tokenResponse != null ? tokenResponse.getErrorDescription() : "response is empty";
throw new IllegalStateException("Esia response error. " + errMsg);
}
String accessToken = tokenResponse.getAccessToken();
String verifyResult = verifyToken(accessToken);
String esiaAccessTokenStr = tokenResponse.getAccessToken();
String verifyResult = verifyToken(esiaAccessTokenStr);
if (verifyResult != null) {
throw new EsiaException(verifyResult);
}
String newRefreshToken = tokenResponse.getRefreshToken();
EsiaAccessToken esiaAccessToken = ulDataService.readToken(accessToken);
String esiaNewRefreshToken = tokenResponse.getRefreshToken();
EsiaAccessToken esiaAccessToken = ulDataService.readToken(esiaAccessTokenStr);
String prnOid = esiaAccessToken.getSbjId();
Long expiresIn = tokenResponse.getExpiresIn();
EsiaTokensStore.addAccessToken(prnOid, accessToken, expiresIn);
EsiaTokensStore.addRefreshToken(prnOid, newRefreshToken, expiresIn);
String ervuId = getErvuId(accessToken, prnOid);
EsiaTokensStore.addAccessToken(prnOid, esiaAccessTokenStr, expiresIn);
EsiaTokensStore.addRefreshToken(prnOid, esiaNewRefreshToken, expiresIn);
String ervuId = getErvuId(esiaAccessTokenStr, prnOid);
createTokenAndAddCookie(response, esiaAccessToken.getSbjId(), ervuId, true, expiresIn);
}
catch (Exception e) {
@ -357,7 +356,7 @@ public class EsiaAuthService {
}
}
private void errorHandler(HttpResponse httpResponse) {
private void errorHandler(HttpResponse<?> httpResponse) {
if (httpResponse.statusCode() != 200) {
throw new EsiaException(httpResponse.statusCode() + " " + httpResponse.body());
}
@ -471,7 +470,7 @@ public class EsiaAuthService {
private void createTokenAndAddCookie(HttpServletResponse response, String userId, String ervuId,
Boolean hasRole, Long expiresIn) {
Token token = jwtTokenService.createAccessToken(userId, expiresIn, ervuId, hasRole);
securityHelper.addAccessCookies(response,token.getValue(), expiresIn.intValue());
securityHelper.addAccessCookies(response, token.getValue(), expiresIn.intValue());
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken =
new UsernamePasswordAuthenticationToken(token.getUserAccountId(), null);
SecurityContext context = SecurityContextHolder.createEmptyContext();
@ -524,11 +523,10 @@ public class EsiaAuthService {
.header("Content-Type", "text/plain")
.POST(HttpRequest.BodyPublishers.ofString(accessToken, StandardCharsets.UTF_8))
.build();
HttpResponse<String> response = HttpClient.newBuilder()
return HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(esiaConfig.getConnectionTimeout()))
.build()
.send(request, HttpResponse.BodyHandlers.ofString());
return response;
}
catch (Exception e) {
throw new EsiaException(e);

View file

@ -17,8 +17,11 @@ public class JwtAuthentication implements Authentication {
private final Authentication authentication;
private final String token;
private final UserIdsPair userIdsPair;
public JwtAuthentication(Authentication authentication, String userAccountId, String token) {
this.userAccountId = userAccountId;
this.userIdsPair = new UserIdsPair(userAccountId);
this.authentication = authentication;
this.token = token;
}
@ -31,6 +34,10 @@ public class JwtAuthentication implements Authentication {
return userAccountId;
}
public UserIdsPair getUserIdsPair() {
return userIdsPair;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return authentication.getAuthorities();

View file

@ -48,22 +48,20 @@ public class JwtAuthenticationProvider implements AuthenticationProvider {
throw new BadCredentialsException("Authentication Failed.", e);
}
if (jwtTokenService.isValid(token)) {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(
REFERENCE_REQUEST);
if (request == null) {
throw new IllegalStateException("No request found in request attributes");
}
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(
REFERENCE_REQUEST);
if (request == null) {
throw new IllegalStateException("No request found in request attributes");
}
if (request.getRequestURI().endsWith("esia/logout") || token.getHasRole()) {
UsernamePasswordAuthenticationToken pwdToken =
UsernamePasswordAuthenticationToken.authenticated(token.getUserAccountId(), null,
Collections.emptyList()
);
if (jwtTokenService.isValid(token) && token.getHasRole()) {
UsernamePasswordAuthenticationToken pwdToken =
UsernamePasswordAuthenticationToken.authenticated(token.getUserAccountId(), null,
Collections.emptyList()
);
return new JwtAuthentication(pwdToken, token.getUserAccountId(), token.getValue());
}
return new JwtAuthentication(pwdToken, token.getUserAccountId(), token.getValue());
}
throw new BadCredentialsException(

View file

@ -6,12 +6,19 @@ import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import ru.micord.ervu.security.webbpm.jwt.helper.SecurityHelper;
/**
* {@link AuthenticationEntryPoint} that rejects all requests with an unauthorized error message.
*/
public class UnauthorizedEntryPoint implements AuthenticationEntryPoint {
private final SecurityHelper securityHelper;
public UnauthorizedEntryPoint(SecurityHelper securityHelper) {
this.securityHelper = securityHelper;
}
@Override
public void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException {
@ -21,9 +28,11 @@ public class UnauthorizedEntryPoint implements AuthenticationEntryPoint {
response.setStatus(HttpServletResponse.SC_OK);
}
else {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED,
"Unauthorized: Authentication token was either missing or invalid."
);
securityHelper.clearAccessCookies(response);
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setContentType("application/json;charset=UTF-8");
response.getWriter()
.write("\"Unauthorized: Authentication token was either missing or invalid.\"");
}
}
}

View file

@ -0,0 +1,27 @@
package ru.micord.ervu.security.webbpm.jwt;
public class UserIdsPair {
private final String esiaUserId;
private final String ervuId;
public UserIdsPair(String idsConcatenated) {
if (idsConcatenated == null) {
this.esiaUserId = null;
this.ervuId = null;
}
else {
String[] ids = idsConcatenated.split(":");
this.esiaUserId = ids[0];
this.ervuId = ids.length == 2 ? ids[1] : null;
}
}
public String getEsiaUserId() {
return esiaUserId;
}
public String getErvuId() {
return ervuId;
}
}

View file

@ -8,6 +8,8 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.util.WebUtils;
import ru.micord.ervu.security.webbpm.jwt.JwtAuthentication;
import ru.micord.ervu.security.webbpm.jwt.UserIdsPair;
public final class SecurityUtil {
public static final String AUTH_TOKEN = "auth_token";
@ -36,4 +38,10 @@ public final class SecurityUtil {
.map(a -> ((JwtAuthentication) a).getUserAccountId())
.orElse(null);
}
public static UserIdsPair getUserIdsPair() {
return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication())
.map(a -> ((JwtAuthentication) a).getUserIdsPair())
.orElse(null);
}
}

View file

@ -16,6 +16,8 @@ http {
sendfile on;
server_tokens off;
gzip on;
# text/html doesn't need to be defined there, it's compressed always
@ -79,6 +81,8 @@ http {
index index.html;
try_files $uri @index;
add_header Content-Security-Policy "frame-ancestors 'none'; default-src 'self'; script-src 'self'; style-src 'unsafe-inline' 'self' data:; font-src 'self' data:; img-src 'self' data:;";
#Application config
location = /src/resources/app-config.json {
add_header Cache-Control "no-cache";

View file

@ -0,0 +1,171 @@
<?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.
-->
<!-- Note: A "Server" is not itself a "Container", so you may not
define subcomponents such as "Valves" at this level.
Documentation at /docs/config/server.html
-->
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<!-- Security listener. Documentation at /docs/config/listeners.html
<Listener className="org.apache.catalina.security.SecurityListener" />
-->
<!-- APR library loader. Documentation at /docs/apr.html -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<!-- Prevent memory leaks due to use of particular java/javax APIs-->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<!-- Global JNDI resources
Documentation at /docs/jndi-resources-howto.html
-->
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<!-- A "Service" is a collection of one or more "Connectors" that share
a single "Container" Note: A "Service" is not itself a "Container",
so you may not define subcomponents such as "Valves" at this level.
Documentation at /docs/config/service.html
-->
<Service name="Catalina">
<!--The connectors can use a shared executor, you can define one or more named thread pools-->
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- A "Connector" using the shared thread pool-->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
<!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443
This connector uses the NIO implementation. The default
SSLImplementation will depend on the presence of the APR/native
library and the useOpenSSL attribute of the AprLifecycleListener.
Either JSSE or OpenSSL style configuration may be used regardless of
the SSLImplementation selected. JSSE style configuration is used below.
-->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
type="RSA" />
</SSLHostConfig>
</Connector>
-->
<!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
This connector uses the APR/native implementation which always uses
OpenSSL for TLS.
Either JSSE or OpenSSL style configuration may be used. OpenSSL style
configuration is used below.
-->
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
maxThreads="150" SSLEnabled="true" >
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
certificateFile="conf/localhost-rsa-cert.pem"
certificateChainFile="conf/localhost-rsa-chain.pem"
type="RSA" />
</SSLHostConfig>
</Connector>
-->
<!-- Define an AJP 1.3 Connector on port 8009 -->
<!--
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443" />
-->
<!-- An Engine represents the entry point (within Catalina) that processes
every request. The Engine implementation for Tomcat stand alone
analyzes the HTTP headers included with the request, and passes them
on to the appropriate Host (virtual host).
Documentation at /docs/config/engine.html -->
<!-- You should set jvmRoute to support load-balancing via AJP ie :
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
-->
<Engine name="Catalina" defaultHost="localhost">
<!--For clustering, please take a look at documentation at:
/docs/cluster-howto.html (simple how to)
/docs/config/cluster.html (reference documentation) -->
<!--
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-->
<!-- Use the LockOutRealm to prevent attempts to guess user passwords
via a brute-force attack -->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<!-- This Realm uses the UserDatabase configured in the global JNDI
resources under the key "UserDatabase". Any edits
that are performed against this UserDatabase are immediately
available for use by the Realm. -->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps"
errorReportValveClass="org.apache.catalina.valves.JsonErrorReportValve"
unpackWARs="true" autoDeploy="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
</Engine>
</Service>
</Server>

View file

@ -0,0 +1,3 @@
document.addEventListener("DOMContentLoaded", function(event) {
document.getElementById("browser-check-info").hidden = navigator.userAgent.indexOf("Chromium GOST") > -1 || navigator.userAgent.indexOf("YaBrowser") > -1;
});

View file

@ -4,6 +4,10 @@
<link rel="stylesheet" type="text/css" href="src/resources/landing/home.css">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self'; style-src 'unsafe-inline' 'self' data:; font-src 'self' data:; img-src 'self' data:"/>
<meta name="referrer" content="strict-origin-when-cross-origin"/>
<script src="browser_check.js"></script>
</head>
<body class="ul">
@ -25,9 +29,6 @@
</div>
</div>
</div>
<script>
document.getElementById("browser-check-info").hidden = navigator.userAgent.indexOf("Chromium GOST") > -1 || navigator.userAgent.indexOf("YaBrowser") > -1;
</script>
<div class="container-inside">
<div class="list-group lk-what">
<div>
@ -84,7 +85,7 @@
<div class="section-group">
<div class="icon-pers">
Ежегодное предоставление списка граждан мужского пола, подлежащих первоначальной постановке на воинский учет в год достижения ими возраста 17 лет
<div class="muted">Срок передачи сведений: <span class="detailed">ежегодно, в срок до 1 ноября</span></div>
<div class="muted">Срок передачи сведений: <span class="detailed">ежегодно, в срок до 1 ноября</span></div>
</div>
<div class="icon-building">
Ежегодное предоставление списка сотрудников/обучающихся в организации, подлежащих воинскому учету
@ -109,10 +110,10 @@
<span class="info"></span>Если в файле будут ошибĸи, данные не будут приняты Реестром и выгрузĸу сведений придется повторить
</div>
</div>
<div class="list-group lk-docs">
<div class="list-group lk-docs">
</div>
</div>
</div>
</body>
</html>
</html>

View file

@ -1748,9 +1748,9 @@
}
},
"@webbpm/base-package": {
"version": "3.185.0",
"resolved": "https://repo.micord.ru/repository/npm-all/@webbpm/base-package/-/base-package-3.185.0.tgz",
"integrity": "sha512-m6qlhhYIjx6tNUJl5MNsUflAFjLt2tLurxf706iwI6IM8ZZGeTjF6j1dCeEUZnOc6hntdRigcUpOsSGa97QMog==",
"version": "3.187.1",
"resolved": "https://repo.micord.ru/repository/npm-all/@webbpm/base-package/-/base-package-3.187.1.tgz",
"integrity": "sha512-YWoxjDkesg90FzT1WfNSaNQMZounBn+TgDXLUSsfjEJjvfBp9nRTk228oEK3nP4SWxmqwZFZO8M6X509SiUEcw==",
"requires": {
"tslib": "^1.9.0"
}

View file

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

View file

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

View file

@ -60,7 +60,7 @@
<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;&#x443;&#x442;&#x440;&#x435;&#x43d;&#x43d;&#x435;&#x439; &#x441;&#x441;&#x44b;&#x43b;&#x43a;&#x438;: <code>products/ru.cg.webbpm.packages.base:resources:jar:3.185.0</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.1</code></li>
</ul>
</li>
<li>

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -8,11 +8,11 @@
<documentation>component/fields/ФИАС.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>
@ -115,7 +115,7 @@
<value>
<expanded>true</expanded>
<implRef type="JAVA">
<className>FiasAddressServiceImpl</className>
<className>GarAddressServiceImpl</className>
<packageName>service.field</packageName>
</implRef>
<complex>

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Денежное_поле.html</documentation>
<internal>true</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Числовое_поле.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/OneToMany.html</documentation>
<internal>true</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

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

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Переключатель.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

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

View file

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

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Статичный_переключатель.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Текст.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Многострочное_поле.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Текстовое_поле.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/Время.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

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

View file

@ -5,11 +5,11 @@
<localization>META-INF/components/localization/editable-grid</localization>
<internal>true</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

@ -4,11 +4,11 @@
<name>EditableOneToManyForm</name>
<internal>true</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

@ -5,11 +5,11 @@
<localization>META-INF/components/localization/fields/file-upload-field</localization>
<internal>true</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/filters/Фильтр_по_полю_адреса.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

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

View file

@ -8,11 +8,11 @@
<documentation>component/fields/filters/Фильтр_поомпоненте_Флаг.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

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

View file

@ -8,11 +8,11 @@
<documentation>component/fields/filters/Фильтр_по_выпадающему_списку.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/filters/Фильтр_поате.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/filters/Фильтр_по_числовому_полю.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/filters/Переключатель.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/filters/Фильтр_по_статичному_выпадающему_списку.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/filters/Фильтр_по_полю_многострочного_ввода.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

@ -8,11 +8,11 @@
<documentation>component/fields/filters/Текстовое_поле.html</documentation>
<internal>false</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

View file

@ -5,11 +5,11 @@
<localization>META-INF/components/localization/fields/link-field</localization>
<internal>true</internal>
<versions>
<studioVersion>3.185.0</studioVersion>
<studioVersion>3.187.1</studioVersion>
<packageVersions>
<entry>
<key>ru.cg.webbpm.packages.base.resources</key>
<value>3.185.0</value>
<value>3.187.1</value>
</entry>
</packageVersions>
</versions>

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