diff --git a/hawkbit-mgmt/hawkbit-mgmt-resource/src/test/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtDistributionSetResourceTest.java b/hawkbit-mgmt/hawkbit-mgmt-resource/src/test/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtDistributionSetResourceTest.java index 38e5f7f82..11de5c9f5 100644 --- a/hawkbit-mgmt/hawkbit-mgmt-resource/src/test/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtDistributionSetResourceTest.java +++ b/hawkbit-mgmt/hawkbit-mgmt-resource/src/test/java/org/eclipse/hawkbit/mgmt/rest/resource/MgmtDistributionSetResourceTest.java @@ -49,6 +49,7 @@ import org.eclipse.hawkbit.mgmt.rest.api.MgmtRestConstants; import org.eclipse.hawkbit.mgmt.rest.resource.util.ResourceUtility; import org.eclipse.hawkbit.repository.DistributionSetManagement; import org.eclipse.hawkbit.repository.DistributionSetManagement.Update; +import org.eclipse.hawkbit.repository.Identifiable; import org.eclipse.hawkbit.repository.TargetFilterQueryManagement.Create; import org.eclipse.hawkbit.repository.TargetManagement; import org.eclipse.hawkbit.repository.exception.AssignmentQuotaExceededException; @@ -1329,16 +1330,22 @@ class MgmtDistributionSetResourceTest extends AbstractManagementApiIntegrationTe @Test void filterDistributionSetComplete() throws Exception { final int amount = 10; - testdataFactory.createDistributionSets(amount); + final List dsIds = testdataFactory.createDistributionSets(amount).stream() + .map(Identifiable::getId).map(String::valueOf).toList(); distributionSetManagement .create(DistributionSetManagement.Create.builder() .type(distributionSetTypeManagement.findByKey("os").orElseThrow()) .name("incomplete").version("2") .build()); - final String rsqlFindLikeDs1OrDs2 = "complete==" + Boolean.TRUE; + mvc.perform(get("/rest/v1/distributionsets?q=complete==true")) + .andDo(MockMvcResultPrinter.print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("size", equalTo(10))) + .andExpect(jsonPath("total", equalTo(10))); - mvc.perform(get("/rest/v1/distributionsets?q=" + rsqlFindLikeDs1OrDs2)) + // and more complex (case insensitive) query + mvc.perform(get("/rest/v1/distributionsets?q=complete==true;valid==true;id=IN=(" + String.join(",", dsIds) + ")")) .andDo(MockMvcResultPrinter.print()) .andExpect(status().isOk()) .andExpect(jsonPath("size", equalTo(10))) diff --git a/hawkbit-repository/hawkbit-repository-jpa-ql/src/main/java/org/eclipse/hawkbit/repository/jpa/ql/QLSupport.java b/hawkbit-repository/hawkbit-repository-jpa-ql/src/main/java/org/eclipse/hawkbit/repository/jpa/ql/QLSupport.java index 33dff49f5..d5ea8c13c 100644 --- a/hawkbit-repository/hawkbit-repository-jpa-ql/src/main/java/org/eclipse/hawkbit/repository/jpa/ql/QLSupport.java +++ b/hawkbit-repository/hawkbit-repository-jpa-ql/src/main/java/org/eclipse/hawkbit/repository/jpa/ql/QLSupport.java @@ -146,6 +146,10 @@ public class QLSupport implements ApplicationListener { this.virtualPropertyResolver = virtualPropertyResolver; } + public Node parse(final String query) { + return parse(query, null); + } + public & QueryField> Node parse(final String query, final Class queryFieldType) { return parser.parse(ignoreCase || caseInsensitiveDB ? query.toLowerCase() : query, queryFieldType); } diff --git a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaDistributionSetManagement.java b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaDistributionSetManagement.java index 87933744e..139477bd1 100644 --- a/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaDistributionSetManagement.java +++ b/hawkbit-repository/hawkbit-repository-jpa/src/main/java/org/eclipse/hawkbit/repository/jpa/management/JpaDistributionSetManagement.java @@ -50,7 +50,6 @@ import org.eclipse.hawkbit.repository.jpa.repository.DistributionSetRepository; import org.eclipse.hawkbit.repository.jpa.repository.DistributionSetTagRepository; import org.eclipse.hawkbit.repository.jpa.repository.SoftwareModuleRepository; import org.eclipse.hawkbit.repository.jpa.repository.TargetFilterQueryRepository; -import org.eclipse.hawkbit.repository.jpa.rsql.RsqlParser; import org.eclipse.hawkbit.repository.jpa.specifications.DistributionSetSpecification; import org.eclipse.hawkbit.repository.jpa.utils.QuotaHelper; import org.eclipse.hawkbit.repository.model.DistributionSet; @@ -116,7 +115,7 @@ public class JpaDistributionSetManagement public Page findByRsql(final String rsql, final Pageable pageable) { if (rsql != null && rsql.toLowerCase().contains(COMPLETE)) { // limited support for 'complete' - could be removed in future - final Node node = RsqlParser.parse(rsql); + final Node node = QLSupport.getInstance().parse(rsql); final Specification notDeleted = (root, query, cb) -> cb.equal(root.get(DELETED), false); final List> specList = new ArrayList<>(); specList.add(notDeleted); diff --git a/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/security/SecurityConfiguration.java b/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/security/SecurityConfiguration.java index 5dec7a9ba..64c919bfc 100644 --- a/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/security/SecurityConfiguration.java +++ b/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/security/SecurityConfiguration.java @@ -9,6 +9,9 @@ */ package org.eclipse.hawkbit.ui.simple.security; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + import com.vaadin.flow.spring.security.VaadinAwareSecurityContextHolderStrategyConfiguration; import com.vaadin.flow.spring.security.VaadinSecurityConfigurer; import lombok.extern.slf4j.Slf4j; @@ -27,11 +30,8 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository; import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.authentication.AuthenticationFailureHandler; - -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; import org.springframework.security.web.access.intercept.AuthorizationFilter; +import org.springframework.security.web.authentication.AuthenticationFailureHandler; @EnableWebSecurity @Configuration @@ -41,11 +41,6 @@ import org.springframework.security.web.access.intercept.AuthorizationFilter; public class SecurityConfiguration { private Customizer> oAuth2LoginConfigurerCustomizer; - @Autowired - private UserDetailsSetter userDetailsSetter; - - @Autowired(required = false) - private InMemoryClientRegistrationRepository clientRegistrationRepository; @Autowired(required = false) public void setOAuth2LoginConfigurerCustomizer( @@ -66,7 +61,10 @@ public class SecurityConfiguration { } @Bean - SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + SecurityFilterChain securityFilterChain( + final HttpSecurity http, + final UserDetailsSetter userDetailsSetter, + @Autowired(required = false) InMemoryClientRegistrationRepository clientRegistrationRepository) throws Exception { http.authorizeHttpRequests(authorize -> authorize.requestMatchers("/images/*.png").permitAll()); http.addFilterAfter(userDetailsSetter, AuthorizationFilter.class); return http.with(VaadinSecurityConfigurer.vaadin(), configurer -> { diff --git a/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/security/UserDetailsSetter.java b/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/security/UserDetailsSetter.java index 55ebc0b5f..676f70081 100644 --- a/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/security/UserDetailsSetter.java +++ b/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/security/UserDetailsSetter.java @@ -40,6 +40,7 @@ class UserDetailsSetter extends OncePerRequestFilter { private final SecurityContextHolderStrategy securityContextHolderStrategy; private final GrantedAuthoritiesService grantedAuthoritiesService; + @SuppressWarnings("java:S1066") // java:S1066 - readability preferred @Override protected void doFilterInternal(@NotNull final HttpServletRequest request, @NotNull final HttpServletResponse response, @NotNull final FilterChain filterChain)