This is an automated email from the ASF dual-hosted git repository.

lprimak pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/shiro.git


The following commit(s) were added to refs/heads/main by this push:
     new 63be1a243 bugfix(jakarta-ee): missing cache entry for the check (#2861)
63be1a243 is described below

commit 63be1a2433f18b12e0d963ebb17c7e4d7dc443af
Author: Lenny Primak <[email protected]>
AuthorDate: Mon Aug 17 12:59:42 2026 -0500

    bugfix(jakarta-ee): missing cache entry for the check (#2861)
---
 .../jakarta-ee/src/main/webapp/WEB-INF/web.xml     |  4 +++
 .../ee/filters/AuthenticationFilterDelegate.java   |  8 +++++-
 .../shiro/ee/filters/FormResubmitSupport.java      | 30 +++++++++++++++++++---
 .../ee/listeners/EnvironmentLoaderListener.java    | 16 ++++++++++++
 4 files changed, 53 insertions(+), 5 deletions(-)

diff --git a/integration-tests/jakarta-ee/src/main/webapp/WEB-INF/web.xml 
b/integration-tests/jakarta-ee/src/main/webapp/WEB-INF/web.xml
index cead2eaec..3008d063e 100644
--- a/integration-tests/jakarta-ee/src/main/webapp/WEB-INF/web.xml
+++ b/integration-tests/jakarta-ee/src/main/webapp/WEB-INF/web.xml
@@ -70,6 +70,10 @@
         <param-name>org.apache.shiro.form-resubmit.secure-cookies</param-name>
         <param-value>false</param-value>
     </context-param>
+    <context-param>
+        
<param-name>org.apache.shiro.form-resubmit.whitelist.disabled</param-name>
+        <param-value>true</param-value>
+    </context-param>
 
     <!-- Apache Shiro Security -->
     <context-param>
diff --git 
a/support/jakarta-ee/src/main/java/org/apache/shiro/ee/filters/AuthenticationFilterDelegate.java
 
b/support/jakarta-ee/src/main/java/org/apache/shiro/ee/filters/AuthenticationFilterDelegate.java
index 7cb31df49..fcc63912a 100644
--- 
a/support/jakarta-ee/src/main/java/org/apache/shiro/ee/filters/AuthenticationFilterDelegate.java
+++ 
b/support/jakarta-ee/src/main/java/org/apache/shiro/ee/filters/AuthenticationFilterDelegate.java
@@ -33,12 +33,15 @@ import static 
org.apache.shiro.ee.filters.FormAuthenticationFilter.LOGIN_PREDICA
 import static 
org.apache.shiro.ee.filters.FormAuthenticationFilter.LOGIN_URL_ATTR_NAME;
 import static 
org.apache.shiro.ee.filters.FormAuthenticationFilter.LOGIN_WAITTIME_ATTR_NAME;
 import static 
org.apache.shiro.ee.filters.FormAuthenticationFilter.NO_PREDICATE;
+import static 
org.apache.shiro.ee.filters.FormAuthenticationFilter.getPathWithinApplication;
+import static org.apache.shiro.ee.filters.FormResubmitSupport.isPostRequest;
 import static 
org.apache.shiro.ee.filters.FormResubmitSupport.savePostDataForResubmit;
 import static 
org.apache.shiro.ee.filters.FormResubmitSupport.saveRequestReferer;
 import static 
org.apache.shiro.ee.filters.LogoutFilter.LOGOUT_PREDICATE_ATTR_NAME;
 import static org.apache.shiro.ee.filters.LogoutFilter.YES_PREDICATE;
 import static 
org.apache.shiro.ee.listeners.EnvironmentLoaderListener.isFormResubmitDisabled;
 import static 
org.apache.shiro.ee.listeners.EnvironmentLoaderListener.isServletNoPrincipal;
+import static 
org.apache.shiro.web.filter.authc.NoAccessFilter.FORM_RESUBMIT_CHECK_SERVLET_PATH;
 import static 
org.apache.shiro.web.jaxrs.SubjectPrincipalRequestFilter.SHIRO_WEB_JAXRS_DISABLE_PRINCIPAL_PARAM;
 
 /**
@@ -101,7 +104,10 @@ class AuthenticationFilterDelegate {
     public boolean isAccessAllowed(ServletRequest request, ServletResponse 
response, Object mappedValue) {
         Subject subject = methods.getSubject(request, response);
         boolean isAuthenticated = subject.isAuthenticated() && 
subject.getPrincipal() != null;
-        return isAuthenticated || (useRemembered && subject.isRemembered());
+        return isAuthenticated || (useRemembered && subject.isRemembered())
+                || (isPostRequest(request)
+                && 
FORM_RESUBMIT_CHECK_SERVLET_PATH.equals(getPathWithinApplication(request,
+                () -> 
WebUtils.getPathWithinApplication(WebUtils.toHttp(request)))));
     }
 
     /**
diff --git 
a/support/jakarta-ee/src/main/java/org/apache/shiro/ee/filters/FormResubmitSupport.java
 
b/support/jakarta-ee/src/main/java/org/apache/shiro/ee/filters/FormResubmitSupport.java
index 44f1cf56d..20e8b6108 100644
--- 
a/support/jakarta-ee/src/main/java/org/apache/shiro/ee/filters/FormResubmitSupport.java
+++ 
b/support/jakarta-ee/src/main/java/org/apache/shiro/ee/filters/FormResubmitSupport.java
@@ -37,10 +37,12 @@ import static 
org.apache.shiro.ee.filters.FormResubmitSupportCookies.getSessionC
 import java.net.URISyntaxException;
 import java.time.Duration;
 import java.util.Collections;
+import org.apache.shiro.cache.CacheManager;
 import org.apache.shiro.crypto.CryptoException;
 import org.apache.shiro.ee.filters.Forms.FallbackPredicate;
 import static 
org.apache.shiro.ee.filters.FormResubmitSupportCookies.initializeCookies;
 import static 
org.apache.shiro.ee.filters.FormResubmitSupportCookies.transformCookieHeader;
+import static 
org.apache.shiro.ee.listeners.EnvironmentLoaderListener.isFormResubmitBlacklistEnabled;
 import static 
org.apache.shiro.ee.listeners.EnvironmentLoaderListener.isFormResubmitDisabled;
 import java.io.IOException;
 import java.net.CookieManager;
@@ -57,6 +59,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
 import static java.util.function.Predicate.not;
+import static 
org.apache.shiro.ee.listeners.EnvironmentLoaderListener.isFormResubmitWhitelistEnabled;
 import static org.apache.shiro.ee.listeners.IniEnvironment.hasFacesContext;
 import static 
org.apache.shiro.web.filter.authc.NoAccessFilter.FORM_RESUBMIT_CHECK_SERVLET_PATH;
 import static org.apache.shiro.web.filter.authz.PortFilter.DEFAULT_HTTP_PORT;
@@ -646,13 +649,18 @@ public class FormResubmitSupport {
         } else if (isBlacklisted(blacklist, authority)) {
             log.debug("Form resubmit blacklist cache hit for {}", 
savedRequestURI);
             return false;
-        } else if (checkWhitelistClient(savedRequestURI, 
servletContext.getContextPath(), client, savedFormDataKey)) {
-            putWhitelistEntry(whitelist, authority);
+        } else if (checkWhitelistClient(savedRequestURI, 
servletContext.getContextPath(), client,
+                savedFormDataKey, dsm.getCacheManager())) {
+            if (isFormResubmitWhitelistEnabled(servletContext)) {
+                putWhitelistEntry(whitelist, authority);
+            }
             blacklist.remove(authority);
             return true;
         }
 
-        putBlacklistEntry(blacklist, authority);
+        if (isFormResubmitBlacklistEnabled(servletContext)) {
+            putBlacklistEntry(blacklist, authority);
+        }
         return false;
     }
 
@@ -710,7 +718,10 @@ public class FormResubmitSupport {
     }
 
     private static boolean checkWhitelistClient(URI savedRequestURI, String 
contextPath, HttpClient client,
-                                                String savedFormDataKey) {
+                                                String savedFormDataKey, 
@NonNull CacheManager cacheManager) {
+        Cache<UUID, String> cache = null;
+        UUID savedFormDataUUID = null;
+
         try {
             var rememberMeManager = getRememberMeManager();
             if (rememberMeManager == null || 
rememberMeManager.getCipherService() == null
@@ -719,6 +730,13 @@ public class FormResubmitSupport {
                 return false;
             }
 
+            if (savedFormDataKey == null) {
+                savedFormDataUUID = UUID.randomUUID();
+                savedFormDataKey = savedFormDataUUID.toString();
+                cache = cacheManager.getCache(FORM_DATA_CACHE);
+                cache.put(savedFormDataUUID, 
"__DUMMY_FOR_CLIENT_WHITELIST_CHECK__");
+            }
+
             var request = HttpRequest.newBuilder()
                     
.uri(URI.create("%s://%s%s%s".formatted(savedRequestURI.getScheme(), 
savedRequestURI.getAuthority(),
                             contextPath, FORM_RESUBMIT_CHECK_SERVLET_PATH)))
@@ -738,6 +756,10 @@ public class FormResubmitSupport {
         } catch (IOException | InterruptedException e) {
             log.debug("Form resubmit whitelist check failed for {} with 
exception: {}",
                     savedRequestURI, e);
+        } finally {
+            if (cache != null) {
+                cache.remove(savedFormDataUUID);
+            }
         }
         return false;
     }
diff --git 
a/support/jakarta-ee/src/main/java/org/apache/shiro/ee/listeners/EnvironmentLoaderListener.java
 
b/support/jakarta-ee/src/main/java/org/apache/shiro/ee/listeners/EnvironmentLoaderListener.java
index fa4b0a08f..5d49862ec 100644
--- 
a/support/jakarta-ee/src/main/java/org/apache/shiro/ee/listeners/EnvironmentLoaderListener.java
+++ 
b/support/jakarta-ee/src/main/java/org/apache/shiro/ee/listeners/EnvironmentLoaderListener.java
@@ -46,6 +46,8 @@ public class EnvironmentLoaderListener extends 
EnvironmentLoader implements Serv
     private static final String SHIRO_EE_CHAR_ENCODING_PARAM = 
"org.apache.shiro.ee.character-encoding";
     private static final String FORM_RESUBMIT_DISABLED_PARAM = 
"org.apache.shiro.form-resubmit.disabled";
     private static final String FORM_RESUBMIT_SECURE_COOKIES = 
"org.apache.shiro.form-resubmit.secure-cookies";
+    private static final String FORM_RESUBMIT_WHITE_LIST_DISABLED = 
"org.apache.shiro.form-resubmit.whitelist.disabled";
+    private static final String FORM_RESUBMIT_BLACK_LIST_DISABLED = 
"org.apache.shiro.form-resubmit.blacklist.disabled";
     private static final String SHIRO_WEB_DISABLE_PRINCIPAL_PARAM = 
"org.apache.shiro.web.disable-principal";
 
     public static boolean isShiroEEDisabled(ServletContext ctx) {
@@ -64,6 +66,14 @@ public class EnvironmentLoaderListener extends 
EnvironmentLoader implements Serv
         return 
Boolean.TRUE.equals(ctx.getAttribute(FORM_RESUBMIT_SECURE_COOKIES));
     }
 
+    public static boolean isFormResubmitWhitelistEnabled(ServletContext ctx) {
+        return 
!Boolean.TRUE.equals(ctx.getAttribute(FORM_RESUBMIT_WHITE_LIST_DISABLED));
+    }
+
+    public static boolean isFormResubmitBlacklistEnabled(ServletContext ctx) {
+        return 
!Boolean.TRUE.equals(ctx.getAttribute(FORM_RESUBMIT_BLACK_LIST_DISABLED));
+    }
+
     public static boolean isServletNoPrincipal(ServletContext ctx) {
         return 
Boolean.TRUE.equals(ctx.getAttribute(SHIRO_WEB_DISABLE_PRINCIPAL_PARAM));
     }
@@ -96,6 +106,12 @@ public class EnvironmentLoaderListener extends 
EnvironmentLoader implements Serv
         } else {
             sce.getServletContext().setAttribute(FORM_RESUBMIT_SECURE_COOKIES, 
Boolean.FALSE);
         }
+        if 
(Boolean.parseBoolean(sce.getServletContext().getInitParameter(FORM_RESUBMIT_WHITE_LIST_DISABLED)))
 {
+            
sce.getServletContext().setAttribute(FORM_RESUBMIT_WHITE_LIST_DISABLED, 
Boolean.TRUE);
+        }
+        if 
(Boolean.parseBoolean(sce.getServletContext().getInitParameter(FORM_RESUBMIT_BLACK_LIST_DISABLED)))
 {
+            
sce.getServletContext().setAttribute(FORM_RESUBMIT_BLACK_LIST_DISABLED, 
Boolean.TRUE);
+        }
         if 
(Boolean.parseBoolean(sce.getServletContext().getInitParameter(SHIRO_WEB_DISABLE_PRINCIPAL_PARAM)))
 {
             
sce.getServletContext().setAttribute(SHIRO_WEB_DISABLE_PRINCIPAL_PARAM, 
Boolean.TRUE);
         }

Reply via email to