Fix su gestione dei device
All checks were successful
IntegryManagementSystem_Multi/pipeline/head This commit looks good

This commit is contained in:
2025-03-14 16:40:37 +01:00
parent 113cc4a95d
commit cef6308491
10 changed files with 88 additions and 152 deletions

View File

@@ -2,13 +2,7 @@ package it.integry.ems.devices;
import it.integry.common.var.CommonConstants;
import it.integry.ems.devices.dto.RegisterDeviceRequestDTO;
import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.*;
@@ -17,42 +11,14 @@ import org.springframework.web.bind.annotation.*;
@RequestMapping("device")
public class DevicesController {
private final Logger logger = LogManager.getLogger();
@Autowired
private MultiDBTransactionManager multiDBTransactionManager;
@Autowired
private RequestDataDTO requestDataDTO;
@Autowired
private DevicesService devicesService;
@Deprecated
@RequestMapping(value = "register", method = RequestMethod.POST)
public @ResponseBody
ServiceRestResponse register(@RequestParam(CommonConstants.PROFILE_DB) String configuration,
@RequestBody RegisterDeviceRequestDTO registerDeviceRequestDTO) throws Exception {
public @ResponseBody ServiceRestResponse register(@RequestParam(CommonConstants.PROFILE_DB) String configuration,
@RequestBody Object registerDeviceRequestDTO) throws Exception {
DevicesService.App application = null;
switch (registerDeviceRequestDTO.getApp().toLowerCase()) {
case "wms":
application = DevicesService.App.WMS;
break;
case "wingest":
application = DevicesService.App.Wingest;
break;
case "textiles":
application = DevicesService.App.Textiles;
break;
case "agribook":
application = DevicesService.App.Agribook;
break;
}
if(application == null)
throw new Exception("Impossibile riconoscere l'applicativo");
devicesService.register(application, requestDataDTO.getDeviceId());
//TODO: To be removed
//Mantenuto solo per lasciare compatibilità con le vecchie versioni del WMS
//Non serve più per >= v1.45.00
return ServiceRestResponse.createPositiveResponse();
}

View File

@@ -1,46 +1,38 @@
package it.integry.ems.devices;
import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.settings.Model.SettingsModel;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.security.service.DeviceService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
@Scope("request")
public class DevicesRequestInterceptor extends HandlerInterceptorAdapter {
public class DevicesRequestInterceptor implements HandlerInterceptor {
private final Logger logger = LogManager.getLogger();
@Autowired
private SettingsModel settingsModel;
@Autowired
private DevicesService devicesService;
@Override
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response, Object handler) {
try {
DeviceService deviceService = ContextLoader.getCurrentWebApplicationContext().getBean(DeviceService.class);
RequestDataDTO requestDataDTO = ContextLoader.getCurrentWebApplicationContext().getBean(RequestDataDTO.class);
MultiDBTransactionManager multiDBTransactionManager = ContextLoader.getCurrentWebApplicationContext().getBean(MultiDBTransactionManager.class);
if (requestDataDTO.isValidProfileDB() && requestDataDTO.isValidDeviceId()) {
devicesService.updateUsage(multiDBTransactionManager.getPrimaryConnection(), requestDataDTO.getDeviceId());
deviceService.updateUsage(requestDataDTO.getApplication(), requestDataDTO.getDeviceId());
}
return true;
} catch (Exception ex) {
ex.printStackTrace();
logger.error(ex.getMessage(), ex);
return false;
}

View File

@@ -1,72 +0,0 @@
package it.integry.ems.devices;
import it.integry.ems._context.ApplicationContextProvider;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.user.UserSession;
import it.integry.ems_model.entity.StbDevices;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.Query;
import it.integry.ems_model.utility.UtilityDB;
import it.integry.ems_model.utility.UtilityLocalDate;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.web.context.ContextLoader;
import java.util.Date;
@Service
public class DevicesService {
public enum App {
WMS,
Wingest,
Textiles,
Agribook
}
private final Logger logger = LogManager.getLogger();
public void register(App application, String deviceId) throws Exception {
MultiDBTransactionManager multiDBTransactionManager = ContextLoader.getCurrentWebApplicationContext().getBean(MultiDBTransactionManager.class);
EntityProcessor entityProcessor = ApplicationContextProvider.getApplicationContext().getBean(EntityProcessor.class);
UserSession userSession = ContextLoader.getCurrentWebApplicationContext().getBean(UserSession.class);
if (!userSession.isAttivo()) {
throw new UsernameNotFoundException("Utente " + userSession.getUsername() + " non riconoscuto!");
}
String appName = application.name();
String selectSql = Query.format("SELECT CAST(COUNT(*) AS BIT) AS exist FROM stb_devices " +
" WHERE identification_id = {}", deviceId);
boolean exists =
UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), selectSql);
if (!exists) {
StbDevices stbDevices = new StbDevices()
.setName(appName)
.setIdentificationId(deviceId)
.setCreatedAt(new Date())
.setLastUse(new Date());
stbDevices.setOperation(OperationType.INSERT_OR_UPDATE);
entityProcessor.processEntity(stbDevices, multiDBTransactionManager);
}
}
public void updateUsage(Connection connection, String deviceId) throws Exception {
String updateSql = Query.format("UPDATE stb_devices " +
" SET last_use = {}" +
" WHERE identification_id = {}", UtilityLocalDate.getNowTime(), deviceId);
UtilityDB.executeSimpleUpdate(connection, updateSql);
}
}

View File

@@ -1,15 +0,0 @@
package it.integry.ems.devices.dto;
public class RegisterDeviceRequestDTO {
private String app;
public String getApp() {
return app;
}
public RegisterDeviceRequestDTO setApp(String app) {
this.app = app;
return this;
}
}

View File

@@ -37,7 +37,7 @@ public class RequestDataDTO {
private String requestClientIP;
private String profileDB;
private String deviceId;
private Long deviceId;
private String username;
private String password;
private boolean includeNulls = false;
@@ -55,10 +55,6 @@ public class RequestDataDTO {
profileDB = request.getHeader(CommonConstants.PROFILE_DB);
}
if (request != null && request.getHeader(EmsRestConstants.DEVICE_ID) != null) {
deviceId = request.getHeader(EmsRestConstants.DEVICE_ID);
}
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && !(authentication instanceof AnonymousAuthenticationToken)) {
readAuthenticationClaims(authentication);
@@ -107,7 +103,7 @@ public class RequestDataDTO {
}
public boolean isValidDeviceId() {
return !UtilityString.isNullOrEmpty(deviceId);
return deviceId != null;
}
public boolean isValidUsername() {
@@ -136,7 +132,7 @@ public class RequestDataDTO {
return profileDB;
}
public String getDeviceId() {
public Long getDeviceId() {
return deviceId;
}
@@ -173,10 +169,10 @@ public class RequestDataDTO {
private void readAuthenticationClaims(Authentication authentication) {
username = authentication.getName();
//final UsernamePasswordAuthenticationToken principal = (UsernamePasswordAuthenticationToken) authentication.getPrincipal();
final AuthTokenDetails authTokenDetails = (AuthTokenDetails) authentication.getDetails();
userDTO = authTokenDetails.getUserDTO();
deviceId = authTokenDetails.getDeviceId();
}
}

View File

@@ -54,7 +54,6 @@ public class EmsRestConstants {
public static final String PASSWORD = "password";
public static final String X_APP_TOKEN = "x-app-token";
public static final String DEVICE_ID = "device_id";
public static final String INCLUDE_NULLS = "include_nulls";
public static final String FILE_PROPS_NAME = "configs";
//calcoli

View File

@@ -3,8 +3,8 @@ package it.integry.security.config;
import it.integry.security.JWTAccessDeniedHandler;
import it.integry.security.JWTAuthenticationEntryPoint;
import it.integry.security.cache.JwtTokenCacheComponent;
import it.integry.security.jwt.JWTFilter;
import it.integry.security.jwt.AccessTokenProvider;
import it.integry.security.jwt.JWTFilter;
import it.integry.security.provider.TokenAuthenticationProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
@@ -24,10 +24,13 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private AccessTokenProvider accessTokenProvider;
@Autowired
private JwtTokenCacheComponent tokenCache;
@Autowired
private JWTAuthenticationEntryPoint authenticationErrorHandler;
@Autowired
private JWTAccessDeniedHandler jwtAccessDeniedHandler;

View File

@@ -39,7 +39,6 @@ public class JWTFilter extends GenericFilterBean {
public JWTFilter(AccessTokenProvider accessTokenProvider, JwtTokenCacheComponent tokenCache) {
this.accessTokenProvider = accessTokenProvider;
this.tokenCache = tokenCache;
}

View File

@@ -0,0 +1,53 @@
package it.integry.security.service;
import it.integry.ems.settings.Model.AvailableConnectionsModel;
import it.integry.ems.settings.Model.SettingsModel;
import it.integry.ems.settings.SettingsController;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.utility.UtilityDebug;
import it.integry.ems_model.utility.UtilityDB;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class DeviceInternalService {
private final Logger logger = LogManager.getLogger(DeviceInternalService.class);
@Autowired
private SettingsModel settingsModel;
@Autowired
private SettingsController settingsController;
@Scheduled(cron = "0 0 0 * * *", zone = "Europe/Rome")
private void cleanOrphanDevices() {
if(UtilityDebug.isDebugExecution() || !settingsModel.isPrimaryInstance())
return;
String cleanQuery = "DELETE stb_devices FROM stb_devices\n" +
"LEFT OUTER JOIN stb_auth_tokens ON stb_auth_tokens.device_id = stb_devices.id\n" +
"WHERE stb_auth_tokens.device_id IS NULL";
try {
List<AvailableConnectionsModel> availableConnections = settingsModel.getAvailableConnectionsWithoutDuplicatedProfiles(true, settingsController.getHistoryProfileDb());
for(AvailableConnectionsModel availableConnection : availableConnections) {
try (MultiDBTransactionManager mdb = new MultiDBTransactionManager(availableConnection)) {
UtilityDB.executeStatement(mdb.getPrimaryConnection(), cleanQuery);
}
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
}

View File

@@ -1,13 +1,17 @@
package it.integry.security.service;
import it.integry.ems.model.IntegryApplicationEnum;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.entity.StbDevices;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.Query;
import it.integry.ems_model.utility.UtilityDB;
import it.integry.ems_model.utility.UtilityLocalDate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.web.context.ContextLoader;
import java.util.Date;
@@ -17,6 +21,7 @@ public class DeviceService {
@Autowired
private MultiDBTransactionManager multiDBTransactionManager;
@Autowired
private EntityProcessor entityProcessor;
@@ -45,4 +50,14 @@ public class DeviceService {
return stbDevices;
}
public void updateUsage(IntegryApplicationEnum application, long deviceId) throws Exception {
MultiDBTransactionManager multiDBTransactionManager = ContextLoader.getCurrentWebApplicationContext().getBean(MultiDBTransactionManager.class);
String updateSql = Query.format("UPDATE stb_devices " +
" SET last_use = {}, name = {}" +
" WHERE id = {}", UtilityLocalDate.getNowTime(), application.name(), deviceId);
UtilityDB.executeSimpleUpdate(multiDBTransactionManager.getPrimaryConnection(), updateSql);
}
}