This is an automated email from the ASF dual-hosted git repository. lukaszlenart pushed a commit to branch WW-4173-optional in repository https://gitbox.apache.org/repos/asf/struts.git
commit 2e79ceea6fbdd070c530a5289960eace47445e1f Author: Lukasz Lenart <lukaszlen...@apache.org> AuthorDate: Wed Nov 9 16:20:54 2022 +0100 WW-4173 Introduces a dedicated interface to allow conditionally disabling a given interceptor --- .../xwork2/DefaultActionInvocation.java | 7 ++-- .../xwork2/interceptor/AbstractInterceptor.java | 12 +++++-- ...nterceptor.java => ConditionalInterceptor.java} | 38 +++++++--------------- .../xwork2/interceptor/Interceptor.java | 8 ----- .../struts2/interceptor/CoepInterceptor.java | 10 +----- .../struts2/interceptor/CoopInterceptor.java | 9 +---- .../interceptor/FetchMetadataInterceptor.java | 4 --- .../struts2/interceptor/csp/CspInterceptor.java | 9 +---- .../struts2/interceptor/CoepInterceptorTest.java | 9 ----- .../struts2/interceptor/CoopInterceptorTest.java | 9 ----- .../struts2/interceptor/CspInterceptorTest.java | 11 ------- .../interceptor/FetchMetadataInterceptorTest.java | 8 ----- 12 files changed, 27 insertions(+), 107 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java b/core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java index c1e049dfa..9634e47ce 100644 --- a/core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java +++ b/core/src/main/java/com/opensymphony/xwork2/DefaultActionInvocation.java @@ -24,6 +24,7 @@ import com.opensymphony.xwork2.config.entities.InterceptorMapping; import com.opensymphony.xwork2.config.entities.ResultConfig; import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.interceptor.ConditionalInterceptor; import com.opensymphony.xwork2.interceptor.Interceptor; import com.opensymphony.xwork2.interceptor.PreResultListener; import com.opensymphony.xwork2.interceptor.WithLazyParams; @@ -248,11 +249,11 @@ public class DefaultActionInvocation implements ActionInvocation { if (interceptor instanceof WithLazyParams) { interceptor = lazyParamInjector.injectParams(interceptor, interceptorMapping.getParams(), invocationContext); } - if (interceptor.isDisabled(this)) { + if (interceptor instanceof ConditionalInterceptor && ((ConditionalInterceptor) interceptor).shouldIntercept(this)) { + resultCode = interceptor.intercept(this); + } else { LOG.debug("Interceptor: {} is disabled, skipping to next", interceptor.getClass().getSimpleName()); resultCode = this.invoke(); - } else { - resultCode = interceptor.intercept(this); } } else { resultCode = invokeActionOnly(); diff --git a/core/src/main/java/com/opensymphony/xwork2/interceptor/AbstractInterceptor.java b/core/src/main/java/com/opensymphony/xwork2/interceptor/AbstractInterceptor.java index efa009052..21e459c29 100644 --- a/core/src/main/java/com/opensymphony/xwork2/interceptor/AbstractInterceptor.java +++ b/core/src/main/java/com/opensymphony/xwork2/interceptor/AbstractInterceptor.java @@ -23,7 +23,7 @@ import com.opensymphony.xwork2.ActionInvocation; /** * Provides default implementations of optional lifecycle methods */ -public abstract class AbstractInterceptor implements Interceptor { +public abstract class AbstractInterceptor implements ConditionalInterceptor { private boolean disabled; @@ -44,12 +44,18 @@ public abstract class AbstractInterceptor implements Interceptor { */ public abstract String intercept(ActionInvocation invocation) throws Exception; + /** + * Allows to skip executing a given interceptor, just define {@code <param name="disabled">true</param>} + * or use other way to override interceptor's parameters, see + * <a href="https://struts.apache.org/core-developers/interceptors#interceptor-parameter-overriding">docs</a>. + * @param disable if set to true, execution of a given interceptor will be skipped. + */ public void setDisabled(String disable) { this.disabled = Boolean.parseBoolean(disable); } @Override - public boolean isDisabled(ActionInvocation invocation) { - return this.disabled; + public boolean shouldIntercept(ActionInvocation invocation) { + return !this.disabled; } } diff --git a/core/src/main/java/com/opensymphony/xwork2/interceptor/AbstractInterceptor.java b/core/src/main/java/com/opensymphony/xwork2/interceptor/ConditionalInterceptor.java similarity index 59% copy from core/src/main/java/com/opensymphony/xwork2/interceptor/AbstractInterceptor.java copy to core/src/main/java/com/opensymphony/xwork2/interceptor/ConditionalInterceptor.java index efa009052..14a3d2764 100644 --- a/core/src/main/java/com/opensymphony/xwork2/interceptor/AbstractInterceptor.java +++ b/core/src/main/java/com/opensymphony/xwork2/interceptor/ConditionalInterceptor.java @@ -21,35 +21,19 @@ package com.opensymphony.xwork2.interceptor; import com.opensymphony.xwork2.ActionInvocation; /** - * Provides default implementations of optional lifecycle methods + * A marking interface, when implemented allows to conditionally execute a given interceptor + * within the current action invocation. + * + * @since Struts 6.1.1 */ -public abstract class AbstractInterceptor implements Interceptor { - - private boolean disabled; - - /** - * Does nothing - */ - public void init() { - } +public interface ConditionalInterceptor extends Interceptor { /** - * Does nothing + * Determines if a given interceptor should be executed in the current processing of action invocation. + * + * @param invocation current {@link ActionInvocation} to determine if the interceptor should be executed + * @return true if the given interceptor should be included in the current action invocation + * @since 6.1.0 */ - public void destroy() { - } - - /** - * Override to handle interception - */ - public abstract String intercept(ActionInvocation invocation) throws Exception; - - public void setDisabled(String disable) { - this.disabled = Boolean.parseBoolean(disable); - } - - @Override - public boolean isDisabled(ActionInvocation invocation) { - return this.disabled; - } + boolean shouldIntercept(ActionInvocation invocation); } diff --git a/core/src/main/java/com/opensymphony/xwork2/interceptor/Interceptor.java b/core/src/main/java/com/opensymphony/xwork2/interceptor/Interceptor.java index 3488314d2..cafa08fc0 100644 --- a/core/src/main/java/com/opensymphony/xwork2/interceptor/Interceptor.java +++ b/core/src/main/java/com/opensymphony/xwork2/interceptor/Interceptor.java @@ -219,12 +219,4 @@ public interface Interceptor extends Serializable { */ String intercept(ActionInvocation invocation) throws Exception; - /** - * Allows to disable processing a given interceptor - * - * @param invocation current {@link ActionInvocation} to determine if the interceptor should be executed - * @return true if the given interceptor should be skipped - * @since 6.1.0 - */ - boolean isDisabled(ActionInvocation invocation); } diff --git a/core/src/main/java/org/apache/struts2/interceptor/CoepInterceptor.java b/core/src/main/java/org/apache/struts2/interceptor/CoepInterceptor.java index 6d550c19f..850556e32 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/CoepInterceptor.java +++ b/core/src/main/java/org/apache/struts2/interceptor/CoepInterceptor.java @@ -51,20 +51,12 @@ public class CoepInterceptor extends AbstractInterceptor implements PreResultLis @Override public String intercept(ActionInvocation invocation) throws Exception { - if (this.isDisabled(invocation)) { - LOG.trace("COEP interceptor has been disabled"); - } else { - invocation.addPreResultListener(this); - } + invocation.addPreResultListener(this); return invocation.invoke(); } @Override public void beforeResult(ActionInvocation invocation, String resultCode) { - if (this.isDisabled(invocation)) { - return; - } - HttpServletRequest req = invocation.getInvocationContext().getServletRequest(); final String path = req.getContextPath(); diff --git a/core/src/main/java/org/apache/struts2/interceptor/CoopInterceptor.java b/core/src/main/java/org/apache/struts2/interceptor/CoopInterceptor.java index 9827ceb13..123170baf 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/CoopInterceptor.java +++ b/core/src/main/java/org/apache/struts2/interceptor/CoopInterceptor.java @@ -53,19 +53,12 @@ public class CoopInterceptor extends AbstractInterceptor implements PreResultLis @Override public String intercept(ActionInvocation invocation) throws Exception { - if (this.isDisabled(invocation)) { - LOG.trace("COOP interceptor has been disabled"); - } else { - invocation.addPreResultListener(this); - } + invocation.addPreResultListener(this); return invocation.invoke(); } @Override public void beforeResult(ActionInvocation invocation, String resultCode) { - if (this.isDisabled(invocation)) { - return; - } HttpServletRequest request = invocation.getInvocationContext().getServletRequest(); String path = request.getContextPath(); diff --git a/core/src/main/java/org/apache/struts2/interceptor/FetchMetadataInterceptor.java b/core/src/main/java/org/apache/struts2/interceptor/FetchMetadataInterceptor.java index 9a3583607..0f46206f2 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/FetchMetadataInterceptor.java +++ b/core/src/main/java/org/apache/struts2/interceptor/FetchMetadataInterceptor.java @@ -62,10 +62,6 @@ public class FetchMetadataInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { - if (this.isDisabled(invocation)) { - LOG.trace("Fetch Metadata interceptor has been disabled"); - return invocation.invoke(); - } ActionContext context = invocation.getInvocationContext(); HttpServletRequest request = context.getServletRequest(); diff --git a/core/src/main/java/org/apache/struts2/interceptor/csp/CspInterceptor.java b/core/src/main/java/org/apache/struts2/interceptor/csp/CspInterceptor.java index 38b196514..f5fae9bc3 100644 --- a/core/src/main/java/org/apache/struts2/interceptor/csp/CspInterceptor.java +++ b/core/src/main/java/org/apache/struts2/interceptor/csp/CspInterceptor.java @@ -47,18 +47,11 @@ public final class CspInterceptor extends AbstractInterceptor implements PreResu @Override public String intercept(ActionInvocation invocation) throws Exception { - if (this.isDisabled(invocation)) { - LOG.trace("CSP interceptor has been disabled"); - } else { - invocation.addPreResultListener(this); - } + invocation.addPreResultListener(this); return invocation.invoke(); } public void beforeResult(ActionInvocation invocation, String resultCode) { - if (this.isDisabled(invocation)) { - return; - } HttpServletRequest request = invocation.getInvocationContext().getServletRequest(); HttpServletResponse response = invocation.getInvocationContext().getServletResponse(); settings.addCspHeaders(request, response); diff --git a/core/src/test/java/org/apache/struts2/interceptor/CoepInterceptorTest.java b/core/src/test/java/org/apache/struts2/interceptor/CoepInterceptorTest.java index 1401951c2..72ea1a024 100644 --- a/core/src/test/java/org/apache/struts2/interceptor/CoepInterceptorTest.java +++ b/core/src/test/java/org/apache/struts2/interceptor/CoepInterceptorTest.java @@ -41,15 +41,6 @@ public class CoepInterceptorTest extends StrutsInternalTestCase { private final String HEADER_CONTENT = "require-corp"; - public void testDisabled() throws Exception { - interceptor.setDisabled("true"); - - interceptor.intercept(mai); - - String header = response.getHeader(COEP_ENFORCING_HEADER); - assertTrue("COEP is not disabled", Strings.isEmpty(header)); - } - public void testEnforcingHeader() throws Exception { interceptor.setEnforcingMode("true"); diff --git a/core/src/test/java/org/apache/struts2/interceptor/CoopInterceptorTest.java b/core/src/test/java/org/apache/struts2/interceptor/CoopInterceptorTest.java index 8e9e9d4ec..544e7b5d8 100644 --- a/core/src/test/java/org/apache/struts2/interceptor/CoopInterceptorTest.java +++ b/core/src/test/java/org/apache/struts2/interceptor/CoopInterceptorTest.java @@ -75,15 +75,6 @@ public class CoopInterceptorTest extends StrutsInternalTestCase { } } - public void testDisabled() throws Exception { - interceptor.setDisabled("true"); - - interceptor.intercept(mai); - - String header = response.getHeader(COOP_HEADER); - assertTrue("COOP is not disabled", Strings.isEmpty(header)); - } - @Override protected void setUp() throws Exception { super.setUp(); diff --git a/core/src/test/java/org/apache/struts2/interceptor/CspInterceptorTest.java b/core/src/test/java/org/apache/struts2/interceptor/CspInterceptorTest.java index a091b93c7..5727a9dcf 100644 --- a/core/src/test/java/org/apache/struts2/interceptor/CspInterceptorTest.java +++ b/core/src/test/java/org/apache/struts2/interceptor/CspInterceptorTest.java @@ -145,17 +145,6 @@ public class CspInterceptorTest extends StrutsInternalTestCase { } } - public void testDisabled() throws Exception { - interceptor.setDisabled("true"); - - interceptor.intercept(mai); - - String header = response.getHeader(CSP_ENFORCE_HEADER); - assertTrue("CSP is not disabled", Strings.isEmpty(header)); - header = response.getHeader(CSP_REPORT_HEADER); - assertTrue("CSP is not disabled", Strings.isEmpty(header)); - } - public void checkHeader(String reportUri, String enforcingMode) { String expectedCspHeader; if (Strings.isEmpty(reportUri)) { diff --git a/core/src/test/java/org/apache/struts2/interceptor/FetchMetadataInterceptorTest.java b/core/src/test/java/org/apache/struts2/interceptor/FetchMetadataInterceptorTest.java index 4b8403c47..6426ebeaa 100644 --- a/core/src/test/java/org/apache/struts2/interceptor/FetchMetadataInterceptorTest.java +++ b/core/src/test/java/org/apache/struts2/interceptor/FetchMetadataInterceptorTest.java @@ -261,12 +261,4 @@ public class FetchMetadataInterceptorTest extends XWorkTestCase { assertNotEquals("Expected interceptor to accept this request [" + "/" + fetchMetadataExemptedGlobalActionConfig.getName() + "]", SC_FORBIDDEN, configuredFetchMetadataInterceptor.intercept(mai)); } - public void testDisabled() throws Exception { - interceptor.setDisabled("true"); - - interceptor.intercept(mai); - - String header = response.getHeader(VARY_HEADER); - assertTrue("Fetch Metadata is not disabled", Strings.isEmpty(header)); - } }