Moved encoding to properties

This commit is contained in:
Mikhail Trofimov 2025-07-24 11:00:48 +03:00
parent c77e22e641
commit a827bd0f6b
7 changed files with 25 additions and 13 deletions

View file

@ -38,4 +38,6 @@ ct.load-dir=/opt/app/reports
ct.monitoring-interval=${MONITORING_INTERVAL:15} ct.monitoring-interval=${MONITORING_INTERVAL:15}
# days # days
ct.update-flags-interval=${UPDATE_FLAGS_INTERVAL:1} ct.update-flags-interval=${UPDATE_FLAGS_INTERVAL:1}
ct.days-to-update-flags=${DAYS_TO_UPDATE_FLAGS:30} ct.days-to-update-flags=${DAYS_TO_UPDATE_FLAGS:30}
ct.encoding=windows-1251

View file

@ -7,6 +7,7 @@ import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException; import org.springframework.web.multipart.MaxUploadSizeExceededException;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.entities.response.errors.*; import ru.nbch.credit_tracker.entities.response.errors.*;
import ru.nbch.credit_tracker.enums.SignalError; import ru.nbch.credit_tracker.enums.SignalError;
import ru.nbch.credit_tracker.exceptions.SignalClientException; import ru.nbch.credit_tracker.exceptions.SignalClientException;
@ -19,11 +20,16 @@ import java.nio.charset.Charset;
public class GlobalExceptionHandler { public class GlobalExceptionHandler {
private final SimpleMessageResolver messageResolver = new SimpleMessageResolver(); private final SimpleMessageResolver messageResolver = new SimpleMessageResolver();
private final String encoding;
public GlobalExceptionHandler(CreditTrackerSettings settings) {
this.encoding = settings.getEncoding();
}
@ExceptionHandler(value = MaxUploadSizeExceededException.class, produces = MediaType.APPLICATION_XML_VALUE) @ExceptionHandler(value = MaxUploadSizeExceededException.class, produces = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity<MonitoringError> handleMaxUploadSizeExceeded(MaxUploadSizeExceededException ex) { public ResponseEntity<MonitoringError> handleMaxUploadSizeExceeded(MaxUploadSizeExceededException ex) {
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();
headers.setContentType(new MediaType("application", "xml", Charset.forName("windows-1251"))); headers.setContentType(new MediaType("application", "xml", Charset.forName(encoding)));
MonitoringError error = new MonitoringError(); MonitoringError error = new MonitoringError();
error.setStatus("error"); error.setStatus("error");
@ -36,7 +42,7 @@ public class GlobalExceptionHandler {
@ExceptionHandler(value = SignalException.class, produces = MediaType.APPLICATION_XML_VALUE) @ExceptionHandler(value = SignalException.class, produces = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity<CommonError> handleClientException(SignalException ex) { public ResponseEntity<CommonError> handleClientException(SignalException ex) {
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();
headers.setContentType(new MediaType("application", "xml", Charset.forName("windows-1251"))); headers.setContentType(new MediaType("application", "xml", Charset.forName(encoding)));
CommonError commonError = getCommonError(ex); CommonError commonError = getCommonError(ex);
commonError.setStatus("error"); commonError.setStatus("error");
commonError.setErrorCode(ex.getErrorMessage().getSubject().getCode()); commonError.setErrorCode(ex.getErrorMessage().getSubject().getCode());

View file

@ -32,4 +32,5 @@ public class CreditTrackerSettings {
private Long updateFlagsInterval; private Long updateFlagsInterval;
private Long daysToUpdateFlags; private Long daysToUpdateFlags;
private String encoding;
} }

View file

@ -3,6 +3,7 @@ package ru.nbch.credit_tracker.config.xml;
import jakarta.xml.bind.JAXBException; import jakarta.xml.bind.JAXBException;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.entities.response.errors.MonitoringError; import ru.nbch.credit_tracker.entities.response.errors.MonitoringError;
import ru.nbch.credit_tracker.entities.response.online_report.SgnlOnlineReport; import ru.nbch.credit_tracker.entities.response.online_report.SgnlOnlineReport;
import ru.nbch.credit_tracker.entities.response.success.MonitoringResponse; import ru.nbch.credit_tracker.entities.response.success.MonitoringResponse;
@ -18,8 +19,8 @@ import java.util.List;
public class XmlConfig { public class XmlConfig {
@Bean @Bean
public IXmlProcessor xmlProcessor() throws JAXBException { public IXmlProcessor xmlProcessor(CreditTrackerSettings settings) throws JAXBException {
return new XmlProcessorImplAnyClasses(Charset.forName("windows-1251"), return new XmlProcessorImplAnyClasses(Charset.forName(settings.getEncoding()),
// unmarshalling classes // unmarshalling classes
SgnlOnlineReport.class, SgnlOnlineReport.class,
// marshalling classes // marshalling classes

View file

@ -18,7 +18,6 @@ import ru.nbch.credit_tracker.entities.response.online_download.Persons;
import ru.nbch.credit_tracker.entities.response.online_report.Report; import ru.nbch.credit_tracker.entities.response.online_report.Report;
import ru.nbch.credit_tracker.entities.response.online_report.SgnlOnlineReport; import ru.nbch.credit_tracker.entities.response.online_report.SgnlOnlineReport;
import ru.nbch.credit_tracker.service.signal.SignalRestService; import ru.nbch.credit_tracker.service.signal.SignalRestService;
import ru.nbch.credit_tracker.service.xml.jaxb.IXmlProcessor;
import ru.nbch.credit_tracker.service.xml.stax.MonitoringSignalResponseStaxXmlWriter; import ru.nbch.credit_tracker.service.xml.stax.MonitoringSignalResponseStaxXmlWriter;
import ru.nbch.credit_tracker.service.xml.stax.StaxXmlProcessor; import ru.nbch.credit_tracker.service.xml.stax.StaxXmlProcessor;
import ru.nbch.credit_tracker.utils.CTUtil; import ru.nbch.credit_tracker.utils.CTUtil;
@ -45,7 +44,6 @@ public class MonitoringService {
public MonitoringService(SignalRestService signalRestService, public MonitoringService(SignalRestService signalRestService,
SignalService signalService, SignalService signalService,
IXmlProcessor xmlProcessor,
StaxXmlProcessor staxXmlProcessor, StaxXmlProcessor staxXmlProcessor,
CreditTrackerSettings config) { CreditTrackerSettings config) {
this.signalRestService = signalRestService; this.signalRestService = signalRestService;
@ -130,7 +128,7 @@ public class MonitoringService {
MonitoringSignalResponse response = new MonitoringSignalResponse(); MonitoringSignalResponse response = new MonitoringSignalResponse();
response.setPackageName(userPackage.getPackageName()); // Имя пакета, переданного при установке response.setPackageName(userPackage.getPackageName()); // Имя пакета, переданного при установке
MonitoringSignalResponseStaxXmlWriter staxXmlWriter = new MonitoringSignalResponseStaxXmlWriter("windows-1251"); MonitoringSignalResponseStaxXmlWriter staxXmlWriter = new MonitoringSignalResponseStaxXmlWriter(config.getEncoding());
staxXmlWriter.writeWithStax(responsePath, response, staxXmlWriter.writeWithStax(responsePath, response,
writer -> { writer -> {
try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(Path.of(reportPath)), 4 * 1024 * 1024)) { try (BufferedInputStream in = new BufferedInputStream(Files.newInputStream(Path.of(reportPath)), 4 * 1024 * 1024)) {

View file

@ -177,7 +177,7 @@ public class SignalService {
Signals signals = buildSignals(packageId); Signals signals = buildSignals(packageId);
SignalsStaxXmlWriter signalsStaxXmlWriter = new SignalsStaxXmlWriter("windows-1251"); SignalsStaxXmlWriter signalsStaxXmlWriter = new SignalsStaxXmlWriter(config.getEncoding());
signalsStaxXmlWriter.writeWithStax(filePath, signalsStaxXmlWriter.writeWithStax(filePath,
signals, signals,

View file

@ -4,6 +4,7 @@ import jakarta.xml.bind.DatatypeConverter;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.enums.SignalError; import ru.nbch.credit_tracker.enums.SignalError;
import ru.nbch.credit_tracker.mapper.scoring.ModelUsersMapper; import ru.nbch.credit_tracker.mapper.scoring.ModelUsersMapper;
@ -13,17 +14,20 @@ import java.util.List;
@Service @Service
public class AuthorizationService { public class AuthorizationService {
private static final String SGNL_CODE = "SGNL"; private static final String SGNL_CODE = "SGNL";
private static final String SALT = "-*-XUSER_"; // TODO move salt to props? private static final String SALT = "-*-XUSER_";
private final ModelUsersMapper mapper; private final ModelUsersMapper mapper;
private final String encoding;
public AuthorizationService(ModelUsersMapper mapper) { public AuthorizationService(ModelUsersMapper mapper,
CreditTrackerSettings settings) {
this.mapper = mapper; this.mapper = mapper;
this.encoding = settings.getEncoding();
} }
public AuthResult findAuthInfo(String userId, String password) throws Exception { public AuthResult findAuthInfo(String userId, String password) throws Exception {
String hashedPassword = hashPassword(password); String hashedPassword = hashPassword(password);
List<String> productCodes = mapper.findUserProductCodes(userId, hashedPassword); // TODO столбец username имеет ограничение на длину. Добавить обработку или валиться с 500? List<String> productCodes = mapper.findUserProductCodes(userId, hashedPassword);
if (productCodes.isEmpty()) { if (productCodes.isEmpty()) {
return new AuthResult(false, SignalError.ERROR_005); return new AuthResult(false, SignalError.ERROR_005);
} }
@ -36,7 +40,7 @@ public class AuthorizationService {
private String hashPassword(String password) throws Exception { private String hashPassword(String password) throws Exception {
try { try {
MessageDigest md = MessageDigest.getInstance("MD5"); MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest((SALT + password).getBytes("windows-1251")); byte[] messageDigest = md.digest((SALT + password).getBytes(encoding));
return DatatypeConverter.printHexBinary(messageDigest).toLowerCase(); return DatatypeConverter.printHexBinary(messageDigest).toLowerCase();
} catch (Exception e) { } catch (Exception e) {
throw new Exception("Unable to hash password", e); throw new Exception("Unable to hash password", e);