From ae998c7b521e0991eea9c6420f8debcb0cf63ff7 Mon Sep 17 00:00:00 2001 From: Daniel Garnier-Moiroux Date: Wed, 9 Apr 2025 20:20:38 +0200 Subject: [PATCH 1/2] Fix HttpSessionRequestCache#getMatchingRequest query string parsing - URL parsing changed in framework 6.2, and fails when path contains a % sign. - The HttpSessionRequestCache only needs to inspect the query string, not the full URL. Fixes gh-16656 Signed-off-by: Daniel Garnier-Moiroux --- .../web/savedrequest/HttpSessionRequestCache.java | 10 +++++----- .../HttpSessionRequestCacheTests.java | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/web/src/main/java/org/springframework/security/web/savedrequest/HttpSessionRequestCache.java b/web/src/main/java/org/springframework/security/web/savedrequest/HttpSessionRequestCache.java index 549a0fcfb41..6b8fec94d3e 100644 --- a/web/src/main/java/org/springframework/security/web/savedrequest/HttpSessionRequestCache.java +++ b/web/src/main/java/org/springframework/security/web/savedrequest/HttpSessionRequestCache.java @@ -103,11 +103,11 @@ public void removeRequest(HttpServletRequest currentRequest, HttpServletResponse @Override public HttpServletRequest getMatchingRequest(HttpServletRequest request, HttpServletResponse response) { if (this.matchingRequestParameterName != null) { - if (!StringUtils.hasText(request.getQueryString()) - || !UriComponentsBuilder.fromUriString(UrlUtils.buildRequestUrl(request)) - .build() - .getQueryParams() - .containsKey(this.matchingRequestParameterName)) { + if (!StringUtils.hasText(request.getQueryString()) || !UriComponentsBuilder.newInstance() + .query(request.getQueryString()) + .build() + .getQueryParams() + .containsKey(this.matchingRequestParameterName)) { this.logger.trace( "matchingRequestParameterName is required for getMatchingRequest to lookup a value, but not provided"); return null; diff --git a/web/src/test/java/org/springframework/security/web/savedrequest/HttpSessionRequestCacheTests.java b/web/src/test/java/org/springframework/security/web/savedrequest/HttpSessionRequestCacheTests.java index e19a5f177d1..1074b3649c3 100644 --- a/web/src/test/java/org/springframework/security/web/savedrequest/HttpSessionRequestCacheTests.java +++ b/web/src/test/java/org/springframework/security/web/savedrequest/HttpSessionRequestCacheTests.java @@ -168,6 +168,21 @@ public void getMatchingRequestWhenMatchingRequestParameterNameSetThenDoesNotInvo verify(request, never()).getParameterMap(); } + // gh-16656 + @Test + public void getMatchingRequestWhenMatchingRequestPathContainsPercentSignThenLookedUp() { + MockHttpServletRequest request = new MockHttpServletRequest(); + request.setServletPath("/30 % off"); + HttpSessionRequestCache cache = new HttpSessionRequestCache(); + cache.saveRequest(request, new MockHttpServletResponse()); + MockHttpServletRequest requestToMatch = new MockHttpServletRequest(); + requestToMatch.setServletPath("/30 % off"); + requestToMatch.setQueryString("continue"); + requestToMatch.setSession(request.getSession()); + HttpServletRequest matchingRequest = cache.getMatchingRequest(requestToMatch, new MockHttpServletResponse()); + assertThat(matchingRequest).isNotNull(); + } + private static final class CustomSavedRequest implements SavedRequest { private final SavedRequest delegate; From c99491c01999b5fc9e4ccf06ebd69d8cf7216ffa Mon Sep 17 00:00:00 2001 From: Josh Cummings <3627351+jzheaux@users.noreply.github.com> Date: Wed, 23 Apr 2025 14:53:42 -0600 Subject: [PATCH 2/2] Update Copyright Issue gh-16656 --- .../security/web/savedrequest/HttpSessionRequestCache.java | 2 +- .../security/web/savedrequest/HttpSessionRequestCacheTests.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/web/src/main/java/org/springframework/security/web/savedrequest/HttpSessionRequestCache.java b/web/src/main/java/org/springframework/security/web/savedrequest/HttpSessionRequestCache.java index 6b8fec94d3e..eb4b1ce4106 100644 --- a/web/src/main/java/org/springframework/security/web/savedrequest/HttpSessionRequestCache.java +++ b/web/src/main/java/org/springframework/security/web/savedrequest/HttpSessionRequestCache.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/web/src/test/java/org/springframework/security/web/savedrequest/HttpSessionRequestCacheTests.java b/web/src/test/java/org/springframework/security/web/savedrequest/HttpSessionRequestCacheTests.java index 1074b3649c3..c6fb8b984b9 100644 --- a/web/src/test/java/org/springframework/security/web/savedrequest/HttpSessionRequestCacheTests.java +++ b/web/src/test/java/org/springframework/security/web/savedrequest/HttpSessionRequestCacheTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License.