Skip to content

Commit 2135ebf

Browse files
authored
WW-5501 Ignores DMI related action field (#1211)
1 parent c0dd8dd commit 2135ebf

File tree

4 files changed

+37
-3
lines changed

4 files changed

+37
-3
lines changed

core/src/main/java/org/apache/struts2/dispatcher/multipart/AbstractMultiPartRequest.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.opensymphony.xwork2.inject.Inject;
2323
import com.opensymphony.xwork2.security.DefaultExcludedPatternsChecker;
2424
import com.opensymphony.xwork2.security.ExcludedPatternsChecker;
25+
import org.apache.commons.lang3.BooleanUtils;
2526
import org.apache.logging.log4j.LogManager;
2627
import org.apache.logging.log4j.Logger;
2728
import org.apache.struts2.StrutsConstants;
@@ -40,7 +41,8 @@ public abstract class AbstractMultiPartRequest implements MultiPartRequest {
4041

4142
private static final Logger LOG = LogManager.getLogger(AbstractMultiPartRequest.class);
4243

43-
private static final String EXCLUDED_FILE_PATTERN = ".*[<>&\"'|;\\\\/?*:]+.*|.*\\.\\..*";
44+
private static final String EXCLUDED_FILE_PATTERN = "^(.*[<>&\"'|;\\\\/?*:]+.*|.*\\.\\..*)$";
45+
private static final String EXCLUDED_FILE_PATTERN_WITH_DMI_SUPPORT = "^(?!action:[^<>&\"'|;\\\\/?*:]+(![^<>&\"'|;\\\\/?*:]+)?$)(.*[<>&\"'|;\\\\/?*:]+.*|.*\\.\\..*)$\n";
4446

4547
/**
4648
* Defines the internal buffer size used during streaming operations.
@@ -86,9 +88,13 @@ public abstract class AbstractMultiPartRequest implements MultiPartRequest {
8688

8789
private final ExcludedPatternsChecker patternsChecker;
8890

89-
public AbstractMultiPartRequest() {
91+
protected AbstractMultiPartRequest(String dmiValue) {
9092
patternsChecker = new DefaultExcludedPatternsChecker();
91-
((DefaultExcludedPatternsChecker) patternsChecker).setAdditionalExcludePatterns(EXCLUDED_FILE_PATTERN);
93+
if (BooleanUtils.toBoolean(dmiValue)) {
94+
((DefaultExcludedPatternsChecker) patternsChecker).setAdditionalExcludePatterns(EXCLUDED_FILE_PATTERN_WITH_DMI_SUPPORT);
95+
} else {
96+
((DefaultExcludedPatternsChecker) patternsChecker).setAdditionalExcludePatterns(EXCLUDED_FILE_PATTERN);
97+
}
9298
}
9399

94100
/**

core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.apache.struts2.dispatcher.multipart;
2020

21+
import com.opensymphony.xwork2.inject.Inject;
2122
import org.apache.commons.fileupload.FileCountLimitExceededException;
2223
import org.apache.commons.fileupload.FileItem;
2324
import org.apache.commons.fileupload.FileUploadBase;
@@ -29,6 +30,7 @@
2930
import org.apache.commons.lang3.StringUtils;
3031
import org.apache.logging.log4j.LogManager;
3132
import org.apache.logging.log4j.Logger;
33+
import org.apache.struts2.StrutsConstants;
3234
import org.apache.struts2.dispatcher.LocalizedMessage;
3335

3436
import javax.servlet.http.HttpServletRequest;
@@ -58,6 +60,14 @@ public class JakartaMultiPartRequest extends AbstractMultiPartRequest {
5860

5961
// maps parameter name -> List of param values
6062
protected Map<String, List<String>> params = new HashMap<>();
63+
public JakartaMultiPartRequest() {
64+
super(Boolean.FALSE.toString());
65+
}
66+
67+
@Inject(value = StrutsConstants.STRUTS_ENABLE_DYNAMIC_METHOD_INVOCATION, required = false)
68+
public JakartaMultiPartRequest(String dmiValue) {
69+
super(dmiValue);
70+
}
6171

6272
/**
6373
* Creates a new request wrapper to handle multi-part data using methods adapted from Jason Pell's

core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.apache.struts2.dispatcher.multipart;
2020

21+
import com.opensymphony.xwork2.inject.Inject;
2122
import org.apache.commons.fileupload.FileItemIterator;
2223
import org.apache.commons.fileupload.FileItemStream;
2324
import org.apache.commons.fileupload.FileUploadBase;
@@ -27,6 +28,7 @@
2728
import org.apache.commons.fileupload.util.Streams;
2829
import org.apache.logging.log4j.LogManager;
2930
import org.apache.logging.log4j.Logger;
31+
import org.apache.struts2.StrutsConstants;
3032
import org.apache.struts2.dispatcher.LocalizedMessage;
3133

3234
import javax.servlet.http.HttpServletRequest;
@@ -206,6 +208,15 @@ public void parse(HttpServletRequest request, String saveDir) throws IOException
206208
}
207209
}
208210

211+
public JakartaStreamMultiPartRequest() {
212+
super(Boolean.FALSE.toString());
213+
}
214+
215+
@Inject(value = StrutsConstants.STRUTS_ENABLE_DYNAMIC_METHOD_INVOCATION, required = false)
216+
public JakartaStreamMultiPartRequest(String dmiValue) {
217+
super(dmiValue);
218+
}
219+
209220
/**
210221
* Processes the upload.
211222
*

plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@
1818
*/
1919
package org.apache.struts2.dispatcher.multipart;
2020

21+
import com.opensymphony.xwork2.inject.Inject;
2122
import http.utils.multipartrequest.ServletMultipartRequest;
2223
import org.apache.logging.log4j.LogManager;
2324
import org.apache.logging.log4j.Logger;
25+
import org.apache.struts2.StrutsConstants;
2426

2527
import javax.servlet.http.HttpServletRequest;
2628
import java.io.IOException;
@@ -38,6 +40,11 @@ public class PellMultiPartRequest extends AbstractMultiPartRequest {
3840

3941
private ServletMultipartRequest multi;
4042

43+
@Inject(value = StrutsConstants.STRUTS_ENABLE_DYNAMIC_METHOD_INVOCATION, required = false)
44+
public PellMultiPartRequest(String dmiValue) {
45+
super(dmiValue);
46+
}
47+
4148
/**
4249
* Creates a new request wrapper to handle multi-part data using methods adapted from Jason Pell's
4350
* multipart classes (see class description).

0 commit comments

Comments
 (0)