Skip to content

Commit 4ca0ae8

Browse files
CRoberto1926gitgoodjhe
authored andcommitted
Closes #2635: Make owner-is-null=owner-is-null not valid, allow use case "owner-is-null=true"
1 parent 3646bc0 commit 4ca0ae8

File tree

6 files changed

+199
-110
lines changed

6 files changed

+199
-110
lines changed

rest/taskana-rest-spring/src/main/java/pro/taskana/common/rest/util/QueryParamsValidator.java

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package pro.taskana.common.rest.util;
22

33
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import java.util.Arrays;
45
import java.util.HashSet;
6+
import java.util.Map;
57
import java.util.Optional;
68
import java.util.Set;
7-
import java.util.regex.Matcher;
8-
import java.util.regex.Pattern;
99
import java.util.stream.Collectors;
1010
import java.util.stream.Stream;
1111
import javax.servlet.http.HttpServletRequest;
12-
import pro.taskana.common.api.exceptions.InvalidArgumentException;
1312

1413
public class QueryParamsValidator {
1514

@@ -35,21 +34,57 @@ public static void validateParams(HttpServletRequest request, Class<?>... filter
3534
if (!providedParams.isEmpty()) {
3635
throw new IllegalArgumentException("Unknown request parameters found: " + providedParams);
3736
}
38-
checkExactParam(request, "owner-is-null");
3937
}
4038

41-
public static void checkExactParam(HttpServletRequest request, String queryParameter) {
42-
String queryString = request.getQueryString();
43-
boolean containParam = queryString != null && queryString.contains(queryParameter);
44-
if (containParam) {
45-
Pattern pattern = Pattern.compile("\\b" + queryParameter + "(&|$)");
46-
Matcher matcher = pattern.matcher(queryString);
47-
48-
boolean hasExactParam = matcher.find();
49-
if (!hasExactParam) {
50-
throw new InvalidArgumentException(
51-
"It is prohibited to use the param " + queryParameter + " with values.");
52-
}
39+
public static boolean hasQueryParameterValues(HttpServletRequest request, String queryParameter) {
40+
41+
Map<String, String[]> queryParametersMap = request.getParameterMap();
42+
43+
if (queryParametersMap.isEmpty()) {
44+
return false;
45+
}
46+
47+
String[] queryParameterValues = queryParametersMap.get(queryParameter);
48+
49+
if (queryParameterValues == null) {
50+
return false;
5351
}
52+
53+
boolean hasQueryParameterNotEmptyValues =
54+
Arrays.stream(queryParameterValues).anyMatch(value -> !value.isBlank());
55+
56+
/* Workaround to manage the case "query-param=".
57+
It should be safe enough to use because we have checked all other possibilities before. */
58+
boolean hasQueryParameterEmptyValues = request.getQueryString().contains(queryParameter + "=");
59+
60+
return hasQueryParameterNotEmptyValues || hasQueryParameterEmptyValues;
61+
}
62+
63+
public static boolean hasQueryParameterValuesOrIsNotTrue(
64+
HttpServletRequest request, String queryParameter) {
65+
66+
Map<String, String[]> queryParametersMap = request.getParameterMap();
67+
68+
if (queryParametersMap.isEmpty()) {
69+
return false;
70+
}
71+
72+
String[] queryParameterValues = queryParametersMap.get(queryParameter);
73+
74+
if (queryParameterValues == null) {
75+
return false;
76+
}
77+
78+
boolean hasQueryParameterProhibitedValues =
79+
Arrays.stream(queryParameterValues)
80+
.anyMatch(value -> !value.isBlank() && !Boolean.parseBoolean(value));
81+
82+
/* Workaround to manage the case "query-param=".
83+
It should be safe enough to use because we have checked all other possibilities before. */
84+
boolean hasQueryParameterEmptyValues =
85+
Arrays.stream(queryParameterValues).allMatch(String::isBlank)
86+
&& request.getQueryString().contains(queryParameter + "=");
87+
88+
return hasQueryParameterProhibitedValues || hasQueryParameterEmptyValues;
5489
}
5590
}

rest/taskana-rest-spring/src/main/java/pro/taskana/task/rest/TaskController.java

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,12 @@ public ResponseEntity<TaskRepresentationModel> createTask(
118118
NotAuthorizedOnWorkbasketException {
119119

120120
if (!taskRepresentationModel.getAttachments().stream()
121-
.filter(att -> Objects.nonNull(att.getTaskId()))
122-
.filter(att -> !att.getTaskId().equals(taskRepresentationModel.getTaskId()))
123-
.collect(Collectors.toList()).isEmpty()) {
121+
.filter(att -> Objects.nonNull(att.getTaskId()))
122+
.filter(att -> !att.getTaskId().equals(taskRepresentationModel.getTaskId()))
123+
.collect(Collectors.toList())
124+
.isEmpty()) {
124125
throw new InvalidArgumentException(
125-
"An attachments' taskId must be empty or equal to the id of the task it belongs to");
126+
"An attachments' taskId must be empty or equal to the id of the task it belongs to");
126127
}
127128

128129
Task fromResource = taskRepresentationModelAssembler.toEntityModel(taskRepresentationModel);
@@ -148,6 +149,7 @@ public ResponseEntity<TaskRepresentationModel> createTask(
148149
* @param sortParameter the sort parameters
149150
* @param pagingParameter the paging parameters
150151
* @return the Tasks with the given filter, sort and paging options.
152+
* @throws InvalidArgumentException if the query parameter "owner-is-null" has values
151153
*/
152154
@GetMapping(path = RestEndpoints.URL_TASKS)
153155
@Transactional(readOnly = true, rollbackFor = Exception.class)
@@ -167,6 +169,12 @@ public ResponseEntity<TaskSummaryPagedRepresentationModel> getTasks(
167169
TaskQueryGroupByParameter.class,
168170
QuerySortParameter.class,
169171
QueryPagingParameter.class);
172+
173+
if (QueryParamsValidator.hasQueryParameterValuesOrIsNotTrue(request, "owner-is-null")) {
174+
throw new InvalidArgumentException(
175+
"It is prohibited to use the param owner-is-null with values.");
176+
}
177+
170178
TaskQuery query = taskService.createTaskQuery();
171179

172180
filterParameter.apply(query);
@@ -653,11 +661,12 @@ public ResponseEntity<TaskRepresentationModel> updateTask(
653661
}
654662

655663
if (!taskRepresentationModel.getAttachments().stream()
656-
.filter(att -> Objects.nonNull(att.getTaskId()))
657-
.filter(att -> !att.getTaskId().equals(taskRepresentationModel.getTaskId()))
658-
.collect(Collectors.toList()).isEmpty()) {
664+
.filter(att -> Objects.nonNull(att.getTaskId()))
665+
.filter(att -> !att.getTaskId().equals(taskRepresentationModel.getTaskId()))
666+
.collect(Collectors.toList())
667+
.isEmpty()) {
659668
throw new InvalidArgumentException(
660-
"An attachments' taskId must be empty or equal to the id of the task it belongs to");
669+
"An attachments' taskId must be empty or equal to the id of the task it belongs to");
661670
}
662671

663672
Task task = taskRepresentationModelAssembler.toEntityModel(taskRepresentationModel);

0 commit comments

Comments
 (0)