You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2013/10/15 20:20:43 UTC

svn commit: r1532467 - in /struts/struts2/branches/STRUTS_2_3_15_X: core/src/main/java/org/apache/struts2/ core/src/main/java/org/apache/struts2/dispatcher/mapper/ core/src/main/resources/org/apache/struts2/ core/src/test/java/org/apache/struts2/dispat...

Author: lukaszlenart
Date: Tue Oct 15 18:20:43 2013
New Revision: 1532467

URL: http://svn.apache.org/r1532467
Log:
Changes archetypes version to match latest release

Modified:
    struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/StrutsConstants.java
    struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java
    struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/ParameterAction.java
    struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/resources/org/apache/struts2/default.properties
    struts/struts2/branches/STRUTS_2_3_15_X/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java
    struts/struts2/branches/STRUTS_2_3_15_X/src/site/resources/archetype-catalog.xml

Modified: struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/StrutsConstants.java
URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/StrutsConstants.java?rev=1532467&r1=1532466&r2=1532467&view=diff
==============================================================================
--- struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/StrutsConstants.java (original)
+++ struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/StrutsConstants.java Tue Oct 15 18:20:43 2013
@@ -258,4 +258,10 @@ public final class StrutsConstants {
     /** actions names' whitelist **/
     public static final String STRUTS_ALLOWED_ACTION_NAMES = "struts.allowed.action.names";
 
+    /** enables action: prefix **/
+    public static final String STRUTS_MAPPER_ACTION_PREFIX_ENABLED = "struts.mapper.action.prefix.enabled";
+
+    /** enables access to actions in other namespaces than current with action: prefix **/
+    public static final String STRUTS_MAPPER_ACTION_PREFIX_CROSSNAMESPACES = "struts.mapper.action.prefix.crossNamespaces";
+
 }

Modified: struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java
URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java?rev=1532467&r1=1532466&r2=1532467&view=diff
==============================================================================
--- struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java (original)
+++ struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java Tue Oct 15 18:20:43 2013
@@ -34,7 +34,6 @@ import org.apache.commons.lang3.StringUt
 import org.apache.struts2.RequestUtils;
 import org.apache.struts2.ServletActionContext;
 import org.apache.struts2.StrutsConstants;
-import org.apache.struts2.dispatcher.ServletDispatcherResult;
 import org.apache.struts2.util.PrefixTrie;
 
 import javax.servlet.http.HttpServletRequest;
@@ -170,13 +169,14 @@ public class DefaultActionMapper impleme
 
     protected static final String METHOD_PREFIX = "method:";
     protected static final String ACTION_PREFIX = "action:";
-    private static final String STRUTS2_ACTION_PREFIX_PARSED = "_struts2_action_prefix_parsed";
 
     protected boolean allowDynamicMethodCalls = false;
     protected boolean allowSlashesInActionNames = false;
     protected boolean alwaysSelectFullNamespace = false;
     protected PrefixTrie prefixTrie = null;
     protected Pattern allowedActionNames = Pattern.compile("[a-zA-Z0-9._!/\\-]*");
+    private boolean allowActionPrefix = false;
+    private boolean allowActionCrossNamespaceAccess = false;
 
     protected List<String> extensions = new ArrayList<String>() {{
         add("action");
@@ -189,7 +189,7 @@ public class DefaultActionMapper impleme
         prefixTrie = new PrefixTrie() {
             {
                 put(METHOD_PREFIX, new ParameterAction() {
-                    public void execute(String key, ActionMapping mapping, HttpServletRequest request) {
+                    public void execute(String key, ActionMapping mapping) {
                         if (allowDynamicMethodCalls) {
                             mapping.setMethod(key.substring(METHOD_PREFIX.length()));
                         }
@@ -197,9 +197,8 @@ public class DefaultActionMapper impleme
                 });
 
                 put(ACTION_PREFIX, new ParameterAction() {
-                    public void execute(final String key, ActionMapping mapping, HttpServletRequest request) {
-                        if (request != null && request.getAttribute(STRUTS2_ACTION_PREFIX_PARSED) == null) {
-                            request.setAttribute(STRUTS2_ACTION_PREFIX_PARSED, true);
+                    public void execute(final String key, ActionMapping mapping) {
+                        if (allowActionPrefix) {
                             String name = key.substring(ACTION_PREFIX.length());
                             if (allowDynamicMethodCalls) {
                                 int bang = name.indexOf('!');
@@ -210,11 +209,17 @@ public class DefaultActionMapper impleme
                                 }
                             }
                             String actionName = cleanupActionName(name);
-                            mapping.setName(actionName);
-                            if (getDefaultExtension() != null) {
-                                actionName = actionName + "." + getDefaultExtension();
+                            if (allowSlashesInActionNames && !allowActionCrossNamespaceAccess) {
+                                if (actionName.startsWith("/")) {
+                                    actionName = actionName.substring(1);
+                                }
                             }
-                            mapping.setResult(new ServletDispatcherResult(actionName));
+                            if (!allowSlashesInActionNames && !allowActionCrossNamespaceAccess) {
+                                if (actionName.lastIndexOf("/") != -1) {
+                                    actionName = actionName.substring(actionName.lastIndexOf("/") + 1);
+                                }
+                            }
+                            mapping.setName(actionName);
                         }
                     }
                 });
@@ -254,6 +259,16 @@ public class DefaultActionMapper impleme
         this.allowedActionNames = Pattern.compile(allowedActionNames);
     }
 
+    @Inject(value = StrutsConstants.STRUTS_MAPPER_ACTION_PREFIX_ENABLED)
+    public void setAllowActionPrefix(String allowActionPrefix) {
+        this.allowActionPrefix = "true".equalsIgnoreCase(allowActionPrefix);
+    }
+
+    @Inject(value = StrutsConstants.STRUTS_MAPPER_ACTION_PREFIX_CROSSNAMESPACES)
+    public void setAllowActionCrossNamespaceAccess(String allowActionCrossNamespaceAccess) {
+        this.allowActionCrossNamespaceAccess = "true".equalsIgnoreCase(allowActionCrossNamespaceAccess);
+    }
+
     @Inject
     public void setContainer(Container container) {
         this.container = container;
@@ -346,7 +361,7 @@ public class DefaultActionMapper impleme
             if (!uniqueParameters.contains(key)) {
                 ParameterAction parameterAction = (ParameterAction) prefixTrie.get(key);
                 if (parameterAction != null) {
-                    parameterAction.execute(key, mapping, request);
+                    parameterAction.execute(key, mapping);
                     uniqueParameters.add(key);
                     break;
                 }

Modified: struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/ParameterAction.java
URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/ParameterAction.java?rev=1532467&r1=1532466&r2=1532467&view=diff
==============================================================================
--- struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/ParameterAction.java (original)
+++ struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/java/org/apache/struts2/dispatcher/mapper/ParameterAction.java Tue Oct 15 18:20:43 2013
@@ -21,8 +21,6 @@
 
 package org.apache.struts2.dispatcher.mapper;
 
-import javax.servlet.http.HttpServletRequest;
-
 /**
  * Defines a parameter action prefix.  This is executed when the configured prefix key is matched in a parameter
  * name, allowing the implementation to manipulate the action mapping accordingly.  For example, if the "action:foo"
@@ -32,5 +30,7 @@ import javax.servlet.http.HttpServletReq
  * @since 2.1.0
  */
 public interface ParameterAction {
-    void execute(String key, ActionMapping mapping, HttpServletRequest request);
+
+    void execute(String key, ActionMapping mapping);
+
 }

Modified: struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/resources/org/apache/struts2/default.properties
URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/resources/org/apache/struts2/default.properties?rev=1532467&r1=1532466&r2=1532467&view=diff
==============================================================================
--- struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/resources/org/apache/struts2/default.properties (original)
+++ struts/struts2/branches/STRUTS_2_3_15_X/core/src/main/resources/org/apache/struts2/default.properties Tue Oct 15 18:20:43 2013
@@ -116,6 +116,12 @@ struts.enable.DynamicMethodInvocation = 
 ### "/foo/save".
 struts.enable.SlashesInActionNames = false
 
+### Disables support for action: prefix
+struts.mapper.action.prefix.enabled = false
+
+### Blocks access to actions in other namespace than current with action: prefix
+struts.mapper.action.prefix.crossNamespaces = false
+
 ### use alternative syntax that requires %{} in most places
 ### to evaluate expressions for String attributes for tags
 struts.tag.altSyntax=true

Modified: struts/struts2/branches/STRUTS_2_3_15_X/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_3_15_X/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java?rev=1532467&r1=1532466&r2=1532467&view=diff
==============================================================================
--- struts/struts2/branches/STRUTS_2_3_15_X/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java (original)
+++ struts/struts2/branches/STRUTS_2_3_15_X/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java Tue Oct 15 18:20:43 2013
@@ -34,7 +34,6 @@ import org.apache.struts2.StrutsTestCase
 import org.apache.struts2.dispatcher.StrutsResultSupport;
 import org.apache.struts2.views.jsp.StrutsMockHttpServletRequest;
 
-import javax.servlet.http.HttpServletRequest;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
@@ -400,7 +399,7 @@ public class DefaultActionMapperTest ext
     // === test special prefix ===
     // ===========================
 
-    public void testActionPrefix() throws Exception {
+    public void testActionPrefixWhenDisabled() throws Exception {
         Map parameterMap = new HashMap();
         parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction", "");
 
@@ -411,9 +410,89 @@ public class DefaultActionMapperTest ext
         DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
         ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager);
 
+        assertEquals("someServletPath", actionMapping.getName());
+    }
+
+    public void testActionPrefixWhenEnabled() throws Exception {
+        Map parameterMap = new HashMap();
+        parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction", "");
+
+        StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest();
+        request.setParameterMap(parameterMap);
+        request.setupGetServletPath("/someServletPath.action");
+
+        DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
+        defaultActionMapper.setAllowActionPrefix("true");
+        ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager);
+
         assertEquals("myAction", actionMapping.getName());
     }
 
+    public void testActionPrefixWhenSlashesAndCrossNamespaceDisabled() throws Exception {
+        Map parameterMap = new HashMap();
+        parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "my/Action", "");
+
+        StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest();
+        request.setParameterMap(parameterMap);
+        request.setupGetServletPath("/someServletPath.action");
+
+        DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
+        defaultActionMapper.setAllowActionPrefix("true");
+        defaultActionMapper.setSlashesInActionNames("true");
+        ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager);
+
+        assertEquals("my/Action", actionMapping.getName());
+    }
+
+    public void testActionPrefixWhenSlashesButSlashesDisabledAndCrossNamespaceDisabled() throws Exception {
+        Map parameterMap = new HashMap();
+        parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "my/Action", "");
+
+        StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest();
+        request.setParameterMap(parameterMap);
+        request.setupGetServletPath("/someServletPath.action");
+
+        DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
+        defaultActionMapper.setAllowActionPrefix("true");
+        defaultActionMapper.setSlashesInActionNames("false");
+        ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager);
+
+        assertEquals("Action", actionMapping.getName());
+    }
+
+    public void testActionPrefixWhenSlashesButSlashesDisabledAndCrossNamespace() throws Exception {
+        Map parameterMap = new HashMap();
+        parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "my/Action", "");
+
+        StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest();
+        request.setParameterMap(parameterMap);
+        request.setupGetServletPath("/someServletPath.action");
+
+        DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
+        defaultActionMapper.setAllowActionPrefix("true");
+        defaultActionMapper.setAllowActionCrossNamespaceAccess("true");
+        defaultActionMapper.setSlashesInActionNames("false");
+        ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager);
+
+        assertEquals("my/Action", actionMapping.getName());
+    }
+
+    public void testActionPrefixWhenCrossNamespace() throws Exception {
+        Map parameterMap = new HashMap();
+        parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "/my/Action", "");
+
+        StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest();
+        request.setParameterMap(parameterMap);
+        request.setupGetServletPath("/someServletPath.action");
+
+        DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
+        defaultActionMapper.setAllowActionPrefix("true");
+        defaultActionMapper.setAllowActionCrossNamespaceAccess("true");
+        ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager);
+
+        assertEquals("/my/Action", actionMapping.getName());
+    }
+
     public void testActionPrefix_fromImageButton() throws Exception {
         Map parameterMap = new HashMap();
         parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction", "");
@@ -425,6 +504,7 @@ public class DefaultActionMapperTest ext
         request.setupGetServletPath("/someServletPath.action");
 
         DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
+        defaultActionMapper.setAllowActionPrefix("true");
         ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager);
 
         assertEquals("myAction", actionMapping.getName());
@@ -440,6 +520,7 @@ public class DefaultActionMapperTest ext
         request.setupGetServletPath("/someServletPath.action");
 
         DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
+        defaultActionMapper.setAllowActionPrefix("true");
         ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager);
 
         assertEquals("myAction", actionMapping.getName());
@@ -539,7 +620,7 @@ public class DefaultActionMapperTest ext
 
         DefaultActionMapper defaultActionMapper = new DefaultActionMapper();
         defaultActionMapper.addParameterAction("foo", new ParameterAction() {
-            public void execute(String key, ActionMapping mapping, HttpServletRequest request) {
+            public void execute(String key, ActionMapping mapping) {
                 mapping.setName("myAction");
             }
         });

Modified: struts/struts2/branches/STRUTS_2_3_15_X/src/site/resources/archetype-catalog.xml
URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_3_15_X/src/site/resources/archetype-catalog.xml?rev=1532467&r1=1532466&r2=1532467&view=diff
==============================================================================
--- struts/struts2/branches/STRUTS_2_3_15_X/src/site/resources/archetype-catalog.xml (original)
+++ struts/struts2/branches/STRUTS_2_3_15_X/src/site/resources/archetype-catalog.xml Tue Oct 15 18:20:43 2013
@@ -7,42 +7,42 @@
         <archetype>
             <groupId>org.apache.struts</groupId>
             <artifactId>struts2-archetype-blank</artifactId>
-            <version>2.3.15.2</version>
+            <version>2.3.15.3</version>
             <repository>http://repo1.maven.org/maven2/</repository>
             <description>Struts 2 Archetypes - Blank</description>
         </archetype>
         <archetype>
             <groupId>org.apache.struts</groupId>
             <artifactId>struts2-archetype-convention</artifactId>
-            <version>2.3.15.2</version>
+            <version>2.3.15.3</version>
             <repository>http://repo1.maven.org/maven2/</repository>
             <description>Struts 2 Archetypes - Blank Convention</description>
         </archetype>
         <archetype>
             <groupId>org.apache.struts</groupId>
             <artifactId>struts2-archetype-dbportlet</artifactId>
-            <version>2.3.15.2</version>
+            <version>2.3.15.3</version>
             <repository>http://repo1.maven.org/maven2/</repository>
             <description>Struts 2 Archetypes - Database Portlet</description>
         </archetype>
         <archetype>
             <groupId>org.apache.struts</groupId>
             <artifactId>struts2-archetype-plugin</artifactId>
-            <version>2.3.15.2</version>
+            <version>2.3.15.3</version>
             <repository>http://repo1.maven.org/maven2/</repository>
             <description>Struts 2 Archetypes - Plugin</description>
         </archetype>
         <archetype>
             <groupId>org.apache.struts</groupId>
             <artifactId>struts2-archetype-portlet</artifactId>
-            <version>2.3.15.2</version>
+            <version>2.3.15.3</version>
             <repository>http://repo1.maven.org/maven2/</repository>
             <description>Struts 2 Archetypes - Portlet</description>
         </archetype>
         <archetype>
             <groupId>org.apache.struts</groupId>
             <artifactId>struts2-archetype-starter</artifactId>
-            <version>2.3.15.2</version>
+            <version>2.3.15.3</version>
             <repository>http://repo1.maven.org/maven2/</repository>
             <description>Struts 2 Archetypes - Starter</description>
         </archetype>