merge improvements
This commit is contained in:
		
							parent
							
								
									e768afc948
								
							
						
					
					
						commit
						a61e9d94c5
					
				@ -31,10 +31,9 @@ import org.springframework.security.config.annotation.authentication.builders.Au
 | 
			
		||||
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
 | 
			
		||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 | 
			
		||||
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 | 
			
		||||
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
 | 
			
		||||
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
 | 
			
		||||
import org.springframework.security.config.annotation.web.configurers.RequestCacheConfigurer;
 | 
			
		||||
import org.springframework.security.config.http.SessionCreationPolicy;
 | 
			
		||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 | 
			
		||||
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestResolver;
 | 
			
		||||
import org.springframework.security.web.SecurityFilterChain;
 | 
			
		||||
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
 | 
			
		||||
@ -136,8 +135,8 @@ public class ThingsboardSecurityConfiguration {
 | 
			
		||||
        ShallowEtagHeaderFilter etagFilter = new ShallowEtagHeaderFilter();
 | 
			
		||||
        etagFilter.setWriteWeakETag(true);
 | 
			
		||||
        FilterRegistrationBean<ShallowEtagHeaderFilter> filterRegistrationBean
 | 
			
		||||
                = new FilterRegistrationBean<>( etagFilter);
 | 
			
		||||
        filterRegistrationBean.addUrlPatterns("*.js","*.css","*.ico","/assets/*","/static/*");
 | 
			
		||||
                = new FilterRegistrationBean<>(etagFilter);
 | 
			
		||||
        filterRegistrationBean.addUrlPatterns("*.js", "*.css", "*.ico", "/assets/*", "/static/*");
 | 
			
		||||
        filterRegistrationBean.setName("etagFilter");
 | 
			
		||||
        return filterRegistrationBean;
 | 
			
		||||
    }
 | 
			
		||||
@ -200,8 +199,19 @@ public class ThingsboardSecurityConfiguration {
 | 
			
		||||
    private OAuth2AuthorizationRequestResolver oAuth2AuthorizationRequestResolver;
 | 
			
		||||
 | 
			
		||||
    @Bean
 | 
			
		||||
    public WebSecurityCustomizer webSecurityCustomizer() {
 | 
			
		||||
        return (web) -> web.ignoring().requestMatchers("/*.js", "/*.css", "/*.ico", "/assets/**", "/static/**");
 | 
			
		||||
    @Order(0)
 | 
			
		||||
    SecurityFilterChain resources(HttpSecurity http) throws Exception {
 | 
			
		||||
        http
 | 
			
		||||
                .securityMatchers(matchers -> matchers
 | 
			
		||||
                        .requestMatchers("/*.js", "/*.css", "/*.ico", "/assets/**", "/static/**"))
 | 
			
		||||
                .headers(header -> header
 | 
			
		||||
                        .defaultsDisabled()
 | 
			
		||||
                        .addHeaderWriter(new StaticHeadersWriter(HttpHeaders.CACHE_CONTROL, "max-age=0, public")))
 | 
			
		||||
                .authorizeHttpRequests((authorize) -> authorize.anyRequest().permitAll())
 | 
			
		||||
                .requestCache(RequestCacheConfigurer::disable)
 | 
			
		||||
                .securityContext(AbstractHttpConfigurer::disable)
 | 
			
		||||
                .sessionManagement(AbstractHttpConfigurer::disable);
 | 
			
		||||
        return http.build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Bean
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,10 @@ package org.thingsboard.server.controller;
 | 
			
		||||
 | 
			
		||||
import com.fasterxml.jackson.databind.JsonNode;
 | 
			
		||||
import io.swagger.v3.oas.annotations.Parameter;
 | 
			
		||||
import io.swagger.v3.oas.annotations.media.Content;
 | 
			
		||||
import io.swagger.v3.oas.annotations.media.ExampleObject;
 | 
			
		||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
 | 
			
		||||
import jakarta.servlet.http.HttpServletRequest;
 | 
			
		||||
import lombok.RequiredArgsConstructor;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.http.HttpHeaders;
 | 
			
		||||
@ -36,10 +40,8 @@ import org.thingsboard.server.common.data.id.DeviceId;
 | 
			
		||||
import org.thingsboard.server.config.annotations.ApiOperation;
 | 
			
		||||
import org.thingsboard.server.dao.device.DeviceConnectivityService;
 | 
			
		||||
import org.thingsboard.server.queue.util.TbCoreComponent;
 | 
			
		||||
import org.thingsboard.server.service.security.permission.Operation;
 | 
			
		||||
import org.thingsboard.server.service.security.system.SystemSecurityService;
 | 
			
		||||
 | 
			
		||||
import jakarta.servlet.http.HttpServletRequest;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.net.URISyntaxException;
 | 
			
		||||
 | 
			
		||||
@ -64,16 +66,30 @@ public class DeviceConnectivityController extends BaseController {
 | 
			
		||||
            notes = "Fetch the list of commands to publish device telemetry based on device profile " +
 | 
			
		||||
                    "If the user has the authority of 'Tenant Administrator', the server checks that the device is owned by the same tenant. " +
 | 
			
		||||
                    "If the user has the authority of 'Customer User', the server checks that the device is assigned to the same customer. " +
 | 
			
		||||
                    TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH)
 | 
			
		||||
//    @ApiResponses(value = {
 | 
			
		||||
//            @ApiResponse(code = 200, message = "OK",
 | 
			
		||||
//                    examples = @io.swagger.annotations.Example(
 | 
			
		||||
//                            value = {
 | 
			
		||||
//                                    @io.swagger.annotations.ExampleProperty(
 | 
			
		||||
//                                            mediaType = "application/json",
 | 
			
		||||
//                                            value = "{\"http\":\"curl -v -X POST http://localhost:8080/api/v1/0ySs4FTOn5WU15XLmal8/telemetry --header Content-Type:application/json --data {temperature:25}\"," +
 | 
			
		||||
//                                                    "\"mqtt\":\"mosquitto_pub -d -q 1 -h localhost -t v1/devices/me/telemetry -i myClient1 -u myUsername1 -P myPassword -m {temperature:25}\"," +
 | 
			
		||||
//                                                    "\"coap\":\"coap-client -m POST coap://localhost:5683/api/v1/0ySs4FTOn5WU15XLmal8/telemetry -t json -e {temperature:25}\"}")}))})
 | 
			
		||||
                    TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH,
 | 
			
		||||
            responses = {
 | 
			
		||||
                    @ApiResponse(
 | 
			
		||||
                            responseCode = "200",
 | 
			
		||||
                            description = "OK",
 | 
			
		||||
                            content = @Content(
 | 
			
		||||
                                    mediaType = MediaType.APPLICATION_JSON_VALUE,
 | 
			
		||||
                                    examples = {
 | 
			
		||||
                                            @ExampleObject(
 | 
			
		||||
                                                    name = "http",
 | 
			
		||||
                                                    value = "curl -v -X POST http://localhost:8080/api/v1/0ySs4FTOn5WU15XLmal8/telemetry --header Content-Type:application/json --data {temperature:25}"
 | 
			
		||||
                                            ),
 | 
			
		||||
                                            @ExampleObject(
 | 
			
		||||
                                                    name = "mqtt",
 | 
			
		||||
                                                    value = "mosquitto_pub -d -q 1 -h localhost -t v1/devices/me/telemetry -i myClient1 -u myUsername1 -P myPassword -m {temperature:25}"
 | 
			
		||||
                                            ),
 | 
			
		||||
                                            @ExampleObject(
 | 
			
		||||
                                                    name = "coap",
 | 
			
		||||
                                                    value = "coap-client -m POST coap://localhost:5683/api/v1/0ySs4FTOn5WU15XLmal8/telemetry -t json -e {temperature:25}"
 | 
			
		||||
                                            )
 | 
			
		||||
                                    }
 | 
			
		||||
                            )
 | 
			
		||||
                    )
 | 
			
		||||
            })
 | 
			
		||||
    @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
 | 
			
		||||
    @RequestMapping(value = "/device-connectivity/{deviceId}", method = RequestMethod.GET)
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
@ -81,7 +97,7 @@ public class DeviceConnectivityController extends BaseController {
 | 
			
		||||
                                                      @PathVariable(DEVICE_ID) String strDeviceId, HttpServletRequest request) throws ThingsboardException, URISyntaxException {
 | 
			
		||||
        checkParameter(DEVICE_ID, strDeviceId);
 | 
			
		||||
        DeviceId deviceId = new DeviceId(toUUID(strDeviceId));
 | 
			
		||||
        Device device = checkDeviceId(deviceId, Operation.READ_CREDENTIALS);
 | 
			
		||||
        Device device = checkDeviceId(deviceId, org.thingsboard.server.service.security.permission.Operation.READ_CREDENTIALS);
 | 
			
		||||
 | 
			
		||||
        String baseUrl = systemSecurityService.getBaseUrl(getTenantId(), getCurrentUser().getCustomerId(), request);
 | 
			
		||||
        return deviceConnectivityService.findDevicePublishTelemetryCommands(baseUrl, device);
 | 
			
		||||
@ -89,25 +105,34 @@ public class DeviceConnectivityController extends BaseController {
 | 
			
		||||
 | 
			
		||||
    @ApiOperation(value = "Get commands to launch gateway (getGatewayLaunchCommands)",
 | 
			
		||||
            notes = "Fetch the list of commands for different operation systems to launch a gateway using docker." +
 | 
			
		||||
                    TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH)
 | 
			
		||||
//    @ApiResponses(value = {
 | 
			
		||||
//            @ApiResponse(code = 200, message = "OK",
 | 
			
		||||
//                    examples = @io.swagger.annotations.Example(
 | 
			
		||||
//                            value = {
 | 
			
		||||
//                                    @io.swagger.annotations.ExampleProperty(
 | 
			
		||||
//                                            mediaType = "application/json",
 | 
			
		||||
//                                            value = "{\"mqtt\": {\n" +
 | 
			
		||||
//                                                    "    \"linux\": \"docker run --rm -it -v ~/.tb-gateway/logs:/thingsboard_gateway/logs -v ~/.tb-gateway/extensions:/thingsboard_gateway/extensions -v ~/.tb-gateway/config:/thingsboard_gateway/config --name tbGateway127001 -e host=localhost -e port=1883 -e accessToken=qTe5oDBHPJf0KCSKO8J3 --restart always thingsboard/tb-gateway\",\n" +
 | 
			
		||||
//                                                    "    \"windows\": \"docker run --rm -it -v %HOMEPATH%/tb-gateway/logs:/thingsboard_gateway/logs -v %HOMEPATH%/tb-gateway/extensions:/thingsboard_gateway/extensions -v %HOMEPATH%/tb-gateway/config:/thingsboard_gateway/config --name tbGateway127001 -e host=localhost -e port=1883 -e accessToken=qTe5oDBHPJf0KCSKO8J3 --restart always thingsboard/tb-gateway\"}\n" +
 | 
			
		||||
//                                                    "}")}))})
 | 
			
		||||
                    TENANT_OR_CUSTOMER_AUTHORITY_PARAGRAPH,
 | 
			
		||||
            responses = {
 | 
			
		||||
                    @ApiResponse(
 | 
			
		||||
                            responseCode = "200",
 | 
			
		||||
                            description = "OK",
 | 
			
		||||
                            content = @Content(
 | 
			
		||||
                                    mediaType = MediaType.APPLICATION_JSON_VALUE,
 | 
			
		||||
                                    examples = {
 | 
			
		||||
                                            @ExampleObject(
 | 
			
		||||
                                                    name = "mqtt-linux",
 | 
			
		||||
                                                    value = "docker run --rm -it -v ~/.tb-gateway/logs:/thingsboard_gateway/logs -v ~/.tb-gateway/extensions:/thingsboard_gateway/extensions -v ~/.tb-gateway/config:/thingsboard_gateway/config --name tbGateway127001 -e host=localhost -e port=1883 -e accessToken=qTe5oDBHPJf0KCSKO8J3 --restart always thingsboard/tb-gateway"
 | 
			
		||||
                                            ),
 | 
			
		||||
                                            @ExampleObject(
 | 
			
		||||
                                                    name = "mqtt-windows",
 | 
			
		||||
                                                    value = "docker run --rm -it -v %HOMEPATH%/tb-gateway/logs:/thingsboard_gateway/logs -v %HOMEPATH%/tb-gateway/extensions:/thingsboard_gateway/extensions -v %HOMEPATH%/tb-gateway/config:/thingsboard_gateway/config --name tbGateway127001 -e host=localhost -e port=1883 -e accessToken=qTe5oDBHPJf0KCSKO8J3 --restart always thingsboard/tb-gateway"
 | 
			
		||||
                                            )
 | 
			
		||||
                                    }
 | 
			
		||||
                            )
 | 
			
		||||
                    )
 | 
			
		||||
            })
 | 
			
		||||
    @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
 | 
			
		||||
    @RequestMapping(value = "/device-connectivity/gateway-launch/{deviceId}", method = RequestMethod.GET)
 | 
			
		||||
    @ResponseBody
 | 
			
		||||
    public JsonNode getGatewayLaunchCommands(@Parameter(description = DEVICE_ID_PARAM_DESCRIPTION)
 | 
			
		||||
                                                      @PathVariable(DEVICE_ID) String strDeviceId, HttpServletRequest request) throws ThingsboardException, URISyntaxException {
 | 
			
		||||
                                             @PathVariable(DEVICE_ID) String strDeviceId, HttpServletRequest request) throws ThingsboardException, URISyntaxException {
 | 
			
		||||
        checkParameter(DEVICE_ID, strDeviceId);
 | 
			
		||||
        DeviceId deviceId = new DeviceId(toUUID(strDeviceId));
 | 
			
		||||
        Device device = checkDeviceId(deviceId, Operation.READ_CREDENTIALS);
 | 
			
		||||
        Device device = checkDeviceId(deviceId, org.thingsboard.server.service.security.permission.Operation.READ_CREDENTIALS);
 | 
			
		||||
 | 
			
		||||
        if (!checkIsGateway(device)) {
 | 
			
		||||
            throw new ThingsboardException("The device must be a gateway!", ThingsboardErrorCode.BAD_REQUEST_PARAMS);
 | 
			
		||||
 | 
			
		||||
@ -35,7 +35,7 @@ public class WidgetTypeDetails extends WidgetType implements HasName, HasTenantI
 | 
			
		||||
    @Schema(description = "Base64 encoded thumbnail")
 | 
			
		||||
    private String image;
 | 
			
		||||
    @NoXss
 | 
			
		||||
    @Length(fieldName = "description")
 | 
			
		||||
    @Length(fieldName = "description", max = 1024)
 | 
			
		||||
    @Schema(description = "Description of the widget")
 | 
			
		||||
    private String description;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -39,7 +39,7 @@ public interface WidgetTypeRepository extends JpaRepository<WidgetTypeDetailsEnt
 | 
			
		||||
 | 
			
		||||
    @Query("SELECT new org.thingsboard.server.dao.model.sql.WidgetTypeInfoEntity(wtd) FROM WidgetTypeDetailsEntity wtd WHERE wtd.tenantId = :systemTenantId " +
 | 
			
		||||
            "AND (LOWER(wtd.name) LIKE LOWER(CONCAT('%', :searchText, '%')) " +
 | 
			
		||||
            "OR ((:fullSearch) IS TRUE AND LOWER(wtd.description) LIKE LOWER(CONCAT('%', :searchText, '%'))))")
 | 
			
		||||
            "OR ((:fullSearch) = TRUE AND LOWER(wtd.description) LIKE LOWER(CONCAT('%', :searchText, '%'))))")
 | 
			
		||||
    Page<WidgetTypeInfoEntity> findSystemWidgetTypes(@Param("systemTenantId") UUID systemTenantId,
 | 
			
		||||
                                                     @Param("searchText") String searchText,
 | 
			
		||||
                                                     @Param("fullSearch") boolean fullSearch,
 | 
			
		||||
@ -47,7 +47,7 @@ public interface WidgetTypeRepository extends JpaRepository<WidgetTypeDetailsEnt
 | 
			
		||||
 | 
			
		||||
    @Query("SELECT new org.thingsboard.server.dao.model.sql.WidgetTypeInfoEntity(wtd) FROM WidgetTypeDetailsEntity wtd WHERE wtd.tenantId IN (:tenantId, :nullTenantId) " +
 | 
			
		||||
            "AND (LOWER(wtd.name) LIKE LOWER(CONCAT('%', :searchText, '%')) " +
 | 
			
		||||
            "OR ((:fullSearch) IS TRUE AND LOWER(wtd.description) LIKE LOWER(CONCAT('%', :searchText, '%'))))")
 | 
			
		||||
            "OR ((:fullSearch) = TRUE AND LOWER(wtd.description) LIKE LOWER(CONCAT('%', :searchText, '%'))))")
 | 
			
		||||
    Page<WidgetTypeInfoEntity> findAllTenantWidgetTypesByTenantId(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                                                                  @Param("nullTenantId") UUID nullTenantId,
 | 
			
		||||
                                                                  @Param("searchText") String searchText,
 | 
			
		||||
@ -56,7 +56,7 @@ public interface WidgetTypeRepository extends JpaRepository<WidgetTypeDetailsEnt
 | 
			
		||||
 | 
			
		||||
    @Query("SELECT new org.thingsboard.server.dao.model.sql.WidgetTypeInfoEntity(wtd) FROM WidgetTypeDetailsEntity wtd WHERE wtd.tenantId = :tenantId " +
 | 
			
		||||
            "AND (LOWER(wtd.name) LIKE LOWER(CONCAT('%', :searchText, '%')) " +
 | 
			
		||||
            "OR ((:fullSearch) IS TRUE AND LOWER(wtd.description) LIKE LOWER(CONCAT('%', :searchText, '%'))))")
 | 
			
		||||
            "OR ((:fullSearch) = TRUE AND LOWER(wtd.description) LIKE LOWER(CONCAT('%', :searchText, '%'))))")
 | 
			
		||||
    Page<WidgetTypeInfoEntity> findTenantWidgetTypesByTenantId(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                                                               @Param("searchText") String searchText,
 | 
			
		||||
                                                               @Param("fullSearch") boolean fullSearch,
 | 
			
		||||
 | 
			
		||||
@ -203,7 +203,6 @@ public class TbRestApiCallNodeTest {
 | 
			
		||||
        ArgumentCaptor<TbMsg> msgCaptor = ArgumentCaptor.forClass(TbMsg.class);
 | 
			
		||||
        ArgumentCaptor<TbMsgMetaData> metadataCaptor = ArgumentCaptor.forClass(TbMsgMetaData.class);
 | 
			
		||||
        ArgumentCaptor<String> dataCaptor = ArgumentCaptor.forClass(String.class);
 | 
			
		||||
        //verify(ctx).transformMsg(msgCaptor.capture(), typeCaptor.capture(), originatorCaptor.capture(), metadataCaptor.capture(), dataCaptor.capture());
 | 
			
		||||
        verify(ctx).transformMsg(msgCaptor.capture(), metadataCaptor.capture(), dataCaptor.capture());
 | 
			
		||||
 | 
			
		||||
        assertNotSame(metaData, metadataCaptor.getValue());
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user