This is an automated email from the ASF dual-hosted git repository. lukaszlenart pushed a commit to branch WW-5241-exec-and-wait in repository https://gitbox.apache.org/repos/asf/struts.git
The following commit(s) were added to refs/heads/WW-5241-exec-and-wait by this push: new 415e0fbd4 WW-5241 Ignores calls to append !method when DMI is disabled 415e0fbd4 is described below commit 415e0fbd44bea04fc3c6566d38fbe60d22680c55 Author: Lukasz Lenart <lukaszlen...@apache.org> AuthorDate: Fri Oct 14 11:32:10 2022 +0200 WW-5241 Ignores calls to append !method when DMI is disabled --- .../dispatcher/mapper/DefaultActionMapper.java | 33 +++++++++++++--------- .../dispatcher/mapper/DefaultActionMapperTest.java | 22 +++++++++++++-- .../apache/struts2/result/PostbackResultTest.java | 5 +++- .../result/ServletActionRedirectResultTest.java | 7 +++-- .../struts2/views/jsp/AbstractUITagTest.java | 6 ++-- 5 files changed, 52 insertions(+), 21 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java b/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java index 98fec5316..ff16adfbf 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java @@ -34,7 +34,12 @@ import org.apache.struts2.StrutsConstants; import org.apache.struts2.util.PrefixTrie; import javax.servlet.http.HttpServletRequest; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.regex.Pattern; /** @@ -344,8 +349,8 @@ public class DefaultActionMapper implements ActionMapper { /** * Parses the name and namespace from the uri * - * @param uri The uri - * @param mapping The action mapping to populate + * @param uri The uri + * @param mapping The action mapping to populate * @param configManager configuration manager */ protected void parseNameAndNamespace(String uri, ActionMapping mapping, ConfigurationManager configManager) { @@ -453,7 +458,7 @@ public class DefaultActionMapper implements ActionMapper { /** * Reads defined method name for a given action from configuration * - * @param mapping current instance of {@link ActionMapping} + * @param mapping current instance of {@link ActionMapping} * @param configurationManager current instance of {@link ConfigurationManager} */ protected void extractMethodName(ActionMapping mapping, ConfigurationManager configurationManager) { @@ -507,7 +512,7 @@ public class DefaultActionMapper implements ActionMapper { } /** - * @return null if no extension is specified. + * @return null if no extension is specified. */ protected String getDefaultExtension() { if (extensions == null) { @@ -552,17 +557,19 @@ public class DefaultActionMapper implements ActionMapper { } protected void handleDynamicMethod(ActionMapping mapping, StringBuilder uri) { + if (!allowDynamicMethodCalls) { + LOG.debug("DMI is disabled, ignoring appending !method to the URI"); + return; + } // See WW-3965 if (StringUtils.isNotEmpty(mapping.getMethod())) { - if (allowDynamicMethodCalls) { - // handle "name!method" convention. - String name = mapping.getName(); - if (!name.contains("!")) { - // Append the method as no bang found - uri.append("!").append(mapping.getMethod()); - } - } else { + // handle "name!method" convention. + String name = mapping.getName(); + if (!name.contains("!")) { + // Append the method as no bang found uri.append("!").append(mapping.getMethod()); + } else if (name.endsWith("!")) { + uri.append(mapping.getMethod()); } } } diff --git a/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java b/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java index a9d01eec7..289e92751 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java @@ -640,6 +640,7 @@ public class DefaultActionMapperTest extends StrutsInternalTestCase { public void testGetUriFromActionMapper1() { DefaultActionMapper mapper = new DefaultActionMapper(); + mapper.setAllowDynamicMethodCalls("true"); ActionMapping actionMapping = new ActionMapping(); actionMapping.setMethod("myMethod"); actionMapping.setName("myActionName"); @@ -651,6 +652,7 @@ public class DefaultActionMapperTest extends StrutsInternalTestCase { public void testGetUriFromActionMapper2() { DefaultActionMapper mapper = new DefaultActionMapper(); + mapper.setAllowDynamicMethodCalls("true"); ActionMapping actionMapping = new ActionMapping(); actionMapping.setMethod("myMethod"); actionMapping.setName("myActionName"); @@ -662,6 +664,7 @@ public class DefaultActionMapperTest extends StrutsInternalTestCase { public void testGetUriFromActionMapper3() { DefaultActionMapper mapper = new DefaultActionMapper(); + mapper.setAllowDynamicMethodCalls("true"); ActionMapping actionMapping = new ActionMapping(); actionMapping.setMethod("myMethod"); actionMapping.setName("myActionName"); @@ -671,7 +674,6 @@ public class DefaultActionMapperTest extends StrutsInternalTestCase { assertEquals("/myActionName!myMethod.action", uri); } - public void testGetUriFromActionMapper4() { DefaultActionMapper mapper = new DefaultActionMapper(); ActionMapping actionMapping = new ActionMapping(); @@ -692,9 +694,9 @@ public class DefaultActionMapperTest extends StrutsInternalTestCase { assertEquals("/myActionName.action", uri); } - // public void testGetUriFromActionMapper6() { DefaultActionMapper mapper = new DefaultActionMapper(); + mapper.setAllowDynamicMethodCalls("true"); ActionMapping actionMapping = new ActionMapping(); actionMapping.setMethod("myMethod"); actionMapping.setName("myActionName?test=bla"); @@ -706,6 +708,7 @@ public class DefaultActionMapperTest extends StrutsInternalTestCase { public void testGetUriFromActionMapper7() { DefaultActionMapper mapper = new DefaultActionMapper(); + mapper.setAllowDynamicMethodCalls("true"); ActionMapping actionMapping = new ActionMapping(); actionMapping.setMethod("myMethod"); actionMapping.setName("myActionName?test=bla"); @@ -717,6 +720,7 @@ public class DefaultActionMapperTest extends StrutsInternalTestCase { public void testGetUriFromActionMapper8() { DefaultActionMapper mapper = new DefaultActionMapper(); + mapper.setAllowDynamicMethodCalls("true"); ActionMapping actionMapping = new ActionMapping(); actionMapping.setMethod("myMethod"); actionMapping.setName("myActionName?test=bla"); @@ -726,6 +730,16 @@ public class DefaultActionMapperTest extends StrutsInternalTestCase { assertEquals("/myActionName!myMethod.action?test=bla", uri); } + public void testGetUriFromActionMapperWithDisabledDMI() { + DefaultActionMapper mapper = new DefaultActionMapper(); + ActionMapping actionMapping = new ActionMapping(); + actionMapping.setMethod("myMethod"); + actionMapping.setName("myActionName?test=bla"); + actionMapping.setNamespace(""); + String uri = mapper.getUriFromActionMapping(actionMapping); + + assertEquals("/myActionName.action?test=bla", uri); + } public void testGetUriFromActionMapper9() { DefaultActionMapper mapper = new DefaultActionMapper(); @@ -769,6 +783,7 @@ public class DefaultActionMapperTest extends StrutsInternalTestCase { public void testGetUriFromActionMapper_justActionAndMethod() { DefaultActionMapper mapper = new DefaultActionMapper(); + mapper.setAllowDynamicMethodCalls("true"); ActionMapping actionMapping = new ActionMapping(); actionMapping.setMethod("myMethod"); actionMapping.setName("myActionName"); @@ -780,7 +795,8 @@ public class DefaultActionMapperTest extends StrutsInternalTestCase { public void testGetUriFromActionMapperWhenBlankExtension() { DefaultActionMapper mapper = new DefaultActionMapper(); - mapper.setExtensions(",,"); + mapper.setExtensions(","); + mapper.setAllowDynamicMethodCalls("true"); ActionMapping actionMapping = new ActionMapping(); actionMapping.setMethod("myMethod"); actionMapping.setName("myActionName"); diff --git a/core/src/test/java/org/apache/struts2/result/PostbackResultTest.java b/core/src/test/java/org/apache/struts2/result/PostbackResultTest.java index 42d9330fa..f019436f7 100644 --- a/core/src/test/java/org/apache/struts2/result/PostbackResultTest.java +++ b/core/src/test/java/org/apache/struts2/result/PostbackResultTest.java @@ -26,6 +26,7 @@ import com.opensymphony.xwork2.util.ValueStack; import org.apache.struts2.ServletActionContext; import org.apache.struts2.StrutsInternalTestCase; import org.apache.struts2.dispatcher.mapper.ActionMapper; +import org.apache.struts2.dispatcher.mapper.DefaultActionMapper; import org.easymock.IMocksControl; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; @@ -117,7 +118,9 @@ public class PostbackResultTest extends StrutsInternalTestCase { expect(mockInvocation.getStack()).andReturn(stack).anyTimes(); control.replay(); - result.setActionMapper(container.getInstance(ActionMapper.class)); + DefaultActionMapper mapper = (DefaultActionMapper) container.getInstance(ActionMapper.class); + mapper.setAllowDynamicMethodCalls("true"); + result.setActionMapper(mapper); result.execute(mockInvocation); assertEquals("<!DOCTYPE html><html><body><form action=\"/myNamespace${1-1}/myAction${1-1}!myMethod${1-1}.action\" method=\"POST\">" + "<script>setTimeout(function(){document.forms[0].submit();},0);</script></html>", res.getContentAsString()); diff --git a/core/src/test/java/org/apache/struts2/result/ServletActionRedirectResultTest.java b/core/src/test/java/org/apache/struts2/result/ServletActionRedirectResultTest.java index 19136bf16..216bb98e0 100644 --- a/core/src/test/java/org/apache/struts2/result/ServletActionRedirectResultTest.java +++ b/core/src/test/java/org/apache/struts2/result/ServletActionRedirectResultTest.java @@ -28,6 +28,7 @@ import com.opensymphony.xwork2.util.ValueStack; import org.apache.struts2.ServletActionContext; import org.apache.struts2.StrutsInternalTestCase; import org.apache.struts2.dispatcher.mapper.ActionMapper; +import org.apache.struts2.dispatcher.mapper.DefaultActionMapper; import org.apache.struts2.views.util.DefaultUrlHelper; import org.easymock.IMocksControl; import org.springframework.mock.web.MockHttpServletRequest; @@ -163,7 +164,9 @@ public class ServletActionRedirectResultTest extends StrutsInternalTestCase { expect(mockInvocation.getStack()).andReturn(stack).anyTimes(); control.replay(); - result.setActionMapper(container.getInstance(ActionMapper.class)); + DefaultActionMapper mapper = (DefaultActionMapper) container.getInstance(ActionMapper.class); + mapper.setAllowDynamicMethodCalls("true"); + result.setActionMapper(mapper); result.execute(mockInvocation); assertEquals("/myNamespace${1-1}/myAction${1-1}!myMethod${1-1}.action?param1=value+1¶m2=value+2¶m3=value+3#fragment", res.getRedirectedUrl()); @@ -313,5 +316,5 @@ public class ServletActionRedirectResultTest extends StrutsInternalTestCase { ServletActionRedirectResult result = (ServletActionRedirectResult) factory.buildResult(resultConfig, ActionContext.getContext().getContextMap()); assertNotNull(result); } - + } diff --git a/core/src/test/java/org/apache/struts2/views/jsp/AbstractUITagTest.java b/core/src/test/java/org/apache/struts2/views/jsp/AbstractUITagTest.java index 79603acfd..c0fad07bd 100644 --- a/core/src/test/java/org/apache/struts2/views/jsp/AbstractUITagTest.java +++ b/core/src/test/java/org/apache/struts2/views/jsp/AbstractUITagTest.java @@ -23,6 +23,8 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; import org.apache.commons.beanutils.BeanUtils; import org.apache.struts2.ServletActionContext; +import org.apache.struts2.dispatcher.mapper.ActionMapper; +import org.apache.struts2.dispatcher.mapper.DefaultActionMapper; import org.apache.struts2.views.jsp.ui.AbstractUITag; import java.io.InputStream; @@ -227,7 +229,7 @@ public abstract class AbstractUITagTest extends AbstractTagTest { try (InputStream in = url.openStream()) { byte[] buf = new byte[4096]; int nbytes; - + while ((nbytes = in.read(buf)) > 0) { buffer.append(new String(buf, 0, nbytes)); } @@ -245,7 +247,7 @@ public abstract class AbstractUITagTest extends AbstractTagTest { protected void setUp() throws Exception { super.setUp(); - + ((DefaultActionMapper) container.getInstance(ActionMapper.class)).setAllowDynamicMethodCalls("true"); ServletActionContext.setServletContext(pageContext.getServletContext()); }