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&param2=value+2&param3=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());
     }
 

Reply via email to