Author: lukaszlenart
Date: Thu May 23 10:31:44 2013
New Revision: 1485640
URL: http://svn.apache.org/r1485640
Log:
Merged from STRUTS_2_3_14_X
Disable eval expressions [from revision 1469249]
Modified:
struts/struts2/trunk/ (props changed)
struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java
struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/XWorkConstants.java
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java
Propchange: struts/struts2/trunk/
------------------------------------------------------------------------------
Merged /struts/struts2/branches/STRUTS_2_3_14_X:r1469249
Modified:
struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java?rev=1485640&r1=1485639&r2=1485640&view=diff
==============================================================================
---
struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java
(original)
+++
struts/struts2/trunk/core/src/main/java/org/apache/struts2/StrutsConstants.java
Thu May 23 10:31:44 2013
@@ -228,6 +228,9 @@ public final class StrutsConstants {
/** Enables caching of parsed OGNL expressions **/
public static final String STRUTS_ENABLE_OGNL_EXPRESSION_CACHE =
"struts.ognl.enableExpressionCache";
+ /** Enables evaluation of OGNL expressions **/
+ public static final String STRUTS_ENABLE_OGNL_EVAL_EXPRESSION =
"struts.ognl.enableOGNLEvalExpression";
+
/** The{@link org.apache.struts2.views.util.UrlHelper} implementation
class **/
public static final String STRUTS_URL_HELPER = "struts.view.urlHelper";
Modified:
struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java?rev=1485640&r1=1485639&r2=1485640&view=diff
==============================================================================
---
struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java
(original)
+++
struts/struts2/trunk/core/src/main/java/org/apache/struts2/config/BeanSelectionProvider.java
Thu May 23 10:31:44 2013
@@ -375,6 +375,7 @@ public class BeanSelectionProvider imple
// Convert Struts properties into XWork properties
convertIfExist(props, StrutsConstants.STRUTS_LOG_MISSING_PROPERTIES,
XWorkConstants.LOG_MISSING_PROPERTIES);
convertIfExist(props,
StrutsConstants.STRUTS_ENABLE_OGNL_EXPRESSION_CACHE,
XWorkConstants.ENABLE_OGNL_EXPRESSION_CACHE);
+ convertIfExist(props,
StrutsConstants.STRUTS_ENABLE_OGNL_EVAL_EXPRESSION,
XWorkConstants.ENABLE_OGNL_EVAL_EXPRESSION);
convertIfExist(props,
StrutsConstants.STRUTS_ALLOW_STATIC_METHOD_ACCESS,
XWorkConstants.ALLOW_STATIC_METHOD_ACCESS);
convertIfExist(props, StrutsConstants.STRUTS_CONFIGURATION_XML_RELOAD,
XWorkConstants.RELOAD_XML_CONFIGURATION);
Modified:
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/XWorkConstants.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/XWorkConstants.java?rev=1485640&r1=1485639&r2=1485640&view=diff
==============================================================================
---
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/XWorkConstants.java
(original)
+++
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/XWorkConstants.java
Thu May 23 10:31:44 2013
@@ -13,6 +13,7 @@ public final class XWorkConstants {
public static final String DEV_MODE = "devMode";
public static final String LOG_MISSING_PROPERTIES = "logMissingProperties";
public static final String ENABLE_OGNL_EXPRESSION_CACHE =
"enableOGNLExpressionCache";
+ public static final String ENABLE_OGNL_EVAL_EXPRESSION =
"enableOGNLEvalExpression";
public static final String RELOAD_XML_CONFIGURATION =
"reloadXmlConfiguration";
public static final String ALLOW_STATIC_METHOD_ACCESS =
"allowStaticMethodAccess";
public static final String XWORK_LOGGER_FACTORY = "xwork.loggerFactory";
Modified:
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java?rev=1485640&r1=1485639&r2=1485640&view=diff
==============================================================================
---
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java
(original)
+++
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/config/impl/DefaultConfiguration.java
Thu May 23 10:31:44 2013
@@ -319,6 +319,7 @@ public class DefaultConfiguration implem
builder.factory(OgnlUtil.class, Scope.SINGLETON);
builder.constant(XWorkConstants.DEV_MODE, "false");
builder.constant(XWorkConstants.LOG_MISSING_PROPERTIES, "false");
+ builder.constant(XWorkConstants.ENABLE_OGNL_EVAL_EXPRESSION, "false");
builder.constant(XWorkConstants.RELOAD_XML_CONFIGURATION, "false");
return builder.create(true);
}
Modified:
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java?rev=1485640&r1=1485639&r2=1485640&view=diff
==============================================================================
---
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java
(original)
+++
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java
Thu May 23 10:31:44 2013
@@ -151,6 +151,7 @@ public class XWorkConfigurationProvider
props.setProperty(XWorkConstants.DEV_MODE, Boolean.FALSE.toString());
props.setProperty(XWorkConstants.LOG_MISSING_PROPERTIES,
Boolean.FALSE.toString());
props.setProperty(XWorkConstants.ENABLE_OGNL_EXPRESSION_CACHE,
Boolean.TRUE.toString());
+ props.setProperty(XWorkConstants.ENABLE_OGNL_EVAL_EXPRESSION,
Boolean.FALSE.toString());
props.setProperty(XWorkConstants.RELOAD_XML_CONFIGURATION,
Boolean.FALSE.toString());
}
Modified:
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java?rev=1485640&r1=1485639&r2=1485640&view=diff
==============================================================================
---
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java
(original)
+++
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java
Thu May 23 10:31:44 2013
@@ -56,6 +56,7 @@ public class OgnlUtil {
private TypeConverter defaultConverter;
static boolean devMode = false;
static boolean enableExpressionCache = true;
+ private boolean enableEvalExpression;
@Inject
public void setXWorkConverter(XWorkConverter conv) {
@@ -67,11 +68,20 @@ public class OgnlUtil {
devMode = "true".equals(mode);
}
- @Inject("enableOGNLExpressionCache")
+ @Inject(XWorkConstants.ENABLE_OGNL_EXPRESSION_CACHE)
public static void setEnableExpressionCache(String cache) {
enableExpressionCache = "true".equals(cache);
}
+ @Inject(value = XWorkConstants.ENABLE_OGNL_EVAL_EXPRESSION, required =
false)
+ public void setEnableEvalExpression(String evalExpression) {
+ enableEvalExpression = "true".equals(evalExpression);
+ if(enableEvalExpression){
+ LOG.warn("Enabling OGNL expression evaluation may introduce
security risks " +
+ "(see
http://struts.apache.org/release/2.3.x/docs/s2-013.html for further details)");
+ }
+ }
+
/**
* Sets the object's properties using the default type converter,
defaulting to not throw
* exceptions for problems setting the properties.
@@ -217,7 +227,7 @@ public class OgnlUtil {
}
protected void setValue(String name, Map<String, Object> context, Object
root, Object value, boolean evalName) throws OgnlException {
- Object tree = compile(name);
+ Object tree = compile(name, context);
if (!evalName && isEvalExpression(tree, context)) {
throw new OgnlException("Eval expression cannot be used as
parameter name");
}
@@ -227,30 +237,46 @@ public class OgnlUtil {
private boolean isEvalExpression(Object tree, Map<String, Object> context)
throws OgnlException {
if (tree instanceof SimpleNode) {
SimpleNode node = (SimpleNode) tree;
- return node.isEvalChain((OgnlContext) context);
+ OgnlContext ognlContext = null;
+
+ if (context!=null && context instanceof OgnlContext) {
+ ognlContext = (OgnlContext) context;
+ }
+ return node.isEvalChain(ognlContext);
}
return false;
}
public Object getValue(String name, Map<String, Object> context, Object
root) throws OgnlException {
- return Ognl.getValue(compile(name), context, root);
+ return Ognl.getValue(compile(name, context), context, root);
}
public Object getValue(String name, Map<String, Object> context, Object
root, Class resultType) throws OgnlException {
- return Ognl.getValue(compile(name), context, root, resultType);
+ return Ognl.getValue(compile(name, context), context, root,
resultType);
}
public Object compile(String expression) throws OgnlException {
+ return compile(expression, null);
+ }
+
+ public Object compile(String expression, Map<String, Object> context)
throws OgnlException {
+ Object tree;
if (enableExpressionCache) {
- Object o = expressions.get(expression);
- if (o == null) {
- o = Ognl.parseExpression(expression);
- expressions.putIfAbsent(expression, o);
+ tree = expressions.get(expression);
+ if (tree == null) {
+ tree = Ognl.parseExpression(expression);
+ expressions.putIfAbsent(expression, tree);
}
- return o;
- } else
- return Ognl.parseExpression(expression);
+ } else {
+ tree = Ognl.parseExpression(expression);
+ }
+
+ if (!enableEvalExpression && isEvalExpression(tree, context)) {
+ throw new OgnlException("Eval expressions has been disabled");
+ }
+
+ return tree;
}
/**
@@ -312,7 +338,7 @@ public class OgnlUtil {
PropertyDescriptor toPd = toPdHash.get(fromPd.getName());
if ((toPd != null) && (toPd.getWriteMethod() != null)) {
try {
- Object expr = compile(fromPd.getName());
+ Object expr = compile(fromPd.getName(), context);
Object value = Ognl.getValue(expr, contextFrom,
from);
Ognl.setValue(expr, contextTo, to, value);
} catch (OgnlException e) {