This is an automated email from the ASF dual-hosted git repository. yasserzamani pushed a commit to branch struts-2-5-x in repository https://gitbox.apache.org/repos/asf/struts.git
The following commit(s) were added to refs/heads/struts-2-5-x by this push: new db085db Updates and cleanup for some configuration-related items (2.5.x). (#291) db085db is described below commit db085dbeef3da43e7cfb427994ccebaf91becc16 Author: JCgH4164838Gh792C124B5 <43964333+jcgh4164838gh792c12...@users.noreply.github.com> AuthorDate: Thu Dec 20 06:55:34 2018 -0500 Updates and cleanup for some configuration-related items (2.5.x). (#291) * Updates and cleanup for some configuration-related items. - Made several attributes final. - Added limiter logic to the setting of certain configuration elements, and increased logging around them. - Updated unit tests impacted by the limiter logic, including minor typo fixes and locale consistency. - Minor cleanup while making the changes. * Update core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java Whitespace cleanup Co-Authored-By: JCgH4164838Gh792C124B5 <43964333+jcgh4164838gh792c12...@users.noreply.github.com> * Updates and cleanup for some configuration-related items (1st revision). - Reworked this PR, taking into account feedback and suggestions. - Removed the if LOG.isxxxEnabled level checks that were added. - Removed the limiter logic and instead reduced access level of most of the injectable methods to protected. - Updated the previous unit test changes following removal of limiter logic. * Minor correction to two debug log statements (as requested by reviewer). * Update debug messages for pattern checkers, as requested by reviewers. Avoids confusing users when replacing an empty exclusion set (which improves safety). Still provides a (slightly milder) message when replacing an empty accepted set (which can reduce safety). --- .../providers/XWorkConfigurationProvider.java | 1 + .../xwork2/ognl/ErrorMessageBuilder.java | 2 +- .../xwork2/ognl/OgnlNullHandlerWrapper.java | 2 +- .../xwork2/ognl/OgnlTypeConverterWrapper.java | 2 +- .../com/opensymphony/xwork2/ognl/OgnlUtil.java | 48 +++--- .../opensymphony/xwork2/ognl/OgnlValueStack.java | 14 +- .../xwork2/ognl/OgnlValueStackFactory.java | 18 ++- .../xwork2/ognl/XWorkTypeConverterWrapper.java | 2 +- .../xwork2/ognl/accessor/CompoundRootAccessor.java | 8 +- .../accessor/XWorkCollectionPropertyAccessor.java | 2 +- .../ognl/accessor/XWorkEnumerationAccessor.java | 2 +- .../accessor/XWorkIteratorPropertyAccessor.java | 2 +- .../security/DefaultAcceptedPatternsChecker.java | 15 +- .../security/DefaultExcludedPatternsChecker.java | 28 +++- core/src/main/resources/struts-default.xml | 1 + .../com/opensymphony/xwork2/ognl/OgnlUtilTest.java | 171 ++++++++++++++++++++- .../xwork2/ognl/OgnlValueStackTest.java | 41 ++++- .../xwork-test-allowstatic-devmode-false.xml | 88 +++++++++++ .../xwork-test-allowstatic-devmode-true.xml | 88 +++++++++++ .../providers/xwork-test-allowstatic-true.xml | 88 +++++++++++ .../config/providers/xwork-test-devmode-true.xml | 88 +++++++++++ 21 files changed, 657 insertions(+), 54 deletions(-) diff --git a/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java b/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java index 94c766c..cd27ed3 100644 --- a/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java +++ b/core/src/main/java/com/opensymphony/xwork2/config/providers/XWorkConfigurationProvider.java @@ -226,6 +226,7 @@ public class XWorkConfigurationProvider implements ConfigurationProvider { 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()); + props.setProperty(StrutsConstants.STRUTS_ALLOW_STATIC_METHOD_ACCESS, Boolean.FALSE.toString()); } } diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/ErrorMessageBuilder.java b/core/src/main/java/com/opensymphony/xwork2/ognl/ErrorMessageBuilder.java index 561f2bc..b904f4b 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ognl/ErrorMessageBuilder.java +++ b/core/src/main/java/com/opensymphony/xwork2/ognl/ErrorMessageBuilder.java @@ -23,7 +23,7 @@ package com.opensymphony.xwork2.ognl; */ public class ErrorMessageBuilder { - private StringBuilder message = new StringBuilder(); + private final StringBuilder message = new StringBuilder(); public static ErrorMessageBuilder create() { return new ErrorMessageBuilder(); diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlNullHandlerWrapper.java b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlNullHandlerWrapper.java index 2f0a31d..9b24261 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlNullHandlerWrapper.java +++ b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlNullHandlerWrapper.java @@ -24,7 +24,7 @@ import java.util.Map; public class OgnlNullHandlerWrapper implements ognl.NullHandler { - private NullHandler wrapped; + private final NullHandler wrapped; public OgnlNullHandlerWrapper(NullHandler target) { this.wrapped = target; diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlTypeConverterWrapper.java b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlTypeConverterWrapper.java index fc87e11..c2783b9 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlTypeConverterWrapper.java +++ b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlTypeConverterWrapper.java @@ -28,7 +28,7 @@ import java.util.Map; */ public class OgnlTypeConverterWrapper implements ognl.TypeConverter { - private TypeConverter typeConverter; + private final TypeConverter typeConverter; public OgnlTypeConverterWrapper(TypeConverter converter) { if (converter == null) { diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java index 13691d5..08b2d86 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java +++ b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java @@ -58,7 +58,7 @@ public class OgnlUtil { private final ConcurrentMap<Class, BeanInfo> beanInfoCache = new ConcurrentHashMap<>(); private TypeConverter defaultConverter; - private boolean devMode = false; + private boolean devMode; private boolean enableExpressionCache = true; private boolean enableEvalExpression; @@ -77,31 +77,35 @@ public class OgnlUtil { } @Inject - public void setXWorkConverter(XWorkConverter conv) { + protected void setXWorkConverter(XWorkConverter conv) { this.defaultConverter = new OgnlTypeConverterWrapper(conv); } @Inject(XWorkConstants.DEV_MODE) - public void setDevMode(String mode) { + protected void setDevMode(String mode) { this.devMode = BooleanUtils.toBoolean(mode); + if (this.devMode) { + LOG.warn("Setting development mode [{}] affects the safety of your application!", + this.devMode); + } } @Inject(XWorkConstants.ENABLE_OGNL_EXPRESSION_CACHE) - public void setEnableExpressionCache(String cache) { + protected void setEnableExpressionCache(String cache) { enableExpressionCache = BooleanUtils.toBoolean(cache); } @Inject(value = XWorkConstants.ENABLE_OGNL_EVAL_EXPRESSION, required = false) - public void setEnableEvalExpression(String evalExpression) { - enableEvalExpression = "true".equals(evalExpression); - if(enableEvalExpression){ + protected void setEnableEvalExpression(String evalExpression) { + this.enableEvalExpression = BooleanUtils.toBoolean(evalExpression); + if (this.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)"); } } @Inject(value = XWorkConstants.OGNL_EXCLUDED_CLASSES, required = false) - public void setExcludedClasses(String commaDelimitedClasses) { + protected void setExcludedClasses(String commaDelimitedClasses) { Set<Class<?>> excludedClasses = new HashSet<>(); excludedClasses.addAll(this.excludedClasses); excludedClasses.addAll(parseExcludedClasses(commaDelimitedClasses)); @@ -124,7 +128,7 @@ public class OgnlUtil { } @Inject(value = XWorkConstants.OGNL_EXCLUDED_PACKAGE_NAME_PATTERNS, required = false) - public void setExcludedPackageNamePatterns(String commaDelimitedPackagePatterns) { + protected void setExcludedPackageNamePatterns(String commaDelimitedPackagePatterns) { Set<Pattern> excludedPackageNamePatterns = new HashSet<>(); excludedPackageNamePatterns.addAll(this.excludedPackageNamePatterns); excludedPackageNamePatterns.addAll(parseExcludedPackageNamePatterns(commaDelimitedPackagePatterns)); @@ -143,7 +147,7 @@ public class OgnlUtil { } @Inject(value = XWorkConstants.OGNL_EXCLUDED_PACKAGE_NAMES, required = false) - public void setExcludedPackageNames(String commaDelimitedPackageNames) { + protected void setExcludedPackageNames(String commaDelimitedPackageNames) { Set<String> excludedPackageNames = new HashSet<>(); excludedPackageNames.addAll(this.excludedPackageNames); excludedPackageNames.addAll(parseExcludedPackageNames(commaDelimitedPackageNames)); @@ -167,18 +171,27 @@ public class OgnlUtil { } @Inject - public void setContainer(Container container) { + protected void setContainer(Container container) { this.container = container; } @Inject(value = XWorkConstants.ALLOW_STATIC_METHOD_ACCESS, required = false) - public void setAllowStaticMethodAccess(String allowStaticMethodAccess) { - this.allowStaticMethodAccess = Boolean.parseBoolean(allowStaticMethodAccess); + protected void setAllowStaticMethodAccess(String allowStaticMethodAccess) { + this.allowStaticMethodAccess = BooleanUtils.toBoolean(allowStaticMethodAccess); + if (this.allowStaticMethodAccess) { + LOG.warn("Setting allow static method access [{}] affects the safety of your application!", + this.allowStaticMethodAccess); + } } @Inject(value = StrutsConstants.STRUTS_DISALLOW_PROXY_MEMBER_ACCESS, required = false) - public void setDisallowProxyMemberAccess(String disallowProxyMemberAccess) { + protected void setDisallowProxyMemberAccess(String disallowProxyMemberAccess) { + this.disallowProxyMemberAccess = Boolean.parseBoolean(disallowProxyMemberAccess); + if (this.disallowProxyMemberAccess == false) { + LOG.warn("Setting disallow proxy member access [{}] should only be done intentionally!", + this.disallowProxyMemberAccess); + } } public boolean isDisallowProxyMemberAccess() { @@ -431,7 +444,7 @@ public class OgnlUtil { final T exec = task.execute(tree); // if cache is enabled and it's a valid expression, puts it in - if(enableExpressionCache) { + if (enableExpressionCache) { expressions.putIfAbsent(expression, tree); } return exec; @@ -452,7 +465,7 @@ public class OgnlUtil { final T exec = task.execute(tree); // if cache is enabled and it's a valid expression, puts it in - if(enableExpressionCache) { + if (enableExpressionCache) { expressions.putIfAbsent(expression, tree); } return exec; @@ -668,8 +681,7 @@ public class OgnlUtil { */ public BeanInfo getBeanInfo(Class clazz) throws IntrospectionException { synchronized (beanInfoCache) { - BeanInfo beanInfo; - beanInfo = beanInfoCache.get(clazz); + BeanInfo beanInfo = beanInfoCache.get(clazz); if (beanInfo == null) { beanInfo = Introspector.getBeanInfo(clazz, Object.class); beanInfoCache.putIfAbsent(clazz, beanInfo); diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java index ab58069..01a98ba 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java +++ b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java @@ -82,7 +82,7 @@ public class OgnlValueStack implements Serializable, ValueStack, ClearableValueS } @Inject - public void setOgnlUtil(OgnlUtil ognlUtil) { + protected void setOgnlUtil(OgnlUtil ognlUtil) { this.ognlUtil = ognlUtil; securityMemberAccess.setExcludedClasses(ognlUtil.getExcludedClasses()); securityMemberAccess.setExcludedPackageNamePatterns(ognlUtil.getExcludedPackageNamePatterns()); @@ -102,12 +102,16 @@ public class OgnlValueStack implements Serializable, ValueStack, ClearableValueS } @Inject(XWorkConstants.DEV_MODE) - public void setDevMode(String mode) { + protected void setDevMode(String mode) { this.devMode = BooleanUtils.toBoolean(mode); + if (this.devMode) { + LOG.warn("Setting development mode [{}] affects the safety of your application!", + this.devMode); + } } @Inject(value = "logMissingProperties", required = false) - public void setLogMissingProperties(String logMissingProperties) { + protected void setLogMissingProperties(String logMissingProperties) { this.logMissingProperties = BooleanUtils.toBoolean(logMissingProperties); } @@ -379,7 +383,7 @@ public class OgnlValueStack implements Serializable, ValueStack, ClearableValueS * @param e The thrown exception. */ private void logLookupFailure(String expr, Exception e) { - if (devMode && LOG.isWarnEnabled()) { + if (devMode) { LOG.warn("Caught an exception while evaluating expression '{}' against value stack", expr, e); LOG.warn("NOTE: Previous warning message was issued due to devMode set to true."); } else { @@ -475,7 +479,7 @@ public class OgnlValueStack implements Serializable, ValueStack, ClearableValueS } @Inject - public void setXWorkConverter(final XWorkConverter converter) { + protected void setXWorkConverter(final XWorkConverter converter) { this.converter = converter; } } diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java index 6b46635..36ca51d 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java +++ b/core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStackFactory.java @@ -32,6 +32,8 @@ import ognl.MethodAccessor; import ognl.OgnlRuntime; import ognl.PropertyAccessor; import org.apache.commons.lang3.BooleanUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.util.Map; import java.util.Set; @@ -41,25 +43,31 @@ import java.util.Set; */ public class OgnlValueStackFactory implements ValueStackFactory { + private static final Logger LOG = LogManager.getLogger(OgnlValueStackFactory.class); + protected XWorkConverter xworkConverter; protected CompoundRootAccessor compoundRootAccessor; protected TextProvider textProvider; protected Container container; - protected boolean allowStaticMethodAccess; + private boolean allowStaticMethodAccess; @Inject - public void setXWorkConverter(XWorkConverter converter) { + protected void setXWorkConverter(XWorkConverter converter) { this.xworkConverter = converter; } @Inject("system") - public void setTextProvider(TextProvider textProvider) { + protected void setTextProvider(TextProvider textProvider) { this.textProvider = textProvider; } @Inject(value="allowStaticMethodAccess", required=false) - public void setAllowStaticMethodAccess(String allowStaticMethodAccess) { + protected void setAllowStaticMethodAccess(String allowStaticMethodAccess) { this.allowStaticMethodAccess = BooleanUtils.toBoolean(allowStaticMethodAccess); + if (this.allowStaticMethodAccess) { + LOG.warn("Setting allow static method access [{}] affects the safety of your application!", + this.allowStaticMethodAccess); + } } public ValueStack createValueStack() { @@ -77,7 +85,7 @@ public class OgnlValueStackFactory implements ValueStackFactory { } @Inject - public void setContainer(Container container) throws ClassNotFoundException { + protected void setContainer(Container container) throws ClassNotFoundException { Set<String> names = container.getInstanceNames(PropertyAccessor.class); for (String name : names) { Class cls = Class.forName(name); diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/XWorkTypeConverterWrapper.java b/core/src/main/java/com/opensymphony/xwork2/ognl/XWorkTypeConverterWrapper.java index 0ea356a..18a2c8e 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ognl/XWorkTypeConverterWrapper.java +++ b/core/src/main/java/com/opensymphony/xwork2/ognl/XWorkTypeConverterWrapper.java @@ -28,7 +28,7 @@ import java.util.Map; */ public class XWorkTypeConverterWrapper implements TypeConverter { - private ognl.TypeConverter typeConverter; + private final ognl.TypeConverter typeConverter; public XWorkTypeConverterWrapper(ognl.TypeConverter conv) { this.typeConverter = conv; diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java index 0bccc60..be0ea8d 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java +++ b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/CompoundRootAccessor.java @@ -63,11 +63,15 @@ public class CompoundRootAccessor implements PropertyAccessor, MethodAccessor, C private final static Logger LOG = LogManager.getLogger(CompoundRootAccessor.class); private final static Class[] EMPTY_CLASS_ARRAY = new Class[0]; private static Map<MethodCall, Boolean> invalidMethods = new ConcurrentHashMap<>(); - private boolean devMode = false; + private boolean devMode; @Inject(XWorkConstants.DEV_MODE) - public void setDevMode(String mode) { + protected void setDevMode(String mode) { this.devMode = BooleanUtils.toBoolean(mode); + if (this.devMode) { + LOG.warn("Setting development mode [{}] affects the safety of your application!", + this.devMode); + } } public void setProperty(Map context, Object target, Object name, Object value) throws OgnlException { diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkCollectionPropertyAccessor.java b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkCollectionPropertyAccessor.java index be2d136..837558f 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkCollectionPropertyAccessor.java +++ b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkCollectionPropertyAccessor.java @@ -48,7 +48,7 @@ public class XWorkCollectionPropertyAccessor extends SetPropertyAccessor { //use a basic object Ognl property accessor here //to access properties of the objects in the Set //so that nothing is put in the context to screw things up - private ObjectPropertyAccessor _accessor = new ObjectPropertyAccessor(); + private final ObjectPropertyAccessor _accessor = new ObjectPropertyAccessor(); private XWorkConverter xworkConverter; private ObjectFactory objectFactory; diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkEnumerationAccessor.java b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkEnumerationAccessor.java index 3e6f576..d0d713a 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkEnumerationAccessor.java +++ b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkEnumerationAccessor.java @@ -30,7 +30,7 @@ import java.util.Map; */ public class XWorkEnumerationAccessor extends EnumerationPropertyAccessor { - ObjectPropertyAccessor opa = new ObjectPropertyAccessor(); + private final ObjectPropertyAccessor opa = new ObjectPropertyAccessor(); @Override public void setProperty(Map context, Object target, Object name, Object value) throws OgnlException { diff --git a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkIteratorPropertyAccessor.java b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkIteratorPropertyAccessor.java index 73ad710..8979608 100644 --- a/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkIteratorPropertyAccessor.java +++ b/core/src/main/java/com/opensymphony/xwork2/ognl/accessor/XWorkIteratorPropertyAccessor.java @@ -30,7 +30,7 @@ import java.util.Map; */ public class XWorkIteratorPropertyAccessor extends IteratorPropertyAccessor { - ObjectPropertyAccessor opa = new ObjectPropertyAccessor(); + private final ObjectPropertyAccessor opa = new ObjectPropertyAccessor(); @Override public void setProperty(Map context, Object target, Object name, Object value) throws OgnlException { diff --git a/core/src/main/java/com/opensymphony/xwork2/security/DefaultAcceptedPatternsChecker.java b/core/src/main/java/com/opensymphony/xwork2/security/DefaultAcceptedPatternsChecker.java index 8dfd6ef..ce7ba34 100644 --- a/core/src/main/java/com/opensymphony/xwork2/security/DefaultAcceptedPatternsChecker.java +++ b/core/src/main/java/com/opensymphony/xwork2/security/DefaultAcceptedPatternsChecker.java @@ -44,9 +44,9 @@ public class DefaultAcceptedPatternsChecker implements AcceptedPatternsChecker { } @Inject(value = XWorkConstants.OVERRIDE_ACCEPTED_PATTERNS, required = false) - public void setOverrideAcceptedPatterns(String acceptablePatterns) { + protected void setOverrideAcceptedPatterns(String acceptablePatterns) { LOG.warn("Overriding accepted patterns [{}] with [{}], be aware that this affects all instances and safety of your application!", - XWorkConstants.OVERRIDE_ACCEPTED_PATTERNS, acceptablePatterns); + acceptedPatterns, acceptablePatterns); acceptedPatterns = new HashSet<>(); for (String pattern : TextParseUtil.commaDelimitedStringToSet(acceptablePatterns)) { acceptedPatterns.add(Pattern.compile(pattern, Pattern.CASE_INSENSITIVE)); @@ -54,7 +54,7 @@ public class DefaultAcceptedPatternsChecker implements AcceptedPatternsChecker { } @Inject(value = XWorkConstants.ADDITIONAL_ACCEPTED_PATTERNS, required = false) - public void setAdditionalAcceptedPatterns(String acceptablePatterns) { + protected void setAdditionalAcceptedPatterns(String acceptablePatterns) { LOG.warn("Adding additional global patterns [{}] to accepted patterns!", acceptablePatterns); for (String pattern : TextParseUtil.commaDelimitedStringToSet(acceptablePatterns)) { acceptedPatterns.add(Pattern.compile(pattern, Pattern.CASE_INSENSITIVE)); @@ -70,7 +70,14 @@ public class DefaultAcceptedPatternsChecker implements AcceptedPatternsChecker { } public void setAcceptedPatterns(Set<String> patterns) { - LOG.trace("Sets accepted patterns [{}]", patterns); + if (acceptedPatterns == null) { + // Limit unwanted log entries (for 1st call, acceptedPatterns null) + LOG.debug("Sets accepted patterns to [{}], note this impacts the safety of your application!", patterns); + } + else { + LOG.warn("Replacing accepted patterns [{}] with [{}], be aware that this affects all instances and safety of your application!", + acceptedPatterns, patterns); + } acceptedPatterns = new HashSet<>(patterns.size()); for (String pattern : patterns) { acceptedPatterns.add(Pattern.compile(pattern, Pattern.CASE_INSENSITIVE)); diff --git a/core/src/main/java/com/opensymphony/xwork2/security/DefaultExcludedPatternsChecker.java b/core/src/main/java/com/opensymphony/xwork2/security/DefaultExcludedPatternsChecker.java index 0148a35..e93683a 100644 --- a/core/src/main/java/com/opensymphony/xwork2/security/DefaultExcludedPatternsChecker.java +++ b/core/src/main/java/com/opensymphony/xwork2/security/DefaultExcludedPatternsChecker.java @@ -47,9 +47,15 @@ public class DefaultExcludedPatternsChecker implements ExcludedPatternsChecker { } @Inject(value = XWorkConstants.OVERRIDE_EXCLUDED_PATTERNS, required = false) - public void setOverrideExcludePatterns(String excludePatterns) { - LOG.warn("Overriding excluded patterns [{}] with [{}], be aware that this affects all instances and safety of your application!", - XWorkConstants.OVERRIDE_EXCLUDED_PATTERNS, excludePatterns); + protected void setOverrideExcludePatterns(String excludePatterns) { + if (excludedPatterns != null && excludedPatterns.size() > 0) { + LOG.warn("Overriding excluded patterns [{}] with [{}], be aware that this affects all instances and safety of your application!", + excludedPatterns, excludePatterns); + } + else { + // Limit unwanted log entries (when excludedPatterns null/empty - usually 1st call) + LOG.debug("Overriding excluded patterns with [{}]", excludePatterns); + } excludedPatterns = new HashSet<Pattern>(); for (String pattern : TextParseUtil.commaDelimitedStringToSet(excludePatterns)) { excludedPatterns.add(Pattern.compile(pattern, Pattern.CASE_INSENSITIVE)); @@ -65,11 +71,14 @@ public class DefaultExcludedPatternsChecker implements ExcludedPatternsChecker { } @Inject(StrutsConstants.STRUTS_ENABLE_DYNAMIC_METHOD_INVOCATION) - public void setDynamicMethodInvocation(String dmiValue) { - if (!BooleanUtils.toBoolean(dmiValue)) { + protected void setDynamicMethodInvocation(String dmiValue) { + if (BooleanUtils.toBoolean(dmiValue) == false) { LOG.debug("DMI is disabled, adding DMI related excluded patterns"); setAdditionalExcludePatterns("^(action|method):.*"); } + else { + LOG.warn("DMI is enabled, *NOT* adding DMI related excluded patterns"); + } } public void setExcludedPatterns(String commaDelimitedPatterns) { @@ -81,7 +90,14 @@ public class DefaultExcludedPatternsChecker implements ExcludedPatternsChecker { } public void setExcludedPatterns(Set<String> patterns) { - LOG.trace("Sets excluded patterns [{}]", patterns); + if (excludedPatterns != null && excludedPatterns.size() > 0) { + LOG.warn("Replacing excluded patterns [{}] with [{}], be aware that this affects all instances and safety of your application!", + excludedPatterns, patterns); + } + else { + // Limit unwanted log entries (when excludedPatterns null/empty - usually 1st call) + LOG.debug("Sets excluded patterns to [{}]", patterns); + } excludedPatterns = new HashSet<>(patterns.size()); for (String pattern : patterns) { excludedPatterns.add(Pattern.compile(pattern, Pattern.CASE_INSENSITIVE)); diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml index fda6cfb..e85bc6a 100644 --- a/core/src/main/resources/struts-default.xml +++ b/core/src/main/resources/struts-default.xml @@ -61,6 +61,7 @@ freemarker.ext.rhino., sun.reflect., javassist., + org.objectweb.asm., com.opensymphony.xwork2.ognl., com.opensymphony.xwork2.security., com.opensymphony.xwork2.util." /> diff --git a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java index 28d0d59..225ca2f 100644 --- a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java @@ -19,9 +19,14 @@ package com.opensymphony.xwork2.ognl; import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.ActionProxyFactory; import com.opensymphony.xwork2.XWorkException; import com.opensymphony.xwork2.XWorkTestCase; +import com.opensymphony.xwork2.config.ConfigurationManager; +import com.opensymphony.xwork2.config.ConfigurationProvider; +import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider; import com.opensymphony.xwork2.conversion.impl.XWorkConverter; +import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.interceptor.ChainingInterceptor; import com.opensymphony.xwork2.test.User; import com.opensymphony.xwork2.util.*; @@ -364,9 +369,10 @@ public class OgnlUtilTest extends XWorkTestCase { Map props = new HashMap(); props.put("birthday", "02/12/1982"); // US style test + context.put(ActionContext.LOCALE, Locale.US); ognlUtil.setProperties(props, foo, context); - Calendar cal = Calendar.getInstance(); + Calendar cal = Calendar.getInstance(Locale.US); cal.clear(); cal.set(Calendar.MONTH, Calendar.FEBRUARY); cal.set(Calendar.DAY_OF_MONTH, 12); @@ -375,7 +381,7 @@ public class OgnlUtilTest extends XWorkTestCase { assertEquals(cal.getTime(), foo.getBirthday()); //UK style test - cal = Calendar.getInstance(); + cal = Calendar.getInstance(Locale.UK); cal.clear(); cal.set(Calendar.MONTH, Calendar.OCTOBER); cal.set(Calendar.DAY_OF_MONTH, 18); @@ -389,7 +395,7 @@ public class OgnlUtilTest extends XWorkTestCase { .format(eventTime); props.put("event", formatted); - cal = Calendar.getInstance(); + cal = Calendar.getInstance(Locale.UK); cal.clear(); cal.set(Calendar.MONTH, Calendar.SEPTEMBER); cal.set(Calendar.DAY_OF_MONTH, 9); @@ -412,9 +418,10 @@ public class OgnlUtilTest extends XWorkTestCase { //test RFC 3339 date format for JSON props.put("event", "1996-12-19T16:39:57Z"); + context.put(ActionContext.LOCALE, Locale.US); ognlUtil.setProperties(props, foo, context); - cal = Calendar.getInstance(); + cal = Calendar.getInstance(Locale.US); cal.clear(); cal.set(Calendar.MONTH, Calendar.DECEMBER); cal.set(Calendar.DAY_OF_MONTH, 19); @@ -427,6 +434,7 @@ public class OgnlUtilTest extends XWorkTestCase { //test setting a calendar property props.put("calendar", "1996-12-19T16:39:57Z"); + context.put(ActionContext.LOCALE, Locale.US); ognlUtil.setProperties(props, foo, context); assertEquals(cal, foo.getCalendar()); } @@ -645,7 +653,7 @@ public class OgnlUtilTest extends XWorkTestCase { try { stack.setValue("1234", foo); - fail("non-valid expression: 1114778947765"); + fail("non-valid expression: 1234"); } catch(RuntimeException ex) { ; @@ -657,6 +665,126 @@ public class OgnlUtilTest extends XWorkTestCase { stack.setValue("1234", foo); } + public void testStackValueDevModeChange() throws Exception { + + try { + reloadTestContainerConfiguration(false, false); // Set dev mode false + } + catch (Exception ex) { + fail("Unable to reload container configuration - exception: " + ex); + } + + ValueStack stack = ActionContext.getContext().getValueStack(); + Map stackContext = stack.getContext(); + stackContext.put(ReflectionContextState.CREATE_NULL_OBJECTS, Boolean.FALSE); + stackContext.put(ReflectionContextState.DENY_METHOD_EXECUTION, Boolean.TRUE); + stackContext.put(XWorkConverter.REPORT_CONVERSION_ERRORS, Boolean.TRUE); + + String[] foo = new String[]{"asdf"}; + + // With dev mode false, the following set values should not cause failures + stack.setValue("list.1114778947765", foo); + stack.setValue("1114778947765", foo); + stack.setValue("1234", foo); + + try { + reloadTestContainerConfiguration(true, false); // Set dev mode true + } + catch (Exception ex) { + fail("Unable to reload container configuration - exception: " + ex); + } + + // Repeat stack/context set after retrieving updated stack + stack = ActionContext.getContext().getValueStack(); + stackContext = stack.getContext(); + stackContext.put(ReflectionContextState.CREATE_NULL_OBJECTS, Boolean.FALSE); + stackContext.put(ReflectionContextState.DENY_METHOD_EXECUTION, Boolean.TRUE); + stackContext.put(XWorkConverter.REPORT_CONVERSION_ERRORS, Boolean.TRUE); + + try { + stack.setValue("list.1114778947765", foo); + fail("non-valid expression: list.1114778947765"); + } + catch(RuntimeException ex) { + // Expected with dev mode true + } + try { + stack.setValue("1114778947765", foo); + fail("non-valid expression: 1114778947765"); + } + catch(RuntimeException ex) { + // Expected with dev mode true + } + try { + stack.setValue("1234", foo); + fail("non-valid expression: 1234"); + } + catch(RuntimeException ex) { + // Expected with dev mode true + } + + } + + public void testDevModeChange() throws Exception { + + try { + reloadTestContainerConfiguration(false, false); // Set dev mode false + } + catch (Exception ex) { + fail("Unable to reload container configuration - exception: " + ex); + } + + ValueStack stack = ActionContext.getContext().getValueStack(); + Map stackContext = stack.getContext(); + stackContext.put(ReflectionContextState.CREATE_NULL_OBJECTS, Boolean.FALSE); + stackContext.put(ReflectionContextState.DENY_METHOD_EXECUTION, Boolean.TRUE); + stackContext.put(XWorkConverter.REPORT_CONVERSION_ERRORS, Boolean.TRUE); + + String[] foo = new String[]{"asdf"}; + + // With dev mode false, the following set values should not cause failures + stack.setValue("list.1114778947765", foo); + stack.setValue("1114778947765", foo); + stack.setValue("1234", foo); + + try { + reloadTestContainerConfiguration(true, false); // Set dev mode true + } + catch (Exception ex) { + fail("Unable to reload container configuration - exception: " + ex); + } + + // Repeat stack/context set after retrieving updated stack + stack = ActionContext.getContext().getValueStack(); + stackContext = stack.getContext(); + stackContext.put(ReflectionContextState.CREATE_NULL_OBJECTS, Boolean.FALSE); + stackContext.put(ReflectionContextState.DENY_METHOD_EXECUTION, Boolean.TRUE); + stackContext.put(XWorkConverter.REPORT_CONVERSION_ERRORS, Boolean.TRUE); + + try { + stack.setValue("list.1114778947765", foo); + fail("non-valid expression: list.1114778947765"); + } + catch(RuntimeException ex) { + // Expected with dev mode true + } + try { + stack.setValue("1114778947765", foo); + fail("non-valid expression: 1114778947765"); + } + catch(RuntimeException ex) { + // Expected with dev mode true + } + try { + stack.setValue("1234", foo); + fail("non-valid expression: 1234"); + } + catch(RuntimeException ex) { + // Expected with dev mode true + } + + } + public void testAvoidCallingMethodsOnObjectClass() throws Exception { Foo foo = new Foo(); @@ -812,6 +940,39 @@ public class OgnlUtilTest extends XWorkTestCase { assertEquals(expected.getMessage(), "It isn't a simple method which can be called!"); } + private void reloadTestContainerConfiguration(boolean devMode, boolean allowStatic) throws Exception { + super.tearDown(); + + ConfigurationProvider configurationProvider; + if (devMode == true && allowStatic == true) { + configurationProvider = new XmlConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-true.xml", true); + } + else if (devMode == true && allowStatic == false) { + configurationProvider = new XmlConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-devmode-true.xml", true); + } + else if (devMode == false && allowStatic == true) { + configurationProvider = new XmlConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-true.xml", true); + } + else { // devMode, allowStatic both false + configurationProvider = new XmlConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-false.xml", true); + } + + configurationManager = new ConfigurationManager(Container.DEFAULT_NAME); + configurationManager.addContainerProvider(configurationProvider); + configuration = configurationManager.getConfiguration(); + container = configuration.getContainer(); + container.inject(configurationProvider); + configurationProvider.init(configuration); + actionProxyFactory = container.getInstance(ActionProxyFactory.class); + + // Reset the value stack + ValueStack stack = container.getInstance(ValueStackFactory.class).createValueStack(); + stack.getContext().put(ActionContext.CONTAINER, container); + ActionContext.setContext(new ActionContext(stack.getContext())); + + ognlUtil = container.getInstance(OgnlUtil.class); + } + public static class Email { String address; diff --git a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlValueStackTest.java b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlValueStackTest.java index 0121220..e66fc24 100644 --- a/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlValueStackTest.java +++ b/core/src/test/java/com/opensymphony/xwork2/ognl/OgnlValueStackTest.java @@ -19,7 +19,11 @@ package com.opensymphony.xwork2.ognl; import com.opensymphony.xwork2.*; +import com.opensymphony.xwork2.config.ConfigurationManager; +import com.opensymphony.xwork2.config.ConfigurationProvider; +import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider; import com.opensymphony.xwork2.conversion.impl.XWorkConverter; +import com.opensymphony.xwork2.inject.Container; import com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor; import com.opensymphony.xwork2.test.TestBean2; import com.opensymphony.xwork2.util.*; @@ -594,7 +598,7 @@ public class OgnlValueStackTest extends XWorkTestCase { assertEquals("bar:123", vs.findValue("foo.bar", String.class)); } - public void testPrimitiveSettingWithInvalidValueAddsFieldErrorInDevMode() { + public void testPrimitiveSettingWithInvalidValueAddsFieldErrorInDevMode() throws Exception { SimpleAction action = new SimpleAction(); OgnlValueStack stack = createValueStack(); stack.getContext().put(XWorkConverter.REPORT_CONVERSION_ERRORS, Boolean.TRUE); @@ -613,7 +617,7 @@ public class OgnlValueStackTest extends XWorkTestCase { assertTrue(conversionErrors.containsKey("bar")); } - public void testPrimitiveSettingWithInvalidValueAddsFieldErrorInNonDevMode() { + public void testPrimitiveSettingWithInvalidValueAddsFieldErrorInNonDevMode() throws Exception { SimpleAction action = new SimpleAction(); OgnlValueStack stack = createValueStack(); stack.getContext().put(XWorkConverter.REPORT_CONVERSION_ERRORS, Boolean.TRUE); @@ -968,6 +972,39 @@ public class OgnlValueStackTest extends XWorkTestCase { assertEquals(null, stack.findValue("address.country.name", String.class)); } + private void reloadTestContainerConfiguration(boolean devMode, boolean allowStatic) throws Exception { + super.tearDown(); + + ConfigurationProvider configurationProvider; + if (devMode == true && allowStatic == true) { + configurationProvider = new XmlConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-true.xml", true); + } + else if (devMode == true && allowStatic == false) { + configurationProvider = new XmlConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-devmode-true.xml", true); + } + else if (devMode == false && allowStatic == true) { + configurationProvider = new XmlConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-true.xml", true); + } + else { // devMode, allowStatic both false + configurationProvider = new XmlConfigurationProvider("com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-false.xml", true); + } + + configurationManager = new ConfigurationManager(Container.DEFAULT_NAME); + configurationManager.addContainerProvider(configurationProvider); + configuration = configurationManager.getConfiguration(); + container = configuration.getContainer(); + container.inject(configurationProvider); + configurationProvider.init(configuration); + actionProxyFactory = container.getInstance(ActionProxyFactory.class); + + // Reset the value stack + ValueStack stack = container.getInstance(ValueStackFactory.class).createValueStack(); + stack.getContext().put(ActionContext.CONTAINER, container); + ActionContext.setContext(new ActionContext(stack.getContext())); + + ognlUtil = container.getInstance(OgnlUtil.class); + } + class BadJavaBean { private int count; private int count2; diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-false.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-false.xml new file mode 100644 index 0000000..132870d --- /dev/null +++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-false.xml @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +--> +<!DOCTYPE xwork PUBLIC + "-//Apache Struts//XWork 2.5//EN" + "http://struts.apache.org/dtds/xwork-2.5.dtd" + > + +<xwork> + + <constant name="struts.devMode" value="false" /> + <constant name="devMode" value="false" /> + <constant name="struts.i18n.reload" value="false" /> + <constant name="logMissingProperties" value="false" /> + <constant name="enableOGNLExpressionCache" value="true" /> + <constant name="enableOGNLEvalExpression" value="false" /> + <constant name="reloadXmlConfiguration" value="false" /> + <constant name="struts.ognl.allowStaticMethodAccess" value="false" /> + <constant name="struts.enable.DynamicMethodInvocation" value="false" /> + <constant name="struts.dispatcher.errorHandler" value="struts" /> + + <bean class="com.opensymphony.xwork2.ObjectFactory" name="default" /> + <bean class="org.apache.struts2.views.freemarker.FreemarkerThemeTemplateLoader" /> + <bean class="org.apache.struts2.views.freemarker.FreemarkerManager" name="default" /> + <bean class="org.apache.struts2.views.velocity.VelocityManager" name="default" optional="true" /> + <bean class="org.apache.struts2.components.template.TemplateEngineManager" /> + <bean class="com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter" /> + <bean class="com.opensymphony.xwork2.ognl.OgnlUtil" /> + <bean class="org.apache.struts2.views.jsp.ui.OgnlTool" /> + + <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="default" class="org.apache.struts2.factory.StrutsActionProxyFactory"/> + <bean type="com.opensymphony.xwork2.FileManager" name="system" class="com.opensymphony.xwork2.util.fs.DefaultFileManager" scope="singleton"/> + <bean type="com.opensymphony.xwork2.FileManagerFactory" name="default" class="com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory" scope="singleton"/> + <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="global-only" class="com.opensymphony.xwork2.util.GlobalLocalizedTextProvider" scope="singleton" /> + <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="default" class="com.opensymphony.xwork2.util.StrutsLocalizedTextProvider" scope="singleton" /> + <bean type="com.opensymphony.xwork2.TextProvider" name="system" class="com.opensymphony.xwork2.DefaultTextProvider" scope="singleton" /> + <bean type="com.opensymphony.xwork2.conversion.ConversionAnnotationProcessor" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultConversionAnnotationProcessor" /> + <bean type="com.opensymphony.xwork2.conversion.ConversionFileProcessor" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultConversionFileProcessor" /> + <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/> + <bean type="com.opensymphony.xwork2.conversion.TypeConverterCreator" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterCreator" /> + <bean type="com.opensymphony.xwork2.conversion.TypeConverterHolder" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterHolder" /> + <bean type="com.opensymphony.xwork2.conversion.impl.XWorkConverter" name="default" class="com.opensymphony.xwork2.conversion.impl.XWorkConverter" /> + + <bean type="com.opensymphony.xwork2.factory.ActionFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultActionFactory" /> + <bean type="com.opensymphony.xwork2.factory.ConverterFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultConverterFactory" /> + <bean type="com.opensymphony.xwork2.factory.ResultFactory" name="default" class="org.apache.struts2.factory.StrutsResultFactory" /> + <bean type="com.opensymphony.xwork2.factory.UnknownHandlerFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory" /> + <bean type="com.opensymphony.xwork2.factory.ValidatorFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultValidatorFactory" /> + <bean type="com.opensymphony.xwork2.factory.InterceptorFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultInterceptorFactory" /> + <bean type="com.opensymphony.xwork2.util.ValueStackFactory" name="default" class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory" /> + <bean type="com.opensymphony.xwork2.util.reflection.ReflectionProvider" name="default" class="com.opensymphony.xwork2.ognl.OgnlReflectionProvider" /> + + <bean type="ognl.MethodAccessor" name="java.lang.Object" class="com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor" /> + <bean type="ognl.MethodAccessor" name="com.opensymphony.xwork2.util.CompoundRoot" class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" /> + <bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.util.CompoundRoot" class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" /> + <bean type="ognl.PropertyAccessor" name="org.apache.struts2.dispatcher.HttpParameters" class="com.opensymphony.xwork2.ognl.accessor.HttpParametersPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.ognl.ObjectProxy" class="com.opensymphony.xwork2.ognl.accessor.ObjectProxyPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="org.apache.struts2.dispatcher.Parameter" class="com.opensymphony.xwork2.ognl.accessor.ParameterPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.ArrayList" class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Collection" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Enumeration" class="com.opensymphony.xwork2.ognl.accessor.XWorkEnumerationAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.HashMap" class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.HashSet" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Iterator" class="com.opensymphony.xwork2.ognl.accessor.XWorkIteratorPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.List" class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Map" class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.lang.Object" class="com.opensymphony.xwork2.ognl.accessor.ObjectAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Set" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" /> + +</xwork> \ No newline at end of file diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-true.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-true.xml new file mode 100644 index 0000000..3065a1a --- /dev/null +++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-devmode-true.xml @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +--> +<!DOCTYPE xwork PUBLIC + "-//Apache Struts//XWork 2.5//EN" + "http://struts.apache.org/dtds/xwork-2.5.dtd" + > + +<xwork> + + <constant name="struts.devMode" value="true" /> + <constant name="devMode" value="true" /> + <constant name="struts.i18n.reload" value="false" /> + <constant name="logMissingProperties" value="false" /> + <constant name="enableOGNLExpressionCache" value="true" /> + <constant name="enableOGNLEvalExpression" value="false" /> + <constant name="reloadXmlConfiguration" value="false" /> + <constant name="struts.ognl.allowStaticMethodAccess" value="true" /> + <constant name="struts.enable.DynamicMethodInvocation" value="false" /> + <constant name="struts.dispatcher.errorHandler" value="struts" /> + + <bean class="com.opensymphony.xwork2.ObjectFactory" name="default" /> + <bean class="org.apache.struts2.views.freemarker.FreemarkerThemeTemplateLoader" /> + <bean class="org.apache.struts2.views.freemarker.FreemarkerManager" name="default" /> + <bean class="org.apache.struts2.views.velocity.VelocityManager" name="default" optional="true" /> + <bean class="org.apache.struts2.components.template.TemplateEngineManager" /> + <bean class="com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter" /> + <bean class="com.opensymphony.xwork2.ognl.OgnlUtil" /> + <bean class="org.apache.struts2.views.jsp.ui.OgnlTool" /> + + <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="default" class="org.apache.struts2.factory.StrutsActionProxyFactory"/> + <bean type="com.opensymphony.xwork2.FileManager" name="system" class="com.opensymphony.xwork2.util.fs.DefaultFileManager" scope="singleton"/> + <bean type="com.opensymphony.xwork2.FileManagerFactory" name="default" class="com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory" scope="singleton"/> + <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="global-only" class="com.opensymphony.xwork2.util.GlobalLocalizedTextProvider" scope="singleton" /> + <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="default" class="com.opensymphony.xwork2.util.StrutsLocalizedTextProvider" scope="singleton" /> + <bean type="com.opensymphony.xwork2.TextProvider" name="system" class="com.opensymphony.xwork2.DefaultTextProvider" scope="singleton" /> + <bean type="com.opensymphony.xwork2.conversion.ConversionAnnotationProcessor" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultConversionAnnotationProcessor" /> + <bean type="com.opensymphony.xwork2.conversion.ConversionFileProcessor" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultConversionFileProcessor" /> + <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/> + <bean type="com.opensymphony.xwork2.conversion.TypeConverterCreator" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterCreator" /> + <bean type="com.opensymphony.xwork2.conversion.TypeConverterHolder" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterHolder" /> + <bean type="com.opensymphony.xwork2.conversion.impl.XWorkConverter" name="default" class="com.opensymphony.xwork2.conversion.impl.XWorkConverter" /> + + <bean type="com.opensymphony.xwork2.factory.ActionFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultActionFactory" /> + <bean type="com.opensymphony.xwork2.factory.ConverterFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultConverterFactory" /> + <bean type="com.opensymphony.xwork2.factory.ResultFactory" name="default" class="org.apache.struts2.factory.StrutsResultFactory" /> + <bean type="com.opensymphony.xwork2.factory.UnknownHandlerFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory" /> + <bean type="com.opensymphony.xwork2.factory.ValidatorFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultValidatorFactory" /> + <bean type="com.opensymphony.xwork2.factory.InterceptorFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultInterceptorFactory" /> + <bean type="com.opensymphony.xwork2.util.ValueStackFactory" name="default" class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory" /> + <bean type="com.opensymphony.xwork2.util.reflection.ReflectionProvider" name="default" class="com.opensymphony.xwork2.ognl.OgnlReflectionProvider" /> + + <bean type="ognl.MethodAccessor" name="java.lang.Object" class="com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor" /> + <bean type="ognl.MethodAccessor" name="com.opensymphony.xwork2.util.CompoundRoot" class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" /> + <bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.util.CompoundRoot" class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" /> + <bean type="ognl.PropertyAccessor" name="org.apache.struts2.dispatcher.HttpParameters" class="com.opensymphony.xwork2.ognl.accessor.HttpParametersPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.ognl.ObjectProxy" class="com.opensymphony.xwork2.ognl.accessor.ObjectProxyPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="org.apache.struts2.dispatcher.Parameter" class="com.opensymphony.xwork2.ognl.accessor.ParameterPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.ArrayList" class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Collection" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Enumeration" class="com.opensymphony.xwork2.ognl.accessor.XWorkEnumerationAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.HashMap" class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.HashSet" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Iterator" class="com.opensymphony.xwork2.ognl.accessor.XWorkIteratorPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.List" class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Map" class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.lang.Object" class="com.opensymphony.xwork2.ognl.accessor.ObjectAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Set" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" /> + +</xwork> \ No newline at end of file diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-true.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-true.xml new file mode 100644 index 0000000..6dc36eb --- /dev/null +++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-allowstatic-true.xml @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +--> +<!DOCTYPE xwork PUBLIC + "-//Apache Struts//XWork 2.5//EN" + "http://struts.apache.org/dtds/xwork-2.5.dtd" + > + +<xwork> + + <constant name="struts.devMode" value="false" /> + <constant name="devMode" value="false" /> + <constant name="struts.i18n.reload" value="false" /> + <constant name="logMissingProperties" value="false" /> + <constant name="enableOGNLExpressionCache" value="true" /> + <constant name="enableOGNLEvalExpression" value="false" /> + <constant name="reloadXmlConfiguration" value="false" /> + <constant name="struts.ognl.allowStaticMethodAccess" value="true" /> + <constant name="struts.enable.DynamicMethodInvocation" value="false" /> + <constant name="struts.dispatcher.errorHandler" value="struts" /> + + <bean class="com.opensymphony.xwork2.ObjectFactory" name="default" /> + <bean class="org.apache.struts2.views.freemarker.FreemarkerThemeTemplateLoader" /> + <bean class="org.apache.struts2.views.freemarker.FreemarkerManager" name="default" /> + <bean class="org.apache.struts2.views.velocity.VelocityManager" name="default" optional="true" /> + <bean class="org.apache.struts2.components.template.TemplateEngineManager" /> + <bean class="com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter" /> + <bean class="com.opensymphony.xwork2.ognl.OgnlUtil" /> + <bean class="org.apache.struts2.views.jsp.ui.OgnlTool" /> + + <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="default" class="org.apache.struts2.factory.StrutsActionProxyFactory"/> + <bean type="com.opensymphony.xwork2.FileManager" name="system" class="com.opensymphony.xwork2.util.fs.DefaultFileManager" scope="singleton"/> + <bean type="com.opensymphony.xwork2.FileManagerFactory" name="default" class="com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory" scope="singleton"/> + <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="global-only" class="com.opensymphony.xwork2.util.GlobalLocalizedTextProvider" scope="singleton" /> + <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="default" class="com.opensymphony.xwork2.util.StrutsLocalizedTextProvider" scope="singleton" /> + <bean type="com.opensymphony.xwork2.TextProvider" name="system" class="com.opensymphony.xwork2.DefaultTextProvider" scope="singleton" /> + <bean type="com.opensymphony.xwork2.conversion.ConversionAnnotationProcessor" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultConversionAnnotationProcessor" /> + <bean type="com.opensymphony.xwork2.conversion.ConversionFileProcessor" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultConversionFileProcessor" /> + <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/> + <bean type="com.opensymphony.xwork2.conversion.TypeConverterCreator" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterCreator" /> + <bean type="com.opensymphony.xwork2.conversion.TypeConverterHolder" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterHolder" /> + <bean type="com.opensymphony.xwork2.conversion.impl.XWorkConverter" name="default" class="com.opensymphony.xwork2.conversion.impl.XWorkConverter" /> + + <bean type="com.opensymphony.xwork2.factory.ActionFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultActionFactory" /> + <bean type="com.opensymphony.xwork2.factory.ConverterFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultConverterFactory" /> + <bean type="com.opensymphony.xwork2.factory.ResultFactory" name="default" class="org.apache.struts2.factory.StrutsResultFactory" /> + <bean type="com.opensymphony.xwork2.factory.UnknownHandlerFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory" /> + <bean type="com.opensymphony.xwork2.factory.ValidatorFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultValidatorFactory" /> + <bean type="com.opensymphony.xwork2.factory.InterceptorFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultInterceptorFactory" /> + <bean type="com.opensymphony.xwork2.util.ValueStackFactory" name="default" class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory" /> + <bean type="com.opensymphony.xwork2.util.reflection.ReflectionProvider" name="default" class="com.opensymphony.xwork2.ognl.OgnlReflectionProvider" /> + + <bean type="ognl.MethodAccessor" name="java.lang.Object" class="com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor" /> + <bean type="ognl.MethodAccessor" name="com.opensymphony.xwork2.util.CompoundRoot" class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" /> + <bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.util.CompoundRoot" class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" /> + <bean type="ognl.PropertyAccessor" name="org.apache.struts2.dispatcher.HttpParameters" class="com.opensymphony.xwork2.ognl.accessor.HttpParametersPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.ognl.ObjectProxy" class="com.opensymphony.xwork2.ognl.accessor.ObjectProxyPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="org.apache.struts2.dispatcher.Parameter" class="com.opensymphony.xwork2.ognl.accessor.ParameterPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.ArrayList" class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Collection" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Enumeration" class="com.opensymphony.xwork2.ognl.accessor.XWorkEnumerationAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.HashMap" class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.HashSet" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Iterator" class="com.opensymphony.xwork2.ognl.accessor.XWorkIteratorPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.List" class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Map" class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.lang.Object" class="com.opensymphony.xwork2.ognl.accessor.ObjectAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Set" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" /> + +</xwork> \ No newline at end of file diff --git a/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-devmode-true.xml b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-devmode-true.xml new file mode 100644 index 0000000..787d8a6 --- /dev/null +++ b/core/src/test/resources/com/opensymphony/xwork2/config/providers/xwork-test-devmode-true.xml @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +--> +<!DOCTYPE xwork PUBLIC + "-//Apache Struts//XWork 2.5//EN" + "http://struts.apache.org/dtds/xwork-2.5.dtd" + > + +<xwork> + + <constant name="struts.devMode" value="true" /> + <constant name="devMode" value="true" /> + <constant name="struts.i18n.reload" value="false" /> + <constant name="logMissingProperties" value="false" /> + <constant name="enableOGNLExpressionCache" value="true" /> + <constant name="enableOGNLEvalExpression" value="false" /> + <constant name="reloadXmlConfiguration" value="false" /> + <constant name="struts.ognl.allowStaticMethodAccess" value="false" /> + <constant name="struts.enable.DynamicMethodInvocation" value="false" /> + <constant name="struts.dispatcher.errorHandler" value="struts" /> + + <bean class="com.opensymphony.xwork2.ObjectFactory" name="default" /> + <bean class="org.apache.struts2.views.freemarker.FreemarkerThemeTemplateLoader" /> + <bean class="org.apache.struts2.views.freemarker.FreemarkerManager" name="default" /> + <bean class="org.apache.struts2.views.velocity.VelocityManager" name="default" optional="true" /> + <bean class="org.apache.struts2.components.template.TemplateEngineManager" /> + <bean class="com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter" /> + <bean class="com.opensymphony.xwork2.ognl.OgnlUtil" /> + <bean class="org.apache.struts2.views.jsp.ui.OgnlTool" /> + + <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="default" class="org.apache.struts2.factory.StrutsActionProxyFactory"/> + <bean type="com.opensymphony.xwork2.FileManager" name="system" class="com.opensymphony.xwork2.util.fs.DefaultFileManager" scope="singleton"/> + <bean type="com.opensymphony.xwork2.FileManagerFactory" name="default" class="com.opensymphony.xwork2.util.fs.DefaultFileManagerFactory" scope="singleton"/> + <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="global-only" class="com.opensymphony.xwork2.util.GlobalLocalizedTextProvider" scope="singleton" /> + <bean type="com.opensymphony.xwork2.LocalizedTextProvider" name="default" class="com.opensymphony.xwork2.util.StrutsLocalizedTextProvider" scope="singleton" /> + <bean type="com.opensymphony.xwork2.TextProvider" name="system" class="com.opensymphony.xwork2.DefaultTextProvider" scope="singleton" /> + <bean type="com.opensymphony.xwork2.conversion.ConversionAnnotationProcessor" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultConversionAnnotationProcessor" /> + <bean type="com.opensymphony.xwork2.conversion.ConversionFileProcessor" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultConversionFileProcessor" /> + <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer"/> + <bean type="com.opensymphony.xwork2.conversion.TypeConverterCreator" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterCreator" /> + <bean type="com.opensymphony.xwork2.conversion.TypeConverterHolder" name="default" class="com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterHolder" /> + <bean type="com.opensymphony.xwork2.conversion.impl.XWorkConverter" name="default" class="com.opensymphony.xwork2.conversion.impl.XWorkConverter" /> + + <bean type="com.opensymphony.xwork2.factory.ActionFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultActionFactory" /> + <bean type="com.opensymphony.xwork2.factory.ConverterFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultConverterFactory" /> + <bean type="com.opensymphony.xwork2.factory.ResultFactory" name="default" class="org.apache.struts2.factory.StrutsResultFactory" /> + <bean type="com.opensymphony.xwork2.factory.UnknownHandlerFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultUnknownHandlerFactory" /> + <bean type="com.opensymphony.xwork2.factory.ValidatorFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultValidatorFactory" /> + <bean type="com.opensymphony.xwork2.factory.InterceptorFactory" name="default" class="com.opensymphony.xwork2.factory.DefaultInterceptorFactory" /> + <bean type="com.opensymphony.xwork2.util.ValueStackFactory" name="default" class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory" /> + <bean type="com.opensymphony.xwork2.util.reflection.ReflectionProvider" name="default" class="com.opensymphony.xwork2.ognl.OgnlReflectionProvider" /> + + <bean type="ognl.MethodAccessor" name="java.lang.Object" class="com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor" /> + <bean type="ognl.MethodAccessor" name="com.opensymphony.xwork2.util.CompoundRoot" class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" /> + <bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.util.CompoundRoot" class="com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor" /> + <bean type="ognl.PropertyAccessor" name="org.apache.struts2.dispatcher.HttpParameters" class="com.opensymphony.xwork2.ognl.accessor.HttpParametersPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="com.opensymphony.xwork2.ognl.ObjectProxy" class="com.opensymphony.xwork2.ognl.accessor.ObjectProxyPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="org.apache.struts2.dispatcher.Parameter" class="com.opensymphony.xwork2.ognl.accessor.ParameterPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.ArrayList" class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Collection" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Enumeration" class="com.opensymphony.xwork2.ognl.accessor.XWorkEnumerationAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.HashMap" class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.HashSet" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Iterator" class="com.opensymphony.xwork2.ognl.accessor.XWorkIteratorPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.List" class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Map" class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.lang.Object" class="com.opensymphony.xwork2.ognl.accessor.ObjectAccessor" /> + <bean type="ognl.PropertyAccessor" name="java.util.Set" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" /> + +</xwork> \ No newline at end of file