Author: lukaszlenart
Date: Fri Aug 31 09:43:17 2012
New Revision: 1379386
URL: http://svn.apache.org/viewvc?rev=1379386&view=rev
Log:
WW-3866 adds more power to users to check if parameter name can be accepted,
adds insecure params test case and cleans up code a bit
Added:
struts/struts2/trunk/xwork-core/src/test/resources/xwork-param-test.xml
- copied, changed from r1375926,
struts/struts2/trunk/xwork-core/src/test/resources/xwork-test-beans.xml
Modified:
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/ParametersInterceptorTest.java
Modified:
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java?rev=1379386&r1=1379385&r2=1379386&view=diff
==============================================================================
---
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java
(original)
+++
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java
Fri Aug 31 09:43:17 2012
@@ -136,10 +136,11 @@ public class ParametersInterceptor exten
private int paramNameMaxLength = PARAM_NAME_MAX_LENGTH;
- boolean ordered = false;
- Set<Pattern> excludeParams = Collections.emptySet();
- Set<Pattern> acceptParams = Collections.emptySet();
- static boolean devMode = false;
+ protected boolean ordered = false;
+ protected Set<Pattern> excludeParams = Collections.emptySet();
+ protected Set<Pattern> acceptParams = Collections.emptySet();
+
+ private boolean devMode = false;
// Allowed names of parameters
private String acceptedParamNames =
"\\w+((\\.\\w+)|(\\[\\d+\\])|(\\(\\d+\\))|(\\['\\w+'\\])|(\\('\\w+'\\)))*";
@@ -153,7 +154,7 @@ public class ParametersInterceptor exten
}
@Inject(XWorkConstants.DEV_MODE)
- public static void setDevMode(String mode) {
+ public void setDevMode(String mode) {
devMode = "true".equals(mode);
}
@@ -279,8 +280,7 @@ public class ParametersInterceptor exten
String name = entry.getKey();
boolean acceptableName = acceptableName(name)
- && (parameterNameAware == null
- || parameterNameAware.acceptableParameterName(name));
+ || (parameterNameAware != null &&
parameterNameAware.acceptableParameterName(name));
if (acceptableName) {
acceptableParameters.put(name, entry.getValue());
@@ -376,8 +376,7 @@ public class ParametersInterceptor exten
}
protected boolean acceptableName(String name) {
- return isWithinLengthLimit(name) && isAccepted(name)
- && !isExcluded(name);
+ return isWithinLengthLimit(name) && isAccepted(name) &&
!isExcluded(name);
}
protected boolean isWithinLengthLimit( String name ) {
Modified:
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/ParametersInterceptorTest.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/ParametersInterceptorTest.java?rev=1379386&r1=1379385&r2=1379386&view=diff
==============================================================================
---
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/ParametersInterceptorTest.java
(original)
+++
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/interceptor/ParametersInterceptorTest.java
Fri Aug 31 09:43:17 2012
@@ -22,9 +22,11 @@ import com.opensymphony.xwork2.ModelDriv
import com.opensymphony.xwork2.SimpleAction;
import com.opensymphony.xwork2.TestBean;
import com.opensymphony.xwork2.TextProvider;
+import com.opensymphony.xwork2.ValidationAware;
import com.opensymphony.xwork2.XWorkTestCase;
import com.opensymphony.xwork2.config.entities.ActionConfig;
import com.opensymphony.xwork2.config.providers.MockConfigurationProvider;
+import com.opensymphony.xwork2.config.providers.XWorkConfigurationProvider;
import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider;
import com.opensymphony.xwork2.conversion.impl.XWorkConverter;
import com.opensymphony.xwork2.mock.MockActionInvocation;
@@ -39,9 +41,11 @@ import ognl.PropertyAccessor;
import java.io.File;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@@ -55,12 +59,13 @@ public class ParametersInterceptorTest e
public void testParameterNameAware() {
ParametersInterceptor pi = createParametersInterceptor();
- final Map actual = injectValueStackFactory(pi);
+ final Map<String, Object> actual = injectValueStackFactory(pi);
ValueStack stack = createStubValueStack(actual);
- final Map expected = new HashMap() {
+ final Map<String, Object> expected = new HashMap<String, Object>() {
{
put("fooKey", "fooValue");
put("barKey", "barValue");
+ put("test%test", "test%test");
}
};
Object a = new ParameterNameAware() {
@@ -68,17 +73,52 @@ public class ParametersInterceptorTest e
return expected.containsKey(parameterName);
}
};
- Map parameters = new HashMap() {
+ final Map<String, Object> parameters = new HashMap<String, Object>() {
{
put("fooKey", "fooValue");
put("barKey", "barValue");
- put("error", "error");
+ put("error-key", "error");
+ put("error key", "error");
+ put("error:key", "error");
+ put("error+key", "error");
+ put("test%test", "test%test");
}
};
pi.setParameters(a, stack, parameters);
assertEquals(expected, actual);
}
+ public void testInsecureParamaters() throws Exception {
+ // given
+ loadConfigurationProviders(new XWorkConfigurationProvider(), new
XmlConfigurationProvider("xwork-param-test.xml"));
+ final Map<String, Object> params = new HashMap<String, Object>() {
+ {
+ put("name",
"(#context[\"xwork.MethodAccessor.denyMethodExecution\"]= new " +
+ "java.lang.Boolean(false),
#_memberAccess[\"allowStaticMethodAccess\"]= new java.lang.Boolean(true), " +
+ "@java.lang.Runtime@getRuntime().exec('mkdir
/tmp/PWNAGE'))(meh)");
+ put("top['name'](0)", "true");
+ }
+ };
+
+ ParametersInterceptor pi = new ParametersInterceptor();
+ container.inject(pi);
+ ValueStack vs = ActionContext.getContext().getValueStack();
+
+ // when
+ ValidateAction action = new ValidateAction();
+ pi.setParameters(action, vs, params);
+
+ // then
+ assertEquals(2, action.getActionMessages().size());
+
+ String msg1 = action.getActionMessage(0);
+ String msg2 = action.getActionMessage(1);
+
+ assertTrue(msg1.contains("Error setting expression 'name' with value
'(#context[\"xwork.MethodAccessor.denyMethodExecution\"]= new
java.lang.Boolean(false), #_memberAccess[\"allowStaticMethodAccess\"]= new
java.lang.Boolean(true), @java.lang.Runtime@getRuntime().exec('mkdir
/tmp/PWNAGE'))(meh)'"));
+ assertTrue(msg2.contains("Error setting expression 'top['name'](0)'
with value 'true'"));
+ assertNull(action.getName());
+ }
+
public void testDoesNotAllowMethodInvocations() throws Exception {
Map<String, Object> params = new HashMap<String, Object>();
params.put("@java.lang.System@exit(1).dummy", "dumb value");
@@ -86,12 +126,9 @@ public class ParametersInterceptorTest e
HashMap<String, Object> extraContext = new HashMap<String, Object>();
extraContext.put(ActionContext.PARAMETERS, params);
- ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.MODEL_DRIVEN_PARAM_TEST, extraContext);
+ ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.MODEL_DRIVEN_PARAM_TEST, null, extraContext);
assertEquals(Action.SUCCESS, proxy.execute());
- ModelDrivenAction action = (ModelDrivenAction) proxy.getAction();
- TestBean model = (TestBean) action.getModel();
-
String property = System.getProperty("xwork.security.test");
assertNull(property);
}
@@ -108,7 +145,7 @@ public class ParametersInterceptorTest e
HashMap<String, Object> extraContext = new HashMap<String, Object>();
extraContext.put(ActionContext.PARAMETERS, params);
- ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.MODEL_DRIVEN_PARAM_TEST, extraContext);
+ ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.MODEL_DRIVEN_PARAM_TEST, null, extraContext);
assertEquals(Action.SUCCESS, proxy.execute());
ModelDrivenAction action = (ModelDrivenAction) proxy.getAction();
@@ -134,7 +171,7 @@ public class ParametersInterceptorTest e
HashMap<String, Object> extraContext = new HashMap<String, Object>();
extraContext.put(ActionContext.PARAMETERS, params);
- ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, extraContext);
+ ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, null, extraContext);
ValueStack stack = proxy.getInvocation().getStack();
HashMap<String, Object> session = new HashMap<String, Object>();
stack.getContext().put("session", session);
@@ -159,7 +196,7 @@ public class ParametersInterceptorTest e
HashMap<String, Object> extraContext = new HashMap<String, Object>();
extraContext.put(ActionContext.PARAMETERS, params);
- ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, "", extraContext);
+ ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, null, extraContext);
ValueStack stack = proxy.getInvocation().getStack();
// when
@@ -180,12 +217,12 @@ public class ParametersInterceptorTest e
HashMap<String, Object> extraContext = new HashMap<String, Object>();
extraContext.put(ActionContext.PARAMETERS, params);
- ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, extraContext);
+ ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, null, extraContext);
proxy.execute();
assertEquals("This is blah", ((SimpleAction)
proxy.getAction()).getBlah());
}
- public void testParametersWithSpacesInTheName() throws Exception {
+ public void testParametersWithSpacesInTheName() throws Exception {
Map<String, Object> params = new HashMap<String, Object>();
params.put("theProtectedMap['p0 p1']", "test1");
params.put("theProtectedMap['p0p1 ']", "test2");
@@ -195,45 +232,45 @@ public class ParametersInterceptorTest e
HashMap<String, Object> extraContext = new HashMap<String, Object>();
extraContext.put(ActionContext.PARAMETERS, params);
- ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, extraContext);
+ ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, null, extraContext);
proxy.execute();
- Map<String, String> existingMap = ((SimpleAction)
proxy.getAction()).getTheProtectedMap();
+ Map<String, String> existingMap = ((SimpleAction)
proxy.getAction()).getTheProtectedMap();
assertEquals(0, existingMap.size());
}
public void testLargeParameterNameWithDefaultLimit() throws Exception {
- ParametersInterceptor parametersInterceptor =
createParametersInterceptor();
- doTestParameterNameLengthRestriction(parametersInterceptor,
ParametersInterceptor.PARAM_NAME_MAX_LENGTH);
+ ParametersInterceptor parametersInterceptor =
createParametersInterceptor();
+ doTestParameterNameLengthRestriction(parametersInterceptor,
ParametersInterceptor.PARAM_NAME_MAX_LENGTH);
+ }
+
+ public void testLargeParameterNameWithCustomLimit() throws Exception {
+ ParametersInterceptor parametersInterceptor =
createParametersInterceptor();
+ int limit = 20;
+ parametersInterceptor.setParamNameMaxLength(limit);
+ doTestParameterNameLengthRestriction(parametersInterceptor, limit);
}
- public void testLargeParameterNameWithCustomLimit() throws Exception {
- ParametersInterceptor parametersInterceptor =
createParametersInterceptor();
- int limit = 20;
- parametersInterceptor.setParamNameMaxLength(limit);
- doTestParameterNameLengthRestriction(parametersInterceptor,
limit);
- }
-
- private void doTestParameterNameLengthRestriction(
ParametersInterceptor parametersInterceptor,
-
int paramNameMaxLength ) {
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < paramNameMaxLength + 1; i++) {
+ private void doTestParameterNameLengthRestriction(ParametersInterceptor
parametersInterceptor,
+ int paramNameMaxLength) {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < paramNameMaxLength + 1; i++) {
sb.append("x");
}
- Map<String, Object> actual = new LinkedHashMap<String,
Object>();
-
parametersInterceptor.setValueStackFactory(createValueStackFactory(actual));
- ValueStack stack = createStubValueStack(actual);
-
- Map<String, Object> parameters = new HashMap<String, Object>();
- parameters.put(sb.toString(), "");
- parameters.put("huuhaa", "");
-
- Action action = new SimpleAction();
- parametersInterceptor.setParameters(action, stack, parameters);
- assertEquals(1, actual.size());
- }
+ Map<String, Object> actual = new LinkedHashMap<String, Object>();
+
parametersInterceptor.setValueStackFactory(createValueStackFactory(actual));
+ ValueStack stack = createStubValueStack(actual);
+
+ Map<String, Object> parameters = new HashMap<String, Object>();
+ parameters.put(sb.toString(), "");
+ parameters.put("huuhaa", "");
- public void testExcludedTrickyParameters() throws Exception {
+ Action action = new SimpleAction();
+ parametersInterceptor.setParameters(action, stack, parameters);
+ assertEquals(1, actual.size());
+ }
+
+ public void testExcludedTrickyParameters() throws Exception {
Map<String, Object> params = new HashMap<String, Object>() {
{
put("blah", "This is blah");
@@ -251,10 +288,10 @@ public class ParametersInterceptorTest e
HashMap<String, Object> extraContext = new HashMap<String, Object>();
extraContext.put(ActionContext.PARAMETERS, params);
- ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, extraContext);
+ ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, null, extraContext);
ActionConfig config =
configuration.getRuntimeConfiguration().getActionConfig("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME);
- ParametersInterceptor pi =(ParametersInterceptor)
config.getInterceptors().get(0).getInterceptor();
+ ParametersInterceptor pi = (ParametersInterceptor)
config.getInterceptors().get(0).getInterceptor();
pi.setExcludeParams("name");
proxy.execute();
@@ -282,10 +319,10 @@ public class ParametersInterceptorTest e
HashMap<String, Object> extraContext = new HashMap<String, Object>();
extraContext.put(ActionContext.PARAMETERS, params);
- ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, extraContext);
+ ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, null, extraContext);
ActionConfig config =
configuration.getRuntimeConfiguration().getActionConfig("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME);
- ParametersInterceptor pi =(ParametersInterceptor)
config.getInterceptors().get(0).getInterceptor();
+ ParametersInterceptor pi = (ParametersInterceptor)
config.getInterceptors().get(0).getInterceptor();
pi.setAcceptParamNames("blah, baz");
proxy.execute();
@@ -305,7 +342,7 @@ public class ParametersInterceptorTest e
HashMap<String, Object> extraContext = new HashMap<String, Object>();
extraContext.put(ActionContext.PARAMETERS, params);
- ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, extraContext);
+ ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, null, extraContext);
proxy.execute();
SimpleAction action = (SimpleAction) proxy.getAction();
assertEquals(1, action.getTheProtectedMap().size());
@@ -321,7 +358,7 @@ public class ParametersInterceptorTest e
HashMap<String, Object> extraContext = new HashMap<String, Object>();
extraContext.put(ActionContext.PARAMETERS, params);
- ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, extraContext);
+ ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, null, extraContext);
proxy.execute();
SimpleAction action = (SimpleAction) proxy.getAction();
assertEquals(1, action.getTheProtectedMap().size());
@@ -332,6 +369,7 @@ public class ParametersInterceptorTest e
/**
* This test demonstrates a vulnerability which allows to execute
arbitrary code.
* For further details and explanations see
https://cwiki.apache.org/confluence/display/WW/S2-009
+ *
* @throws Exception
*/
public void testEvalExpressionAsParameterName() throws Exception {
@@ -344,7 +382,7 @@ public class ParametersInterceptorTest e
HashMap<String, Object> extraContext = new HashMap<String, Object>();
extraContext.put(ActionContext.PARAMETERS, params);
- ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, extraContext);
+ ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, null, extraContext);
proxy.execute();
@SuppressWarnings("unused")
SimpleAction action = (SimpleAction) proxy.getAction();
@@ -362,7 +400,7 @@ public class ParametersInterceptorTest e
HashMap<String, Object> extraContext = new HashMap<String, Object>();
extraContext.put(ActionContext.PARAMETERS, params);
- ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, extraContext);
+ ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, null, extraContext);
proxy.execute();
SimpleAction action = (SimpleAction) proxy.getAction();
assertEquals(1, action.getTheExistingMap().size());
@@ -380,11 +418,10 @@ public class ParametersInterceptorTest e
HashMap<String, Object> extraContext = new HashMap<String, Object>();
extraContext.put(ActionContext.PARAMETERS, params);
- ParametersInterceptor.setDevMode("true");
ActionConfig config =
configuration.getRuntimeConfiguration().getActionConfig("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME);
container.inject(config.getInterceptors().get(0).getInterceptor());
- ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, extraContext);
+ ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, null, extraContext);
proxy.execute();
final String actionMessage = "" + ((SimpleAction)
proxy.getAction()).getActionMessages().toArray()[0];
assertTrue(actionMessage.contains("Error setting expression
'not_a_property' with value 'There is no action property named like this'"));
@@ -403,7 +440,7 @@ public class ParametersInterceptorTest e
ActionConfig config =
configuration.getRuntimeConfiguration().getActionConfig("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME);
container.inject(config.getInterceptors().get(0).getInterceptor());
- ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, extraContext);
+ ActionProxy proxy = actionProxyFactory.createActionProxy("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME, null, extraContext);
proxy.execute();
assertTrue(((SimpleAction)
proxy.getAction()).getActionMessages().isEmpty());
}
@@ -483,7 +520,7 @@ public class ParametersInterceptorTest e
public void testExcludedParametersAreIgnored() throws Exception {
ParametersInterceptor pi = createParametersInterceptor();
pi.setExcludeParams("dojo\\..*");
- final Map actual = injectValueStackFactory(pi);
+ final Map<String, Object> actual = injectValueStackFactory(pi);
ValueStack stack = injectValueStack(actual);
final Map<String, Object> expected = new HashMap<String, Object>() {
@@ -505,7 +542,7 @@ public class ParametersInterceptorTest e
public void testInternalParametersAreIgnored() throws Exception {
// given
ParametersInterceptor interceptor = createParametersInterceptor();
- final Map actual = injectValueStackFactory(interceptor);
+ final Map<String, Object> actual =
injectValueStackFactory(interceptor);
ValueStack stack = injectValueStack(actual);
@@ -535,14 +572,14 @@ public class ParametersInterceptorTest e
assertEquals(expected, actual);
}
- private ValueStack injectValueStack(Map actual) {
+ private ValueStack injectValueStack(Map<String, Object> actual) {
ValueStack stack = createStubValueStack(actual);
container.inject(stack);
return stack;
}
- private Map injectValueStackFactory(ParametersInterceptor interceptor) {
- final Map actual = new HashMap();
+ private Map<String, Object> injectValueStackFactory(ParametersInterceptor
interceptor) {
+ final Map<String, Object> actual = new HashMap<String, Object>();
interceptor.setValueStackFactory(createValueStackFactory(actual));
return actual;
}
@@ -567,12 +604,13 @@ public class ParametersInterceptorTest e
private ValueStack createStubValueStack(final Map<String, Object> actual) {
ValueStack stack = new OgnlValueStack(
container.getInstance(XWorkConverter.class),
-
(CompoundRootAccessor)container.getInstance(PropertyAccessor.class,
CompoundRoot.class.getName()),
+ (CompoundRootAccessor)
container.getInstance(PropertyAccessor.class, CompoundRoot.class.getName()),
container.getInstance(TextProvider.class, "system"), true) {
@Override
public void setValue(String expr, Object value) {
actual.put(expr, value);
}
+
@Override
public void setParameter(String expr, Object value) {
actual.put(expr, value);
@@ -614,4 +652,71 @@ public class ParametersInterceptorTest e
ActionConfig config =
configuration.getRuntimeConfiguration().getActionConfig("",
MockConfigurationProvider.PARAM_INTERCEPTOR_ACTION_NAME);
container.inject(config.getInterceptors().get(0).getInterceptor());
}
+
+}
+
+class ValidateAction implements ValidationAware {
+
+ private List<String> messages = new LinkedList<String>();
+ private String name;
+
+ public void setActionErrors(Collection<String> errorMessages) {
+ }
+
+ public Collection<String> getActionErrors() {
+ return null;
+ }
+
+ public void setActionMessages(Collection<String> messages) {
+ }
+
+ public Collection<String> getActionMessages() {
+ return messages;
+ }
+
+ public void setFieldErrors(Map<String, List<String>> errorMap) {
+ }
+
+ public Map<String, List<String>> getFieldErrors() {
+ return null;
+ }
+
+ public void addActionError(String anErrorMessage) {
+ }
+
+ public void addActionMessage(String aMessage) {
+ messages.add(aMessage);
+ }
+
+ public void addFieldError(String fieldName, String errorMessage) {
+ }
+
+ public boolean hasActionErrors() {
+ return false;
+ }
+
+ public boolean hasActionMessages() {
+ return messages.size() > 0;
+ }
+
+ public boolean hasErrors() {
+ return false;
+ }
+
+ public boolean hasFieldErrors() {
+ return false;
+ }
+
+ public String getActionMessage(int index) {
+ return messages.get(index);
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
}
Copied: struts/struts2/trunk/xwork-core/src/test/resources/xwork-param-test.xml
(from r1375926,
struts/struts2/trunk/xwork-core/src/test/resources/xwork-test-beans.xml)
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/test/resources/xwork-param-test.xml?p2=struts/struts2/trunk/xwork-core/src/test/resources/xwork-param-test.xml&p1=struts/struts2/trunk/xwork-core/src/test/resources/xwork-test-beans.xml&r1=1375926&r2=1379386&rev=1379386&view=diff
==============================================================================
--- struts/struts2/trunk/xwork-core/src/test/resources/xwork-test-beans.xml
(original)
+++ struts/struts2/trunk/xwork-core/src/test/resources/xwork-param-test.xml Fri
Aug 31 09:43:17 2012
@@ -3,25 +3,5 @@
"http://struts.apache.org/dtds/xwork-2.0.dtd">
<xwork>
-<!--
- <bean class="com.opensymphony.xwork2.ObjectFactory" name="default" />
- <bean type="com.opensymphony.xwork2.ActionProxyFactory" name="default"
class="com.opensymphony.xwork2.DefaultActionProxyFactory"/>
- <constant name="devMode" value="false" />
-
- <bean type="com.opensymphony.xwork2.util.ValueStackFactory"
- class="com.opensymphony.xwork2.ognl.OgnlValueStackFactory" />
- <bean type="com.opensymphony.xwork2.util.reflection.ReflectionProvider"
- class="com.opensymphony.xwork2.ognl.OgnlReflectionProvider" />
- <bean
type="com.opensymphony.xwork2.util.reflection.ReflectionContextFactory"
- class="com.opensymphony.xwork2.ognl.OgnlReflectionContextFactory" />
- <bean class="com.opensymphony.xwork2.conversion.impl.XWorkConverter" />
- <bean type="com.opensymphony.xwork2.conversion.ObjectTypeDeterminer"
-
class="com.opensymphony.xwork2.conversion.impl.DefaultObjectTypeDeterminer" />
--->
- <!-- static injections -->
- <!--
- <bean class="com.opensymphony.xwork2.ognl.OgnlValueStack" static="true"/>
- <bean class="com.opensymphony.xwork2.conversion.impl.XWorkConverter"
static="true"/>
- <bean
class="com.opensymphony.xwork2.util.reflection.ReflectionProviderFactory"
static="true" />
- -->
+ <constant name="devMode" value="true" />
</xwork>
\ No newline at end of file