1
1
package pro .taskana .common .rest .util ;
2
2
3
3
import com .fasterxml .jackson .annotation .JsonProperty ;
4
+ import java .util .Arrays ;
4
5
import java .util .HashSet ;
6
+ import java .util .Map ;
5
7
import java .util .Optional ;
6
8
import java .util .Set ;
7
- import java .util .regex .Matcher ;
8
- import java .util .regex .Pattern ;
9
9
import java .util .stream .Collectors ;
10
10
import java .util .stream .Stream ;
11
11
import javax .servlet .http .HttpServletRequest ;
12
- import pro .taskana .common .api .exceptions .InvalidArgumentException ;
13
12
14
13
public class QueryParamsValidator {
15
14
@@ -35,21 +34,57 @@ public static void validateParams(HttpServletRequest request, Class<?>... filter
35
34
if (!providedParams .isEmpty ()) {
36
35
throw new IllegalArgumentException ("Unknown request parameters found: " + providedParams );
37
36
}
38
- checkExactParam (request , "owner-is-null" );
39
37
}
40
38
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 ;
53
51
}
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 ;
54
89
}
55
90
}
0 commit comments