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

@ -39,3 +39,5 @@ ct.monitoring-interval=${MONITORING_INTERVAL:15}
# days
ct.update-flags-interval=${UPDATE_FLAGS_INTERVAL:1}
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.RestControllerAdvice;
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.enums.SignalError;
import ru.nbch.credit_tracker.exceptions.SignalClientException;
@ -19,11 +20,16 @@ import java.nio.charset.Charset;
public class GlobalExceptionHandler {
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)
public ResponseEntity<MonitoringError> handleMaxUploadSizeExceeded(MaxUploadSizeExceededException ex) {
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();
error.setStatus("error");
@ -36,7 +42,7 @@ public class GlobalExceptionHandler {
@ExceptionHandler(value = SignalException.class, produces = MediaType.APPLICATION_XML_VALUE)
public ResponseEntity<CommonError> handleClientException(SignalException ex) {
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.setStatus("error");
commonError.setErrorCode(ex.getErrorMessage().getSubject().getCode());

View file

@ -32,4 +32,5 @@ public class CreditTrackerSettings {
private Long updateFlagsInterval;
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 org.springframework.context.annotation.Bean;
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.online_report.SgnlOnlineReport;
import ru.nbch.credit_tracker.entities.response.success.MonitoringResponse;
@ -18,8 +19,8 @@ import java.util.List;
public class XmlConfig {
@Bean
public IXmlProcessor xmlProcessor() throws JAXBException {
return new XmlProcessorImplAnyClasses(Charset.forName("windows-1251"),
public IXmlProcessor xmlProcessor(CreditTrackerSettings settings) throws JAXBException {
return new XmlProcessorImplAnyClasses(Charset.forName(settings.getEncoding()),
// unmarshalling classes
SgnlOnlineReport.class,
// 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.SgnlOnlineReport;
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.StaxXmlProcessor;
import ru.nbch.credit_tracker.utils.CTUtil;
@ -45,7 +44,6 @@ public class MonitoringService {
public MonitoringService(SignalRestService signalRestService,
SignalService signalService,
IXmlProcessor xmlProcessor,
StaxXmlProcessor staxXmlProcessor,
CreditTrackerSettings config) {
this.signalRestService = signalRestService;
@ -130,7 +128,7 @@ public class MonitoringService {
MonitoringSignalResponse response = new MonitoringSignalResponse();
response.setPackageName(userPackage.getPackageName()); // Имя пакета, переданного при установке
MonitoringSignalResponseStaxXmlWriter staxXmlWriter = new MonitoringSignalResponseStaxXmlWriter("windows-1251");
MonitoringSignalResponseStaxXmlWriter staxXmlWriter = new MonitoringSignalResponseStaxXmlWriter(config.getEncoding());
staxXmlWriter.writeWithStax(responsePath, response,
writer -> {
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);
SignalsStaxXmlWriter signalsStaxXmlWriter = new SignalsStaxXmlWriter("windows-1251");
SignalsStaxXmlWriter signalsStaxXmlWriter = new SignalsStaxXmlWriter(config.getEncoding());
signalsStaxXmlWriter.writeWithStax(filePath,
signals,

View file

@ -4,6 +4,7 @@ import jakarta.xml.bind.DatatypeConverter;
import lombok.AllArgsConstructor;
import lombok.Getter;
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.mapper.scoring.ModelUsersMapper;
@ -13,17 +14,20 @@ import java.util.List;
@Service
public class AuthorizationService {
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 String encoding;
public AuthorizationService(ModelUsersMapper mapper) {
public AuthorizationService(ModelUsersMapper mapper,
CreditTrackerSettings settings) {
this.mapper = mapper;
this.encoding = settings.getEncoding();
}
public AuthResult findAuthInfo(String userId, String password) throws Exception {
String hashedPassword = hashPassword(password);
List<String> productCodes = mapper.findUserProductCodes(userId, hashedPassword); // TODO столбец username имеет ограничение на длину. Добавить обработку или валиться с 500?
List<String> productCodes = mapper.findUserProductCodes(userId, hashedPassword);
if (productCodes.isEmpty()) {
return new AuthResult(false, SignalError.ERROR_005);
}
@ -36,7 +40,7 @@ public class AuthorizationService {
private String hashPassword(String password) throws Exception {
try {
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();
} catch (Exception e) {
throw new Exception("Unable to hash password", e);