From 05e57364a5a63d6bbea4c84951ee5d173ac42d4f Mon Sep 17 00:00:00 2001 From: Luca Bassi Date: Wed, 20 Nov 2024 18:03:25 +0100 Subject: [PATCH] Upgrade to Spring Boot 3 --- compose/.env | 2 +- doc/external-sessions.md | 9 +- pom.xml | 88 ++++---- robot/test/partial_transfer.robot | 16 +- robot/test/propfind.robot | 4 +- .../webdav/authn/AuthenticationUtils.java | 6 +- .../ErrorPageAuthenticationEntryPoint.java | 18 +- .../storm/webdav/authn/PrincipalHelper.java | 6 +- .../italiangrid/storm/webdav/authz/Utils.java | 4 +- .../authz/VOMSAuthenticationDetails.java | 6 +- .../authz/VOMSAuthenticationFilter.java | 2 +- .../authz/VOMSPreAuthDetailsSource.java | 2 +- .../authz/managers/ConsensusBasedManager.java | 17 +- .../managers/FineGrainedAuthzManager.java | 15 ++ .../FineGrainedCopyMoveAuthzManager.java | 15 ++ .../authz/managers/LocalAuthzManager.java | 15 ++ .../authz/managers/MacaroonAuthzManager.java | 15 ++ .../managers/UnanimousDelegatedManager.java | 16 +- .../WlcgScopeAuthzCopyMoveManager.java | 16 +- .../authz/managers/WlcgScopeAuthzManager.java | 15 ++ .../pdp/DefaultPathAuthorizationPdp.java | 2 +- .../authz/pdp/LocalAuthorizationPdp.java | 5 +- .../authz/pdp/PathAuthorizationPolicy.java | 2 +- .../authz/pdp/PathAuthorizationRequest.java | 2 +- .../WlcgStructuredPathAuthorizationPdp.java | 2 +- .../authz/util/CustomHttpMethodMatcher.java | 4 +- .../authz/util/EmptyPathRequestMatcher.java | 2 +- .../storm/webdav/authz/util/MatcherUtils.java | 2 +- .../authz/util/ReadonlyHttpMethodMatcher.java | 4 +- .../util/SaveAuthnAccessDeniedHandler.java | 6 +- .../util/StructuredPathScopeMatcher.java | 4 +- .../authz/util/WriteHttpMethodMatcher.java | 5 +- .../vomap/DefaultVOMapDetailsService.java | 20 +- .../FineGrainedAuthzPolicyProperties.java | 15 +- .../storm/webdav/config/OAuthProperties.java | 4 +- .../ServiceConfigurationProperties.java | 12 +- .../config/ThirdPartyCopyProperties.java | 11 +- .../webdav/config/validation/Principal.java | 8 +- .../config/validation/PrincipalValidator.java | 4 +- .../macaroon/MacaroonRequestFilter.java | 27 ++- .../webdav/metrics/HealthContextListener.java | 8 +- .../metrics/MetricsContextListener.java | 8 +- .../metrics/StorageAreaStatsFilter.java | 14 +- .../webdav/milton/StoRMDirectoryResource.java | 2 +- .../webdav/milton/StoRMFileResource.java | 6 +- .../webdav/milton/StoRMMiltonRequest.java | 4 +- .../storm/webdav/milton/StoRMResource.java | 2 +- .../webdav/milton/StoRMResourceFactory.java | 10 +- .../oauth/authzserver/AccessTokenRequest.java | 6 +- .../authzserver/AuthzServerController.java | 7 +- .../jwt/DefaultJwtTokenIssuer.java | 9 +- .../DefaultOidcConfigurationFetcher.java | 17 +- .../utils/PermissiveBearerTokenResolver.java | 4 +- .../oidc/ClientRegistrationCacheLoader.java | 2 +- .../redirector/DefaultRedirectionService.java | 4 +- .../webdav/redirector/RedirectFilter.java | 17 +- .../webdav/redirector/RedirectionService.java | 4 +- .../server/DefaultJettyServerCustomizer.java | 13 +- .../DefaultJettyServletWebServerFactory.java | 39 ++-- .../webdav/server/DefaultPathResolver.java | 2 +- .../server/DefaultWebServerFactory.java | 10 +- .../server/TLSServerConnectorBuilder.java | 2 +- .../webdav/server/servlet/ChecksumFilter.java | 30 ++- .../servlet/DeleteSanityChecksFilter.java | 14 +- .../server/servlet/LogRequestFilter.java | 16 +- .../webdav/server/servlet/MiltonFilter.java | 18 +- .../MoveRequestSanityChecksFilter.java | 14 +- .../webdav/server/servlet/SAIndexServlet.java | 28 ++- .../webdav/server/servlet/SciTagFilter.java | 12 +- .../servlet/ServerResponseHeaderFilter.java | 12 +- .../webdav/server/servlet/StoRMServlet.java | 136 +++++++++--- .../StoRMResourceHttpContentFactory.java | 88 ++++++++ .../servlet/resource/StormFsResourceView.java | 9 +- .../resource/StormResourceService.java | 96 --------- .../resource/StormResourceWrapper.java | 193 +++++------------- .../tracing/LogbackAccessAuthnInfoFilter.java | 13 +- .../server/tracing/RequestIdFilter.java | 16 +- .../server/util/JettyErrorPageHandler.java | 48 ----- .../storm/webdav/spring/AppConfig.java | 81 ++++---- .../spring/web/AppContextLoaderListener.java | 2 +- .../web/HttpMethodRequestRejectedHandler.java | 6 +- .../storm/webdav/spring/web/MvcConfig.java | 6 +- .../spring/web/ServletConfiguration.java | 11 +- .../tpc/TpcPlainConnectionSocketFactory.java | 56 ----- ...Factory.java => TpcTlsSocketStrategy.java} | 15 +- .../storm/webdav/tpc/TpcUtils.java | 7 +- .../storm/webdav/tpc/TransferFilter.java | 84 ++++---- .../webdav/tpc/TransferFilterSupport.java | 26 +-- .../tpc/http/DropAuthorizationHeaderExec.java | 52 +++++ .../webdav/tpc/http/GetResponseHandler.java | 15 +- .../webdav/tpc/http/HttpTransferClient.java | 51 ++--- .../HttpTransferClientMetricsWrapper.java | 17 +- .../webdav/tpc/http/PutResponseHandler.java | 15 +- .../tpc/http/ResponseHandlerSupport.java | 10 +- .../tpc/http/SuperLaxRedirectStrategy.java | 85 +++----- .../tpc/http/TpcSchemePortResolver.java | 36 ++++ .../webdav/tpc/transfer/TransferClient.java | 10 +- .../tpc/utils/Adler32DigestHeaderHelper.java | 4 +- .../webdav/tpc/utils/CountingFileEntity.java | 4 +- .../storm/webdav/web/OidcLoginController.java | 9 +- .../webdav/web/ViewUtilsInterceptor.java | 4 +- src/main/resources/application-redis.yml | 11 +- .../server/TLSConnectorBuilderTest.java | 4 +- .../servlet/AvoidTraceMethodFilterTest.java | 8 +- .../storm/webdav/test/authz/AuthzTest.java | 6 +- .../AuthorizationIntegrationTests.java | 47 ++--- .../LocalAuthzIntegrationTests.java | 2 +- .../webdav/test/authz/pdp/AuthzPdpTests.java | 2 +- .../test/authz/pdp/LocalAuthzPdpTests.java | 8 +- .../pdp/PolicyPropertiesValidationTests.java | 8 +- .../authz/pdp/ScopePathAuthzPdpTests.java | 5 +- .../test/authz/vomap/PathResolverTests.java | 6 +- .../test/checksum/ChecksumHelperTest.java | 4 +- .../MacaroonRequestIntegrationTests.java | 2 +- .../MacaroonRequestLhcbIntegrationTests.java | 2 +- .../OAuthAuthzServerIntegrationTests.java | 10 +- .../jwk/OidcConfigurationFetcherTest.java | 20 +- .../webdav/test/oauth/jwt/JwtIssuerTest.java | 4 +- .../test/oauth/jwt/TokenServiceTest.java | 2 +- .../test/redirector/RedirectFilterTests.java | 10 +- .../redirector/RedirectionServiceTests.java | 9 +- .../webdav/test/tpc/PullTransferTest.java | 10 +- .../webdav/test/tpc/PushTransferTest.java | 22 +- .../test/tpc/SciTagFilterActivationTest.java | 2 +- .../tpc/TransferFilterActivationTest.java | 5 +- .../test/tpc/TransferFilterTestSupport.java | 12 +- .../tpc/TransferRequestValidationTest.java | 6 +- .../test/tpc/TransferReturnStatusTest.java | 12 +- .../webdav/test/tpc/http/ClientTest.java | 37 ++-- .../test/tpc/http/ClientTestSupport.java | 13 +- .../webdav/test/tpc/http/DigestTest.java | 7 +- .../test/tpc/http/GetResponseHandlerTest.java | 14 +- .../integration/TpcClientRedirectionTest.java | 40 +--- .../http/integration/TpcIntegrationTest.java | 6 +- 134 files changed, 1170 insertions(+), 1153 deletions(-) create mode 100644 src/main/java/org/italiangrid/storm/webdav/server/servlet/resource/StoRMResourceHttpContentFactory.java delete mode 100644 src/main/java/org/italiangrid/storm/webdav/server/servlet/resource/StormResourceService.java delete mode 100644 src/main/java/org/italiangrid/storm/webdav/server/util/JettyErrorPageHandler.java delete mode 100644 src/main/java/org/italiangrid/storm/webdav/tpc/TpcPlainConnectionSocketFactory.java rename src/main/java/org/italiangrid/storm/webdav/tpc/{TpcSSLConnectionSocketFactory.java => TpcTlsSocketStrategy.java} (75%) create mode 100644 src/main/java/org/italiangrid/storm/webdav/tpc/http/DropAuthorizationHeaderExec.java create mode 100644 src/main/java/org/italiangrid/storm/webdav/tpc/http/TpcSchemePortResolver.java diff --git a/compose/.env b/compose/.env index 27d31cbe..dc454781 100644 --- a/compose/.env +++ b/compose/.env @@ -6,4 +6,4 @@ WEBDAV_IMAGE_TAG=latest TS_IMAGE=indigoiam/robot-framework TS_IMAGE_TAG=latest NGINX_IMAGE=baltig.infn.it:4567/cnafsd/ngx_http_voms_module/nginx-httpg-voms -NGINX_IMAGE_TAG=latest \ No newline at end of file +NGINX_IMAGE_TAG=dc82caa1 diff --git a/doc/external-sessions.md b/doc/external-sessions.md index 50c1cb57..e5ec900f 100644 --- a/doc/external-sessions.md +++ b/doc/external-sessions.md @@ -17,9 +17,10 @@ spring: session: store-type: redis - redis: - host: redis.host.example - port: 6379 + data: + redis: + host: redis.host.example + port: 6379 management: health: @@ -30,4 +31,4 @@ management: For other redis connection configuration options, see the [Spring boot reference guide][spring-boot-reference]. [redis]: https://redis.io/ -[spring-boot-reference]: https://docs.spring.io/spring-boot/docs/2.2.9.RELEASE/reference/htmlsingle/#data-properties +[spring-boot-reference]: https://docs.spring.io/spring-boot/appendix/application-properties/index.html#appendix.application-properties.data diff --git a/pom.xml b/pom.xml index 7744b098..48d5ea94 100644 --- a/pom.xml +++ b/pom.xml @@ -11,8 +11,7 @@ org.springframework.boot spring-boot-starter-parent - - 2.7.18 + 3.4.3 @@ -20,44 +19,37 @@ UTF-8 UTF-8 - 3.8.0 - - 2.4 - 2.4 - 2.3 1.9.0 - 0.8.8 + 0.8.12 17 - - 2.7.18 - 5.8.15 - italiangrid_storm-webdav italiangrid https://sonarcloud.io 3.3.3 - 2.8.0.3 + 4.0.4.2305 + + 1.9.0 + 1.3.0 - 2.3 - 1.2 - 1.0 - 1.1 + 4.2.30 + 11.0.24 + 5.4.2 - 4.2.2 - 4.2.1 + 2.0.6 - 32.0.0-jre + 33.4.0-jre - 1.0.5.1 + 1.0.12 - 2.3.3.RELEASE 6.0.2 - 5.5.1 + 5.15.0 + + 3.1.2.RELEASE @@ -77,8 +69,8 @@ - pl.project13.maven - git-commit-id-plugin + io.github.git-commit-id + git-commit-id-maven-plugin @@ -313,11 +305,13 @@ io.dropwizard.metrics metrics-core + ${metrics.version} io.dropwizard.metrics - metrics-jetty9 + metrics-jetty12 + ${metrics.version} org.eclipse.jetty @@ -328,12 +322,20 @@ io.dropwizard.metrics - metrics-servlets + metrics-jetty12-ee10 + ${metrics.version} + + + + io.dropwizard.metrics + metrics-jakarta-servlets + ${metrics.version} org.eclipse.jetty.http2 http2-server + ${http-server.version} @@ -358,23 +360,15 @@ - ch.qos.logback - logback-access - - - - ch.qos.logback - logback-core + ch.qos.logback.access + logback-access-jetty12 + ${logback-access.version} - ch.qos.logback - logback-classic - - - - org.apache.httpcomponents - httpclient + org.apache.httpcomponents.client5 + httpclient5 + ${httpclient5.version} commons-logging @@ -388,12 +382,6 @@ jetty-rewrite - - commons-lang - commons-lang - ${commons-lang.version} - - org.apache.commons commons-csv @@ -431,12 +419,6 @@ ${milton.version} - - commons-cli - commons-cli - ${commons-cli.version} - - org.mockito mockito-core diff --git a/robot/test/partial_transfer.robot b/robot/test/partial_transfer.robot index 0f1642ce..27f8bab7 100644 --- a/robot/test/partial_transfer.robot +++ b/robot/test/partial_transfer.robot @@ -30,14 +30,14 @@ Partial Get works [Tags] voms get [Setup] Setup file partial_works test123456789 ${url} DAVS URL partial_works - ${rc} ${out} Curl Voms Get Success ${url} ${curl.opts.default} -H "Range: 0-3" + ${rc} ${out} Curl Voms Get Success ${url} ${curl.opts.default} -H "Range: bytes=0-3" Should Contain ${out} test Should Not Contain ${out} 123456789 Should Contain ${out} Content-Length: 4 - ${rc} ${out} Curl Voms Get Success ${url} ${curl.opts.default} -H "Range: 4-7" + ${rc} ${out} Curl Voms Get Success ${url} ${curl.opts.default} -H "Range: bytes=4-7" Should Contain ${out} 1234 Should Contain ${out} Content-Length: 4 - ${rc} ${out} Curl Voms Get Success ${url} ${curl.opts.default} -H "Range: 9-12" + ${rc} ${out} Curl Voms Get Success ${url} ${curl.opts.default} -H "Range: bytes=9-12" Should Contain ${out} 6789 Should Contain ${out} Content-Length: 4 [Teardown] Teardown file partial_works @@ -46,7 +46,7 @@ Partial Get with multiple range [Tags] voms get [Setup] Setup file partial_works test123456789 ${url} DAVS URL partial_works - ${rc} ${out} Curl Voms Get Success ${url} ${curl.opts.default} -H "Range: 1-3,5-7,10-11" + ${rc} ${out} Curl Voms Get Success ${url} ${curl.opts.default} -H "Range: bytes=1-3,5-7,10-11" Should Contain ${out} Content-Range: bytes 1-3/13 Should Contain ${out} est Should Contain ${out} Content-Range: bytes 5-7/13 @@ -59,7 +59,7 @@ Partial Get not entirely on range [Tags] voms get [Setup] Setup file partial_works test123456789 ${url} DAVS URL partial_works - ${rc} ${out} Curl Voms Get Success ${url} ${curl.opts.default} -H "Range: 11-13" + ${rc} ${out} Curl Voms Get Success ${url} ${curl.opts.default} -H "Range: bytes=11-13" Should Contain ${out} Content-Range: bytes 11-12/13 Should Contain ${out} 89 Should Contain ${out} Content-Length: 2 @@ -69,7 +69,7 @@ Partial Get out of range [Tags] voms get [Setup] Setup file partial_works test123456789 ${url} DAVS URL partial_works - ${rc} ${out} Curl Voms Get Failure ${url} ${curl.opts.default} -H "Range: 20-24" + ${rc} ${out} Curl Voms Get Failure ${url} ${curl.opts.default} -H "Range: bytes=20-24" Should Match Regexp ${out} 416 Requested Range Not Satisfiable|416 Range Not Satisfiable [Teardown] Teardown file partial_works @@ -77,7 +77,7 @@ Partial Get out in one of multiple range [Tags] voms get [Setup] Setup file partial_works test123456789 ${url} DAVS URL partial_works - ${rc} ${out} Curl Voms Get Success ${url} ${curl.opts.default} -H "Range: 1-3,20-24" + ${rc} ${out} Curl Voms Get Success ${url} ${curl.opts.default} -H "Range: bytes=1-3,20-24" Should Contain ${out} Content-Range: bytes 1-3/13 Should Contain ${out} est Should Contain ${out} Content-Length: 3 @@ -90,4 +90,4 @@ Partial Put works ${dest} DAVS Url pput_test ${rc} ${out} Curl Voms Put Success ${TEMPDIR}/pput0_test ${dest} ${rc} ${out} Curl Voms Put Success ${TEMPDIR}/pput1_test ${dest} ${opts} - [Teardown] Partial Put Teardown \ No newline at end of file + [Teardown] Partial Put Teardown diff --git a/robot/test/propfind.robot b/robot/test/propfind.robot index 113aad9a..d296981c 100644 --- a/robot/test/propfind.robot +++ b/robot/test/propfind.robot @@ -22,7 +22,7 @@ Get PROPFIND PROPNAME body [Return] ${output} Get PROPFIND PROP body [Arguments] ${propname} - ${output} Set variable "" + ${output} Set variable "" [Return] ${output} @@ -71,4 +71,4 @@ Propfind status property works ${body} Get PROPFIND PROP body status ${rc} ${out} Curl Voms PROPFIND ${url} ${body} Should Contain ${out} HTTP/1.1 200 OK - [Teardown] Teardown file propfind_works \ No newline at end of file + [Teardown] Teardown file propfind_works diff --git a/src/main/java/org/italiangrid/storm/webdav/authn/AuthenticationUtils.java b/src/main/java/org/italiangrid/storm/webdav/authn/AuthenticationUtils.java index ae4b373b..37136125 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authn/AuthenticationUtils.java +++ b/src/main/java/org/italiangrid/storm/webdav/authn/AuthenticationUtils.java @@ -32,8 +32,7 @@ private AuthenticationUtils() { public static String getPalatableSubject(Authentication authn) { if (authn == null || authn instanceof AnonymousAuthenticationToken) { return "Anonymous user"; - } else if (authn instanceof OAuth2AuthenticationToken) { - OAuth2AuthenticationToken authToken = (OAuth2AuthenticationToken) authn; + } else if (authn instanceof OAuth2AuthenticationToken authToken) { Map attributes = authToken.getPrincipal().getAttributes(); String subjectIssuer = String.format("%s @ %s", attributes.get("sub"), attributes.get("iss")); @@ -46,8 +45,7 @@ public static String getPalatableSubject(Authentication authn) { } else if (authn instanceof PreAuthenticatedAuthenticationToken) { return authn.getName(); - } else if (authn instanceof JwtAuthenticationToken) { - JwtAuthenticationToken jwtToken = (JwtAuthenticationToken) authn; + } else if (authn instanceof JwtAuthenticationToken jwtToken) { return String.format("%s @ %s", jwtToken.getToken().getSubject(), jwtToken.getToken().getIssuer()); } else { diff --git a/src/main/java/org/italiangrid/storm/webdav/authn/ErrorPageAuthenticationEntryPoint.java b/src/main/java/org/italiangrid/storm/webdav/authn/ErrorPageAuthenticationEntryPoint.java index 80216572..14b2c6f7 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authn/ErrorPageAuthenticationEntryPoint.java +++ b/src/main/java/org/italiangrid/storm/webdav/authn/ErrorPageAuthenticationEntryPoint.java @@ -19,10 +19,10 @@ import java.util.LinkedHashMap; import java.util.Map; -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.RequestDispatcher; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.http.HttpStatus; import org.springframework.security.core.AuthenticationException; @@ -46,8 +46,8 @@ public void commence(HttpServletRequest request, HttpServletResponse response, response.setStatus(status.value()); - if (authException instanceof OAuth2AuthenticationException) { - OAuth2Error error = ((OAuth2AuthenticationException) authException).getError(); + if (authException instanceof OAuth2AuthenticationException oAuth2AuthenticationException) { + OAuth2Error error = oAuth2AuthenticationException.getError(); parameters.put("error", error.getErrorCode()); @@ -59,14 +59,12 @@ public void commence(HttpServletRequest request, HttpServletResponse response, parameters.put("error_uri", error.getUri()); } - if (error instanceof BearerTokenError) { - BearerTokenError bearerTokenError = (BearerTokenError) error; - + if (error instanceof BearerTokenError bearerTokenError) { if (StringUtils.hasText(bearerTokenError.getScope())) { parameters.put("scope", bearerTokenError.getScope()); } - status = ((BearerTokenError) error).getHttpStatus(); + status = bearerTokenError.getHttpStatus(); response.setStatus(status.value()); } } else { diff --git a/src/main/java/org/italiangrid/storm/webdav/authn/PrincipalHelper.java b/src/main/java/org/italiangrid/storm/webdav/authn/PrincipalHelper.java index 1b2427dc..db6aa8c4 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authn/PrincipalHelper.java +++ b/src/main/java/org/italiangrid/storm/webdav/authn/PrincipalHelper.java @@ -44,14 +44,12 @@ public PrincipalHelper(ServiceConfigurationProperties config) throws MalformedUR public String getPrincipalAsString(Authentication authn) { if (authn == null || authn instanceof AnonymousAuthenticationToken) { return ANONYMOUS; - } else if (authn instanceof OAuth2AuthenticationToken) { - OAuth2AuthenticationToken authToken = (OAuth2AuthenticationToken) authn; + } else if (authn instanceof OAuth2AuthenticationToken authToken) { Map attributes = authToken.getPrincipal().getAttributes(); return String.format("%s@%s", attributes.get("sub"), attributes.get("iss")); } else if (authn instanceof PreAuthenticatedAuthenticationToken) { return authn.getName(); - } else if (authn instanceof JwtAuthenticationToken) { - JwtAuthenticationToken jwtToken = (JwtAuthenticationToken) authn; + } else if (authn instanceof JwtAuthenticationToken jwtToken) { if (localAuthzServerIssuer.isPresent() && localAuthzServerIssuer.get().equals(jwtToken.getToken().getIssuer())) { return jwtToken.getToken().getSubject(); diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/Utils.java b/src/main/java/org/italiangrid/storm/webdav/authz/Utils.java index 8ed45b50..5b9f11da 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/Utils.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/Utils.java @@ -19,13 +19,13 @@ import java.util.Optional; import javax.security.auth.x500.X500Principal; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import eu.emi.security.authn.x509.proxy.ProxyUtils; public class Utils { - public static final String X509_CERT_REQ_ATTR = "javax.servlet.request.X509Certificate"; + public static final String X509_CERT_REQ_ATTR = "jakarta.servlet.request.X509Certificate"; private Utils() { diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/VOMSAuthenticationDetails.java b/src/main/java/org/italiangrid/storm/webdav/authz/VOMSAuthenticationDetails.java index 653c1197..68f5d69a 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/VOMSAuthenticationDetails.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/VOMSAuthenticationDetails.java @@ -18,7 +18,7 @@ import java.util.Collection; import java.util.List; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.italiangrid.voms.VOMSAttribute; import org.springframework.security.core.GrantedAuthority; @@ -26,9 +26,9 @@ public class VOMSAuthenticationDetails extends PreAuthenticatedGrantedAuthoritiesWebAuthenticationDetails { - + private static final long serialVersionUID = 1L; - + // Transient here is due to the fact that VOMSAttributesImpl is not serializable! final transient List vomsAttributes; diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/VOMSAuthenticationFilter.java b/src/main/java/org/italiangrid/storm/webdav/authz/VOMSAuthenticationFilter.java index 843424ec..4a12fab1 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/VOMSAuthenticationFilter.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/VOMSAuthenticationFilter.java @@ -18,7 +18,7 @@ import java.security.cert.X509Certificate; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.core.Authentication; diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/VOMSPreAuthDetailsSource.java b/src/main/java/org/italiangrid/storm/webdav/authz/VOMSPreAuthDetailsSource.java index 8bb284c5..a85f6410 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/VOMSPreAuthDetailsSource.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/VOMSPreAuthDetailsSource.java @@ -24,7 +24,7 @@ import java.util.Set; import javax.security.auth.x500.X500Principal; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.italiangrid.storm.webdav.authz.vomap.VOMapDetailsService; import org.italiangrid.voms.VOMSAttribute; diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/managers/ConsensusBasedManager.java b/src/main/java/org/italiangrid/storm/webdav/authz/managers/ConsensusBasedManager.java index 62c8d6c2..18d38bf5 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/managers/ConsensusBasedManager.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/managers/ConsensusBasedManager.java @@ -22,6 +22,7 @@ import org.slf4j.LoggerFactory; import org.springframework.security.authorization.AuthorizationDecision; import org.springframework.security.authorization.AuthorizationManager; +import org.springframework.security.authorization.AuthorizationResult; import org.springframework.security.core.Authentication; import org.springframework.security.web.access.intercept.RequestAuthorizationContext; @@ -39,14 +40,28 @@ public ConsensusBasedManager(String name, this.managers = managers; } + /** + * @deprecated To be remove in Spring Security 7 + */ + @Deprecated(forRemoval = true) @Override public AuthorizationDecision check(Supplier authentication, RequestAuthorizationContext requestAuthorizationContext) { + if (authorize(authentication, + requestAuthorizationContext) instanceof AuthorizationDecision authorizationDecision) { + return authorizationDecision; + } + return null; + } + + @Override + public AuthorizationResult authorize(Supplier authentication, + RequestAuthorizationContext requestAuthorizationContext) { int grant = 0; int notGrant = 0; for (AuthorizationManager manager : managers) { - AuthorizationDecision result = manager.check(authentication, requestAuthorizationContext); + AuthorizationResult result = manager.authorize(authentication, requestAuthorizationContext); if (LOG.isDebugEnabled()) { LOG.debug("Voter: {}, returned: {}", manager, result); diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/managers/FineGrainedAuthzManager.java b/src/main/java/org/italiangrid/storm/webdav/authz/managers/FineGrainedAuthzManager.java index 68039afa..a2621c80 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/managers/FineGrainedAuthzManager.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/managers/FineGrainedAuthzManager.java @@ -27,6 +27,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.authorization.AuthorizationDecision; +import org.springframework.security.authorization.AuthorizationResult; import org.springframework.security.core.Authentication; import org.springframework.security.web.access.intercept.RequestAuthorizationContext; @@ -40,9 +41,23 @@ public FineGrainedAuthzManager(ServiceConfigurationProperties config, PathResolv super(config, resolver, pdp, localUrlService, true); } + /** + * @deprecated To be remove in Spring Security 7 + */ + @Deprecated(forRemoval = true) @Override public AuthorizationDecision check(Supplier authentication, RequestAuthorizationContext requestAuthorizationContext) { + if (authorize(authentication, + requestAuthorizationContext) instanceof AuthorizationDecision authorizationDecision) { + return authorizationDecision; + } + return null; + } + + @Override + public AuthorizationResult authorize(Supplier authentication, + RequestAuthorizationContext requestAuthorizationContext) { final String requestPath = getRequestPath(requestAuthorizationContext.getRequest()); StorageAreaInfo sa = resolver.resolveStorageArea(requestPath); diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/managers/FineGrainedCopyMoveAuthzManager.java b/src/main/java/org/italiangrid/storm/webdav/authz/managers/FineGrainedCopyMoveAuthzManager.java index 6e5d4d38..195e7b23 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/managers/FineGrainedCopyMoveAuthzManager.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/managers/FineGrainedCopyMoveAuthzManager.java @@ -32,6 +32,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.authorization.AuthorizationDecision; +import org.springframework.security.authorization.AuthorizationResult; import org.springframework.security.core.Authentication; import org.springframework.security.web.access.intercept.RequestAuthorizationContext; @@ -44,9 +45,23 @@ public FineGrainedCopyMoveAuthzManager(ServiceConfigurationProperties config, super(config, resolver, pdp, localUrlService, true); } + /** + * @deprecated To be remove in Spring Security 7 + */ + @Deprecated(forRemoval = true) @Override public AuthorizationDecision check(Supplier authentication, RequestAuthorizationContext requestAuthorizationContext) { + if (authorize(authentication, + requestAuthorizationContext) instanceof AuthorizationDecision authorizationDecision) { + return authorizationDecision; + } + return null; + } + + @Override + public AuthorizationResult authorize(Supplier authentication, + RequestAuthorizationContext requestAuthorizationContext) { if (!isCopyOrMoveRequest(requestAuthorizationContext.getRequest())) { return null; diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/managers/LocalAuthzManager.java b/src/main/java/org/italiangrid/storm/webdav/authz/managers/LocalAuthzManager.java index 9cb2c5a7..f1cb5744 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/managers/LocalAuthzManager.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/managers/LocalAuthzManager.java @@ -29,6 +29,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.authorization.AuthorizationDecision; +import org.springframework.security.authorization.AuthorizationResult; import org.springframework.security.core.Authentication; import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.security.web.access.intercept.RequestAuthorizationContext; @@ -60,9 +61,23 @@ private boolean isLocalAuthzToken(JwtAuthenticationToken token) { } } + /** + * @deprecated To be remove in Spring Security 7 + */ + @Deprecated(forRemoval = true) @Override public AuthorizationDecision check(Supplier authentication, RequestAuthorizationContext requestAuthorizationContext) { + if (authorize(authentication, + requestAuthorizationContext) instanceof AuthorizationDecision authorizationDecision) { + return authorizationDecision; + } + return null; + } + + @Override + public AuthorizationResult authorize(Supplier authentication, + RequestAuthorizationContext requestAuthorizationContext) { if (!(authentication.get() instanceof JwtAuthenticationToken)) { return null; diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/managers/MacaroonAuthzManager.java b/src/main/java/org/italiangrid/storm/webdav/authz/managers/MacaroonAuthzManager.java index 59147a90..43953010 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/managers/MacaroonAuthzManager.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/managers/MacaroonAuthzManager.java @@ -20,15 +20,30 @@ import org.italiangrid.storm.webdav.macaroon.MacaroonRequestFilter; import org.springframework.security.authorization.AuthorizationDecision; import org.springframework.security.authorization.AuthorizationManager; +import org.springframework.security.authorization.AuthorizationResult; import org.springframework.security.core.Authentication; import org.springframework.security.web.access.intercept.RequestAuthorizationContext; import org.springframework.util.Assert; public class MacaroonAuthzManager implements AuthorizationManager { + /** + * @deprecated To be remove in Spring Security 7 + */ + @Deprecated(forRemoval = true) @Override public AuthorizationDecision check(Supplier authentication, RequestAuthorizationContext requestAuthorizationContext) { + if (authorize(authentication, + requestAuthorizationContext) instanceof AuthorizationDecision authorizationDecision) { + return authorizationDecision; + } + return null; + } + + @Override + public AuthorizationResult authorize(Supplier authentication, + RequestAuthorizationContext requestAuthorizationContext) { Assert.notNull(authentication.get(), "authentication must not be null"); Assert.notNull(requestAuthorizationContext, "requestAuthorizationContext must not be null"); diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/managers/UnanimousDelegatedManager.java b/src/main/java/org/italiangrid/storm/webdav/authz/managers/UnanimousDelegatedManager.java index b5279138..a1cf9f1d 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/managers/UnanimousDelegatedManager.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/managers/UnanimousDelegatedManager.java @@ -22,6 +22,7 @@ import org.slf4j.LoggerFactory; import org.springframework.security.authorization.AuthorizationDecision; import org.springframework.security.authorization.AuthorizationManager; +import org.springframework.security.authorization.AuthorizationResult; import org.springframework.security.core.Authentication; import org.springframework.security.web.access.intercept.RequestAuthorizationContext; @@ -40,13 +41,26 @@ private UnanimousDelegatedManager(String name, this.managers = managers; } + /** + * @deprecated To be remove in Spring Security 7 + */ + @Deprecated(forRemoval = true) @Override public AuthorizationDecision check(Supplier authentication, RequestAuthorizationContext filter) { + if (authorize(authentication, filter) instanceof AuthorizationDecision authorizationDecision) { + return authorizationDecision; + } + return null; + } + + @Override + public AuthorizationResult authorize(Supplier authentication, + RequestAuthorizationContext filter) { int grant = 0; for (AuthorizationManager manager : managers) { - AuthorizationDecision result = manager.check(authentication, filter); + AuthorizationResult result = manager.authorize(authentication, filter); if (LOG.isDebugEnabled()) { LOG.debug("Voter: {}, returned: {}", manager, result); diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/managers/WlcgScopeAuthzCopyMoveManager.java b/src/main/java/org/italiangrid/storm/webdav/authz/managers/WlcgScopeAuthzCopyMoveManager.java index f431743d..1697e547 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/managers/WlcgScopeAuthzCopyMoveManager.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/managers/WlcgScopeAuthzCopyMoveManager.java @@ -32,6 +32,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.authorization.AuthorizationDecision; +import org.springframework.security.authorization.AuthorizationResult; import org.springframework.security.core.Authentication; import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.security.web.access.intercept.RequestAuthorizationContext; @@ -45,10 +46,23 @@ public WlcgScopeAuthzCopyMoveManager(ServiceConfigurationProperties config, Path super(config, resolver, pdp, localUrlService, true); } - + /** + * @deprecated To be remove in Spring Security 7 + */ + @Deprecated(forRemoval = true) @Override public AuthorizationDecision check(Supplier authentication, RequestAuthorizationContext requestAuthorizationContext) { + if (authorize(authentication, + requestAuthorizationContext) instanceof AuthorizationDecision authorizationDecision) { + return authorizationDecision; + } + return null; + } + + @Override + public AuthorizationResult authorize(Supplier authentication, + RequestAuthorizationContext requestAuthorizationContext) { if (!(authentication.get() instanceof JwtAuthenticationToken)) { return null; diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/managers/WlcgScopeAuthzManager.java b/src/main/java/org/italiangrid/storm/webdav/authz/managers/WlcgScopeAuthzManager.java index 36e0c2e5..d73895cf 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/managers/WlcgScopeAuthzManager.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/managers/WlcgScopeAuthzManager.java @@ -27,6 +27,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.authorization.AuthorizationDecision; +import org.springframework.security.authorization.AuthorizationResult; import org.springframework.security.core.Authentication; import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.security.web.access.intercept.RequestAuthorizationContext; @@ -41,9 +42,23 @@ public WlcgScopeAuthzManager(ServiceConfigurationProperties config, PathResolver super(config, resolver, pdp, localUrlService, true); } + /** + * @deprecated To be remove in Spring Security 7 + */ + @Deprecated(forRemoval = true) @Override public AuthorizationDecision check(Supplier authentication, RequestAuthorizationContext requestAuthorizationContext) { + if (authorize(authentication, + requestAuthorizationContext) instanceof AuthorizationDecision authorizationDecision) { + return authorizationDecision; + } + return null; + } + + @Override + public AuthorizationResult authorize(Supplier authentication, + RequestAuthorizationContext requestAuthorizationContext) { if (!(authentication.get() instanceof JwtAuthenticationToken)) { return null; diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/pdp/DefaultPathAuthorizationPdp.java b/src/main/java/org/italiangrid/storm/webdav/authz/pdp/DefaultPathAuthorizationPdp.java index b3f0ff46..9d4a85e7 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/pdp/DefaultPathAuthorizationPdp.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/pdp/DefaultPathAuthorizationPdp.java @@ -15,7 +15,7 @@ */ package org.italiangrid.storm.webdav.authz.pdp; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/pdp/LocalAuthorizationPdp.java b/src/main/java/org/italiangrid/storm/webdav/authz/pdp/LocalAuthorizationPdp.java index 03c294df..1ac0d0d8 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/pdp/LocalAuthorizationPdp.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/pdp/LocalAuthorizationPdp.java @@ -28,7 +28,7 @@ import java.util.Set; import java.util.function.Supplier; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.italiangrid.storm.webdav.config.ServiceConfigurationProperties; import org.italiangrid.storm.webdav.oauth.authzserver.ResourceAccessTokenRequest.Permission; @@ -97,8 +97,7 @@ public PathAuthorizationResult authorizeRequest(PathAuthorizationRequest authzRe if (LOG.isDebugEnabled()) { if (originIp.isPresent()) { LOG.debug("Ok: {}, pathMatches: {}, permMatches: {}, originMatches: {}", ok, pathMatches, - permMatches, - originMatches); + permMatches, originMatches); } else { LOG.debug("Ok: {}, pathMatches: {}, permMatches: {}", ok, pathMatches, permMatches); } diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/pdp/PathAuthorizationPolicy.java b/src/main/java/org/italiangrid/storm/webdav/authz/pdp/PathAuthorizationPolicy.java index 408f713b..bced3e2b 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/pdp/PathAuthorizationPolicy.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/pdp/PathAuthorizationPolicy.java @@ -19,7 +19,7 @@ import java.util.List; import java.util.UUID; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.italiangrid.storm.webdav.authz.pdp.principal.PrincipalMatcher; import org.slf4j.Logger; diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/pdp/PathAuthorizationRequest.java b/src/main/java/org/italiangrid/storm/webdav/authz/pdp/PathAuthorizationRequest.java index 9b00326a..294639eb 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/pdp/PathAuthorizationRequest.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/pdp/PathAuthorizationRequest.java @@ -15,7 +15,7 @@ */ package org.italiangrid.storm.webdav.authz.pdp; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.italiangrid.storm.webdav.server.servlet.WebDAVMethod; import org.springframework.lang.Nullable; diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/pdp/WlcgStructuredPathAuthorizationPdp.java b/src/main/java/org/italiangrid/storm/webdav/authz/pdp/WlcgStructuredPathAuthorizationPdp.java index e760f1a1..61a365db 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/pdp/WlcgStructuredPathAuthorizationPdp.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/pdp/WlcgStructuredPathAuthorizationPdp.java @@ -27,7 +27,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.italiangrid.storm.webdav.authz.util.MatcherUtils; import org.italiangrid.storm.webdav.authz.util.StructuredPathScopeMatcher; diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/util/CustomHttpMethodMatcher.java b/src/main/java/org/italiangrid/storm/webdav/authz/util/CustomHttpMethodMatcher.java index c49458be..ded39869 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/util/CustomHttpMethodMatcher.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/util/CustomHttpMethodMatcher.java @@ -17,7 +17,7 @@ import java.util.Set; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,5 +53,5 @@ public boolean matches(HttpServletRequest request) { public String toString() { return "CustomHttpMethodMatcher [supportedMethods=" + supportedMethods + "]"; } - + } diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/util/EmptyPathRequestMatcher.java b/src/main/java/org/italiangrid/storm/webdav/authz/util/EmptyPathRequestMatcher.java index 1618fc59..857e3dc5 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/util/EmptyPathRequestMatcher.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/util/EmptyPathRequestMatcher.java @@ -15,7 +15,7 @@ */ package org.italiangrid.storm.webdav.authz.util; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.security.web.util.matcher.RequestMatcher; import org.springframework.util.StringUtils; diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/util/MatcherUtils.java b/src/main/java/org/italiangrid/storm/webdav/authz/util/MatcherUtils.java index f084d252..fd09d055 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/util/MatcherUtils.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/util/MatcherUtils.java @@ -15,7 +15,7 @@ */ package org.italiangrid.storm.webdav.authz.util; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.italiangrid.storm.webdav.authz.pdp.PathAuthorizationRequest; diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/util/ReadonlyHttpMethodMatcher.java b/src/main/java/org/italiangrid/storm/webdav/authz/util/ReadonlyHttpMethodMatcher.java index a5aa267e..c7ac4062 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/util/ReadonlyHttpMethodMatcher.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/util/ReadonlyHttpMethodMatcher.java @@ -19,7 +19,7 @@ import java.util.Set; import java.util.TreeSet; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.security.web.util.matcher.AndRequestMatcher; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; @@ -54,5 +54,5 @@ public boolean matches(HttpServletRequest request) { public String toString() { return "ReadonlyHttpMethodMatcher [delegate=" + delegate + "]"; } - + } diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/util/SaveAuthnAccessDeniedHandler.java b/src/main/java/org/italiangrid/storm/webdav/authz/util/SaveAuthnAccessDeniedHandler.java index b563464d..4cd48a8d 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/util/SaveAuthnAccessDeniedHandler.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/util/SaveAuthnAccessDeniedHandler.java @@ -17,9 +17,9 @@ import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.italiangrid.storm.webdav.authn.PrincipalHelper; import org.italiangrid.storm.webdav.server.tracing.LogbackAccessAuthnInfoFilter; diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/util/StructuredPathScopeMatcher.java b/src/main/java/org/italiangrid/storm/webdav/authz/util/StructuredPathScopeMatcher.java index 35a258ca..fc1345b5 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/util/StructuredPathScopeMatcher.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/util/StructuredPathScopeMatcher.java @@ -20,7 +20,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.annotation.Generated; +import jakarta.annotation.Generated; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -83,7 +83,7 @@ public boolean matchesPathIncludingParents(String path) { public static StructuredPathScopeMatcher fromString(String scope) { final int sepIndex = scope.indexOf(SEP); final String prefix = scope.substring(0, sepIndex); - final String path = scope.substring(sepIndex+1, scope.length()); + final String path = scope.substring(sepIndex + 1, scope.length()); return new StructuredPathScopeMatcher(prefix, path); } diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/util/WriteHttpMethodMatcher.java b/src/main/java/org/italiangrid/storm/webdav/authz/util/WriteHttpMethodMatcher.java index e91535bb..90301a5e 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/util/WriteHttpMethodMatcher.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/util/WriteHttpMethodMatcher.java @@ -20,7 +20,7 @@ import java.util.Set; import java.util.TreeSet; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.security.web.util.matcher.AndRequestMatcher; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; @@ -31,8 +31,7 @@ public class WriteHttpMethodMatcher implements RequestMatcher { // COPY is now classified as a write method since there's a single case // where COPY is a read-only method: TPC push copy, while local COPY (in the same storage // area) and TPC pull COPY all require write privileges - private static final Set METHODS = - new TreeSet<>(asList("PUT", "MKCOL", "MOVE", "COPY")); + private static final Set METHODS = new TreeSet<>(asList("PUT", "MKCOL", "MOVE", "COPY")); private final RequestMatcher delegate; diff --git a/src/main/java/org/italiangrid/storm/webdav/authz/vomap/DefaultVOMapDetailsService.java b/src/main/java/org/italiangrid/storm/webdav/authz/vomap/DefaultVOMapDetailsService.java index fc68937f..fb330a5b 100644 --- a/src/main/java/org/italiangrid/storm/webdav/authz/vomap/DefaultVOMapDetailsService.java +++ b/src/main/java/org/italiangrid/storm/webdav/authz/vomap/DefaultVOMapDetailsService.java @@ -54,18 +54,10 @@ public DefaultVOMapDetailsService(Set providers, private void scheduleRefresh() { - Runnable refreshTask = new Runnable() { + Runnable refreshTask = this::refresh; - @Override - public void run() { - - refresh(); - - } - }; - - scheduler.scheduleWithFixedDelay(refreshTask, - refreshPeriodInSeconds, + scheduler.scheduleWithFixedDelay(refreshTask, + refreshPeriodInSeconds, refreshPeriodInSeconds, TimeUnit.SECONDS); @@ -76,7 +68,7 @@ public Set getPrincipalVOs(X500Principal principal) { Assert.notNull(principal, "PrincipalProperties cannot be null"); - HashSet voNames = new HashSet(); + HashSet voNames = new HashSet<>(); for (VOMembershipProvider p : providers) { @@ -92,9 +84,9 @@ protected void refresh() { logger.debug("Refreshing vo membership providers..."); for (VOMembershipProvider p : providers) { - if (p instanceof Refreshable) { + if (p instanceof Refreshable refreshable) { try { - ((Refreshable) p).refresh(); + refreshable.refresh(); } catch (Throwable t) { logger.warn( "Exception caught refreshing VOMembership provider for VO: {}. {}", diff --git a/src/main/java/org/italiangrid/storm/webdav/config/FineGrainedAuthzPolicyProperties.java b/src/main/java/org/italiangrid/storm/webdav/config/FineGrainedAuthzPolicyProperties.java index 7cfb2bf7..346b981f 100644 --- a/src/main/java/org/italiangrid/storm/webdav/config/FineGrainedAuthzPolicyProperties.java +++ b/src/main/java/org/italiangrid/storm/webdav/config/FineGrainedAuthzPolicyProperties.java @@ -20,10 +20,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotEmpty; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; import org.italiangrid.storm.webdav.authz.pdp.PolicyEffect; import org.italiangrid.storm.webdav.config.validation.Principal; @@ -73,11 +74,7 @@ public void setParams(Map params) { } public enum Action { - READ, - WRITE, - DELETE, - LIST, - ALL + READ, WRITE, DELETE, LIST, ALL } @NotBlank @@ -130,7 +127,7 @@ public void setPrincipals(List principals) { this.principals = principals; } - public EnumSet getActions() { + public Set getActions() { return actions; } diff --git a/src/main/java/org/italiangrid/storm/webdav/config/OAuthProperties.java b/src/main/java/org/italiangrid/storm/webdav/config/OAuthProperties.java index 86328f85..1ecb6fbb 100644 --- a/src/main/java/org/italiangrid/storm/webdav/config/OAuthProperties.java +++ b/src/main/java/org/italiangrid/storm/webdav/config/OAuthProperties.java @@ -18,8 +18,8 @@ import java.util.ArrayList; import java.util.List; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotBlank; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; import org.hibernate.validator.constraints.URL; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/src/main/java/org/italiangrid/storm/webdav/config/ServiceConfigurationProperties.java b/src/main/java/org/italiangrid/storm/webdav/config/ServiceConfigurationProperties.java index 508a8bfe..f67a976e 100644 --- a/src/main/java/org/italiangrid/storm/webdav/config/ServiceConfigurationProperties.java +++ b/src/main/java/org/italiangrid/storm/webdav/config/ServiceConfigurationProperties.java @@ -21,12 +21,12 @@ import java.util.ArrayList; import java.util.List; -import javax.validation.Valid; -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.Positive; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Positive; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/org/italiangrid/storm/webdav/config/ThirdPartyCopyProperties.java b/src/main/java/org/italiangrid/storm/webdav/config/ThirdPartyCopyProperties.java index b8835b69..e47ecfb8 100644 --- a/src/main/java/org/italiangrid/storm/webdav/config/ThirdPartyCopyProperties.java +++ b/src/main/java/org/italiangrid/storm/webdav/config/ThirdPartyCopyProperties.java @@ -15,9 +15,9 @@ */ package org.italiangrid.storm.webdav.config; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Positive; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Positive; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @@ -44,7 +44,7 @@ public class ThirdPartyCopyProperties { @Min(value = 4096, message = "tpc.httpClientSocketBufferSize must be > 4096") int httpClientSocketBufferSize = 8192; - + boolean useConscrypt = false; boolean enableTlsClientAuth = false; @@ -55,7 +55,8 @@ public class ThirdPartyCopyProperties { @Positive(message = "tpc.progressReportThreadPoolSize must be a positive integer (i.e. > 0)") int progressReportThreadPoolSize; - @Min(value = 0, message = "Threshold of content size to reach before sending 'Expect: 100-continue' header.") + @Min(value = 0, + message = "Threshold of content size to reach before sending 'Expect: 100-continue' header.") long enableExpectContinueThreshold; public String getTlsProtocol() { diff --git a/src/main/java/org/italiangrid/storm/webdav/config/validation/Principal.java b/src/main/java/org/italiangrid/storm/webdav/config/validation/Principal.java index abf86621..9572a358 100644 --- a/src/main/java/org/italiangrid/storm/webdav/config/validation/Principal.java +++ b/src/main/java/org/italiangrid/storm/webdav/config/validation/Principal.java @@ -22,14 +22,16 @@ import java.lang.annotation.Retention; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; @Retention(RUNTIME) @Target({TYPE, ANNOTATION_TYPE}) -@Constraint(validatedBy=PrincipalValidator.class) +@Constraint(validatedBy = PrincipalValidator.class) public @interface Principal { String message() default "Invalid principal"; + Class[] groups() default {}; + Class[] payload() default {}; } diff --git a/src/main/java/org/italiangrid/storm/webdav/config/validation/PrincipalValidator.java b/src/main/java/org/italiangrid/storm/webdav/config/validation/PrincipalValidator.java index f351df10..bc4f43e2 100644 --- a/src/main/java/org/italiangrid/storm/webdav/config/validation/PrincipalValidator.java +++ b/src/main/java/org/italiangrid/storm/webdav/config/validation/PrincipalValidator.java @@ -28,8 +28,8 @@ import java.util.Collection; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import org.italiangrid.storm.webdav.config.FineGrainedAuthzPolicyProperties; import org.italiangrid.storm.webdav.config.FineGrainedAuthzPolicyProperties.PrincipalProperties.PrincipalType; diff --git a/src/main/java/org/italiangrid/storm/webdav/macaroon/MacaroonRequestFilter.java b/src/main/java/org/italiangrid/storm/webdav/macaroon/MacaroonRequestFilter.java index 2fc235e1..86218bff 100644 --- a/src/main/java/org/italiangrid/storm/webdav/macaroon/MacaroonRequestFilter.java +++ b/src/main/java/org/italiangrid/storm/webdav/macaroon/MacaroonRequestFilter.java @@ -15,19 +15,19 @@ */ package org.italiangrid.storm.webdav.macaroon; -import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; -import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN; -import static javax.servlet.http.HttpServletResponse.SC_OK; +import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST; +import static jakarta.servlet.http.HttpServletResponse.SC_FORBIDDEN; +import static jakarta.servlet.http.HttpServletResponse.SC_OK; import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -90,12 +90,9 @@ private void processMacaroonRequest(HttpServletRequest httpRequest, mapper.writeValue(httpResponse.getWriter(), res); } catch (AccessDeniedException e) { - httpResponse.sendError(SC_FORBIDDEN, - "Access denied"); - + httpResponse.sendError(SC_FORBIDDEN, "Access denied"); } catch (IOException e) { - httpResponse.sendError(SC_BAD_REQUEST, - "Invalid macaroon request"); + httpResponse.sendError(SC_BAD_REQUEST, "Invalid macaroon request"); } } } diff --git a/src/main/java/org/italiangrid/storm/webdav/metrics/HealthContextListener.java b/src/main/java/org/italiangrid/storm/webdav/metrics/HealthContextListener.java index 622f2d78..fc19ef72 100644 --- a/src/main/java/org/italiangrid/storm/webdav/metrics/HealthContextListener.java +++ b/src/main/java/org/italiangrid/storm/webdav/metrics/HealthContextListener.java @@ -19,19 +19,19 @@ import org.springframework.stereotype.Component; import com.codahale.metrics.health.HealthCheckRegistry; -import com.codahale.metrics.servlets.HealthCheckServlet.ContextListener; +import io.dropwizard.metrics.servlets.HealthCheckServlet.ContextListener; @Component public class HealthContextListener extends ContextListener { - + private HealthCheckRegistry registry; @Autowired public HealthContextListener(HealthCheckRegistry r) { this.registry = r; - + } - + @Override protected HealthCheckRegistry getHealthCheckRegistry() { return registry; diff --git a/src/main/java/org/italiangrid/storm/webdav/metrics/MetricsContextListener.java b/src/main/java/org/italiangrid/storm/webdav/metrics/MetricsContextListener.java index 322d489e..65eb13bf 100644 --- a/src/main/java/org/italiangrid/storm/webdav/metrics/MetricsContextListener.java +++ b/src/main/java/org/italiangrid/storm/webdav/metrics/MetricsContextListener.java @@ -19,20 +19,20 @@ import org.springframework.stereotype.Component; import com.codahale.metrics.MetricRegistry; -import com.codahale.metrics.servlets.MetricsServlet.ContextListener; +import io.dropwizard.metrics.servlets.MetricsServlet.ContextListener; @Component public class MetricsContextListener extends ContextListener { - + private MetricRegistry registry; - + @Autowired public MetricsContextListener(MetricRegistry r) { registry = r; } - + @Override protected MetricRegistry getMetricRegistry() { return registry; diff --git a/src/main/java/org/italiangrid/storm/webdav/metrics/StorageAreaStatsFilter.java b/src/main/java/org/italiangrid/storm/webdav/metrics/StorageAreaStatsFilter.java index 2903f6b3..79b07508 100644 --- a/src/main/java/org/italiangrid/storm/webdav/metrics/StorageAreaStatsFilter.java +++ b/src/main/java/org/italiangrid/storm/webdav/metrics/StorageAreaStatsFilter.java @@ -19,13 +19,13 @@ import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.italiangrid.storm.webdav.config.StorageAreaInfo; import org.italiangrid.storm.webdav.server.PathResolver; diff --git a/src/main/java/org/italiangrid/storm/webdav/milton/StoRMDirectoryResource.java b/src/main/java/org/italiangrid/storm/webdav/milton/StoRMDirectoryResource.java index 1102a935..d15d9160 100644 --- a/src/main/java/org/italiangrid/storm/webdav/milton/StoRMDirectoryResource.java +++ b/src/main/java/org/italiangrid/storm/webdav/milton/StoRMDirectoryResource.java @@ -85,7 +85,7 @@ public boolean isEmpty() throws IOException { @Override public List getChildren() throws NotAuthorizedException, BadRequestException { - List childResources = new ArrayList(); + List childResources = new ArrayList<>(); for (File f : file.listFiles()) { if (f.isDirectory()) { diff --git a/src/main/java/org/italiangrid/storm/webdav/milton/StoRMFileResource.java b/src/main/java/org/italiangrid/storm/webdav/milton/StoRMFileResource.java index 62402e13..c6e448de 100644 --- a/src/main/java/org/italiangrid/storm/webdav/milton/StoRMFileResource.java +++ b/src/main/java/org/italiangrid/storm/webdav/milton/StoRMFileResource.java @@ -33,7 +33,6 @@ import javax.xml.namespace.QName; -import org.apache.commons.lang.NotImplementedException; import org.italiangrid.storm.webdav.checksum.Adler32ChecksumInputStream; import org.italiangrid.storm.webdav.error.DiskQuotaExceeded; import org.italiangrid.storm.webdav.error.ResourceNotFound; @@ -205,7 +204,7 @@ public Object getProperty(QName name) { public void setProperty(QName name, Object value) throws PropertySetException, NotAuthorizedException { - throw new NotImplementedException("StoRM WebDAV does not support setting DAV properties."); + throw new UnsupportedOperationException("StoRM WebDAV does not support setting DAV properties."); } @Override @@ -225,7 +224,8 @@ public void sendContent(OutputStream out, Range range, Map param String contentType) throws IOException, NotAuthorizedException, BadRequestException, NotFoundException { - throw new NotImplementedException(); + // Not implemented + throw new UnsupportedOperationException(); } diff --git a/src/main/java/org/italiangrid/storm/webdav/milton/StoRMMiltonRequest.java b/src/main/java/org/italiangrid/storm/webdav/milton/StoRMMiltonRequest.java index d1021cc4..4c593039 100644 --- a/src/main/java/org/italiangrid/storm/webdav/milton/StoRMMiltonRequest.java +++ b/src/main/java/org/italiangrid/storm/webdav/milton/StoRMMiltonRequest.java @@ -18,8 +18,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpServletRequest; import org.eclipse.jetty.util.URIUtil; diff --git a/src/main/java/org/italiangrid/storm/webdav/milton/StoRMResource.java b/src/main/java/org/italiangrid/storm/webdav/milton/StoRMResource.java index 3c0cb57d..05a58645 100644 --- a/src/main/java/org/italiangrid/storm/webdav/milton/StoRMResource.java +++ b/src/main/java/org/italiangrid/storm/webdav/milton/StoRMResource.java @@ -37,7 +37,7 @@ public abstract class StoRMResource implements Resource, PropFindableResource, M protected final StoRMResourceFactory resourceFactory; protected final File file; - public StoRMResource(StoRMResourceFactory factory, File f) { + protected StoRMResource(StoRMResourceFactory factory, File f) { resourceFactory = factory; file = f; diff --git a/src/main/java/org/italiangrid/storm/webdav/milton/StoRMResourceFactory.java b/src/main/java/org/italiangrid/storm/webdav/milton/StoRMResourceFactory.java index 3eec1f7a..455f3444 100644 --- a/src/main/java/org/italiangrid/storm/webdav/milton/StoRMResourceFactory.java +++ b/src/main/java/org/italiangrid/storm/webdav/milton/StoRMResourceFactory.java @@ -66,9 +66,11 @@ public Resource getResource(String host, String path) LOG.debug("getResource: path={}, resolvedPath={}", path, requestedFile.getAbsolutePath()); if (!requestedFile.exists()) { - LOG.debug( - "Requested file '{}' does not exists or user {} does not have the rights to read it.", - requestedFile, System.getProperty("user.name")); + if (LOG.isDebugEnabled()) { + LOG.debug( + "Requested file '{}' does not exists or user {} does not have the rights to read it.", + requestedFile, System.getProperty("user.name")); + } return null; } @@ -88,7 +90,7 @@ public ExtendedAttributesHelper getExtendedAttributesHelper() { return attrsHelper; } - + public ReplaceContentStrategy getReplaceContentStrategy() { return rcs; } diff --git a/src/main/java/org/italiangrid/storm/webdav/oauth/authzserver/AccessTokenRequest.java b/src/main/java/org/italiangrid/storm/webdav/oauth/authzserver/AccessTokenRequest.java index d1eb1a00..19362dea 100644 --- a/src/main/java/org/italiangrid/storm/webdav/oauth/authzserver/AccessTokenRequest.java +++ b/src/main/java/org/italiangrid/storm/webdav/oauth/authzserver/AccessTokenRequest.java @@ -15,9 +15,9 @@ */ package org.italiangrid.storm.webdav.oauth.authzserver; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; public class AccessTokenRequest { diff --git a/src/main/java/org/italiangrid/storm/webdav/oauth/authzserver/AuthzServerController.java b/src/main/java/org/italiangrid/storm/webdav/oauth/authzserver/AuthzServerController.java index f13acd41..dc5210a9 100644 --- a/src/main/java/org/italiangrid/storm/webdav/oauth/authzserver/AuthzServerController.java +++ b/src/main/java/org/italiangrid/storm/webdav/oauth/authzserver/AuthzServerController.java @@ -22,8 +22,8 @@ import static org.italiangrid.storm.webdav.oauth.authzserver.ErrorResponseDTO.INVALID_SCOPE; import static org.italiangrid.storm.webdav.oauth.authzserver.ErrorResponseDTO.UNSUPPORTED_GRANT_TYPE; -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; import org.italiangrid.storm.webdav.oauth.authzserver.error.InvalidScopeError; import org.italiangrid.storm.webdav.oauth.authzserver.error.InvalidTokenRequestError; @@ -58,7 +58,8 @@ protected void handleValidationError(FieldError e) { throw new InvalidTokenRequestError(e.getDefaultMessage()); } if (INVALID_GRANT_TYPE.equals(e.getDefaultMessage())) { - throw new UnsupportedGrantTypeError(format("%s: %s", e.getDefaultMessage(), e.getRejectedValue())); + throw new UnsupportedGrantTypeError( + format("%s: %s", e.getDefaultMessage(), e.getRejectedValue())); } throw new InvalidScopeError(e.getDefaultMessage() != null ? e.getDefaultMessage() : ""); } diff --git a/src/main/java/org/italiangrid/storm/webdav/oauth/authzserver/jwt/DefaultJwtTokenIssuer.java b/src/main/java/org/italiangrid/storm/webdav/oauth/authzserver/jwt/DefaultJwtTokenIssuer.java index 83a814a3..1c9d93a5 100644 --- a/src/main/java/org/italiangrid/storm/webdav/oauth/authzserver/jwt/DefaultJwtTokenIssuer.java +++ b/src/main/java/org/italiangrid/storm/webdav/oauth/authzserver/jwt/DefaultJwtTokenIssuer.java @@ -74,11 +74,10 @@ public DefaultJwtTokenIssuer(Clock clock, AuthorizationServerProperties props, protected Optional vomsAcExpiration(Authentication authentication) { - if (authentication.getDetails() instanceof VOMSAuthenticationDetails details) { - if (!details.getVomsAttributes().isEmpty()) { - Date acNotAfter = details.getVomsAttributes().get(0).getNotAfter(); - return Optional.of(acNotAfter.toInstant()); - } + if (authentication.getDetails() instanceof VOMSAuthenticationDetails details + && !details.getVomsAttributes().isEmpty()) { + Date acNotAfter = details.getVomsAttributes().get(0).getNotAfter(); + return Optional.of(acNotAfter.toInstant()); } return Optional.empty(); diff --git a/src/main/java/org/italiangrid/storm/webdav/oauth/utils/DefaultOidcConfigurationFetcher.java b/src/main/java/org/italiangrid/storm/webdav/oauth/utils/DefaultOidcConfigurationFetcher.java index f1c1c1f3..3715efc2 100644 --- a/src/main/java/org/italiangrid/storm/webdav/oauth/utils/DefaultOidcConfigurationFetcher.java +++ b/src/main/java/org/italiangrid/storm/webdav/oauth/utils/DefaultOidcConfigurationFetcher.java @@ -57,7 +57,7 @@ public class DefaultOidcConfigurationFetcher implements OidcConfigurationFetcher public DefaultOidcConfigurationFetcher(RestTemplateBuilder restBuilder, OAuthProperties oAuthProperties) { final Duration timeout = Duration.ofSeconds(oAuthProperties.getRefreshTimeoutSeconds()); - this.restTemplate = restBuilder.setConnectTimeout(timeout).setReadTimeout(timeout).build(); + this.restTemplate = restBuilder.connectTimeout(timeout).readTimeout(timeout).build(); } private void metadataChecks(String issuer, Map oidcConfiguration) { @@ -95,15 +95,16 @@ public Map loadConfigurationForIssuer(String issuer) { } throw new OidcConfigurationResolutionError(errorMsg, e); } - if (response.getStatusCodeValue() != 200) { + if (response.getStatusCode().value() != 200) { throw new OidcConfigurationResolutionError( - format("Received status code: %s", response.getStatusCodeValue())); + format("Received status code: %s", response.getStatusCode().value())); } - if (response.getBody() == null) { + Map body = response.getBody(); + if (body == null) { throw new OidcConfigurationResolutionError("Received null body"); } - metadataChecks(issuer, response.getBody()); - return response.getBody(); + metadataChecks(issuer, body); + return body; } @Override @@ -124,9 +125,9 @@ public String loadJWKSourceForURL(URI uri) throws KeySourceException { } throw new RemoteKeySourceException(errorMsg, e); } - if (response.getStatusCodeValue() != 200) { + if (response.getStatusCode().value() != 200) { throw new KeySourceException(format("Unable to get JWK from '%s': received status code %s", - uri, response.getStatusCodeValue())); + uri, response.getStatusCode().value())); } return response.getBody(); } diff --git a/src/main/java/org/italiangrid/storm/webdav/oauth/utils/PermissiveBearerTokenResolver.java b/src/main/java/org/italiangrid/storm/webdav/oauth/utils/PermissiveBearerTokenResolver.java index dbde22f3..6cecaef2 100644 --- a/src/main/java/org/italiangrid/storm/webdav/oauth/utils/PermissiveBearerTokenResolver.java +++ b/src/main/java/org/italiangrid/storm/webdav/oauth/utils/PermissiveBearerTokenResolver.java @@ -18,7 +18,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -29,7 +29,7 @@ import org.springframework.util.StringUtils; /** - * + * * Does not raise error when a bearer token is found both as parameter and in the Authorization * header. Request parameter takes precedence * diff --git a/src/main/java/org/italiangrid/storm/webdav/oidc/ClientRegistrationCacheLoader.java b/src/main/java/org/italiangrid/storm/webdav/oidc/ClientRegistrationCacheLoader.java index 805ed969..fb02a844 100644 --- a/src/main/java/org/italiangrid/storm/webdav/oidc/ClientRegistrationCacheLoader.java +++ b/src/main/java/org/italiangrid/storm/webdav/oidc/ClientRegistrationCacheLoader.java @@ -56,7 +56,7 @@ public ClientRegistrationCacheLoader(OAuth2ClientProperties clientProperties, private ClientRegistration getClientRegistration(String registrationId, OAuth2ClientProperties.Registration properties, Map providers) { - String provider = StringUtils.trimWhitespace(properties.getProvider()); + String provider = properties.getProvider().strip(); Builder builder = getBuilderFromIssuerIfPossible(registrationId, provider, providers); if (builder == null) { return null; diff --git a/src/main/java/org/italiangrid/storm/webdav/redirector/DefaultRedirectionService.java b/src/main/java/org/italiangrid/storm/webdav/redirector/DefaultRedirectionService.java index 40e9af8d..5dea18fc 100644 --- a/src/main/java/org/italiangrid/storm/webdav/redirector/DefaultRedirectionService.java +++ b/src/main/java/org/italiangrid/storm/webdav/redirector/DefaultRedirectionService.java @@ -18,8 +18,8 @@ import java.net.URI; import java.util.function.Supplier; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.italiangrid.storm.webdav.config.ServiceConfigurationProperties; import org.italiangrid.storm.webdav.config.ServiceConfigurationProperties.RedirectorProperties.ReplicaEndpointProperties; diff --git a/src/main/java/org/italiangrid/storm/webdav/redirector/RedirectFilter.java b/src/main/java/org/italiangrid/storm/webdav/redirector/RedirectFilter.java index 4289ea7e..e3b73cdb 100644 --- a/src/main/java/org/italiangrid/storm/webdav/redirector/RedirectFilter.java +++ b/src/main/java/org/italiangrid/storm/webdav/redirector/RedirectFilter.java @@ -18,13 +18,13 @@ import java.io.IOException; import java.nio.file.Path; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.italiangrid.storm.webdav.server.PathResolver; import org.italiangrid.storm.webdav.tpc.TpcUtils; @@ -111,8 +111,7 @@ private boolean requestedResourceExistsAndIsAFile(HttpServletRequest req) { private boolean isRedirectable(HttpServletRequest req) { return isSecureRequest(req) && !isNoRedirectRequest(req) && isGetOrPutRequest(req) - && requestDoesNotHaveAccessToken(req) - && requestedResourceExistsAndIsAFile(req); + && requestDoesNotHaveAccessToken(req) && requestedResourceExistsAndIsAFile(req); } } diff --git a/src/main/java/org/italiangrid/storm/webdav/redirector/RedirectionService.java b/src/main/java/org/italiangrid/storm/webdav/redirector/RedirectionService.java index 02eadf3e..2882f626 100644 --- a/src/main/java/org/italiangrid/storm/webdav/redirector/RedirectionService.java +++ b/src/main/java/org/italiangrid/storm/webdav/redirector/RedirectionService.java @@ -15,8 +15,8 @@ */ package org.italiangrid.storm.webdav.redirector; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.core.Authentication; diff --git a/src/main/java/org/italiangrid/storm/webdav/server/DefaultJettyServerCustomizer.java b/src/main/java/org/italiangrid/storm/webdav/server/DefaultJettyServerCustomizer.java index 900acf20..0e661c33 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/DefaultJettyServerCustomizer.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/DefaultJettyServerCustomizer.java @@ -18,8 +18,9 @@ import java.io.File; import java.nio.file.Paths; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; +import org.eclipse.jetty.rewrite.handler.CompactPathRule; import org.eclipse.jetty.rewrite.handler.RewriteHandler; import org.eclipse.jetty.rewrite.handler.RewriteRegexRule; import org.eclipse.jetty.server.HttpConfiguration; @@ -37,8 +38,8 @@ import org.springframework.util.StringUtils; import com.codahale.metrics.MetricRegistry; -import com.codahale.metrics.jetty9.InstrumentedConnectionFactory; -import com.codahale.metrics.jetty9.InstrumentedHandler; +import io.dropwizard.metrics.jetty12.InstrumentedConnectionFactory; +import io.dropwizard.metrics.jetty12.ee10.InstrumentedEE10Handler; import ch.qos.logback.access.jetty.RequestLogImpl; import eu.emi.security.authn.x509.X509CertChainValidatorExt; @@ -147,8 +148,7 @@ private void configureRewriteHandler(Server server) { RewriteHandler rh = new RewriteHandler(); - rh.setRewritePathInfo(true); - rh.setRewriteRequestURI(true); + CompactPathRule compactPathRule = new CompactPathRule(); RewriteRegexRule dropLegacyWebDAV = new RewriteRegexRule(); dropLegacyWebDAV.setRegex("/webdav/(.*)"); @@ -158,12 +158,13 @@ private void configureRewriteHandler(Server server) { dropLegacyFileTransfer.setRegex("/fileTransfer/(.*)"); dropLegacyFileTransfer.setReplacement("/$1"); + rh.addRule(compactPathRule); rh.addRule(dropLegacyWebDAV); rh.addRule(dropLegacyFileTransfer); rh.setHandler(server.getHandler()); - InstrumentedHandler ih = new InstrumentedHandler(metricRegistry, "storm.http.handler"); + InstrumentedEE10Handler ih = new InstrumentedEE10Handler(metricRegistry, "storm.http.handler"); ih.setHandler(rh); server.setHandler(ih); diff --git a/src/main/java/org/italiangrid/storm/webdav/server/DefaultJettyServletWebServerFactory.java b/src/main/java/org/italiangrid/storm/webdav/server/DefaultJettyServletWebServerFactory.java index 3e2b1eb4..0a032689 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/DefaultJettyServletWebServerFactory.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/DefaultJettyServletWebServerFactory.java @@ -20,23 +20,16 @@ import java.util.Collection; import java.util.List; -import org.eclipse.jetty.server.handler.ErrorHandler; -import org.eclipse.jetty.servlet.ErrorPageErrorHandler; -import org.eclipse.jetty.webapp.AbstractConfiguration; -import org.eclipse.jetty.webapp.Configuration; -import org.eclipse.jetty.webapp.WebAppContext; -import org.italiangrid.storm.webdav.server.util.JettyErrorPageHandler; +import org.eclipse.jetty.ee10.servlet.ErrorPageErrorHandler; +import org.eclipse.jetty.ee10.webapp.AbstractConfiguration; +import org.eclipse.jetty.ee10.webapp.Configuration; +import org.eclipse.jetty.ee10.webapp.WebAppContext; import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory; import org.springframework.boot.web.server.ErrorPage; import org.springframework.boot.web.servlet.ServletContextInitializer; public class DefaultJettyServletWebServerFactory extends JettyServletWebServerFactory { - @Override - protected void postProcessWebAppContext(WebAppContext context) { - context.setCompactPath(true); - } - @Override protected Configuration[] getWebAppContextConfigurations(WebAppContext webAppContext, ServletContextInitializer... initializers) { @@ -49,32 +42,30 @@ protected Configuration[] getWebAppContextConfigurations(WebAppContext webAppCon } private Configuration getStormErrorPageConfiguration() { - return new AbstractConfiguration() { + return new AbstractConfiguration(new AbstractConfiguration.Builder()) { @Override public void configure(WebAppContext context) throws Exception { - JettyErrorPageHandler errorHandler = new JettyErrorPageHandler(); + ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler(); context.setErrorHandler(errorHandler); addErrorPages(errorHandler, getErrorPages()); errorHandler.setShowStacks(false); } - private void addErrorPages(ErrorHandler errorHandler, Collection errorPages) { - if (errorHandler instanceof ErrorPageErrorHandler handler) { - for (ErrorPage errorPage : errorPages) { - if (errorPage.isGlobal()) { - handler.addErrorPage(ErrorPageErrorHandler.GLOBAL_ERROR_PAGE, errorPage.getPath()); + private void addErrorPages(ErrorPageErrorHandler errorHandler, + Collection errorPages) { + for (ErrorPage errorPage : errorPages) { + if (errorPage.isGlobal()) { + errorHandler.addErrorPage(ErrorPageErrorHandler.GLOBAL_ERROR_PAGE, errorPage.getPath()); + } else { + if (errorPage.getExceptionName() != null) { + errorHandler.addErrorPage(errorPage.getExceptionName(), errorPage.getPath()); } else { - if (errorPage.getExceptionName() != null) { - handler.addErrorPage(errorPage.getExceptionName(), errorPage.getPath()); - } else { - handler.addErrorPage(errorPage.getStatusCode(), errorPage.getPath()); - } + errorHandler.addErrorPage(errorPage.getStatusCode(), errorPage.getPath()); } } } } - }; } } diff --git a/src/main/java/org/italiangrid/storm/webdav/server/DefaultPathResolver.java b/src/main/java/org/italiangrid/storm/webdav/server/DefaultPathResolver.java index b0a0e3a0..8467b3be 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/DefaultPathResolver.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/DefaultPathResolver.java @@ -57,7 +57,7 @@ public DefaultPathResolver(StorageAreaConfiguration cfg) { protected String stripContextPath(String context, String path) { - if (context != null && context.length() > 0) { + if (context != null && !context.isEmpty()) { return path.replaceFirst(context, ""); } else { return path; diff --git a/src/main/java/org/italiangrid/storm/webdav/server/DefaultWebServerFactory.java b/src/main/java/org/italiangrid/storm/webdav/server/DefaultWebServerFactory.java index 56d286cf..e42ac748 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/DefaultWebServerFactory.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/DefaultWebServerFactory.java @@ -24,7 +24,7 @@ import org.springframework.boot.web.server.WebServerFactoryCustomizer; import com.codahale.metrics.MetricRegistry; -import com.codahale.metrics.jetty9.InstrumentedQueuedThreadPool; +import io.dropwizard.metrics.jetty12.InstrumentedQueuedThreadPool; public class DefaultWebServerFactory implements WebServerFactoryCustomizer { @@ -45,10 +45,10 @@ public DefaultWebServerFactory(ServiceConfiguration configuration, } private InstrumentedQueuedThreadPool getInstrumentedThreadPool() { - InstrumentedQueuedThreadPool tPool = - new InstrumentedQueuedThreadPool(metricRegistry, configuration.getMaxConnections(), - configuration.getMinConnections(), configuration.getThreadPoolMaxIdleTimeInMsec(), - new ArrayBlockingQueue<>(configuration.getMaxQueueSize()), "storm.http"); + InstrumentedQueuedThreadPool tPool = new InstrumentedQueuedThreadPool(metricRegistry, + configuration.getMaxConnections(), configuration.getMinConnections(), + configuration.getThreadPoolMaxIdleTimeInMsec(), + new ArrayBlockingQueue<>(configuration.getMaxQueueSize()), new ThreadGroup("storm.http")); tPool.setName("thread-pool"); return tPool; } diff --git a/src/main/java/org/italiangrid/storm/webdav/server/TLSServerConnectorBuilder.java b/src/main/java/org/italiangrid/storm/webdav/server/TLSServerConnectorBuilder.java index 5d735f3d..d7d8f011 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/TLSServerConnectorBuilder.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/TLSServerConnectorBuilder.java @@ -45,7 +45,7 @@ import org.eclipse.jetty.util.ssl.SslContextFactory; import com.codahale.metrics.MetricRegistry; -import com.codahale.metrics.jetty9.InstrumentedConnectionFactory; +import io.dropwizard.metrics.jetty12.InstrumentedConnectionFactory; import eu.emi.security.authn.x509.X509CertChainValidatorExt; import eu.emi.security.authn.x509.helpers.ssl.SSLTrustManager; diff --git a/src/main/java/org/italiangrid/storm/webdav/server/servlet/ChecksumFilter.java b/src/main/java/org/italiangrid/storm/webdav/server/servlet/ChecksumFilter.java index bf3d747f..701717a0 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/servlet/ChecksumFilter.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/servlet/ChecksumFilter.java @@ -20,14 +20,14 @@ import java.io.File; import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.italiangrid.storm.webdav.fs.attrs.ExtendedAttributesHelper; import org.italiangrid.storm.webdav.server.PathResolver; @@ -44,8 +44,7 @@ public class ChecksumFilter implements Filter { public static final Logger logger = LoggerFactory.getLogger(ChecksumFilter.class); @Autowired - public ChecksumFilter(ExtendedAttributesHelper attributeHelper, - PathResolver resolver) { + public ChecksumFilter(ExtendedAttributesHelper attributeHelper, PathResolver resolver) { this.attributeHelper = attributeHelper; this.resolver = resolver; @@ -59,8 +58,8 @@ public void init(FilterConfig filterConfig) throws ServletException { } @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) throws IOException, ServletException { + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { addChecksumHeader((HttpServletRequest) request, (HttpServletResponse) response); @@ -75,8 +74,7 @@ public void destroy() { } - private void addChecksumHeader(HttpServletRequest request, - HttpServletResponse response) { + private void addChecksumHeader(HttpServletRequest request, HttpServletResponse response) { String method = request.getMethod().toUpperCase(); @@ -117,8 +115,8 @@ private void addChecksumHeader(HttpServletRequest request, } catch (IOException e) { - logger.error("Error retrieving checksum value for path '{}': {}", - pathResolved,e.getMessage()); + logger.error("Error retrieving checksum value for path '{}': {}", pathResolved, + e.getMessage()); if (logger.isDebugEnabled()) { logger.error(e.getMessage(), e); diff --git a/src/main/java/org/italiangrid/storm/webdav/server/servlet/DeleteSanityChecksFilter.java b/src/main/java/org/italiangrid/storm/webdav/server/servlet/DeleteSanityChecksFilter.java index ca449bce..2454bfe9 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/servlet/DeleteSanityChecksFilter.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/servlet/DeleteSanityChecksFilter.java @@ -17,13 +17,13 @@ import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.italiangrid.storm.webdav.server.PathResolver; import org.italiangrid.storm.webdav.tpc.TpcUtils; diff --git a/src/main/java/org/italiangrid/storm/webdav/server/servlet/LogRequestFilter.java b/src/main/java/org/italiangrid/storm/webdav/server/servlet/LogRequestFilter.java index aa3da4d9..b1349843 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/servlet/LogRequestFilter.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/servlet/LogRequestFilter.java @@ -20,14 +20,14 @@ import java.util.Objects; import java.util.Optional; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/org/italiangrid/storm/webdav/server/servlet/MiltonFilter.java b/src/main/java/org/italiangrid/storm/webdav/server/servlet/MiltonFilter.java index 8887b6a5..f6827ee4 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/servlet/MiltonFilter.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/servlet/MiltonFilter.java @@ -19,15 +19,15 @@ import java.util.HashSet; import java.util.Set; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.italiangrid.storm.webdav.fs.FilesystemAccess; import org.italiangrid.storm.webdav.fs.attrs.ExtendedAttributesHelper; diff --git a/src/main/java/org/italiangrid/storm/webdav/server/servlet/MoveRequestSanityChecksFilter.java b/src/main/java/org/italiangrid/storm/webdav/server/servlet/MoveRequestSanityChecksFilter.java index b28bcc4e..d2689dd7 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/servlet/MoveRequestSanityChecksFilter.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/servlet/MoveRequestSanityChecksFilter.java @@ -18,13 +18,13 @@ import java.io.IOException; import java.net.MalformedURLException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.italiangrid.storm.webdav.error.BadRequest; import org.italiangrid.storm.webdav.error.ResourceNotFound; diff --git a/src/main/java/org/italiangrid/storm/webdav/server/servlet/SAIndexServlet.java b/src/main/java/org/italiangrid/storm/webdav/server/servlet/SAIndexServlet.java index 8eddbb8d..56473702 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/servlet/SAIndexServlet.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/servlet/SAIndexServlet.java @@ -21,10 +21,10 @@ import java.util.Map; import java.util.TreeMap; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.italiangrid.storm.webdav.config.OAuthProperties; import org.italiangrid.storm.webdav.config.ServiceConfigurationProperties; @@ -34,11 +34,13 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.WebContext; +import org.thymeleaf.web.IWebExchange; +import org.thymeleaf.web.servlet.JakartaServletWebApplication; public class SAIndexServlet extends HttpServlet { /** - * + * */ private static final long serialVersionUID = -8193945050086639692L; @@ -55,10 +57,10 @@ public class SAIndexServlet extends HttpServlet { public static final String STORM_HOSTNAME_KEY = "storm"; public static final String OIDC_ENABLED_KEY = "oidcEnabled"; - private final OAuthProperties oauthProperties; - private final StorageAreaConfiguration saConfig; - private final ServiceConfigurationProperties serviceConfig; - private final TemplateEngine engine; + private final transient OAuthProperties oauthProperties; + private final transient StorageAreaConfiguration saConfig; + private final transient ServiceConfigurationProperties serviceConfig; + private final transient TemplateEngine engine; private final Map saIndexMap; @@ -69,7 +71,7 @@ public SAIndexServlet(OAuthProperties oauthP, ServiceConfigurationProperties ser this.serviceConfig = serviceConfig; this.saConfig = config; this.engine = engine; - saIndexMap = new TreeMap(); + saIndexMap = new TreeMap<>(); for (StorageAreaInfo sa : saConfig.getStorageAreaInfo()) { saIndexMap.put(sa.name(), sa.accessPoints().get(0)); } @@ -92,7 +94,11 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) req.setAttribute(STORM_HOSTNAME_KEY, serviceConfig.getHostnames().get(0)); req.setAttribute(OIDC_ENABLED_KEY, oauthProperties.isEnableOidc()); - WebContext ctxt = new WebContext(req, resp, getServletContext(), req.getLocale()); + final IWebExchange webExchange = + JakartaServletWebApplication.buildApplication(this.getServletContext()) + .buildExchange(req, resp); + + WebContext ctxt = new WebContext(webExchange, req.getLocale()); engine.process(SA_INDEX_PAGE_NAME, ctxt, resp.getWriter()); } diff --git a/src/main/java/org/italiangrid/storm/webdav/server/servlet/SciTagFilter.java b/src/main/java/org/italiangrid/storm/webdav/server/servlet/SciTagFilter.java index f01c0af1..26b0c710 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/servlet/SciTagFilter.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/servlet/SciTagFilter.java @@ -18,12 +18,12 @@ import java.io.IOException; import java.util.Optional; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; import org.italiangrid.storm.webdav.scitag.SciTag; import org.italiangrid.storm.webdav.tpc.TransferConstants; diff --git a/src/main/java/org/italiangrid/storm/webdav/server/servlet/ServerResponseHeaderFilter.java b/src/main/java/org/italiangrid/storm/webdav/server/servlet/ServerResponseHeaderFilter.java index 55486f70..50da8b0c 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/servlet/ServerResponseHeaderFilter.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/servlet/ServerResponseHeaderFilter.java @@ -26,12 +26,12 @@ import java.util.jar.Attributes; import java.util.jar.JarInputStream; import java.util.jar.Manifest; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/org/italiangrid/storm/webdav/server/servlet/StoRMServlet.java b/src/main/java/org/italiangrid/storm/webdav/server/servlet/StoRMServlet.java index 68145aa7..b2e009f8 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/servlet/StoRMServlet.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/servlet/StoRMServlet.java @@ -15,78 +15,146 @@ */ package org.italiangrid.storm.webdav.server.servlet; -import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.eclipse.jetty.servlet.DefaultServlet; -import org.eclipse.jetty.util.resource.Resource; +import jakarta.servlet.RequestDispatcher; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.eclipse.jetty.ee10.servlet.ResourceServlet; +import org.eclipse.jetty.ee10.servlet.ServletContextRequest; +import org.eclipse.jetty.ee10.servlet.ServletContextResponse; +import org.eclipse.jetty.http.HttpHeader; +import org.eclipse.jetty.http.MimeTypes; +import org.eclipse.jetty.http.content.HttpContent; import org.italiangrid.storm.webdav.config.OAuthProperties; import org.italiangrid.storm.webdav.config.ServiceConfigurationProperties; import org.italiangrid.storm.webdav.server.PathResolver; -import org.italiangrid.storm.webdav.server.servlet.resource.StormResourceService; -import org.italiangrid.storm.webdav.server.servlet.resource.StormResourceWrapper; +import org.italiangrid.storm.webdav.server.servlet.resource.StoRMResourceHttpContentFactory; import org.thymeleaf.TemplateEngine; +import org.eclipse.jetty.util.URIUtil; +import org.italiangrid.storm.webdav.scitag.SciTag; +import org.italiangrid.storm.webdav.scitag.SciTagTransfer; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class StoRMServlet extends DefaultServlet { +public class StoRMServlet extends ResourceServlet { + public static final Logger LOG = LoggerFactory.getLogger(StoRMServlet.class); /** * */ private static final long serialVersionUID = 4204673943980786498L; - final PathResolver pathResolver; - final TemplateEngine templateEngine; - final ServiceConfigurationProperties serviceConfig; - final OAuthProperties oauthProperties; - final StormResourceService resourceService; + final transient PathResolver pathResolver; + final transient TemplateEngine templateEngine; + final transient ServiceConfigurationProperties serviceConfig; + final transient OAuthProperties oauthProperties; public StoRMServlet(OAuthProperties oauthP, ServiceConfigurationProperties serviceConfig, - PathResolver resolver, TemplateEngine engine, StormResourceService rs) { - super(rs); + PathResolver resolver, TemplateEngine engine) { + super(); oauthProperties = oauthP; - resourceService = rs; pathResolver = resolver; templateEngine = engine; this.serviceConfig = serviceConfig; } @Override - public Resource getResource(String pathInContext) { - - String resolvedPath = pathResolver.resolvePath(pathInContext); - - if (resolvedPath == null) { - return null; - } + public void init() throws ServletException { + super.init(); + this.getResourceService() + .setHttpContentFactory(new StoRMResourceHttpContentFactory(null, MimeTypes.DEFAULTS, + oauthProperties, serviceConfig, pathResolver, templateEngine)); + } - File f = new File(resolvedPath); + // Similar to getInitBoolean of + // https://github.com/jetty/jetty.project/blob/jetty-12.0.x/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/ResourceServlet.java + private boolean getInitBooleanStoRM(String name, boolean defaultValue) { + String value = getInitParameter(name); + if (value == null || value.isEmpty()) + return defaultValue; + return (value.startsWith("t") || value.startsWith("T") || value.startsWith("y") + || value.startsWith("Y") || value.startsWith("1")); + } - if (!f.exists()) { - return null; + @Override + protected String getEncodedPathInContext(HttpServletRequest request, boolean included) { + String servletPath = null; + String pathInfo = null; + + if (included) { + servletPath = getInitBooleanStoRM("pathInfoOnly", false) ? "/" + : (String) request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH); + pathInfo = (String) request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO); + if (servletPath == null) { + servletPath = request.getServletPath(); + pathInfo = request.getPathInfo(); + } + } else { + servletPath = getInitBooleanStoRM("pathInfoOnly", false) ? "/" : request.getServletPath(); + pathInfo = request.getPathInfo(); } - return new StormResourceWrapper(oauthProperties, serviceConfig, templateEngine, - Resource.newResource(f)); - + return URIUtil.addPaths(servletPath, pathInfo); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - resourceService.doGet(request, response); + SciTag scitag = (SciTag) request.getAttribute(SciTag.SCITAG_ATTRIBUTE); + SciTagTransfer scitagTransfer = null; + if (scitag != null) { + scitagTransfer = new SciTagTransfer(scitag, request.getLocalAddr(), request.getLocalPort(), + request.getRemoteAddr(), request.getRemotePort()); + scitagTransfer.writeStart(); + } + if (request.getHeader("Range") != null) { + ServletContextRequest servletContextRequest = + ServletContextRequest.getServletContextRequest(request); + ServletContextResponse servletContextResponse = + servletContextRequest.getServletContextResponse(); + super.doGet(request, servletContextResponse.getServletApiResponse()); + } else { + super.doGet(request, response); + } + if (scitagTransfer != null) { + scitagTransfer.writeEnd(); + } } @Override protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - resourceService.doHead(request, response); + final boolean included = request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI) != null; + final String pathInContext = getEncodedPathInContext(request, included); + + final HttpContent content = + getResourceService().getHttpContentFactory().getContent(pathInContext); + + if (content == null || !content.getResource().exists()) { + + if (included) { + throw new FileNotFoundException("!" + pathInContext); + } + + response.sendError(HttpServletResponse.SC_NOT_FOUND); + } else { + response.setHeader(HttpHeader.LAST_MODIFIED.asString(), content.getLastModified().getValue()); + if (content.getContentLength() != null) { + response.setHeader(HttpHeader.CONTENT_LENGTH.asString(), + content.getContentLength().getValue()); + } + if (content.getContentType() != null) { + response.setHeader(HttpHeader.CONTENT_TYPE.asString(), content.getContentType().getValue()); + } + response.setHeader(HttpHeader.ACCEPT_RANGES.asString(), "bytes"); + } } - @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { diff --git a/src/main/java/org/italiangrid/storm/webdav/server/servlet/resource/StoRMResourceHttpContentFactory.java b/src/main/java/org/italiangrid/storm/webdav/server/servlet/resource/StoRMResourceHttpContentFactory.java new file mode 100644 index 00000000..b2293383 --- /dev/null +++ b/src/main/java/org/italiangrid/storm/webdav/server/servlet/resource/StoRMResourceHttpContentFactory.java @@ -0,0 +1,88 @@ +/** + * Copyright (c) Istituto Nazionale di Fisica Nucleare, 2014-2023. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.italiangrid.storm.webdav.server.servlet.resource; + +import java.io.File; +import java.net.URI; + +import org.eclipse.jetty.http.MimeTypes; +import org.eclipse.jetty.http.content.HttpContent; +import org.eclipse.jetty.http.content.ResourceHttpContent; +import org.eclipse.jetty.http.content.ResourceHttpContentFactory; +import org.eclipse.jetty.util.resource.PathResourceFactory; +import org.eclipse.jetty.util.resource.Resource; +import org.italiangrid.storm.webdav.config.OAuthProperties; +import org.italiangrid.storm.webdav.config.ServiceConfigurationProperties; +import org.italiangrid.storm.webdav.server.PathResolver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.thymeleaf.TemplateEngine; + +public class StoRMResourceHttpContentFactory extends ResourceHttpContentFactory { + public static final Logger LOG = LoggerFactory.getLogger(StoRMResourceHttpContentFactory.class); + final PathResolver pathResolver; + final TemplateEngine templateEngine; + final ServiceConfigurationProperties serviceConfig; + final OAuthProperties oauthProperties; + MimeTypes mimeTypes; + + public StoRMResourceHttpContentFactory(Resource baseResource, MimeTypes mimeTypes, + OAuthProperties oauthP, ServiceConfigurationProperties serviceConfig, PathResolver resolver, + TemplateEngine engine) { + super(baseResource, mimeTypes); + this.mimeTypes = mimeTypes; + pathResolver = resolver; + oauthProperties = oauthP; + templateEngine = engine; + this.serviceConfig = serviceConfig; + } + + @Override + public HttpContent getContent(String pathInContext) { + + String resolvedPath = pathResolver.resolvePath(pathInContext); + LOG.warn("pathInContext: {}, resolvedPath: {}", pathInContext, resolvedPath); + + if (resolvedPath == null) { + return null; + } + + File f = new File(resolvedPath); + + if (!f.exists()) { + LOG.warn("File {} do not exist", resolvedPath); + return null; + } + + PathResourceFactory pathResourceFactory = new PathResourceFactory(); + try { + if (f.isDirectory()) { + StormResourceWrapper resource = + new StormResourceWrapper(oauthProperties, serviceConfig, templateEngine, + pathResourceFactory.newResource(new URI("file:" + resolvedPath)), pathInContext); + return new ResourceHttpContent(resource, "text/html"); + } else { + return new ResourceHttpContent( + pathResourceFactory.newResource(new URI("file:" + resolvedPath)), + mimeTypes.getMimeByExtension(pathInContext)); + } + } catch (Exception e) { + LOG.warn("PathResourceFactory exception: {}", e.getMessage()); + } + + return null; + } +} diff --git a/src/main/java/org/italiangrid/storm/webdav/server/servlet/resource/StormFsResourceView.java b/src/main/java/org/italiangrid/storm/webdav/server/servlet/resource/StormFsResourceView.java index 2add60c2..98fc35ce 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/servlet/resource/StormFsResourceView.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/servlet/resource/StormFsResourceView.java @@ -33,18 +33,18 @@ public class StormFsResourceView { private StormFsResourceView(Builder b) { if (b.isDirectory && !b.name.endsWith("/")) { - this.name = b.name +"/"; + this.name = b.name + "/"; } else { this.name = b.name; } - + this.isDirectory = b.isDirectory; this.path = b.path; this.sizeInBytes = b.sizeInBytes; this.lastModificationTime = b.lastModificationTime; this.creationTime = b.creationTime; - - + + } public String getName() { @@ -80,6 +80,7 @@ public Date getCreationTime() { public static Builder builder() { return new Builder(); } + public static class Builder { String name; boolean isDirectory; diff --git a/src/main/java/org/italiangrid/storm/webdav/server/servlet/resource/StormResourceService.java b/src/main/java/org/italiangrid/storm/webdav/server/servlet/resource/StormResourceService.java deleted file mode 100644 index aa606090..00000000 --- a/src/main/java/org/italiangrid/storm/webdav/server/servlet/resource/StormResourceService.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Copyright (c) Istituto Nazionale di Fisica Nucleare, 2014-2023. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.italiangrid.storm.webdav.server.servlet.resource; - -import java.io.FileNotFoundException; -import java.io.IOException; - -import javax.servlet.ServletException; -import javax.servlet.RequestDispatcher; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.eclipse.jetty.http.HttpContent; -import org.eclipse.jetty.server.ResourceService; -import org.eclipse.jetty.util.URIUtil; -import org.italiangrid.storm.webdav.scitag.SciTag; -import org.italiangrid.storm.webdav.scitag.SciTagTransfer; - -public class StormResourceService extends ResourceService { - - private String pathInContext(HttpServletRequest request) { - String servletPath = null; - String pathInfo = null; - - boolean included = request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI) != null; - - if (included) { - servletPath = isPathInfoOnly() ? "/" - : (String) request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH); - pathInfo = (String) request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO); - if (servletPath == null) { - servletPath = request.getServletPath(); - pathInfo = request.getPathInfo(); - } - } else { - servletPath = isPathInfoOnly() ? "/" : request.getServletPath(); - pathInfo = request.getPathInfo(); - } - - return URIUtil.addPaths(servletPath, pathInfo); - } - - @Override - public boolean doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - SciTag scitag = (SciTag) request.getAttribute(SciTag.SCITAG_ATTRIBUTE); - SciTagTransfer scitagTransfer = null; - if (scitag != null) { - scitagTransfer = new SciTagTransfer(scitag, request.getLocalAddr(), request.getLocalPort(), - request.getRemoteAddr(), request.getRemotePort()); - scitagTransfer.writeStart(); - } - boolean result = super.doGet(request, response); - if (scitagTransfer != null) { - scitagTransfer.writeEnd(); - } - return result; - } - - public boolean doHead(HttpServletRequest request, HttpServletResponse response) - throws IOException { - - final boolean included = request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI) != null; - final String pathInContext = pathInContext(request); - - final HttpContent content = - getContentFactory().getContent(pathInContext, response.getBufferSize()); - - if (content == null || !content.getResource().exists()) { - - if (included) { - throw new FileNotFoundException("!" + pathInContext); - } - - response.sendError(HttpServletResponse.SC_NOT_FOUND); - return response.isCommitted(); - } - - putHeaders(response, content, content.getContentLengthValue()); - return true; - } - -} diff --git a/src/main/java/org/italiangrid/storm/webdav/server/servlet/resource/StormResourceWrapper.java b/src/main/java/org/italiangrid/storm/webdav/server/servlet/resource/StormResourceWrapper.java index 73a030e9..b6b8da0c 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/servlet/resource/StormResourceWrapper.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/servlet/resource/StormResourceWrapper.java @@ -15,15 +15,15 @@ */ package org.italiangrid.storm.webdav.server.servlet.resource; -import java.io.File; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; -import java.net.MalformedURLException; -import java.net.URL; -import java.nio.channels.ReadableByteChannel; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.time.Instant; import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collections; import java.util.Date; import java.util.List; @@ -45,40 +45,45 @@ public class StormResourceWrapper extends Resource { final TemplateEngine engine; final OAuthProperties oauthProperties; final ServiceConfigurationProperties serviceConfig; + final String pathInContext; public StormResourceWrapper(OAuthProperties oauth, ServiceConfigurationProperties serviceConfig, - TemplateEngine engine, Resource delegate) { + TemplateEngine engine, Resource delegate, String pathInContext) { this.oauthProperties = oauth; this.engine = engine; this.delegate = delegate; this.serviceConfig = serviceConfig; + this.pathInContext = pathInContext; } + // Adapted from + // https://github.com/jetty/jetty.project/blob/jetty-12.0.x/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/ResourceListing.java /** - * Encode any characters that could break the URI string in an HREF. Such as ">Link + *

+ * Encode any characters that could break the URI string in an HREF. + *

* + *

+ * Such as: {@code Link} + *

+ *

* The above example would parse incorrectly on various browsers as the "<" or '"' characters * would end the href attribute value string prematurely. + *

* * @param raw the raw text to encode. * @return the defanged text. */ private static String hrefEncodeURI(String raw) { - StringBuffer buf = null; - loop: for (int i = 0; i < raw.length(); i++) { + for (int i = 0; i < raw.length(); i++) { char c = raw.charAt(i); - switch (c) { - case '\'': - case '"': - case '<': - case '>': - buf = new StringBuffer(raw.length() << 1); - break loop; + if (c == '\'' || c == '"' || c == '<' || c == '>') { + buf = new StringBuffer(raw.length() << 1); + break; } } if (buf == null) @@ -87,39 +92,21 @@ private static String hrefEncodeURI(String raw) { for (int i = 0; i < raw.length(); i++) { char c = raw.charAt(i); switch (c) { - case '"': - buf.append("%22"); - continue; - case '\'': - buf.append("%27"); - continue; - case '<': - buf.append("%3C"); - continue; - case '>': - buf.append("%3E"); - continue; - default: - buf.append(c); - continue; + case '"' -> buf.append("%22"); + case '\'' -> buf.append("%27"); + case '<' -> buf.append("%3C"); + case '>' -> buf.append("%3E"); + default -> buf.append(c); } } return buf.toString(); } - - @Override - public String getListHTML(String base, boolean parent, String query) throws IOException { - + public String getListHTML(String base) { base = URIUtil.canonicalPath(base); - if (base == null || !isDirectory()) - return null; - String[] rawListing = list(); - if (rawListing == null) { - return null; - } + List rawListing = list(); Context context = new Context(); @@ -139,17 +126,16 @@ public String getListHTML(String base, boolean parent, String query) throws IOEx String parentDir = URIUtil.addPaths(encodedBase, "../"); - Arrays.sort(rawListing); + Collections.sort(rawListing, (a, b) -> a.getFileName().compareTo(b.getFileName())); List resources = new ArrayList<>(); - for (String l : rawListing) { - Resource r = addPath(l); + for (Resource r : rawListing) { resources.add(StormFsResourceView.builder() - .withName(l) - .withPath(URIUtil.addEncodedPaths(encodedBase, URIUtil.encodePath(l))) + .withName(r.getFileName()) + .withPath(URIUtil.addEncodedPaths(encodedBase, r.getFileName())) .withIsDirectory(r.isDirectory()) - .withLastModificationTime(new Date(r.lastModified())) + .withLastModificationTime(Date.from(r.lastModified())) .withSizeInBytes(r.length()) .build()); } @@ -160,18 +146,6 @@ public String getListHTML(String base, boolean parent, String query) throws IOEx return engine.process(JETTY_DIR_TEMPLATE, context); } - @Override - public boolean isContainedIn(Resource r) throws MalformedURLException { - - return delegate.isContainedIn(r); - } - - @Override - public void close() { - - delegate.close(); - } - @Override public boolean exists() { return delegate.exists(); @@ -179,11 +153,17 @@ public boolean exists() { @Override public boolean isDirectory() { - return delegate.isDirectory(); + // We must lie otherwise Jetty uses its non-overridable directory listing + return false; + } + + @Override + public boolean isReadable() { + return delegate.isReadable(); } @Override - public long lastModified() { + public Instant lastModified() { return delegate.lastModified(); } @@ -192,15 +172,14 @@ public long length() { return delegate.length(); } - @SuppressWarnings("deprecation") @Override - public URL getURL() { - return delegate.getURL(); + public URI getURI() { + return delegate.getURI(); } @Override - public File getFile() throws IOException { - return delegate.getFile(); + public String getFileName() { + return delegate.getFileName(); } @Override @@ -209,85 +188,23 @@ public String getName() { } @Override - public InputStream getInputStream() throws IOException { - return delegate.getInputStream(); + public Path getPath() { + // We must lie so Jetty uses our overrided newInputStream + return null; } @Override - public ReadableByteChannel getReadableByteChannel() throws IOException { - return delegate.getReadableByteChannel(); + public InputStream newInputStream() throws IOException { + return new ByteArrayInputStream(getListHTML(pathInContext).getBytes(StandardCharsets.UTF_8)); } @Override - public boolean delete() throws SecurityException { - return delegate.delete(); - } - - @Override - public boolean renameTo(Resource dest) throws SecurityException { - return delegate.renameTo(dest); - } - - @Override - public String[] list() { + public List list() { return delegate.list(); } @Override - public Resource addPath(String path) throws IOException { - return delegate.addPath(path); - } - - @Override - public void writeTo(OutputStream out, long start, long count) throws IOException { - - try (InputStream in = getInputStream()) { - if (start > 0) { - long n = in.skip(start); - if (n < start) { - throw new IOException("Skipped " + start + " bytes but read " + n); - } - } - if (count < 0) { - internalCopy(in, out); - } else { - internalCopy(in, out, count); - } - } - - } - - private void internalCopy(InputStream in, OutputStream out, long byteCount) throws IOException { - - int bufferSize = serviceConfig.getBuffer().getFileBufferSizeBytes(); - byte[] buffer = new byte[bufferSize]; - int len = bufferSize; - - if (byteCount >= 0) { - while (byteCount > 0) { - int max = byteCount < bufferSize ? (int) byteCount : bufferSize; - len = in.read(buffer, 0, max); - - if (len == -1) - break; - - byteCount -= len; - out.write(buffer, 0, len); - } - } else { - while (true) { - len = in.read(buffer, 0, bufferSize); - if (len < 0) - break; - out.write(buffer, 0, len); - } - } - - } - - private void internalCopy(InputStream in, OutputStream out) throws IOException { - internalCopy(in, out, -1); + public Resource resolve(String subUriPath) { + return delegate.resolve(subUriPath); } - - } diff --git a/src/main/java/org/italiangrid/storm/webdav/server/tracing/LogbackAccessAuthnInfoFilter.java b/src/main/java/org/italiangrid/storm/webdav/server/tracing/LogbackAccessAuthnInfoFilter.java index 4e62dc3f..af101132 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/tracing/LogbackAccessAuthnInfoFilter.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/tracing/LogbackAccessAuthnInfoFilter.java @@ -17,12 +17,12 @@ import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; import org.italiangrid.storm.webdav.authn.PrincipalHelper; import org.springframework.security.core.Authentication; @@ -37,6 +37,7 @@ public class LogbackAccessAuthnInfoFilter implements Filter { public LogbackAccessAuthnInfoFilter(PrincipalHelper principalHelper) { this.helper = principalHelper; } + @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { diff --git a/src/main/java/org/italiangrid/storm/webdav/server/tracing/RequestIdFilter.java b/src/main/java/org/italiangrid/storm/webdav/server/tracing/RequestIdFilter.java index 023ea6a1..87411f83 100644 --- a/src/main/java/org/italiangrid/storm/webdav/server/tracing/RequestIdFilter.java +++ b/src/main/java/org/italiangrid/storm/webdav/server/tracing/RequestIdFilter.java @@ -17,11 +17,11 @@ import java.io.IOException; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import org.slf4j.MDC; @@ -32,11 +32,11 @@ public class RequestIdFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { - + RequestIdHolder.setRandomId(); request.setAttribute(REQUEST_ID_ATTRIBUTE_NAME, RequestIdHolder.getRequestId()); MDC.put(REQUEST_ID_ATTRIBUTE_NAME, RequestIdHolder.getRequestId()); - + try { chain.doFilter(request, response); } finally { @@ -44,6 +44,6 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha MDC.clear(); } } - + } diff --git a/src/main/java/org/italiangrid/storm/webdav/server/util/JettyErrorPageHandler.java b/src/main/java/org/italiangrid/storm/webdav/server/util/JettyErrorPageHandler.java deleted file mode 100644 index 8e71a188..00000000 --- a/src/main/java/org/italiangrid/storm/webdav/server/util/JettyErrorPageHandler.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Copyright (c) Istituto Nazionale di Fisica Nucleare, 2014-2023. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.italiangrid.storm.webdav.server.util; - -import java.io.IOException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.servlet.ErrorPageErrorHandler; - -public class JettyErrorPageHandler extends ErrorPageErrorHandler { - - private static final Set HANDLED_HTTP_METHODS = - new HashSet<>(Arrays.asList("GET", "POST", "HEAD")); - - @Override - public boolean errorPageForMethod(String method) { - return true; - } - - @Override - public void handle(String target, Request baseRequest, HttpServletRequest request, - HttpServletResponse response) throws IOException { - if (!HANDLED_HTTP_METHODS.contains(baseRequest.getMethod())) { - baseRequest.setMethod("GET"); - } - super.doError(target, baseRequest, request, response); - } - -} diff --git a/src/main/java/org/italiangrid/storm/webdav/spring/AppConfig.java b/src/main/java/org/italiangrid/storm/webdav/spring/AppConfig.java index 8706844f..292948bc 100644 --- a/src/main/java/org/italiangrid/storm/webdav/spring/AppConfig.java +++ b/src/main/java/org/italiangrid/storm/webdav/spring/AppConfig.java @@ -26,6 +26,7 @@ import java.security.Security; import java.security.cert.CertificateException; import java.time.Clock; +import java.util.HashMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -37,16 +38,17 @@ import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.config.ConnectionConfig; -import org.apache.http.config.Registry; -import org.apache.http.config.RegistryBuilder; -import org.apache.http.conn.HttpClientConnectionManager; -import org.apache.http.conn.socket.ConnectionSocketFactory; -import org.apache.http.conn.socket.LayeredConnectionSocketFactory; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.hc.client5.http.config.RequestConfig; +import org.apache.hc.client5.http.config.ConnectionConfig; +import org.apache.hc.core5.http.config.Http1Config; +import org.apache.hc.core5.http.io.HttpConnectionFactory; +import org.apache.hc.client5.http.io.HttpClientConnectionManager; +import org.apache.hc.client5.http.io.ManagedHttpClientConnection; +import org.apache.hc.client5.http.impl.ChainElement; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.client5.http.impl.io.ManagedHttpClientConnectionFactory; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; import org.conscrypt.OpenSSLProvider; import org.italiangrid.storm.webdav.authn.PrincipalHelper; import org.italiangrid.storm.webdav.authz.AuthorizationPolicyService; @@ -89,10 +91,10 @@ import org.italiangrid.storm.webdav.server.util.CANLListener; import org.italiangrid.storm.webdav.tpc.LocalURLService; import org.italiangrid.storm.webdav.tpc.StaticHostListLocalURLService; -import org.italiangrid.storm.webdav.tpc.TpcPlainConnectionSocketFactory; -import org.italiangrid.storm.webdav.tpc.TpcSSLConnectionSocketFactory; -import org.italiangrid.storm.webdav.tpc.TransferConstants; +import org.italiangrid.storm.webdav.tpc.TpcTlsSocketStrategy; +import org.italiangrid.storm.webdav.tpc.http.DropAuthorizationHeaderExec; import org.italiangrid.storm.webdav.tpc.http.SuperLaxRedirectStrategy; +import org.italiangrid.storm.webdav.tpc.http.TpcSchemePortResolver; import org.italiangrid.voms.util.CertificateValidatorBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -108,6 +110,9 @@ import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.jwt.JwtDecoder; import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver; +import org.springframework.session.MapSession; +import org.springframework.session.MapSessionRepository; +import org.springframework.session.SessionRepository; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.health.HealthCheckRegistry; @@ -245,6 +250,17 @@ ScheduledExecutorService tpcProgressReportEs(ThirdPartyCopyProperties props) { HttpClientConnectionManager tpcClientConnectionManager(ThirdPartyCopyProperties props, ServiceConfiguration conf) throws KeyStoreException, CertificateException, IOException, NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException { + + Http1Config customHttpConfig = + Http1Config.custom().setBufferSize(props.getHttpClientSocketBufferSize()).build(); + HttpConnectionFactory connectionFactory = + ManagedHttpClientConnectionFactory.builder().http1Config(customHttpConfig).build(); + + ConnectionConfig connectionConfig = ConnectionConfig.custom() + .setSocketTimeout(props.getTimeoutInSecs(), TimeUnit.SECONDS) + .setConnectTimeout(props.getTimeoutInSecs(), TimeUnit.SECONDS) + .build(); + PEMCredential serviceCredential = serviceCredential(conf); X509CertChainValidatorExt validator = canlCertChainCustomValidator(conf, @@ -270,42 +286,30 @@ HttpClientConnectionManager tpcClientConnectionManager(ThirdPartyCopyProperties ctx.init(null, new TrustManager[] {tm}, null); } - ConnectionSocketFactory sf = TpcPlainConnectionSocketFactory.getSocketFactory(); - LayeredConnectionSocketFactory tlsSf = new TpcSSLConnectionSocketFactory(ctx); - - Registry r = RegistryBuilder.create() - .register(TransferConstants.HTTP, sf) - .register(TransferConstants.HTTPS, tlsSf) - .register(TransferConstants.DAV, sf) - .register(TransferConstants.DAVS, tlsSf) + return PoolingHttpClientConnectionManagerBuilder + .create() + .setSchemePortResolver(TpcSchemePortResolver.INSTANCE) + .setTlsSocketStrategy(new TpcTlsSocketStrategy(ctx)) + .setDefaultConnectionConfig(connectionConfig) + .setMaxConnPerRoute(props.getMaxConnectionsPerRoute()) .build(); - - PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(r); - cm.setMaxTotal(props.getMaxConnections()); - cm.setDefaultMaxPerRoute(props.getMaxConnectionsPerRoute()); - return cm; } @Bean CloseableHttpClient transferClient(ThirdPartyCopyProperties props, @Qualifier("tpcConnectionManager") HttpClientConnectionManager cm) { - ConnectionConfig connectionConfig = - ConnectionConfig.custom().setBufferSize(props.getHttpClientSocketBufferSize()).build(); - - int timeoutMsec = (int) TimeUnit.SECONDS.toMillis(props.getTimeoutInSecs()); RequestConfig config = RequestConfig.custom() .setExpectContinueEnabled(false) - .setConnectTimeout(timeoutMsec) - .setConnectionRequestTimeout(timeoutMsec) - .setSocketTimeout(timeoutMsec) + .setConnectionRequestTimeout(props.getTimeoutInSecs(), TimeUnit.SECONDS) .build(); return HttpClients.custom() .setConnectionManager(cm) - .setDefaultConnectionConfig(connectionConfig) - .setDefaultRequestConfig(config) .setRedirectStrategy(SuperLaxRedirectStrategy.INSTANCE) + .addExecInterceptorAfter(ChainElement.REDIRECT.name(), "DropAuthorizationHeader", + new DropAuthorizationHeaderExec(SuperLaxRedirectStrategy.INSTANCE)) + .setDefaultRequestConfig(config) .build(); } @@ -451,6 +455,13 @@ PrincipalHelper principalHelper(ServiceConfigurationProperties config) throws MalformedURLException { return new PrincipalHelper(config); } + + @Bean + @ConditionalOnProperty(name = "spring.session.store-type", havingValue = "none") + public SessionRepository sessionRepository() { + return new MapSessionRepository(new HashMap<>()); + } + } diff --git a/src/main/java/org/italiangrid/storm/webdav/spring/web/AppContextLoaderListener.java b/src/main/java/org/italiangrid/storm/webdav/spring/web/AppContextLoaderListener.java index 1f39b68b..bcc4d36f 100644 --- a/src/main/java/org/italiangrid/storm/webdav/spring/web/AppContextLoaderListener.java +++ b/src/main/java/org/italiangrid/storm/webdav/spring/web/AppContextLoaderListener.java @@ -15,7 +15,7 @@ */ package org.italiangrid.storm.webdav.spring.web; -import javax.servlet.ServletContext; +import jakarta.servlet.ServletContext; import org.springframework.context.ApplicationContext; import org.springframework.web.context.ContextLoaderListener; diff --git a/src/main/java/org/italiangrid/storm/webdav/spring/web/HttpMethodRequestRejectedHandler.java b/src/main/java/org/italiangrid/storm/webdav/spring/web/HttpMethodRequestRejectedHandler.java index e724830b..534788be 100644 --- a/src/main/java/org/italiangrid/storm/webdav/spring/web/HttpMethodRequestRejectedHandler.java +++ b/src/main/java/org/italiangrid/storm/webdav/spring/web/HttpMethodRequestRejectedHandler.java @@ -19,9 +19,9 @@ import java.util.ArrayList; import java.util.List; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/src/main/java/org/italiangrid/storm/webdav/spring/web/MvcConfig.java b/src/main/java/org/italiangrid/storm/webdav/spring/web/MvcConfig.java index 57288094..672a1467 100644 --- a/src/main/java/org/italiangrid/storm/webdav/spring/web/MvcConfig.java +++ b/src/main/java/org/italiangrid/storm/webdav/spring/web/MvcConfig.java @@ -31,16 +31,16 @@ @Configuration public class MvcConfig implements WebMvcConfigurer { - + @Autowired ServiceConfigurationProperties properties; - + @Autowired OAuthProperties oauthProperties; @Autowired StorageAreaConfiguration saConfig; - + @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new ViewUtilsInterceptor(properties, saConfig, oauthProperties)); diff --git a/src/main/java/org/italiangrid/storm/webdav/spring/web/ServletConfiguration.java b/src/main/java/org/italiangrid/storm/webdav/spring/web/ServletConfiguration.java index da87d8b1..99beb87a 100644 --- a/src/main/java/org/italiangrid/storm/webdav/spring/web/ServletConfiguration.java +++ b/src/main/java/org/italiangrid/storm/webdav/spring/web/ServletConfiguration.java @@ -42,7 +42,6 @@ import org.italiangrid.storm.webdav.server.servlet.SciTagFilter; import org.italiangrid.storm.webdav.server.servlet.ServerResponseHeaderFilter; import org.italiangrid.storm.webdav.server.servlet.StoRMServlet; -import org.italiangrid.storm.webdav.server.servlet.resource.StormResourceService; import org.italiangrid.storm.webdav.server.tracing.LogbackAccessAuthnInfoFilter; import org.italiangrid.storm.webdav.server.tracing.RequestIdFilter; import org.italiangrid.storm.webdav.tpc.LocalURLService; @@ -60,7 +59,7 @@ import org.thymeleaf.TemplateEngine; import com.codahale.metrics.MetricRegistry; -import com.codahale.metrics.servlets.MetricsServlet; +import io.dropwizard.metrics.servlets.MetricsServlet; import com.fasterxml.jackson.databind.ObjectMapper; @@ -243,14 +242,12 @@ ServletRegistrationBean stormServlet(OAuthProperties oauthProperti ServiceConfigurationProperties serviceConfig, StorageAreaConfiguration saConfig, PathResolver pathResolver, TemplateEngine templateEngine) { - ServletRegistrationBean stormServlet = - new ServletRegistrationBean<>(new StoRMServlet(oauthProperties, serviceConfig, pathResolver, - templateEngine, new StormResourceService())); + ServletRegistrationBean stormServlet = new ServletRegistrationBean<>( + new StoRMServlet(oauthProperties, serviceConfig, pathResolver, templateEngine)); stormServlet.addInitParameter("acceptRanges", "true"); stormServlet.addInitParameter("dirAllowed", "true"); - stormServlet.addInitParameter("aliases", "false"); - stormServlet.addInitParameter("gzip", "false"); + stormServlet.addInitParameter("precompressed", "false"); saConfig.getStorageAreaInfo() diff --git a/src/main/java/org/italiangrid/storm/webdav/tpc/TpcPlainConnectionSocketFactory.java b/src/main/java/org/italiangrid/storm/webdav/tpc/TpcPlainConnectionSocketFactory.java deleted file mode 100644 index 04289a9d..00000000 --- a/src/main/java/org/italiangrid/storm/webdav/tpc/TpcPlainConnectionSocketFactory.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Copyright (c) Istituto Nazionale di Fisica Nucleare, 2014-2023. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.italiangrid.storm.webdav.tpc; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Socket; -import org.apache.http.HttpHost; -import org.apache.http.conn.socket.PlainConnectionSocketFactory; -import org.apache.http.protocol.HttpContext; -import org.italiangrid.storm.webdav.scitag.SciTag; -import org.italiangrid.storm.webdav.scitag.SciTagTransfer; - -public class TpcPlainConnectionSocketFactory extends PlainConnectionSocketFactory { - - public static final TpcPlainConnectionSocketFactory INSTANCE = - new TpcPlainConnectionSocketFactory(); - - public static TpcPlainConnectionSocketFactory getSocketFactory() { - return INSTANCE; - } - - public TpcPlainConnectionSocketFactory() { - super(); - } - - @Override - public Socket connectSocket(int connectTimeout, Socket socket, HttpHost host, - InetSocketAddress remoteAddress, InetSocketAddress localAddress, HttpContext context) - throws IOException { - Socket s = - super.connectSocket(connectTimeout, socket, host, remoteAddress, localAddress, context); - SciTag scitag = (SciTag) context.getAttribute(SciTag.SCITAG_ATTRIBUTE); - if (scitag != null) { - SciTagTransfer scitagTransfer = - new SciTagTransfer(scitag, s.getLocalAddress().getHostAddress(), s.getLocalPort(), - s.getInetAddress().getHostAddress(), s.getPort()); - scitagTransfer.writeStart(); - context.setAttribute(SciTagTransfer.SCITAG_TRANSFER_ATTRIBUTE, scitagTransfer); - } - return s; - } -} diff --git a/src/main/java/org/italiangrid/storm/webdav/tpc/TpcSSLConnectionSocketFactory.java b/src/main/java/org/italiangrid/storm/webdav/tpc/TpcTlsSocketStrategy.java similarity index 75% rename from src/main/java/org/italiangrid/storm/webdav/tpc/TpcSSLConnectionSocketFactory.java rename to src/main/java/org/italiangrid/storm/webdav/tpc/TpcTlsSocketStrategy.java index d7660cb6..7f11edcd 100644 --- a/src/main/java/org/italiangrid/storm/webdav/tpc/TpcSSLConnectionSocketFactory.java +++ b/src/main/java/org/italiangrid/storm/webdav/tpc/TpcTlsSocketStrategy.java @@ -17,22 +17,25 @@ import java.io.IOException; import java.net.Socket; + import javax.net.ssl.SSLContext; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.protocol.HttpContext; +import javax.net.ssl.SSLSocket; + +import org.apache.hc.client5.http.ssl.DefaultClientTlsStrategy; +import org.apache.hc.core5.http.protocol.HttpContext; import org.italiangrid.storm.webdav.scitag.SciTag; import org.italiangrid.storm.webdav.scitag.SciTagTransfer; -public class TpcSSLConnectionSocketFactory extends SSLConnectionSocketFactory { +public class TpcTlsSocketStrategy extends DefaultClientTlsStrategy { - public TpcSSLConnectionSocketFactory(SSLContext sslContext) { + public TpcTlsSocketStrategy(SSLContext sslContext) { super(sslContext); } @Override - public Socket createLayeredSocket(Socket socket, String target, int port, HttpContext context) + public SSLSocket upgrade(Socket socket, String target, int port, Object attachment, HttpContext context) throws IOException { - Socket s = super.createLayeredSocket(socket, target, port, context); + SSLSocket s = super.upgrade(socket, target, port, attachment, context); SciTag scitag = (SciTag) context.getAttribute(SciTag.SCITAG_ATTRIBUTE); if (scitag != null) { SciTagTransfer scitagTransfer = diff --git a/src/main/java/org/italiangrid/storm/webdav/tpc/TpcUtils.java b/src/main/java/org/italiangrid/storm/webdav/tpc/TpcUtils.java index 5e7a1ec0..ff5445dd 100644 --- a/src/main/java/org/italiangrid/storm/webdav/tpc/TpcUtils.java +++ b/src/main/java/org/italiangrid/storm/webdav/tpc/TpcUtils.java @@ -24,7 +24,7 @@ import java.util.function.Supplier; import java.util.regex.Matcher; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.italiangrid.storm.webdav.config.StorageAreaInfo; import org.italiangrid.storm.webdav.error.ResourceNotFound; @@ -106,8 +106,9 @@ default boolean isCopy(HttpServletRequest request) { } default boolean isPushTpc(HttpServletRequest request, LocalURLService localUrlService) { - return "COPY".equals(request.getMethod()) && (requestHasRemoteDestinationHeader(request, localUrlService) - || requestHasTranferHeader(request)); + return "COPY".equals(request.getMethod()) + && (requestHasRemoteDestinationHeader(request, localUrlService) + || requestHasTranferHeader(request)); } default boolean requestHasTranferHeader(HttpServletRequest request) { diff --git a/src/main/java/org/italiangrid/storm/webdav/tpc/TransferFilter.java b/src/main/java/org/italiangrid/storm/webdav/tpc/TransferFilter.java index c40d2a56..cf8b6931 100644 --- a/src/main/java/org/italiangrid/storm/webdav/tpc/TransferFilter.java +++ b/src/main/java/org/italiangrid/storm/webdav/tpc/TransferFilter.java @@ -15,7 +15,7 @@ */ package org.italiangrid.storm.webdav.tpc; -import static javax.servlet.http.HttpServletResponse.SC_ACCEPTED; +import static jakarta.servlet.http.HttpServletResponse.SC_ACCEPTED; import java.io.IOException; import java.net.MalformedURLException; @@ -23,17 +23,17 @@ import java.time.Clock; import java.util.Optional; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.io.FileUtils; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.HttpResponseException; +import org.apache.hc.client5.http.ClientProtocolException; +import org.apache.hc.client5.http.HttpResponseException; import org.italiangrid.storm.webdav.error.BadRequest; import org.italiangrid.storm.webdav.error.ResourceNotFound; import org.italiangrid.storm.webdav.scitag.SciTag; @@ -147,20 +147,24 @@ protected void reportProgress(TransferRequest request, TransferStatus s, HttpSer protected void logTransferStart(GetTransferRequest req) { - LOG.info( - "Pull third-party transfer requested: Source: {}, Destination: {}, hasAuthorizationHeader: {}, id: {}", - req.remoteURI(), req.path(), - req.transferHeaders().containsKey(TransferConstants.AUTHORIZATION_HEADER), req.uuid()); + if (LOG.isInfoEnabled()) { + LOG.info( + "Pull third-party transfer requested: Source: {}, Destination: {}, hasAuthorizationHeader: {}, id: {}", + req.remoteURI(), req.path(), + req.transferHeaders().containsKey(TransferConstants.AUTHORIZATION_HEADER), req.uuid()); + } if (LOG.isDebugEnabled()) { LOG.debug("{}", req); } } protected void logTransferStart(PutTransferRequest req) { - LOG.info( - "Push third-party transfer requested: Source: {}, Destination: {}, hasAuthorizationHeader: {}, id: {}", - req.path(), req.remoteURI(), - req.transferHeaders().containsKey(TransferConstants.AUTHORIZATION_HEADER), req.uuid()); + if (LOG.isInfoEnabled()) { + LOG.info( + "Push third-party transfer requested: Source: {}, Destination: {}, hasAuthorizationHeader: {}, id: {}", + req.path(), req.remoteURI(), + req.transferHeaders().containsKey(TransferConstants.AUTHORIZATION_HEADER), req.uuid()); + } if (LOG.isDebugEnabled()) { LOG.debug("{}", req); } @@ -169,40 +173,38 @@ protected void logTransferStart(PutTransferRequest req) { private String getUserFriendlyThroughputString(TransferRequest req) { String xferThroughputString = EMPTY_VALUE; - if (req.transferThroughputBytesPerSec().isPresent()) { + Optional transferThroughputBytesPerSec = req.transferThroughputBytesPerSec(); + if (transferThroughputBytesPerSec.isPresent()) { xferThroughputString = - FileUtils.byteCountToDisplaySize(req.transferThroughputBytesPerSec().get().longValue()); + FileUtils.byteCountToDisplaySize(transferThroughputBytesPerSec.get().longValue()); } return xferThroughputString; } protected void logTransferDone(GetTransferRequest req) { - if (req.lastTransferStatus().isPresent() && LOG.isInfoEnabled()) { - TransferStatus lastStatus = req.lastTransferStatus().get(); - if (TransferStatus.Status.DONE.equals(lastStatus.getStatus())) { - LOG.info( - "Pull third-party transfer completed: {}. Source: {}, Destination: {}, Bytes transferred: {}, Duration (msec): {}, Throughput: {}/sec, id: {}", - lastStatus, req.remoteURI(), req.path(), - req.bytesTransferred(), - req.duration().toMillis(), - getUserFriendlyThroughputString(req), - req.uuid()); - } else { - LOG.warn("Pull third-party transfer completed: {}. Source: {}, Destination: {}", lastStatus, - req.remoteURI(), req.path()); - } + if (LOG.isInfoEnabled()) { + req.lastTransferStatus().ifPresent(lastStatus -> { + if (TransferStatus.Status.DONE.equals(lastStatus.getStatus())) { + LOG.info( + "Pull third-party transfer completed: {}. Source: {}, Destination: {}, Bytes transferred: {}, Duration (msec): {}, Throughput: {}/sec, id: {}", + lastStatus, req.remoteURI(), req.path(), req.bytesTransferred(), + req.duration().toMillis(), getUserFriendlyThroughputString(req), req.uuid()); + } else { + LOG.warn("Pull third-party transfer completed: {}. Source: {}, Destination: {}", + lastStatus, req.remoteURI(), req.path()); + } + }); } } protected void logTransferDone(PutTransferRequest req) { - if (req.lastTransferStatus().isPresent() && LOG.isInfoEnabled()) { - - LOG.info( - "Push third-party transfer completed: {}. Source: {}, Destination: {}, Bytes transferred: {}, Duration (msec): {}, Throughput: {}/sec, id: {}", - req.lastTransferStatus().get(), req.path(), req.remoteURI(), - req.bytesTransferred(), req.duration().toMillis(), getUserFriendlyThroughputString(req), - req.uuid()); + if (LOG.isInfoEnabled()) { + req.lastTransferStatus() + .ifPresent(lastTransferStatus -> LOG.info( + "Push third-party transfer completed: {}. Source: {}, Destination: {}, Bytes transferred: {}, Duration (msec): {}, Throughput: {}/sec, id: {}", + lastTransferStatus, req.path(), req.remoteURI(), req.bytesTransferred(), + req.duration().toMillis(), getUserFriendlyThroughputString(req), req.uuid())); } } diff --git a/src/main/java/org/italiangrid/storm/webdav/tpc/TransferFilterSupport.java b/src/main/java/org/italiangrid/storm/webdav/tpc/TransferFilterSupport.java index ad0b487d..c1c3a2a7 100644 --- a/src/main/java/org/italiangrid/storm/webdav/tpc/TransferFilterSupport.java +++ b/src/main/java/org/italiangrid/storm/webdav/tpc/TransferFilterSupport.java @@ -16,7 +16,7 @@ package org.italiangrid.storm.webdav.tpc; import static java.lang.String.format; -import static javax.servlet.http.HttpServletResponse.SC_PRECONDITION_FAILED; +import static jakarta.servlet.http.HttpServletResponse.SC_PRECONDITION_FAILED; import static org.springframework.http.HttpStatus.BAD_REQUEST; import java.io.IOException; @@ -28,11 +28,11 @@ import java.util.Enumeration; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.HttpResponseException; +import org.apache.hc.client5.http.ClientProtocolException; +import org.apache.hc.client5.http.HttpResponseException; import org.italiangrid.storm.webdav.scitag.SciTag; import org.italiangrid.storm.webdav.server.PathResolver; import org.italiangrid.storm.webdav.tpc.transfer.TransferRequest; @@ -83,7 +83,7 @@ protected Multimap getTransferHeaders(HttpServletRequest request if (headerName.toLowerCase().startsWith(TransferConstants.TRANSFER_HEADER_LC)) { String xferHeaderName = headerName.substring(TransferConstants.TRANFER_HEADER_LENGTH); - if (xferHeaderName.trim().length() == 0) { + if (xferHeaderName.isBlank()) { LOG.warn("Ignoring invalid transfer header {}", headerName); continue; } @@ -99,9 +99,9 @@ protected Multimap getTransferHeaders(HttpServletRequest request } } - if (isPushTpc(request, localURLService) && request.getContentLength() >= enableExpectContinueThreshold) { - xferHeaders.put(org.apache.http.protocol.HTTP.EXPECT_DIRECTIVE, - org.apache.http.protocol.HTTP.EXPECT_CONTINUE); + if (isPushTpc(request, localURLService) + && request.getContentLength() >= enableExpectContinueThreshold) { + xferHeaders.put("Expect", "100-continue"); } return xferHeaders; @@ -184,7 +184,7 @@ protected boolean validLocalSourcePath(HttpServletRequest request, HttpServletRe Optional pathInfo = Optional.ofNullable(request.getPathInfo()); - if (!pathInfo.isPresent() || pathInfo.get().trim().length() == 0) { + if (!pathInfo.isPresent() || pathInfo.get().isBlank()) { invalidRequest(response, "Null or empty local path information!"); return false; } @@ -213,7 +213,7 @@ protected boolean validLocalDestinationPath(HttpServletRequest request, Optional pathInfo = Optional.ofNullable(request.getPathInfo()); - if (!pathInfo.isPresent() || pathInfo.get().trim().length() == 0) { + if (!pathInfo.isPresent() || pathInfo.get().isBlank()) { invalidRequest(response, "Null or empty local path information!"); return false; } @@ -286,7 +286,7 @@ protected boolean validRequest(HttpServletRequest request, HttpServletResponse r String val = overwrite.get(); - if (val.trim().length() == 0 || val.trim().length() > 1 + if (val.isBlank() || val.trim().length() > 1 || (!"T".equalsIgnoreCase(val) && !"F".equalsIgnoreCase(val))) { invalidOverwrite = true; } @@ -304,7 +304,7 @@ protected boolean validRequest(HttpServletRequest request, HttpServletResponse r String val = checksum.get(); - if (val.trim().length() == 0 || (!"true".equals(val) && !"false".equals(val))) { + if (val.isBlank() || (!"true".equals(val) && !"false".equals(val))) { invalidChecksum = true; } diff --git a/src/main/java/org/italiangrid/storm/webdav/tpc/http/DropAuthorizationHeaderExec.java b/src/main/java/org/italiangrid/storm/webdav/tpc/http/DropAuthorizationHeaderExec.java new file mode 100644 index 00000000..c9eda7b7 --- /dev/null +++ b/src/main/java/org/italiangrid/storm/webdav/tpc/http/DropAuthorizationHeaderExec.java @@ -0,0 +1,52 @@ +/** + * Copyright (c) Istituto Nazionale di Fisica Nucleare, 2014-2023. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.italiangrid.storm.webdav.tpc.http; + +import java.io.IOException; + +import org.apache.hc.client5.http.classic.ExecChain; +import org.apache.hc.client5.http.classic.ExecChainHandler; +import org.apache.hc.client5.http.config.RequestConfig; +import org.apache.hc.client5.http.protocol.HttpClientContext; +import org.apache.hc.client5.http.protocol.RedirectStrategy; +import org.apache.hc.core5.http.ClassicHttpRequest; +import org.apache.hc.core5.http.ClassicHttpResponse; +import org.apache.hc.core5.http.HttpException; +import org.apache.hc.core5.http.HttpHeaders; + +public final class DropAuthorizationHeaderExec implements ExecChainHandler { + + private final RedirectStrategy redirectStrategy; + + public DropAuthorizationHeaderExec(final RedirectStrategy redirectStrategy) { + super(); + this.redirectStrategy = redirectStrategy; + } + + @Override + public ClassicHttpResponse execute(final ClassicHttpRequest request, final ExecChain.Scope scope, + final ExecChain chain) throws IOException, HttpException { + final ClassicHttpResponse response = chain.proceed(request, scope); + final HttpClientContext context = scope.clientContext; + final RequestConfig config = context.getRequestConfigOrDefault(); + if (config.isRedirectsEnabled() + && this.redirectStrategy.isRedirected(request, response, context)) { + scope.originalRequest.removeHeaders(HttpHeaders.AUTHORIZATION); + } + return response; + } + +} diff --git a/src/main/java/org/italiangrid/storm/webdav/tpc/http/GetResponseHandler.java b/src/main/java/org/italiangrid/storm/webdav/tpc/http/GetResponseHandler.java index 98b16e66..24008134 100644 --- a/src/main/java/org/italiangrid/storm/webdav/tpc/http/GetResponseHandler.java +++ b/src/main/java/org/italiangrid/storm/webdav/tpc/http/GetResponseHandler.java @@ -21,10 +21,10 @@ import java.util.Collections; import java.util.Map; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.StatusLine; -import org.apache.http.util.EntityUtils; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.core5.http.ClassicHttpResponse; +import org.apache.hc.core5.http.io.HttpClientResponseHandler; +import org.apache.hc.core5.http.io.entity.EntityUtils; import org.italiangrid.storm.webdav.checksum.Adler32ChecksumOutputStream; import org.italiangrid.storm.webdav.fs.attrs.ExtendedAttributesHelper; import org.italiangrid.storm.webdav.tpc.transfer.GetTransferRequest; @@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory; public class GetResponseHandler extends ResponseHandlerSupport - implements org.apache.http.client.ResponseHandler { + implements HttpClientResponseHandler { public static final int DEFAULT_BUFFER_SIZE = 4096; @@ -83,15 +83,14 @@ private void writeEntityToStream(HttpEntity entity, OutputStream os) @Override - public Boolean handleResponse(HttpResponse response) throws IOException { + public Boolean handleResponse(ClassicHttpResponse response) throws IOException { setupMDC(); LOG.debug("Response: {}", response); - StatusLine sl = response.getStatusLine(); HttpEntity entity = response.getEntity(); - checkResponseStatus(sl); + checkResponseStatus(response); Adler32ChecksumOutputStream checkedStream = null; diff --git a/src/main/java/org/italiangrid/storm/webdav/tpc/http/HttpTransferClient.java b/src/main/java/org/italiangrid/storm/webdav/tpc/http/HttpTransferClient.java index dcf71208..7cdeede3 100644 --- a/src/main/java/org/italiangrid/storm/webdav/tpc/http/HttpTransferClient.java +++ b/src/main/java/org/italiangrid/storm/webdav/tpc/http/HttpTransferClient.java @@ -32,15 +32,14 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import org.apache.http.HttpEntity; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.HttpResponseException; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpHead; -import org.apache.http.client.methods.HttpPut; -import org.apache.http.client.protocol.HttpClientContext; -import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.core5.http.Method; +import org.apache.hc.core5.http.message.BasicClassicHttpRequest; +import org.apache.hc.client5.http.ClientProtocolException; +import org.apache.hc.client5.http.HttpResponseException; +import org.apache.hc.client5.http.classic.methods.HttpHead; +import org.apache.hc.client5.http.protocol.HttpClientContext; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.italiangrid.storm.webdav.config.ServiceConfigurationProperties; import org.italiangrid.storm.webdav.config.ThirdPartyCopyProperties; import org.italiangrid.storm.webdav.fs.attrs.ExtendedAttributesHelper; @@ -105,10 +104,10 @@ public void destroy() throws Exception { executorService.shutdownNow(); } - HttpGet prepareRequest(GetTransferRequest request) { + BasicClassicHttpRequest prepareRequest(GetTransferRequest request) { request.setTransferStatus(TransferStatus.builder(clock).inProgress(0)); - HttpGet get = new HttpGet(request.remoteURI()); + BasicClassicHttpRequest get = new BasicClassicHttpRequest(Method.GET, request.remoteURI()); for (Map.Entry h : request.transferHeaders().entries()) { get.addHeader(h.getKey(), h.getValue()); @@ -116,11 +115,11 @@ HttpGet prepareRequest(GetTransferRequest request) { return get; } - HttpPut prepareRequest(PutTransferRequest request, HttpEntity cfe) { + BasicClassicHttpRequest prepareRequest(PutTransferRequest request, HttpEntity cfe) { request.setTransferStatus(TransferStatus.builder(clock).inProgress(0)); - HttpPut put = new HttpPut(request.remoteURI()); + BasicClassicHttpRequest put = new BasicClassicHttpRequest(Method.PUT, request.remoteURI()); for (Map.Entry h : request.transferHeaders().entries()) { put.addHeader(h.getKey(), h.getValue()); @@ -167,7 +166,7 @@ StormCountingOutputStream prepareOutputStream(String path) { public void handle(GetTransferRequest request, TransferStatusCallback cb) { StormCountingOutputStream os = prepareOutputStream(resolver.resolvePath(request.path())); - HttpGet get = prepareRequest(request); + BasicClassicHttpRequest get = prepareRequest(request); HttpClientContext context = HttpClientContext.create(); ScheduledFuture reportTask = executorService.scheduleAtFixedRate( @@ -177,8 +176,8 @@ public void handle(GetTransferRequest request, TransferStatusCallback cb) { try { context.setAttribute(SciTag.SCITAG_ATTRIBUTE, request.scitag()); - httpClient.execute(get, new GetResponseHandler(request, os, attributesHelper, - MDC.getCopyOfContextMap(), socketBufferSize, true), context); + httpClient.execute(get, context, new GetResponseHandler(request, os, attributesHelper, + MDC.getCopyOfContextMap(), socketBufferSize, true)); reportTask.cancel(true); reportStatus(cb, request, statusBuilder.done(os.getCount())); @@ -215,13 +214,15 @@ protected void checkOverwrite(PutTransferRequest request) throws IOException { for (Map.Entry h : request.transferHeaders().entries()) { head.addHeader(h.getKey(), h.getValue()); } - CloseableHttpResponse response = httpClient.execute(head); - if (response.getStatusLine().getStatusCode() == 200) { - throw new TransferError("Remote file exists and overwrite is false"); - } else if (response.getStatusLine().getStatusCode() != 404) { - throw new TransferError(format("Error checking if remote file exists: %d %s", - response.getStatusLine().getStatusCode(), response.getStatusLine().getReasonPhrase())); - } + httpClient.execute(head, response -> { + if (response.getCode() == 200) { + throw new TransferError("Remote file exists and overwrite is false"); + } else if (response.getCode() != 404) { + throw new TransferError(format("Error checking if remote file exists: %d %s", + response.getCode(), response.getReasonPhrase())); + } + return null; + }); } } @@ -230,7 +231,7 @@ public void handle(PutTransferRequest request, TransferStatusCallback cb) { CountingFileEntity cfe = prepareFileEntity(resolver.resolvePath(request.path())); - HttpPut put = null; + BasicClassicHttpRequest put = null; HttpClientContext context = HttpClientContext.create(); put = prepareRequest(request, cfe); @@ -242,7 +243,7 @@ public void handle(PutTransferRequest request, TransferStatusCallback cb) { try { checkOverwrite(request); context.setAttribute(SciTag.SCITAG_ATTRIBUTE, request.scitag()); - httpClient.execute(put, new PutResponseHandler(MDC.getCopyOfContextMap()), context); + httpClient.execute(put, context, new PutResponseHandler(MDC.getCopyOfContextMap())); reportTask.cancel(true); reportStatus(cb, request, statusBuilder.done(cfe.getCount())); } catch (HttpResponseException e) { diff --git a/src/main/java/org/italiangrid/storm/webdav/tpc/http/HttpTransferClientMetricsWrapper.java b/src/main/java/org/italiangrid/storm/webdav/tpc/http/HttpTransferClientMetricsWrapper.java index 80e58a3a..24c7c2c9 100644 --- a/src/main/java/org/italiangrid/storm/webdav/tpc/http/HttpTransferClientMetricsWrapper.java +++ b/src/main/java/org/italiangrid/storm/webdav/tpc/http/HttpTransferClientMetricsWrapper.java @@ -17,7 +17,7 @@ import static com.codahale.metrics.MetricRegistry.name; -import org.apache.http.client.ClientProtocolException; +import org.apache.hc.client5.http.ClientProtocolException; import org.italiangrid.storm.webdav.tpc.transfer.GetTransferRequest; import org.italiangrid.storm.webdav.tpc.transfer.PutTransferRequest; import org.italiangrid.storm.webdav.tpc.transfer.TransferClient; @@ -82,17 +82,18 @@ private void updateRequestOutcome(PutTransferRequest request) { } private void updateThroughput(GetTransferRequest request) { - - if (request.endedSuccesfully() && request.transferThroughputBytesPerSec().isPresent()) { - pullThroughput.update(request.transferThroughputBytesPerSec().get().longValue()); + if (request.endedSuccesfully()) { + request.transferThroughputBytesPerSec() + .ifPresent(transferThroughputBytesPerSec -> pullThroughput + .update(transferThroughputBytesPerSec.longValue())); } - } private void updateThroughput(PutTransferRequest request) { - - if (request.endedSuccesfully() && request.transferThroughputBytesPerSec().isPresent()) { - pushThroughput.update(request.transferThroughputBytesPerSec().get().longValue()); + if (request.endedSuccesfully()) { + request.transferThroughputBytesPerSec() + .ifPresent(transferThroughputBytesPerSec -> pushThroughput + .update(transferThroughputBytesPerSec.longValue())); } } diff --git a/src/main/java/org/italiangrid/storm/webdav/tpc/http/PutResponseHandler.java b/src/main/java/org/italiangrid/storm/webdav/tpc/http/PutResponseHandler.java index 7d4a5227..588fa39b 100644 --- a/src/main/java/org/italiangrid/storm/webdav/tpc/http/PutResponseHandler.java +++ b/src/main/java/org/italiangrid/storm/webdav/tpc/http/PutResponseHandler.java @@ -18,14 +18,15 @@ import java.io.IOException; import java.util.Map; -import org.apache.http.HttpResponse; -import org.apache.http.client.ResponseHandler; -import org.apache.http.util.EntityUtils; +import org.apache.hc.core5.http.ClassicHttpResponse; +import org.apache.hc.core5.http.io.HttpClientResponseHandler; +import org.apache.hc.core5.http.io.entity.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; -public class PutResponseHandler extends ResponseHandlerSupport implements ResponseHandler { +public class PutResponseHandler extends ResponseHandlerSupport + implements HttpClientResponseHandler { public static final Logger LOG = LoggerFactory.getLogger(PutResponseHandler.class); @@ -34,11 +35,11 @@ public PutResponseHandler(Map mdcContextMap) { } @Override - public Boolean handleResponse(HttpResponse response) throws IOException { + public Boolean handleResponse(ClassicHttpResponse response) throws IOException { setupMDC(); - + try { - checkResponseStatus(response.getStatusLine()); + checkResponseStatus(response); return true; } finally { EntityUtils.consumeQuietly(response.getEntity()); diff --git a/src/main/java/org/italiangrid/storm/webdav/tpc/http/ResponseHandlerSupport.java b/src/main/java/org/italiangrid/storm/webdav/tpc/http/ResponseHandlerSupport.java index 7ef4bb7d..25929a1c 100644 --- a/src/main/java/org/italiangrid/storm/webdav/tpc/http/ResponseHandlerSupport.java +++ b/src/main/java/org/italiangrid/storm/webdav/tpc/http/ResponseHandlerSupport.java @@ -17,8 +17,8 @@ import java.util.Map; -import org.apache.http.StatusLine; -import org.apache.http.client.HttpResponseException; +import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.client5.http.HttpResponseException; import org.slf4j.MDC; public abstract class ResponseHandlerSupport { @@ -35,9 +35,9 @@ protected void setupMDC() { } } - protected void checkResponseStatus(StatusLine sl) throws HttpResponseException { - if (sl.getStatusCode() >= 300) { - throw new HttpResponseException(sl.getStatusCode(), sl.getReasonPhrase()); + protected void checkResponseStatus(HttpResponse response) throws HttpResponseException { + if (response.getCode() >= 300) { + throw new HttpResponseException(response.getCode(), response.getReasonPhrase()); } } diff --git a/src/main/java/org/italiangrid/storm/webdav/tpc/http/SuperLaxRedirectStrategy.java b/src/main/java/org/italiangrid/storm/webdav/tpc/http/SuperLaxRedirectStrategy.java index 025f159f..753ee7e4 100644 --- a/src/main/java/org/italiangrid/storm/webdav/tpc/http/SuperLaxRedirectStrategy.java +++ b/src/main/java/org/italiangrid/storm/webdav/tpc/http/SuperLaxRedirectStrategy.java @@ -15,76 +15,55 @@ */ package org.italiangrid.storm.webdav.tpc.http; -import org.apache.http.HttpRequest; -import org.apache.http.HttpResponse; -import org.apache.http.ProtocolException; -import org.apache.http.client.methods.HttpDelete; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpHead; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.methods.HttpPut; -import org.apache.http.client.methods.HttpUriRequest; -import org.apache.http.impl.client.DefaultRedirectStrategy; -import org.apache.http.protocol.HttpContext; +import org.apache.hc.client5.http.classic.methods.HttpDelete; +import org.apache.hc.client5.http.classic.methods.HttpGet; +import org.apache.hc.client5.http.classic.methods.HttpHead; +import org.apache.hc.client5.http.classic.methods.HttpPost; +import org.apache.hc.client5.http.classic.methods.HttpPut; +import org.apache.hc.client5.http.impl.DefaultRedirectStrategy; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpHeaders; +import org.apache.hc.core5.http.HttpRequest; +import org.apache.hc.core5.http.HttpResponse; +import org.apache.hc.core5.http.HttpStatus; +import org.apache.hc.core5.http.protocol.HttpContext; public class SuperLaxRedirectStrategy extends DefaultRedirectStrategy { - /* - * SUH stands for Sad, Useless Header. - */ - public static final String SUH_HEADER = "X-SUH"; - - public static final String AUTHORIZATION_HEADER = "Authorization"; - - private static final String[] REDIRECT_METHODS = new String[] {HttpGet.METHOD_NAME, - HttpPut.METHOD_NAME, HttpPost.METHOD_NAME, HttpHead.METHOD_NAME, HttpDelete.METHOD_NAME}; - public static final SuperLaxRedirectStrategy INSTANCE = new SuperLaxRedirectStrategy(); - private SuperLaxRedirectStrategy() { - // empty ctor - } + private static final String[] REDIRECT_METHODS = new String[] {HttpGet.METHOD_NAME, + HttpPost.METHOD_NAME, HttpPut.METHOD_NAME, HttpHead.METHOD_NAME, HttpDelete.METHOD_NAME}; @Override - public HttpUriRequest getRedirect(HttpRequest request, HttpResponse response, HttpContext context) - throws ProtocolException { - - HttpUriRequest redirect = super.getRedirect(request, response, context); - - /* - * If this method returns an HttpUriRequest that has no HTTP headers then the RedirectExec code - * will copy all the headers from the original request into the HttpUriRequest. - * DefaultRedirectStrategy returns such requests under several circumstances. Therefore, in - * order to suppress the Authorization header we must ensure the returned request - * includes headers. - */ - if (!redirect.headerIterator().hasNext()) { - redirect.setHeaders(request.getAllHeaders()); + public boolean isRedirected(final HttpRequest request, final HttpResponse response, + final HttpContext context) { + if (!response.containsHeader(HttpHeaders.LOCATION)) { + return false; } - redirect.removeHeaders(AUTHORIZATION_HEADER); - - if (!redirect.headerIterator().hasNext()) { - /* - * If the Authorization header was the only one set in the original request or in the redirect, we need to - * add back an empty header otherwise the RedirectExec code will copy the Authorization header from the original - * request back in. - */ - redirect.addHeader(SUH_HEADER, ""); + final int statusCode = response.getCode(); + final String method = request.getMethod(); + final Header locationHeader = response.getFirstHeader("location"); + switch (statusCode) { + case HttpStatus.SC_MOVED_TEMPORARILY: + return isRedirectable(method) && locationHeader != null; + case HttpStatus.SC_MOVED_PERMANENTLY, HttpStatus.SC_TEMPORARY_REDIRECT: + return isRedirectable(method); + case HttpStatus.SC_SEE_OTHER: + return true; + default: + return false; } - - return redirect; } - - @Override - protected boolean isRedirectable(String method) { + protected boolean isRedirectable(final String method) { for (final String m : REDIRECT_METHODS) { if (m.equalsIgnoreCase(method)) { return true; } } - return false; } } + diff --git a/src/main/java/org/italiangrid/storm/webdav/tpc/http/TpcSchemePortResolver.java b/src/main/java/org/italiangrid/storm/webdav/tpc/http/TpcSchemePortResolver.java new file mode 100644 index 00000000..6fde9520 --- /dev/null +++ b/src/main/java/org/italiangrid/storm/webdav/tpc/http/TpcSchemePortResolver.java @@ -0,0 +1,36 @@ +/** + * Copyright (c) Istituto Nazionale di Fisica Nucleare, 2014-2023. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.italiangrid.storm.webdav.tpc.http; + +import org.apache.hc.client5.http.impl.DefaultSchemePortResolver; +import org.apache.hc.core5.http.URIScheme; +import org.apache.hc.core5.net.NamedEndpoint; + +public class TpcSchemePortResolver extends DefaultSchemePortResolver { + + public static final TpcSchemePortResolver INSTANCE = new TpcSchemePortResolver(); + + @Override + public int resolve(String scheme, final NamedEndpoint endpoint) { + if (scheme.equals("dav")) { + scheme = URIScheme.HTTP.toString(); + } else if (scheme.equals("davs")) { + scheme = URIScheme.HTTPS.toString(); + } + return super.resolve(scheme, endpoint); + } + +} diff --git a/src/main/java/org/italiangrid/storm/webdav/tpc/transfer/TransferClient.java b/src/main/java/org/italiangrid/storm/webdav/tpc/transfer/TransferClient.java index 58dfd993..057758b9 100644 --- a/src/main/java/org/italiangrid/storm/webdav/tpc/transfer/TransferClient.java +++ b/src/main/java/org/italiangrid/storm/webdav/tpc/transfer/TransferClient.java @@ -15,12 +15,14 @@ */ package org.italiangrid.storm.webdav.tpc.transfer; -import org.apache.http.client.ClientProtocolException; +import org.apache.hc.client5.http.ClientProtocolException; public interface TransferClient { - void handle(GetTransferRequest request, TransferStatusCallback status) throws ClientProtocolException; - - void handle(PutTransferRequest request, TransferStatusCallback status) throws ClientProtocolException; + void handle(GetTransferRequest request, TransferStatusCallback status) + throws ClientProtocolException; + + void handle(PutTransferRequest request, TransferStatusCallback status) + throws ClientProtocolException; } diff --git a/src/main/java/org/italiangrid/storm/webdav/tpc/utils/Adler32DigestHeaderHelper.java b/src/main/java/org/italiangrid/storm/webdav/tpc/utils/Adler32DigestHeaderHelper.java index 28f2d528..d728c64f 100644 --- a/src/main/java/org/italiangrid/storm/webdav/tpc/utils/Adler32DigestHeaderHelper.java +++ b/src/main/java/org/italiangrid/storm/webdav/tpc/utils/Adler32DigestHeaderHelper.java @@ -20,8 +20,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.http.Header; -import org.apache.http.HttpResponse; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpResponse; import org.springframework.util.StringUtils; public class Adler32DigestHeaderHelper { diff --git a/src/main/java/org/italiangrid/storm/webdav/tpc/utils/CountingFileEntity.java b/src/main/java/org/italiangrid/storm/webdav/tpc/utils/CountingFileEntity.java index e0d5e365..8c7757d5 100644 --- a/src/main/java/org/italiangrid/storm/webdav/tpc/utils/CountingFileEntity.java +++ b/src/main/java/org/italiangrid/storm/webdav/tpc/utils/CountingFileEntity.java @@ -15,13 +15,13 @@ */ package org.italiangrid.storm.webdav.tpc.utils; -import static org.apache.http.entity.ContentType.APPLICATION_OCTET_STREAM; +import static org.apache.hc.core5.http.ContentType.APPLICATION_OCTET_STREAM; import java.io.File; import java.io.IOException; import java.io.OutputStream; -import org.apache.http.entity.FileEntity; +import org.apache.hc.core5.http.io.entity.FileEntity; import com.google.common.io.CountingOutputStream; diff --git a/src/main/java/org/italiangrid/storm/webdav/web/OidcLoginController.java b/src/main/java/org/italiangrid/storm/webdav/web/OidcLoginController.java index ffbf1e61..e27d4e68 100644 --- a/src/main/java/org/italiangrid/storm/webdav/web/OidcLoginController.java +++ b/src/main/java/org/italiangrid/storm/webdav/web/OidcLoginController.java @@ -16,7 +16,6 @@ package org.italiangrid.storm.webdav.web; import java.util.List; -import java.util.stream.Collectors; import org.italiangrid.storm.webdav.config.ServiceConfigurationProperties; import org.springframework.beans.factory.annotation.Autowired; @@ -33,13 +32,13 @@ public class OidcLoginController { final List clients; final ServiceConfigurationProperties serviceProperties; - + @Autowired public OidcLoginController(OAuth2ClientProperties clientProperties, ServiceConfigurationProperties serviceProperties) { this.serviceProperties = serviceProperties; - + clients = clientProperties.getRegistration().entrySet().stream().map(e -> { Provider provider = clientProperties.getProvider().get(e.getValue().getProvider()); OidcClientModel m = new OidcClientModel(); @@ -47,7 +46,7 @@ public OidcLoginController(OAuth2ClientProperties clientProperties, m.setIssuer(provider.getIssuerUri()); m.setUrl(String.format("/oauth2/authorization/%s", e.getKey())); return m; - }).collect(Collectors.toList()); + }).toList(); } @@ -85,7 +84,7 @@ public String getUrl() { public void setUrl(String url) { this.url = url; } - + @Override public String toString() { return "OidcClientModel [name=" + name + ", issuer=" + issuer + ", url=" + url + "]"; diff --git a/src/main/java/org/italiangrid/storm/webdav/web/ViewUtilsInterceptor.java b/src/main/java/org/italiangrid/storm/webdav/web/ViewUtilsInterceptor.java index f1b54e2b..4021e2df 100644 --- a/src/main/java/org/italiangrid/storm/webdav/web/ViewUtilsInterceptor.java +++ b/src/main/java/org/italiangrid/storm/webdav/web/ViewUtilsInterceptor.java @@ -15,8 +15,8 @@ */ package org.italiangrid.storm.webdav.web; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.italiangrid.storm.webdav.authn.AuthenticationUtils; import org.italiangrid.storm.webdav.config.OAuthProperties; diff --git a/src/main/resources/application-redis.yml b/src/main/resources/application-redis.yml index a1431435..5e77524b 100644 --- a/src/main/resources/application-redis.yml +++ b/src/main/resources/application-redis.yml @@ -4,10 +4,11 @@ management: enabled: true spring: - redis: - host: ${STORM_WEBDAV_REDIS_HOST:localhost} - port: ${STORM_WEBDAV_REDIS_PORT:6379} - password: ${STORM_WEBDAV_REDIS_PASSWORD:} + data: + redis: + host: ${STORM_WEBDAV_REDIS_HOST:localhost} + port: ${STORM_WEBDAV_REDIS_PORT:6379} + password: ${STORM_WEBDAV_REDIS_PASSWORD:} session: - store-type: redis \ No newline at end of file + store-type: redis diff --git a/src/test/java/org/italiangrid/storm/webdav/server/TLSConnectorBuilderTest.java b/src/test/java/org/italiangrid/storm/webdav/server/TLSConnectorBuilderTest.java index b7fcbba9..408bee0f 100644 --- a/src/test/java/org/italiangrid/storm/webdav/server/TLSConnectorBuilderTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/server/TLSConnectorBuilderTest.java @@ -24,7 +24,7 @@ import javax.net.ssl.KeyManager; -import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.hc.client5.http.ssl.NoopHostnameVerifier; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; @@ -114,4 +114,4 @@ void tlsConnectorBuilderTests() { ServerConnector c = builder.build(); assertThat(c.getPort(), is(1234)); } -} \ No newline at end of file +} diff --git a/src/test/java/org/italiangrid/storm/webdav/server/servlet/AvoidTraceMethodFilterTest.java b/src/test/java/org/italiangrid/storm/webdav/server/servlet/AvoidTraceMethodFilterTest.java index f4ed7af1..fb11740b 100644 --- a/src/test/java/org/italiangrid/storm/webdav/server/servlet/AvoidTraceMethodFilterTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/server/servlet/AvoidTraceMethodFilterTest.java @@ -70,27 +70,27 @@ void traceAsNonAnonymousOnRootLeadsTo405() throws Exception { @Test void trackAsAnonymousLeadsTo405() throws Exception { - mvc.perform(MockMvcRequestBuilders.request("TRACK", new URI("/test/file"))) + mvc.perform(MockMvcRequestBuilders.request(HttpMethod.valueOf("TRACK"), new URI("/test/file"))) .andExpect(status().isMethodNotAllowed()); } @Test @WithMockVOMSUser(vos = "wlcg", saReadPermissions = {"wlcg"}) void trackAsNonAnonymousLeadsTo405() throws Exception { - mvc.perform(MockMvcRequestBuilders.request("TRACK", new URI("/wlcg/file"))) + mvc.perform(MockMvcRequestBuilders.request(HttpMethod.valueOf("TRACK"), new URI("/wlcg/file"))) .andExpect(status().isMethodNotAllowed()); } @Test void trackAsAnonymousOnRootLeadsTo405() throws Exception { - mvc.perform(MockMvcRequestBuilders.request("TRACK", new URI("/"))) + mvc.perform(MockMvcRequestBuilders.request(HttpMethod.valueOf("TRACK"), new URI("/"))) .andExpect(status().isMethodNotAllowed()); } @Test @WithMockVOMSUser(vos = "wlcg", saReadPermissions = {"wlcg"}) void trackAsNonAnonymousOnRootLeadsTo405() throws Exception { - mvc.perform(MockMvcRequestBuilders.request("TRACK", new URI("/"))) + mvc.perform(MockMvcRequestBuilders.request(HttpMethod.valueOf("TRACK"), new URI("/"))) .andExpect(status().isMethodNotAllowed()); } diff --git a/src/test/java/org/italiangrid/storm/webdav/test/authz/AuthzTest.java b/src/test/java/org/italiangrid/storm/webdav/test/authz/AuthzTest.java index 698d9572..9f9a5dd8 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/authz/AuthzTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/authz/AuthzTest.java @@ -19,6 +19,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.italiangrid.storm.webdav.authz.VOMSAuthenticationFilter; +import org.italiangrid.storm.webdav.config.ServiceConfigurationProperties; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; @@ -43,8 +44,11 @@ class AuthzTest { @Autowired VOMSAuthenticationFilter filter; + @Autowired + ServiceConfigurationProperties props; + @BeforeEach - public void setup() { + void setup() { filter.setCheckForPrincipalChanges(false); } diff --git a/src/test/java/org/italiangrid/storm/webdav/test/authz/integration/AuthorizationIntegrationTests.java b/src/test/java/org/italiangrid/storm/webdav/test/authz/integration/AuthorizationIntegrationTests.java index eddc1680..9301b2f2 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/authz/integration/AuthorizationIntegrationTests.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/authz/integration/AuthorizationIntegrationTests.java @@ -36,6 +36,7 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.http.HttpMethod; import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.test.context.ActiveProfiles; @@ -74,7 +75,7 @@ public class AuthorizationIntegrationTests { private StormJwtAuthoritiesConverter authConverter; @BeforeEach - public void setup() { + void setup() { filter.setCheckForPrincipalChanges(false); HttpManager httpManager = Mockito.mock(HttpManager.class); @@ -300,17 +301,17 @@ void readWriteAccessAsJwtWithAllowedGroup() throws Exception { @WithMockVOMSUser(vos = "wlcg", saReadPermissions = {"wlcg"}) @Test void localVomsCopyRequiresWithReadPermissionsGetsAccessDenied() throws Exception { - mvc.perform(request("COPY", URI.create("http://localhost/wlcg/source")).header("Destination", - "http://localhost/wlcg/destination")) + mvc + .perform(request(HttpMethod.valueOf("COPY"), URI.create("http://localhost/wlcg/source")) + .header("Destination", "http://localhost/wlcg/destination")) .andExpect(status().isForbidden()); } @WithMockVOMSUser(vos = "wlcg", saWritePermissions = {"wlcg"}, saReadPermissions = {"wlcg"}) @Test void localVomsCopyRequiresReadAndWritePermissions() throws Exception { - mvc.perform(request("COPY", URI.create("http://localhost/wlcg/source")).header("Destination", - "http://localhost/wlcg/destination")) - .andExpect(status().isOk()); + mvc.perform(request(HttpMethod.valueOf("COPY"), URI.create("http://localhost/wlcg/source")) + .header("Destination", "http://localhost/wlcg/destination")).andExpect(status().isOk()); } @Test @@ -322,7 +323,7 @@ void tpcJwtPullCopyBlockedWithStorageReadScope() throws Exception { .claim("scope", "storage.read:/") .build(); - mvc.perform(request("COPY", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("COPY"), URI.create("http://localhost/wlcg/source")) .header("Source", "http://localhost/wlcg/destination") .with(jwt().jwt(token))).andExpect(status().isForbidden()); } @@ -336,7 +337,7 @@ void tpcJwtPullCopyRequiresStorageModifyScope() throws Exception { .claim("scope", "storage.modify:/") .build(); - mvc.perform(request("COPY", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("COPY"), URI.create("http://localhost/wlcg/source")) .header("Source", "http://localhost/wlcg/destination") .with(jwt().jwt(token))).andExpect(status().isAccepted()); } @@ -350,7 +351,7 @@ void tpcJwtPullCopyRequiresStorageModifyScopeWithRightPath() throws Exception { .claim("scope", "storage.modify:/subdir storage.read:/") .build(); - mvc.perform(request("COPY", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("COPY"), URI.create("http://localhost/wlcg/source")) .header("Source", "http://localhost/wlcg/destination") .with(jwt().jwt(token))).andExpect(status().isForbidden()); } @@ -365,7 +366,7 @@ void tpcJwtLocalCopyRequiresAppropriatePermissions() throws Exception { .claim("scope", "storage.read:/") .build(); - mvc.perform(request("COPY", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("COPY"), URI.create("http://localhost/wlcg/source")) .header("Destination", "http://localhost/wlcg/destination") .with(jwt().jwt(token))).andExpect(status().isForbidden()); @@ -376,7 +377,7 @@ void tpcJwtLocalCopyRequiresAppropriatePermissions() throws Exception { .claim("scope", "storage.modify:/") .build(); - mvc.perform(request("COPY", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("COPY"), URI.create("http://localhost/wlcg/source")) .header("Destination", "http://localhost/wlcg/destination") .with(jwt().jwt(token))).andExpect(status().isForbidden()); @@ -387,7 +388,7 @@ void tpcJwtLocalCopyRequiresAppropriatePermissions() throws Exception { .claim("scope", "storage.read:/ storage.modify:/") .build(); - mvc.perform(request("COPY", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("COPY"), URI.create("http://localhost/wlcg/source")) .header("Destination", "http://localhost/wlcg/destination") .with(jwt().jwt(token))).andExpect(status().isOk()); @@ -398,7 +399,7 @@ void tpcJwtLocalCopyRequiresAppropriatePermissions() throws Exception { .claim("scope", "storage.read:/subdir storage.modify:/") .build(); - mvc.perform(request("COPY", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("COPY"), URI.create("http://localhost/wlcg/source")) .header("Destination", "http://localhost/wlcg/destination") .with(jwt().jwt(token))).andExpect(status().isForbidden()); @@ -409,7 +410,7 @@ void tpcJwtLocalCopyRequiresAppropriatePermissions() throws Exception { .claim("scope", "storage.read:/ storage.modify:/subdir") .build(); - mvc.perform(request("COPY", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("COPY"), URI.create("http://localhost/wlcg/source")) .header("Destination", "http://localhost/wlcg/destination") .with(jwt().jwt(token))).andExpect(status().isForbidden()); @@ -420,7 +421,7 @@ void tpcJwtLocalCopyRequiresAppropriatePermissions() throws Exception { .claim("scope", "storage.read:/source storage.modify:/destination") .build(); - mvc.perform(request("COPY", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("COPY"), URI.create("http://localhost/wlcg/source")) .header("Destination", "http://localhost/wlcg/destination") .with(jwt().jwt(token))).andExpect(status().isOk()); } @@ -434,7 +435,7 @@ void tpcJwtLocalMoveRequiresAppropriatePermissions() throws Exception { .claim("scope", "storage.read:/") .build(); - mvc.perform(request("MOVE", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("MOVE"), URI.create("http://localhost/wlcg/source")) .header("Destination", "http://localhost/wlcg/destination") .with(jwt().jwt(token))).andExpect(status().isForbidden()); @@ -445,7 +446,7 @@ void tpcJwtLocalMoveRequiresAppropriatePermissions() throws Exception { .claim("scope", "storage.modify:/") .build(); - mvc.perform(request("MOVE", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("MOVE"), URI.create("http://localhost/wlcg/source")) .header("Destination", "http://localhost/wlcg/destination") .with(jwt().jwt(token))).andExpect(status().isOk()); @@ -457,7 +458,7 @@ void tpcJwtLocalMoveRequiresAppropriatePermissions() throws Exception { .claim("scope", "storage.modify:/subdir") .build(); - mvc.perform(request("MOVE", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("MOVE"), URI.create("http://localhost/wlcg/source")) .header("Destination", "http://localhost/wlcg/destination") .with(jwt().jwt(token))).andExpect(status().isForbidden()); @@ -469,7 +470,7 @@ void tpcJwtLocalMoveRequiresAppropriatePermissions() throws Exception { .claim("scope", "openid storage.modify:/source storage.modify:/destination") .build(); - mvc.perform(request("MOVE", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("MOVE"), URI.create("http://localhost/wlcg/source")) .header("Destination", "http://localhost/wlcg/destination") .with(jwt().jwt(token))).andExpect(status().isOk()); } @@ -484,7 +485,7 @@ void tpcJwtFineGrainedAuthzCopyTests() throws Exception { .subject("123") .build(); - mvc.perform(request("COPY", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("COPY"), URI.create("http://localhost/wlcg/source")) .header("Destination", "http://localhost/wlcg/destination") .with(jwt().jwt(token).authorities(authConverter))).andExpect(status().isForbidden()); @@ -496,7 +497,7 @@ void tpcJwtFineGrainedAuthzCopyTests() throws Exception { .claim("groups", "/example/admins") .build(); - mvc.perform(request("COPY", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("COPY"), URI.create("http://localhost/wlcg/source")) .header("Destination", "http://localhost/wlcg/destination") .with(jwt().jwt(token).authorities(authConverter))).andExpect(status().isOk()); @@ -507,7 +508,7 @@ void tpcJwtFineGrainedAuthzCopyTests() throws Exception { .claim("groups", "/example") .build(); - mvc.perform(request("COPY", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("COPY"), URI.create("http://localhost/wlcg/source")) .header("Destination", "http://localhost/wlcg/destination") .with(jwt().jwt(token).authorities(authConverter))).andExpect(status().isForbidden()); @@ -518,7 +519,7 @@ void tpcJwtFineGrainedAuthzCopyTests() throws Exception { .claim("groups", "/example/admins") .build(); - mvc.perform(request("COPY", URI.create("http://localhost/wlcg/source")) + mvc.perform(request(HttpMethod.valueOf("COPY"), URI.create("http://localhost/wlcg/source")) .header("Destination", "http://localhost/wlcg/destination") .with(jwt().jwt(token).authorities(authConverter))).andExpect(status().isForbidden()); diff --git a/src/test/java/org/italiangrid/storm/webdav/test/authz/integration/LocalAuthzIntegrationTests.java b/src/test/java/org/italiangrid/storm/webdav/test/authz/integration/LocalAuthzIntegrationTests.java index d59a1bbe..9b0a6b75 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/authz/integration/LocalAuthzIntegrationTests.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/authz/integration/LocalAuthzIntegrationTests.java @@ -69,7 +69,7 @@ public class LocalAuthzIntegrationTests { SignedJwtTokenIssuer tokenIssuer; @BeforeEach - public void setup() { + void setup() { filter.setCheckForPrincipalChanges(false); HttpManager httpManager = Mockito.mock(HttpManager.class); diff --git a/src/test/java/org/italiangrid/storm/webdav/test/authz/pdp/AuthzPdpTests.java b/src/test/java/org/italiangrid/storm/webdav/test/authz/pdp/AuthzPdpTests.java index ce2b3c53..aff4af39 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/authz/pdp/AuthzPdpTests.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/authz/pdp/AuthzPdpTests.java @@ -28,7 +28,7 @@ import java.util.List; import java.util.Set; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.italiangrid.storm.webdav.authz.VOMSFQANAuthority; import org.italiangrid.storm.webdav.authz.VOMSVOAuthority; diff --git a/src/test/java/org/italiangrid/storm/webdav/test/authz/pdp/LocalAuthzPdpTests.java b/src/test/java/org/italiangrid/storm/webdav/test/authz/pdp/LocalAuthzPdpTests.java index 3f082100..50cf4116 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/authz/pdp/LocalAuthzPdpTests.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/authz/pdp/LocalAuthzPdpTests.java @@ -28,7 +28,7 @@ import java.net.URL; import java.util.Enumeration; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.italiangrid.storm.webdav.authz.pdp.LocalAuthorizationPdp; import org.italiangrid.storm.webdav.authz.pdp.PathAuthorizationResult; @@ -81,7 +81,7 @@ public class LocalAuthzPdpTests { LocalAuthorizationPdp pdp; @BeforeEach - public void setup() throws MalformedURLException { + void setup() throws MalformedURLException { AuthorizationServerProperties props = new AuthorizationServerProperties(); props.setIssuer(LOCAL_AUTHZ_SERVER_ISSUER); @@ -130,7 +130,7 @@ void pathMismatchYeldsDeny() { } @Test - void permMismatchYeldsDeny() throws Exception { + void permMismatchYeldsDeny() { when(request.getMethod()).thenReturn("PUT"); PathAuthorizationResult result = @@ -151,7 +151,7 @@ void originMismatchYeldsDeny() { } @Test - void testPermit() throws Exception { + void testPermit() { PathAuthorizationResult result = pdp.authorizeRequest(newAuthorizationRequest(request, jwtAuth)); diff --git a/src/test/java/org/italiangrid/storm/webdav/test/authz/pdp/PolicyPropertiesValidationTests.java b/src/test/java/org/italiangrid/storm/webdav/test/authz/pdp/PolicyPropertiesValidationTests.java index 5006c345..8470ff67 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/authz/pdp/PolicyPropertiesValidationTests.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/authz/pdp/PolicyPropertiesValidationTests.java @@ -26,10 +26,10 @@ import java.util.Locale; import java.util.Set; -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; import org.italiangrid.storm.webdav.authz.pdp.PolicyEffect; import org.italiangrid.storm.webdav.config.FineGrainedAuthzPolicyProperties; diff --git a/src/test/java/org/italiangrid/storm/webdav/test/authz/pdp/ScopePathAuthzPdpTests.java b/src/test/java/org/italiangrid/storm/webdav/test/authz/pdp/ScopePathAuthzPdpTests.java index 0a42ebb2..30495dec 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/authz/pdp/ScopePathAuthzPdpTests.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/authz/pdp/ScopePathAuthzPdpTests.java @@ -32,7 +32,7 @@ import java.util.List; import java.util.Set; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.italiangrid.storm.webdav.authz.pdp.PathAuthorizationResult; import org.italiangrid.storm.webdav.authz.pdp.PathAuthorizationResult.Decision; @@ -459,8 +459,7 @@ void parentDirCreationIsNotAllowedWithWrongScopes() { lenient().when(pathResolver.resolveStorageArea(anyString())).thenReturn(sa); lenient().when(request.getPathInfo()).thenReturn("test/dir/subdir"); - lenient().when(jwt.getClaimAsString(SCOPE_CLAIM)) - .thenReturn("openid storage.read:/dir/subdir"); + lenient().when(jwt.getClaimAsString(SCOPE_CLAIM)).thenReturn("openid storage.read:/dir/subdir"); lenient().when(request.getMethod()).thenReturn("MKCOL"); PathAuthorizationResult result = pdp.authorizeRequest(newAuthorizationRequest(request, jwtAuth)); diff --git a/src/test/java/org/italiangrid/storm/webdav/test/authz/vomap/PathResolverTests.java b/src/test/java/org/italiangrid/storm/webdav/test/authz/vomap/PathResolverTests.java index cb11dfad..31052d8a 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/authz/vomap/PathResolverTests.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/authz/vomap/PathResolverTests.java @@ -34,7 +34,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -public class PathResolverTests { +class PathResolverTests { private static final String ROOTDIR = "/storage"; @@ -44,7 +44,7 @@ public class PathResolverTests { private static Map input; @BeforeAll - public static void init() { + static void init() { input = new HashMap(); input.put("test.vo.bis", "testers.eu-emi.eu"); @@ -64,7 +64,7 @@ public static void init() { List saInfoList; @BeforeEach - public void setup() { + void setup() { saInfoList = new ArrayList(); for (String ap : input.keySet()) { diff --git a/src/test/java/org/italiangrid/storm/webdav/test/checksum/ChecksumHelperTest.java b/src/test/java/org/italiangrid/storm/webdav/test/checksum/ChecksumHelperTest.java index 97d40ee8..4e368d7b 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/checksum/ChecksumHelperTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/checksum/ChecksumHelperTest.java @@ -38,7 +38,7 @@ class ChecksumHelperTest { private Adler32ChecksumInputStream cis; @BeforeEach - public void setup() throws IOException { + void setup() throws IOException { String resourcePath = "storage/test/example"; @@ -60,7 +60,7 @@ public void setup() throws IOException { } @AfterEach - public void cleanup() throws IOException { + void cleanup() throws IOException { cis.close(); } diff --git a/src/test/java/org/italiangrid/storm/webdav/test/macaroon/MacaroonRequestIntegrationTests.java b/src/test/java/org/italiangrid/storm/webdav/test/macaroon/MacaroonRequestIntegrationTests.java index 5c85f963..e5b17897 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/macaroon/MacaroonRequestIntegrationTests.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/macaroon/MacaroonRequestIntegrationTests.java @@ -86,7 +86,7 @@ public Clock mockClock() { ObjectMapper mapper; @BeforeEach - public void setup() { + void setup() { filter.setCheckForPrincipalChanges(false); } diff --git a/src/test/java/org/italiangrid/storm/webdav/test/macaroon/MacaroonRequestLhcbIntegrationTests.java b/src/test/java/org/italiangrid/storm/webdav/test/macaroon/MacaroonRequestLhcbIntegrationTests.java index 0333e561..8b0a0c5f 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/macaroon/MacaroonRequestLhcbIntegrationTests.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/macaroon/MacaroonRequestLhcbIntegrationTests.java @@ -80,7 +80,7 @@ Clock mockClock() { ObjectMapper mapper; @BeforeEach - public void setup() { + void setup() { filter.setCheckForPrincipalChanges(false); } diff --git a/src/test/java/org/italiangrid/storm/webdav/test/oauth/integration/OAuthAuthzServerIntegrationTests.java b/src/test/java/org/italiangrid/storm/webdav/test/oauth/integration/OAuthAuthzServerIntegrationTests.java index 41eaaac3..801d0986 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/oauth/integration/OAuthAuthzServerIntegrationTests.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/oauth/integration/OAuthAuthzServerIntegrationTests.java @@ -16,7 +16,6 @@ package org.italiangrid.storm.webdav.test.oauth.integration; import static java.lang.String.format; -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; import static org.hamcrest.CoreMatchers.is; import static org.italiangrid.storm.webdav.oauth.authzserver.ErrorResponseDTO.UNSUPPORTED_GRANT_TYPE; import static org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED; @@ -30,6 +29,7 @@ import java.time.Instant; import java.time.ZoneId; +import org.apache.commons.lang3.RandomStringUtils; import org.italiangrid.storm.webdav.authz.VOMSAuthenticationFilter; import org.italiangrid.storm.webdav.config.ServiceConfigurationProperties; import org.italiangrid.storm.webdav.oauth.authzserver.AccessTokenRequest; @@ -88,7 +88,7 @@ public Clock mockClock() { ObjectMapper mapper; @BeforeEach - public void setup() { + void setup() { filter.setCheckForPrincipalChanges(false); } @@ -161,7 +161,9 @@ void requestedLifetimeLimited() throws Exception { @WithMockVOMSUser void scopeLengthIsChecked() throws Exception { - String randomAlphabetic = randomAlphabetic(AccessTokenRequest.MAX_SCOPE_LENGTH); + RandomStringUtils randomStringUtils = RandomStringUtils.insecure(); + + String randomAlphabetic = randomStringUtils.nextAlphabetic(AccessTokenRequest.MAX_SCOPE_LENGTH); mvc .perform(post("/oauth/token").content(format("%s&scope=%s", CONTENT, randomAlphabetic)) @@ -169,7 +171,7 @@ void scopeLengthIsChecked() throws Exception { .andExpect(status().isOk()) .andExpect(jsonPath("$.access_token").exists()); - randomAlphabetic = randomAlphabetic(AccessTokenRequest.MAX_SCOPE_LENGTH + 1); + randomAlphabetic = randomStringUtils.nextAlphabetic(AccessTokenRequest.MAX_SCOPE_LENGTH + 1); mvc .perform(post("/oauth/token").content(format("%s&scope=%s", CONTENT, randomAlphabetic)) diff --git a/src/test/java/org/italiangrid/storm/webdav/test/oauth/jwk/OidcConfigurationFetcherTest.java b/src/test/java/org/italiangrid/storm/webdav/test/oauth/jwk/OidcConfigurationFetcherTest.java index c56364b1..18944ef0 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/oauth/jwk/OidcConfigurationFetcherTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/oauth/jwk/OidcConfigurationFetcherTest.java @@ -50,6 +50,7 @@ import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; @@ -94,8 +95,7 @@ private ResponseEntity> getWellKnownResponse(HttpStatus stat ResponseEntity> mockedEntity = (ResponseEntity>) Mockito.mock(ResponseEntity.class); - lenient().when(mockedEntity.getStatusCode()).thenReturn(status); - lenient().when(mockedEntity.getStatusCodeValue()).thenReturn(status.value()); + lenient().when(mockedEntity.getStatusCode()).thenReturn(HttpStatusCode.valueOf(status.value())); lenient().when(mockedEntity.getBody()).thenReturn(map); return mockedEntity; } @@ -113,8 +113,7 @@ private ResponseEntity getJWKURIResponse(HttpStatus status, String data) ResponseEntity mockedEntity = (ResponseEntity) Mockito.mock(ResponseEntity.class); lenient().when(mockedEntity.getBody()).thenReturn(data); - lenient().when(mockedEntity.getStatusCode()).thenReturn(status); - lenient().when(mockedEntity.getStatusCodeValue()).thenReturn(status.value()); + lenient().when(mockedEntity.getStatusCode()).thenReturn(HttpStatusCode.valueOf(status.value())); return mockedEntity; } @@ -126,18 +125,20 @@ private OidcConfigurationFetcher getFetcher(ResponseEntity> return getFetcher(restTemplate); } - private OidcConfigurationFetcher getFetcherWithException(ResponseEntity> wellKnownResponse) { + private OidcConfigurationFetcher getFetcherWithException( + ResponseEntity> wellKnownResponse) { lenient().when(restTemplate.exchange(any(), eq(typeReference))).thenReturn(wellKnownResponse); - lenient().when(restTemplate.exchange(any(), eq(String.class))).thenThrow(new RuntimeException("ERROR")); + lenient().when(restTemplate.exchange(any(), eq(String.class))) + .thenThrow(new RuntimeException("ERROR")); return getFetcher(restTemplate); } private OidcConfigurationFetcher getFetcher(RestTemplate restTemplate) { lenient().when(restBuilder.build()).thenReturn(restTemplate); - lenient().when(restBuilder.setConnectTimeout(any())).thenReturn(restBuilder); - lenient().when(restBuilder.setReadTimeout(any())).thenReturn(restBuilder); + lenient().when(restBuilder.connectTimeout(any())).thenReturn(restBuilder); + lenient().when(restBuilder.readTimeout(any())).thenReturn(restBuilder); lenient().when(oAuthProperties.getRefreshTimeoutSeconds()).thenReturn(30); lenient().when(oAuthProperties.getRefreshPeriodMinutes()).thenReturn(1); return new DefaultOidcConfigurationFetcher(restBuilder, oAuthProperties); @@ -195,7 +196,8 @@ private OidcConfigurationFetcher getFetcherWithErrorOnGetJwk() throws RestClient return getFetcher(mockedResponseMapEntity, mockedResponseStringEntity); } - private OidcConfigurationFetcher getFetcherWithRuntimeExceptionOnGetJwk() throws RestClientException { + private OidcConfigurationFetcher getFetcherWithRuntimeExceptionOnGetJwk() + throws RestClientException { ResponseEntity> mockedResponseMapEntity = getWellKnownResponse(OK, getMapWithIssuerAndJwkUri(ISSUER, JWK_URI)); diff --git a/src/test/java/org/italiangrid/storm/webdav/test/oauth/jwt/JwtIssuerTest.java b/src/test/java/org/italiangrid/storm/webdav/test/oauth/jwt/JwtIssuerTest.java index 35d212af..d02186ed 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/oauth/jwt/JwtIssuerTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/oauth/jwt/JwtIssuerTest.java @@ -37,7 +37,7 @@ import java.util.Set; import java.util.concurrent.TimeUnit; -import org.apache.commons.lang.RandomStringUtils; +import org.apache.commons.lang3.RandomStringUtils; import org.italiangrid.storm.webdav.authn.PrincipalHelper; import org.italiangrid.storm.webdav.authz.AuthorizationPolicyService; import org.italiangrid.storm.webdav.authz.SAPermission; @@ -70,7 +70,7 @@ public class JwtIssuerTest { public static final String ISSUER = "https://storm.example"; public static final String AUTHN_SUBJECT = "CN=test"; - public static final String SECRET = RandomStringUtils.random(256, true, true); + public static final String SECRET = RandomStringUtils.insecure().nextAlphanumeric(256); public static final int MAX_TOKEN_LIFETIME_SEC = 43200; diff --git a/src/test/java/org/italiangrid/storm/webdav/test/oauth/jwt/TokenServiceTest.java b/src/test/java/org/italiangrid/storm/webdav/test/oauth/jwt/TokenServiceTest.java index 9a70ae63..ffdd35e2 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/oauth/jwt/TokenServiceTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/oauth/jwt/TokenServiceTest.java @@ -72,7 +72,7 @@ public class TokenServiceTest { new JWTClaimsSet.Builder().expirationTime(Date.from(NOW_PLUS_100_SECS)).build(); @BeforeEach - public void setup() throws ParseException { + void setup() throws ParseException { issuerService = new DefaultTokenIssuerService(props, tokenIssuer, mockClock); diff --git a/src/test/java/org/italiangrid/storm/webdav/test/redirector/RedirectFilterTests.java b/src/test/java/org/italiangrid/storm/webdav/test/redirector/RedirectFilterTests.java index 617bb9ab..567ff574 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/redirector/RedirectFilterTests.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/redirector/RedirectFilterTests.java @@ -15,7 +15,7 @@ */ package org.italiangrid.storm.webdav.test.redirector; -import static javax.servlet.http.HttpServletResponse.SC_TEMPORARY_REDIRECT; +import static jakarta.servlet.http.HttpServletResponse.SC_TEMPORARY_REDIRECT; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.lenient; @@ -29,10 +29,10 @@ import java.util.HashMap; import java.util.Map; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.italiangrid.storm.webdav.redirector.RedirectFilter; import org.italiangrid.storm.webdav.redirector.RedirectionService; diff --git a/src/test/java/org/italiangrid/storm/webdav/test/redirector/RedirectionServiceTests.java b/src/test/java/org/italiangrid/storm/webdav/test/redirector/RedirectionServiceTests.java index 6f7d4489..880abd17 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/redirector/RedirectionServiceTests.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/redirector/RedirectionServiceTests.java @@ -26,8 +26,8 @@ import java.net.URI; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.italiangrid.storm.webdav.config.ServiceConfigurationProperties; import org.italiangrid.storm.webdav.oauth.authzserver.ResourceAccessTokenRequest; @@ -79,9 +79,10 @@ class RedirectionServiceTests extends RedirectorTestSupport { DefaultRedirectionService service; @BeforeEach - public void setup() { + void setup() { config = buildConfigurationProperties(); - lenient().when(tokenIssuer.createResourceAccessToken(Mockito.any(), Mockito.any())).thenReturn(token); + lenient().when(tokenIssuer.createResourceAccessToken(Mockito.any(), Mockito.any())) + .thenReturn(token); lenient().when(token.serialize()).thenReturn(RANDOM_TOKEN_STRING); lenient().when(selector.selectReplica()).thenReturn(Optional.empty()); lenient().when(request.getServletPath()).thenReturn(PATH); diff --git a/src/test/java/org/italiangrid/storm/webdav/test/tpc/PullTransferTest.java b/src/test/java/org/italiangrid/storm/webdav/test/tpc/PullTransferTest.java index 09527a6a..1fc62c70 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/tpc/PullTransferTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/tpc/PullTransferTest.java @@ -28,7 +28,7 @@ import java.io.IOException; -import javax.servlet.ServletException; +import jakarta.servlet.ServletException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -109,8 +109,8 @@ void checkTransferHeaderPassing() throws IOException, ServletException { when(request.getHeader(TRANSFER_HEADER_SCITAG)).thenReturn(SCITAG_HEADER_VALUE); when(request.getHeader(SCITAG_HEADER)).thenReturn(null); - when(request.getHeaderNames()).thenReturn(enumeration( - asList(TRANSFER_HEADER_AUTHORIZATION_KEY, TRANSFER_HEADER_WHATEVER_KEY, TRANSFER_HEADER_SCITAG))); + when(request.getHeaderNames()).thenReturn(enumeration(asList(TRANSFER_HEADER_AUTHORIZATION_KEY, + TRANSFER_HEADER_WHATEVER_KEY, TRANSFER_HEADER_SCITAG))); filter.doFilter(request, response, chain); verify(client).handle(getXferRequest.capture(), Mockito.any()); @@ -134,8 +134,8 @@ void checkTransferHeaderPassing() throws IOException, ServletException { @Test void emptyTransferHeaderAreIgnored() throws IOException, ServletException { - when(request.getHeaderNames()).thenReturn( - enumeration(asList(TRANSFER_HEADER, TRANSFER_HEADER_WHATEVER_KEY))); + when(request.getHeaderNames()) + .thenReturn(enumeration(asList(TRANSFER_HEADER, TRANSFER_HEADER_WHATEVER_KEY))); when(request.getHeader(TRANSFER_HEADER_WHATEVER_KEY)) .thenReturn(TRANSFER_HEADER_WHATEVER_VALUE); diff --git a/src/test/java/org/italiangrid/storm/webdav/test/tpc/PushTransferTest.java b/src/test/java/org/italiangrid/storm/webdav/test/tpc/PushTransferTest.java index 8806e50c..c9c80b60 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/tpc/PushTransferTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/tpc/PushTransferTest.java @@ -18,7 +18,7 @@ import static java.util.Arrays.asList; import static java.util.Collections.emptyEnumeration; import static java.util.Collections.enumeration; -import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; +import static jakarta.servlet.http.HttpServletResponse.SC_NOT_FOUND; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.italiangrid.storm.webdav.server.servlet.WebDAVMethod.COPY; @@ -29,8 +29,8 @@ import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -139,8 +139,8 @@ void checkTransferHeaderPassing() throws IOException, ServletException { @Test void emptyTransferHeaderAreIgnored() throws IOException, ServletException { - when(request.getHeaderNames()).thenReturn( - enumeration(asList(TRANSFER_HEADER, TRANSFER_HEADER_WHATEVER_KEY))); + when(request.getHeaderNames()) + .thenReturn(enumeration(asList(TRANSFER_HEADER, TRANSFER_HEADER_WHATEVER_KEY))); when(request.getHeader(TRANSFER_HEADER_WHATEVER_KEY)) .thenReturn(TRANSFER_HEADER_WHATEVER_VALUE); @@ -178,9 +178,9 @@ void checkExpectContinueHeaderIsSet() throws IOException, ServletException { when(request.getHeader(TRANSFER_HEADER_AUTHORIZATION_KEY)) .thenReturn(TRANSFER_HEADER_AUTHORIZATION_VALUE); - when(request.getHeaderNames()).thenReturn( - enumeration(asList(TRANSFER_HEADER_AUTHORIZATION_KEY))); - when(request.getContentLength()).thenReturn(1024*1024+1); + when(request.getHeaderNames()) + .thenReturn(enumeration(asList(TRANSFER_HEADER_AUTHORIZATION_KEY))); + when(request.getContentLength()).thenReturn(1024 * 1024 + 1); filter.doFilter(request, response, chain); verify(client).handle(putXferRequest.capture(), Mockito.any()); @@ -198,9 +198,9 @@ void checkExpectContinueHeaderIsNotSet() throws IOException, ServletException { when(request.getHeader(TRANSFER_HEADER_AUTHORIZATION_KEY)) .thenReturn(TRANSFER_HEADER_AUTHORIZATION_VALUE); - when(request.getHeaderNames()).thenReturn( - enumeration(asList(TRANSFER_HEADER_AUTHORIZATION_KEY))); - when(request.getContentLength()).thenReturn(1024*1024-1); + when(request.getHeaderNames()) + .thenReturn(enumeration(asList(TRANSFER_HEADER_AUTHORIZATION_KEY))); + when(request.getContentLength()).thenReturn(1024 * 1024 - 1); filter.doFilter(request, response, chain); verify(client).handle(putXferRequest.capture(), Mockito.any()); diff --git a/src/test/java/org/italiangrid/storm/webdav/test/tpc/SciTagFilterActivationTest.java b/src/test/java/org/italiangrid/storm/webdav/test/tpc/SciTagFilterActivationTest.java index 51e587c9..ac438355 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/tpc/SciTagFilterActivationTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/tpc/SciTagFilterActivationTest.java @@ -27,7 +27,7 @@ import java.io.File; import java.io.IOException; -import javax.servlet.ServletException; +import jakarta.servlet.ServletException; import org.italiangrid.storm.webdav.config.StorageAreaInfo; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/org/italiangrid/storm/webdav/test/tpc/TransferFilterActivationTest.java b/src/test/java/org/italiangrid/storm/webdav/test/tpc/TransferFilterActivationTest.java index b7b9a3a0..2fa25695 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/tpc/TransferFilterActivationTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/tpc/TransferFilterActivationTest.java @@ -27,7 +27,7 @@ import java.io.IOException; import java.util.EnumSet; -import javax.servlet.ServletException; +import jakarta.servlet.ServletException; import org.italiangrid.storm.webdav.config.StorageAreaInfo; import org.italiangrid.storm.webdav.server.servlet.WebDAVMethod; @@ -82,8 +82,7 @@ void filterIgnoresOtherHttpOrWebdavMethods() throws IOException, ServletExceptio } @Test - void filterSkippedIfSourceAndDestionationHeaderMissing() - throws IOException, ServletException { + void filterSkippedIfSourceAndDestionationHeaderMissing() throws IOException, ServletException { // No source or destination header when(request.getHeader(TransferConstants.SOURCE_HEADER)).thenReturn(null); diff --git a/src/test/java/org/italiangrid/storm/webdav/test/tpc/TransferFilterTestSupport.java b/src/test/java/org/italiangrid/storm/webdav/test/tpc/TransferFilterTestSupport.java index 6f81b5c1..4b8289a0 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/tpc/TransferFilterTestSupport.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/tpc/TransferFilterTestSupport.java @@ -26,9 +26,9 @@ import java.util.Arrays; import java.util.Enumeration; -import javax.servlet.FilterChain; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.FilterChain; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.italiangrid.storm.webdav.server.PathResolver; import org.italiangrid.storm.webdav.tpc.LocalURLService; @@ -76,8 +76,8 @@ public class TransferFilterTestSupport { public static final String[] INVALID_URLs = {"http:whatever", "httpg://storm.example/test", "gsiftp://whatever/test"}; - public static final String EXPECTED_HEADER = org.apache.http.protocol.HTTP.EXPECT_DIRECTIVE; - public static final String EXPECTED_VALUE = org.apache.http.protocol.HTTP.EXPECT_CONTINUE; + public static final String EXPECTED_HEADER = "Expect"; + public static final String EXPECTED_VALUE = "100-continue"; @Mock FilterChain chain; @@ -117,7 +117,7 @@ public class TransferFilterTestSupport { LocalURLService lus = new StaticHostListLocalURLService(Arrays.asList("localhost")); protected void setup() throws IOException { - filter = new TransferFilter(clock, client, resolver, lus, true, 1024L*1024L); + filter = new TransferFilter(clock, client, resolver, lus, true, 1024L * 1024L); lenient().when(request.getHeaderNames()).thenReturn(requestHeaderNames); } diff --git a/src/test/java/org/italiangrid/storm/webdav/test/tpc/TransferRequestValidationTest.java b/src/test/java/org/italiangrid/storm/webdav/test/tpc/TransferRequestValidationTest.java index 619e7782..b8a741af 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/tpc/TransferRequestValidationTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/tpc/TransferRequestValidationTest.java @@ -16,7 +16,7 @@ package org.italiangrid.storm.webdav.test.tpc; import static java.util.Collections.emptyEnumeration; -import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; +import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.is; @@ -29,8 +29,8 @@ import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/org/italiangrid/storm/webdav/test/tpc/TransferReturnStatusTest.java b/src/test/java/org/italiangrid/storm/webdav/test/tpc/TransferReturnStatusTest.java index b54b1bac..96cb54d1 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/tpc/TransferReturnStatusTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/tpc/TransferReturnStatusTest.java @@ -16,8 +16,8 @@ package org.italiangrid.storm.webdav.test.tpc; import static java.util.Collections.emptyEnumeration; -import static javax.servlet.http.HttpServletResponse.SC_ACCEPTED; -import static javax.servlet.http.HttpServletResponse.SC_PRECONDITION_FAILED; +import static jakarta.servlet.http.HttpServletResponse.SC_ACCEPTED; +import static jakarta.servlet.http.HttpServletResponse.SC_PRECONDITION_FAILED; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.italiangrid.storm.webdav.server.servlet.WebDAVMethod.COPY; @@ -26,11 +26,11 @@ import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletResponse; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.HttpResponseException; +import org.apache.hc.client5.http.ClientProtocolException; +import org.apache.hc.client5.http.HttpResponseException; import org.italiangrid.storm.webdav.tpc.TransferConstants; import org.italiangrid.storm.webdav.tpc.transfer.GetTransferRequest; import org.italiangrid.storm.webdav.tpc.transfer.error.ChecksumVerificationError; diff --git a/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/ClientTest.java b/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/ClientTest.java index efd8b40b..fdd9d9bc 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/ClientTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/ClientTest.java @@ -24,13 +24,14 @@ import java.io.File; import java.io.IOException; +import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import org.apache.http.client.ResponseHandler; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.protocol.HttpClientContext; +import org.apache.hc.core5.http.io.HttpClientResponseHandler; +import org.apache.hc.core5.http.message.BasicClassicHttpRequest; +import org.apache.hc.client5.http.protocol.HttpClientContext; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -53,7 +54,9 @@ class ClientTest extends ClientTestSupport { public void setup() throws IOException { super.setup(); - lenient().when(es.scheduleAtFixedRate(Mockito.any(), Mockito.anyLong(), Mockito.anyLong(), Mockito.any())) + lenient() + .when(es.scheduleAtFixedRate(Mockito.any(), Mockito.anyLong(), Mockito.anyLong(), + Mockito.any())) .thenReturn(sf); lenient().when(req.remoteURI()).thenReturn(HTTP_URI_URI); lenient().when(req.path()).thenReturn(LOCAL_PATH); @@ -70,38 +73,36 @@ public void setup() throws IOException { } @Test - void testClientCorrectlyBuildsHttpRequestNoHeaders() throws IOException { + void testClientCorrectlyBuildsHttpRequestNoHeaders() throws IOException, URISyntaxException { client.handle(req, (r, s) -> { }); - verify(httpClient).execute(getRequest.capture(), - ArgumentMatchers.>any(), - ArgumentMatchers.any()); + verify(httpClient).execute(getRequest.capture(), ArgumentMatchers.any(), + ArgumentMatchers.>any()); - HttpGet httpGetReq = getRequest.getValue(); + BasicClassicHttpRequest httpGetReq = getRequest.getValue(); - assertThat(httpGetReq.getURI(), is(HTTP_URI_URI)); - assertThat(httpGetReq.getAllHeaders(), arrayWithSize(0)); + assertThat(httpGetReq.getUri(), is(HTTP_URI_URI)); + assertThat(httpGetReq.getHeaders(), arrayWithSize(0)); } @Test - void testClientCorrectlyBuildsHttpRequestWithHeaders() throws IOException { + void testClientCorrectlyBuildsHttpRequestWithHeaders() throws IOException, URISyntaxException { when(req.transferHeaders()).thenReturn(HEADER_MAP); client.handle(req, (r, s) -> { }); - verify(httpClient).execute(getRequest.capture(), - ArgumentMatchers.>any(), - ArgumentMatchers.any()); + verify(httpClient).execute(getRequest.capture(), ArgumentMatchers.any(), + ArgumentMatchers.>any()); - HttpGet httpGetReq = getRequest.getValue(); + BasicClassicHttpRequest httpGetReq = getRequest.getValue(); - assertThat(httpGetReq.getURI(), is(HTTP_URI_URI)); - assertThat(httpGetReq.getAllHeaders(), arrayWithSize(1)); + assertThat(httpGetReq.getUri(), is(HTTP_URI_URI)); + assertThat(httpGetReq.getHeaders(), arrayWithSize(1)); assertThat(httpGetReq.getHeaders(AUTHORIZATION_HEADER)[0].getValue(), is(AUTHORIZATION_HEADER_VALUE)); diff --git a/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/ClientTestSupport.java b/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/ClientTestSupport.java index ce3ef8ce..6888d6e1 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/ClientTestSupport.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/ClientTestSupport.java @@ -22,8 +22,8 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.hc.core5.http.message.BasicClassicHttpRequest; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.italiangrid.storm.webdav.config.ServiceConfigurationProperties; import org.italiangrid.storm.webdav.config.ServiceConfigurationProperties.BufferProperties; import org.italiangrid.storm.webdav.config.ThirdPartyCopyProperties; @@ -79,7 +79,7 @@ public class ClientTestSupport { HttpTransferClient client; @Captor - ArgumentCaptor getRequest; + ArgumentCaptor getRequest; public static final String MOCKFS_WORKDIR = "/mockfs"; @@ -94,15 +94,14 @@ public FileSystem initMockFs() { } @BeforeEach - public void setup() throws IOException { + void setup() throws IOException { ThirdPartyCopyProperties props = new ThirdPartyCopyProperties(); ServiceConfigurationProperties config = new ServiceConfigurationProperties(); BufferProperties buffer = new BufferProperties(); config.setBuffer(buffer); - client = - new HttpTransferClient(Clock.systemDefaultZone(), httpClient, resolver, eah, es, props, - config); + client = new HttpTransferClient(Clock.systemDefaultZone(), httpClient, resolver, eah, es, props, + config); } } diff --git a/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/DigestTest.java b/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/DigestTest.java index 5ace7612..24a0dfe6 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/DigestTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/DigestTest.java @@ -20,8 +20,8 @@ import static org.italiangrid.storm.webdav.tpc.utils.Adler32DigestHeaderHelper.extractAdler32DigestFromResponse; import static org.mockito.Mockito.lenient; -import org.apache.http.Header; -import org.apache.http.HttpResponse; +import org.apache.hc.core5.http.Header; +import org.apache.hc.core5.http.HttpResponse; import org.italiangrid.storm.webdav.tpc.utils.Adler32DigestHeaderHelper; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -45,7 +45,8 @@ public class DigestTest { protected void instrumentResponse(String headerValue) { - lenient().when(response.getFirstHeader(Adler32DigestHeaderHelper.DIGEST_HEADER)).thenReturn(header); + lenient().when(response.getFirstHeader(Adler32DigestHeaderHelper.DIGEST_HEADER)) + .thenReturn(header); lenient().when(header.getName()).thenReturn(Adler32DigestHeaderHelper.DIGEST_HEADER); lenient().when(header.getValue()).thenReturn(headerValue); } diff --git a/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/GetResponseHandlerTest.java b/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/GetResponseHandlerTest.java index 498be64d..72f434d3 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/GetResponseHandlerTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/GetResponseHandlerTest.java @@ -18,14 +18,12 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; import java.io.IOException; import java.nio.file.Path; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.StatusLine; +import org.apache.hc.core5.http.HttpEntity; +import org.apache.hc.core5.http.ClassicHttpResponse; import org.italiangrid.storm.webdav.tpc.http.GetResponseHandler; import org.italiangrid.storm.webdav.tpc.utils.StormCountingOutputStream; import org.junit.jupiter.api.BeforeEach; @@ -38,14 +36,11 @@ @ExtendWith(MockitoExtension.class) class GetResponseHandlerTest extends ClientTestSupport { - @Mock - StatusLine status; - @Mock HttpEntity entity; @Mock - HttpResponse response; + ClassicHttpResponse response; @Mock StormCountingOutputStream os; @@ -57,14 +52,11 @@ class GetResponseHandlerTest extends ClientTestSupport { public void setup() { handler = new GetResponseHandler(null, os, eah); - lenient().when(response.getStatusLine()).thenReturn(status); lenient().when(response.getEntity()).thenReturn(entity); } @Test void handlerWritesToStream() throws IOException { - when(status.getStatusCode()).thenReturn(200); - handler.handleResponse(response); verify(entity).getContent(); diff --git a/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/integration/TpcClientRedirectionTest.java b/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/integration/TpcClientRedirectionTest.java index 33e51df0..ff2f5de0 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/integration/TpcClientRedirectionTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/integration/TpcClientRedirectionTest.java @@ -15,6 +15,7 @@ */ package org.italiangrid.storm.webdav.test.tpc.http.integration; +import static org.mockserver.configuration.Configuration.configuration; import static org.mockserver.integration.ClientAndServer.startClientAndServer; import static org.mockserver.model.Header.header; import static org.mockserver.model.HttpRequest.request; @@ -24,21 +25,12 @@ import java.net.URI; import java.util.UUID; -import javax.net.ssl.SSLContext; - -import org.apache.http.config.Registry; -import org.apache.http.config.RegistryBuilder; -import org.apache.http.conn.HttpClientConnectionManager; -import org.apache.http.conn.socket.ConnectionSocketFactory; -import org.apache.http.conn.socket.LayeredConnectionSocketFactory; -import org.apache.http.conn.socket.PlainConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.hc.client5.http.io.HttpClientConnectionManager; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; import org.italiangrid.storm.webdav.WebdavService; import org.italiangrid.storm.webdav.config.ServiceConfiguration; import org.italiangrid.storm.webdav.config.ThirdPartyCopyProperties; import org.italiangrid.storm.webdav.test.tpc.http.integration.TpcClientRedirectionTest.TestConfig; -import org.italiangrid.storm.webdav.tpc.TransferConstants; import org.italiangrid.storm.webdav.tpc.http.HttpTransferClient; import org.italiangrid.storm.webdav.tpc.transfer.GetTransferRequest; import org.italiangrid.storm.webdav.tpc.transfer.impl.GetTransferRequestImpl; @@ -88,42 +80,26 @@ public static class TestConfig { @Primary public HttpClientConnectionManager tpcClientConnectionManager(ThirdPartyCopyProperties props, ServiceConfiguration conf) { + new KeyStoreFactory(configuration(), null).sslContext(); - SSLContext ctx = KeyStoreFactory.keyStoreFactory().sslContext(); - ConnectionSocketFactory sf = PlainConnectionSocketFactory.getSocketFactory(); - LayeredConnectionSocketFactory tlsSf = new SSLConnectionSocketFactory(ctx); - - Registry r = RegistryBuilder.create() - .register(TransferConstants.HTTP, sf) - .register(TransferConstants.HTTPS, tlsSf) - .register(TransferConstants.DAV, sf) - .register(TransferConstants.DAVS, tlsSf) - .build(); - - PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(r); - cm.setMaxTotal(props.getMaxConnections()); - return cm; + return PoolingHttpClientConnectionManagerBuilder.create().setMaxConnTotal(props.getMaxConnections()).build(); } } @BeforeAll - public static void startMockServer() { - // port = findAvailableTcpPort(15000); - + static void startMockServer() { httpPort = PortFactory.findFreePort(); httpsPort = httpPort + 1; mockServer = startClientAndServer(httpPort, httpsPort); - - } @AfterAll - public static void stopMockServer() { + static void stopMockServer() { mockServer.stop(); } @BeforeEach - public void before() { + void before() { mockServer.reset(); } diff --git a/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/integration/TpcIntegrationTest.java b/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/integration/TpcIntegrationTest.java index 9c8d8e86..d5bd3888 100644 --- a/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/integration/TpcIntegrationTest.java +++ b/src/test/java/org/italiangrid/storm/webdav/test/tpc/http/integration/TpcIntegrationTest.java @@ -69,18 +69,18 @@ public class TpcIntegrationTest { @BeforeAll - public static void startMockServer() { + static void startMockServer() { port = findAvailableTcpPort(); mockServer = startClientAndServer(port); } @AfterAll - public static void stopMockServer() { + static void stopMockServer() { mockServer.stop(); } @BeforeEach - public void before() { + void before() { mockServer.reset(); }