Author: rgielen
Date: Mon May 27 14:11:10 2013
New Revision: 1486633

URL: http://svn.apache.org/r1486633
Log:
Merged from STRUTS_2_3_14_X
Disable eval expressions [from revision 1469249]
WW-4063
Improved security  by making static method attribute immutable [from revision 
1486054]
WW-4063
Skipping unneeded translation for included parameters [from revision 1486076]
WW-4063
Testcase modification after refactoring [from revision 1486164]
WW-4063
Testcases for double parameter evaluation problems [from revision 1486576]

Modified:
    struts/struts2/trunk/   (props changed)
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java
    
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java
    
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/DefaultUrlHelperTest.java
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java

Propchange: struts/struts2/trunk/
------------------------------------------------------------------------------
  Merged 
/struts/struts2/branches/STRUTS_2_3_14_X:r1486054,1486076,1486164,1486576

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java?rev=1486633&r1=1486632&r2=1486633&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/util/DefaultUrlHelper.java
 Mon May 27 14:11:10 2013
@@ -241,47 +241,45 @@ public class DefaultUrlHelper implements
 
     private String buildParameterSubstring(String name, String value) {
         StringBuilder builder = new StringBuilder();
-        builder.append(translateAndEncode(name));
+        builder.append(encode(name));
         builder.append('=');
-        builder.append(translateAndEncode(value));
+        builder.append(encode(value));
         return builder.toString();
     }
 
-    /**
-     * Translates any script expressions using {@link 
com.opensymphony.xwork2.util.TextParseUtil#translateVariables} and
-     * encodes the URL using {@link java.net.URLEncoder#encode} with the 
encoding specified in the configuration.
-     *
-     * @param input
-     * @return the translated and encoded string
-     */
-    public String translateAndEncode(String input) {
-        String translatedInput = translateVariable(input);
-        try {
-            return URLEncoder.encode(translatedInput, encoding);
-        } catch (UnsupportedEncodingException e) {
-            if (LOG.isWarnEnabled()) {
-                LOG.warn("Could not encode URL parameter '#0', returning value 
un-encoded", input);
-            }
-            return translatedInput;
-        }
-    }
-
-    public String translateAndDecode(String input) {
-        String translatedInput = translateVariable(input);
-        try {
-            return URLDecoder.decode(translatedInput, encoding);
-        } catch (UnsupportedEncodingException e) {
-            if (LOG.isWarnEnabled()) {
-                LOG.warn("Could not encode URL parameter '#0', returning value 
un-encoded", input);
-            }
-            return translatedInput;
-        }
-    }
-
-    private String translateVariable(String input) {
-        ValueStack valueStack = 
ServletActionContext.getContext().getValueStack();
-        return TextParseUtil.translateVariables(input, valueStack);
-    }
+       /**
+        * Encodes the URL using {@link java.net.URLEncoder#encode} with the 
encoding specified in the configuration.
+        *
+        * @param input the input to encode
+        * @return the encoded string
+        */
+       public String encode( String input ) {
+               try {
+                       return URLEncoder.encode(input, encoding);
+               } catch (UnsupportedEncodingException e) {
+                       if (LOG.isWarnEnabled()) {
+                               LOG.warn("Could not encode URL parameter '#0', 
returning value un-encoded", input);
+                       }
+                       return input;
+               }
+       }
+
+       /**
+        * Decodes the URL using {@link java.net.URLDecoder#decode(String, 
String)} with the encoding specified in the configuration.
+        *
+        * @param input the input to decode
+        * @return the encoded string
+        */
+       public String decode( String input ) {
+               try {
+                       return URLDecoder.decode(input, encoding);
+               } catch (UnsupportedEncodingException e) {
+                       if (LOG.isWarnEnabled()) {
+                               LOG.warn("Could not decode URL parameter '#0', 
returning value un-decoded", input);
+                       }
+                       return input;
+               }
+       }
 
     public Map<String, Object> parseQueryString(String queryString, boolean 
forceValueArray) {
         Map<String, Object> queryParams = new LinkedHashMap<String, Object>();
@@ -299,8 +297,8 @@ public class DefaultUrlHelper implements
                         paramValue = tmpParams[1];
                     }
                     if (paramName != null) {
-                        paramName = translateAndDecode(paramName);
-                        String translatedParamValue = 
translateAndDecode(paramValue);
+                        paramName = decode(paramName);
+                        String translatedParamValue = decode(paramValue);
 
                         if (queryParams.containsKey(paramName) || 
forceValueArray) {
                             // WW-1619 append new param value to existing 
value(s)

Modified: 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java?rev=1486633&r1=1486632&r2=1486633&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java
 (original)
+++ 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/URLTagTest.java
 Mon May 27 14:11:10 2013
@@ -21,16 +21,12 @@
 
 package org.apache.struts2.views.jsp;
 
-import java.io.File;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpSession;
-import javax.servlet.jsp.JspWriter;
-
+import com.mockobjects.dynamic.Mock;
+import com.opensymphony.xwork2.ActionContext;
+import com.opensymphony.xwork2.ActionProxy;
+import com.opensymphony.xwork2.DefaultActionInvocation;
+import com.opensymphony.xwork2.DefaultActionProxyFactory;
+import com.opensymphony.xwork2.inject.Container;
 import org.apache.struts2.ServletActionContext;
 import org.apache.struts2.components.URL;
 import org.apache.struts2.dispatcher.ApplicationMap;
@@ -40,15 +36,14 @@ import org.apache.struts2.dispatcher.Ses
 import org.apache.struts2.dispatcher.mapper.ActionMapping;
 import org.apache.struts2.dispatcher.mapper.DefaultActionMapper;
 
-import com.mockobjects.dynamic.Mock;
-import com.opensymphony.xwork2.ActionContext;
-import com.opensymphony.xwork2.ActionProxy;
-import com.opensymphony.xwork2.DefaultActionInvocation;
-import com.opensymphony.xwork2.DefaultActionProxy;
-import com.opensymphony.xwork2.DefaultActionProxyFactory;
-import com.opensymphony.xwork2.config.providers.XWorkConfigurationProvider;
-import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider;
-import com.opensymphony.xwork2.inject.Container;
+import javax.servlet.http.HttpSession;
+import javax.servlet.jsp.JspWriter;
+import java.io.File;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * Unit test for {@link URLTag}.
@@ -619,6 +614,69 @@ public class URLTagTest extends Abstract
         
     }
 
+       public void testEmbeddedParamTagExpressionGetsEvaluatedCorrectly() 
throws Exception {
+               request.setRequestURI("/public/about");
+               request.setQueryString("section=team&company=acme inc");
+
+               tag.setAction("team");
+               tag.setIncludeParams("all");
+
+               tag.doStartTag();
+
+               Foo foo = new Foo("test");
+               stack.push(foo);
+
+               // include nested param tag
+               ParamTag paramTag = new ParamTag();
+               paramTag.setPageContext(pageContext);
+               paramTag.setName("title");
+               paramTag.setValue("%{title}");
+               paramTag.doStartTag();
+               paramTag.doEndTag();
+
+               tag.doEndTag();
+
+               
assertEquals("/team.action?section=team&amp;company=acme+inc&amp;title=test", 
writer.toString());
+       }
+
+       public void testAccessToStackInternalsGetsHandledCorrectly() throws 
Exception {
+               Map<String, Object> params = new HashMap<String, Object>();
+               params.put("aaa", new String[] 
{"1${#session[\"foo\"]='true'}"});
+               params.put("aab", new String[] {"1${#session[\"bar\"]}"});
+               params.put("aac", new String[] 
{"1${#_memberAccess[\"allowStaticMethodAccess\"]='true'}"});
+               params.put("aad", new String[] 
{"1${#_memberAccess[\"allowStaticMethodAccess\"]}"});
+
+               request.setParameterMap(params);
+               request.setRequestURI("/public/about");
+               
request.setQueryString("aae${%23session[\"bar\"]}=1%24%7B%23session%5B%22bar%22%5D%7D");
+               session.put("bar", "rab");
+
+               tag.setAction("team");
+               tag.setIncludeParams("all");
+
+               tag.doStartTag();
+               tag.doEndTag();
+
+               Object allowMethodAccess = 
stack.findValue("\u0023_memberAccess['allowStaticMethodAccess']");
+               assertNotNull(allowMethodAccess);
+               assertEquals(Boolean.FALSE, allowMethodAccess);
+
+               assertNull(session.get("foo"));
+
+               assertEquals("/team.action?" +
+                                                        
"aab=1%24%7B%23session%5B%22bar%22%5D%7D" +
+                                                        "&amp;" +
+                                                        
"aac=1%24%7B%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3D%27true%27%7D"
 +
+                                                        "&amp;" +
+                                                        
"aaa=1%24%7B%23session%5B%22foo%22%5D%3D%27true%27%7D" +
+                                                        "&amp;" +
+                                                        
"aad=1%24%7B%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%7D" +
+                                                        "&amp;"+
+                                                    
"aae%24%7B%23session%5B%22bar%22%5D%7D=1%24%7B%23session%5B%22bar%22%5D%7D"
+                               , writer.toString()
+               );
+       }
+
     protected void setUp() throws Exception {
         super.setUp();
 
@@ -635,7 +693,14 @@ public class URLTagTest extends Abstract
     public static class Foo {
         private String title;
 
-        public void setTitle(String title) {
+               public Foo() {
+               }
+
+               public Foo( String title ) {
+                       this.title = title;
+               }
+
+               public void setTitle(String title) {
             this.title = title;
         }
 

Modified: 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/DefaultUrlHelperTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/DefaultUrlHelperTest.java?rev=1486633&r1=1486632&r2=1486633&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/DefaultUrlHelperTest.java
 (original)
+++ 
struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/util/DefaultUrlHelperTest.java
 Mon May 27 14:11:10 2013
@@ -378,17 +378,17 @@ public class DefaultUrlHelperTest extend
     }
 
 
-    public void testTranslateAndEncode() throws Exception {
+    public void testEncode() throws Exception {
         setProp(StrutsConstants.STRUTS_I18N_ENCODING, "UTF-8");
-        String result = urlHelper.translateAndEncode("\u65b0\u805e");
+        String result = urlHelper.encode("\u65b0\u805e");
         String expectedResult = "%E6%96%B0%E8%81%9E";
 
         assertEquals(result, expectedResult);
     }
 
-    public void testTranslateAndDecode() throws Exception {
+    public void testDecode() throws Exception {
         setProp(StrutsConstants.STRUTS_I18N_ENCODING, "UTF-8");
-        String result = urlHelper.translateAndDecode("%E6%96%B0%E8%81%9E");
+        String result = urlHelper.decode("%E6%96%B0%E8%81%9E");
         String expectedResult = "\u65b0\u805e";
 
         assertEquals(result, expectedResult);

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java?rev=1486633&r1=1486632&r2=1486633&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java
 Mon May 27 14:11:10 2013
@@ -32,7 +32,7 @@ import java.util.regex.Pattern;
  */
 public class SecurityMemberAccess extends DefaultMemberAccess {
 
-    private boolean allowStaticMethodAccess;
+    private final boolean allowStaticMethodAccess;
     Set<Pattern> excludeProperties = Collections.emptySet();
     Set<Pattern> acceptProperties = Collections.emptySet();
 
@@ -45,10 +45,6 @@ public class SecurityMemberAccess extend
         return allowStaticMethodAccess;
     }
 
-    public void setAllowStaticMethodAccess(boolean allowStaticMethodAccess) {
-        this.allowStaticMethodAccess = allowStaticMethodAccess;
-    }
-
     @Override
     public boolean isAccessible(Map context, Object target, Member member,
                                 String propertyName) {


Reply via email to