1
+ import java .lang .reflect .Method ;
2
+ import java .net .URI ;
3
+ import java .util .ArrayList ;
4
+ import java .util .Date ;
5
+ import java .util .HashMap ;
6
+ import java .util .HashSet ;
7
+ import java .util .List ;
8
+ import java .util .Map ;
9
+ import java .util .Set ;
10
+ import javax .ws .rs .core .CacheControl ;
11
+ import javax .ws .rs .core .Cookie ;
12
+ import javax .ws .rs .core .EntityTag ;
13
+ import javax .ws .rs .core .Form ;
14
+ import javax .ws .rs .core .GenericEntity ;
15
+ import javax .ws .rs .core .HttpHeaders ;
16
+ import javax .ws .rs .core .Link ;
17
+ import javax .ws .rs .core .MediaType ;
18
+ import javax .ws .rs .core .MultivaluedMap ;
19
+ import javax .ws .rs .core .PathSegment ;
20
+ import javax .ws .rs .core .Response ;
21
+ import javax .ws .rs .core .UriBuilder ;
22
+ import javax .ws .rs .core .UriInfo ;
23
+ import javax .ws .rs .core .Variant ;
24
+
25
+ public class JaxRsFlow {
26
+ String taint () { return "tainted" ; }
27
+
28
+ private static class ResponseSource {
29
+ static Response taint () { return null ; }
30
+ }
31
+
32
+ private static class ResponseBuilderSource {
33
+ static Response .ResponseBuilder taint () { return Response .noContent (); }
34
+ }
35
+
36
+ private static class IntSource {
37
+ static int taint () { return 0 ; }
38
+ }
39
+
40
+ private static class SetStringSource {
41
+ static Set <String > taint () { return new HashSet <String >(); }
42
+ }
43
+
44
+ static HttpHeaders taint (HttpHeaders h ) { return h ; }
45
+
46
+ static PathSegment taint (PathSegment ps ) { return ps ; }
47
+
48
+ static UriInfo taint (UriInfo ui ) { return ui ; }
49
+
50
+ static Map taint (Map m ) { return m ; }
51
+
52
+ static Link taint (Link l ) { return l ; }
53
+
54
+ static Class taint (Class c ) { return c ; }
55
+
56
+ private static class UriSource {
57
+ static URI taint () throws Exception { return new URI ("" ); }
58
+ }
59
+
60
+ void sink (Object o ) {}
61
+
62
+ void testResponse () {
63
+ sink (Response .accepted (taint ())); // $hasTaintFlow
64
+ sink (Response .fromResponse (ResponseSource .taint ())); // $hasTaintFlow
65
+ sink (Response .ok (taint ())); // $hasTaintFlow
66
+ sink (Response .ok (taint (), new MediaType ())); // $hasTaintFlow
67
+ sink (Response .ok (taint (), "type" )); // $hasTaintFlow
68
+ sink (Response .ok (taint (), new Variant (new MediaType (), "" , "" ))); // $hasTaintFlow
69
+ }
70
+
71
+ void testResponseBuilder (MultivaluedMap <String ,Object > multivaluedMap , List <Variant > list ) throws Exception {
72
+ sink (ResponseBuilderSource .taint ().build ()); // $hasTaintFlow
73
+ sink (Response .noContent ().entity (taint ())); // $hasTaintFlow
74
+ sink (ResponseBuilderSource .taint ().allow (new HashSet <String >())); // $hasValueFlow
75
+ sink (ResponseBuilderSource .taint ().cacheControl (new CacheControl ())); // $hasValueFlow
76
+ sink (ResponseBuilderSource .taint ().clone ()); // $hasTaintFlow
77
+ sink (ResponseBuilderSource .taint ().contentLocation (new URI ("" ))); // $hasValueFlow
78
+ sink (ResponseBuilderSource .taint ().cookie ()); // $hasValueFlow
79
+ sink (ResponseBuilderSource .taint ().encoding ("" )); // $hasValueFlow
80
+ sink (ResponseBuilderSource .taint ().entity ("" )); // $hasValueFlow
81
+ sink (ResponseBuilderSource .taint ().expires (new Date ())); // $hasValueFlow
82
+ sink (ResponseBuilderSource .taint ().header ("" , "" )); // $hasValueFlow
83
+ sink (ResponseBuilderSource .taint ().language ("" )); // $hasValueFlow
84
+ sink (ResponseBuilderSource .taint ().lastModified (new Date ())); // $hasValueFlow
85
+ sink (ResponseBuilderSource .taint ().link ("" , "" )); // $hasValueFlow
86
+ sink (ResponseBuilderSource .taint ().link (new URI ("" ), "" )); // $hasValueFlow
87
+ sink (ResponseBuilderSource .taint ().links ()); // $hasValueFlow
88
+ sink (ResponseBuilderSource .taint ().location (new URI ("" ))); // $hasValueFlow
89
+ sink (ResponseBuilderSource .taint ().replaceAll (multivaluedMap )); // $hasValueFlow
90
+ sink (ResponseBuilderSource .taint ().status (400 )); // $hasValueFlow
91
+ sink (ResponseBuilderSource .taint ().tag (new EntityTag ("" ))); // $hasValueFlow
92
+ sink (ResponseBuilderSource .taint ().tag ("" )); // $hasValueFlow
93
+ sink (ResponseBuilderSource .taint ().type ("" )); // $hasValueFlow
94
+ sink (ResponseBuilderSource .taint ().variant (new Variant (new MediaType (), "" , "" ))); // $hasValueFlow
95
+ sink (ResponseBuilderSource .taint ().variants (list )); // $hasValueFlow
96
+ sink (ResponseBuilderSource .taint ().variants ()); // $hasValueFlow
97
+ }
98
+
99
+ void testHttpHeaders (HttpHeaders h ) {
100
+ sink (taint (h ).getAcceptableLanguages ()); // $hasTaintFlow
101
+ sink (taint (h ).getAcceptableMediaTypes ()); // $hasTaintFlow
102
+ sink (taint (h ).getCookies ()); // $hasTaintFlow
103
+ sink (taint (h ).getHeaderString ("" )); // $hasTaintFlow
104
+ sink (taint (h ).getLanguage ()); // $hasTaintFlow
105
+ sink (taint (h ).getMediaType ()); // $hasTaintFlow
106
+ sink (taint (h ).getRequestHeader ("" )); // $hasTaintFlow
107
+ sink (taint (h ).getRequestHeaders ()); // $hasTaintFlow
108
+ }
109
+
110
+ void testMultivaluedMapAdd (MultivaluedMap <String , String > mm1 , MultivaluedMap <String , String > mm2 ) {
111
+ mm1 .add (taint (), "value" );
112
+ sink (mm1 .keySet ().iterator ().next ()); // $hasValueFlow
113
+ mm2 .add ("key" , taint ());
114
+ sink (mm2 .get ("key" ).get (0 )); // $hasValueFlow
115
+ }
116
+
117
+ void testMultivaluedMapAddAll (MultivaluedMap <String , String > mm1 , MultivaluedMap <String , String > mm2 , MultivaluedMap <String , String > mm3 ) {
118
+ mm1 .addAll (taint (), "a" , "b" );
119
+ sink (mm1 .keySet ().iterator ().next ()); // $hasValueFlow
120
+ List <String > l = new ArrayList <String >();
121
+ l .add (taint ());
122
+ mm2 .addAll ("key" , l );
123
+ sink (mm2 .get ("key" ).get (0 )); // $hasValueFlow
124
+ mm3 .addAll ("key" , "a" , taint ());
125
+ sink (mm3 .get ("key" ).get (0 )); // $hasValueFlow
126
+ }
127
+
128
+ void testMultivaluedMapAddFirst (MultivaluedMap <String , String > mm1 , MultivaluedMap <String , String > mm2 ) {
129
+ mm1 .addFirst (taint (), "value" );
130
+ sink (mm1 .keySet ().iterator ().next ()); // $hasValueFlow
131
+ mm2 .addFirst ("key" , taint ());
132
+ sink (mm2 .get ("key" ).get (0 )); // $hasValueFlow
133
+ sink (mm2 .getFirst ("key" )); // $hasValueFlow
134
+ }
135
+
136
+ void testMultivaluedMapputSingle (MultivaluedMap <String , String > mm1 , MultivaluedMap <String , String > mm2 ) {
137
+ mm1 .putSingle (taint (), "value" );
138
+ sink (mm1 .keySet ().iterator ().next ()); // $hasValueFlow
139
+ mm2 .putSingle ("key" , taint ());
140
+ sink (mm2 .get ("key" ).get (0 )); // $hasValueFlow
141
+ }
142
+
143
+ void testPathSegment (PathSegment ps1 , PathSegment ps2 ) {
144
+ sink (taint (ps1 ).getMatrixParameters ()); // $hasTaintFlow
145
+ sink (taint (ps2 ).getPath ()); // $hasTaintFlow
146
+ }
147
+
148
+ void testUriInfo (UriInfo ui1 , UriInfo ui2 , UriInfo ui3 , UriInfo ui4 , UriInfo ui5 ) {
149
+ sink (taint (ui1 ).getPathParameters ()); // $hasTaintFlow
150
+ sink (taint (ui2 ).getPathSegments ()); // $hasTaintFlow
151
+ sink (taint (ui2 ).getQueryParameters ()); // $hasTaintFlow
152
+ sink (taint (ui2 ).getRequestUri ()); // $hasTaintFlow
153
+ sink (taint (ui2 ).getRequestUriBuilder ()); // $hasTaintFlow
154
+ }
155
+
156
+ void testCookie () {
157
+ sink (new Cookie (taint (), "" , "" , "" , 0 )); // $hasTaintFlow
158
+ sink (new Cookie ("" , taint (), "" , "" , 0 )); // $hasTaintFlow
159
+ sink (new Cookie ("" , "" , taint (), "" , 0 )); // $hasTaintFlow
160
+ sink (new Cookie ("" , "" , "" , taint (), 0 )); // $hasTaintFlow
161
+ sink (new Cookie ("" , "" , "" , "" , IntSource .taint ())); // $hasTaintFlow
162
+ sink (new Cookie (taint (), "" , "" , "" )); // $hasTaintFlow
163
+ sink (new Cookie ("" , taint (), "" , "" )); // $hasTaintFlow
164
+ sink (new Cookie ("" , "" , taint (), "" )); // $hasTaintFlow
165
+ sink (new Cookie ("" , "" , "" , taint ())); // $hasTaintFlow
166
+ sink (new Cookie (taint (), "" )); // $hasTaintFlow
167
+ sink (new Cookie ("" , taint ())); // $hasTaintFlow
168
+ sink (Cookie .valueOf (taint ())); // $hasTaintFlow
169
+ sink (Cookie .valueOf (taint ()).getDomain ()); // $hasTaintFlow
170
+ sink (Cookie .valueOf (taint ()).getName ()); // $hasTaintFlow
171
+ sink (Cookie .valueOf (taint ()).getPath ()); // $hasTaintFlow
172
+ sink (Cookie .valueOf (taint ()).getValue ()); // $hasTaintFlow
173
+ sink (Cookie .valueOf (taint ()).getVersion ()); // $hasTaintFlow
174
+ sink (Cookie .valueOf (taint ()).toString ()); // $hasTaintFlow
175
+ }
176
+
177
+ void testForm (MultivaluedMap <String , String > mm1 , MultivaluedMap <String , String > mm2 ) {
178
+ sink (new Form (taint (), "" )); // $hasTaintFlow
179
+ sink (new Form ("" , taint ())); // $hasTaintFlow
180
+ mm1 .add (taint (), "value" );
181
+ sink (new Form (mm1 )); // $hasTaintFlow
182
+ mm2 .add ("key" , taint ());
183
+ sink (new Form (mm2 )); // $hasTaintFlow
184
+ Form f1 = new Form (taint (), "" );
185
+ sink (f1 .asMap ()); // $hasTaintFlow
186
+ Form f2 = new Form ();
187
+ sink (f2 .param (taint (), "b" )); // $hasTaintFlow
188
+ Form f3 = new Form ();
189
+ sink (f3 .param ("a" , taint ())); // $hasTaintFlow
190
+ Form f4 = new Form (taint (), "" );
191
+ sink (f4 .param ("a" , "b" )); // $hasTaintFlow
192
+ }
193
+
194
+ void testGenericEntity () {
195
+ Method m = Dummy .class .getMethods ()[0 ];
196
+ GenericEntity <Set <String >> ge = new GenericEntity <Set <String >>(SetStringSource .taint (), m .getGenericReturnType ());
197
+ sink (ge ); // $hasTaintFlow
198
+ sink (ge .getEntity ()); // $hasTaintFlow
199
+ }
200
+
201
+ void testMediaType (Map <String , String > m ) {
202
+ sink (new MediaType (taint (), "" )); // $hasTaintFlow
203
+ sink (new MediaType ("" , taint ())); // $hasTaintFlow
204
+ sink (new MediaType (taint (), "" , m )); // $hasTaintFlow
205
+ sink (new MediaType ("" , taint (), m )); // $hasTaintFlow
206
+ sink (new MediaType ("" , "" , taint (m ))); // $hasTaintFlow
207
+ sink (new MediaType (taint (), "" , "" )); // $hasTaintFlow
208
+ sink (new MediaType ("" , taint (), "" )); // $hasTaintFlow
209
+ sink (new MediaType ("" , "" , taint ())); // $hasTaintFlow
210
+ sink (MediaType .valueOf (taint ()).getParameters ()); // $hasTaintFlow
211
+ sink (MediaType .valueOf (taint ()).getSubtype ()); // $hasTaintFlow
212
+ sink (MediaType .valueOf (taint ()).getType ()); // $hasTaintFlow
213
+ sink (MediaType .valueOf (taint ())); // $hasTaintFlow
214
+ }
215
+
216
+ void testUriBuilder () throws Exception {
217
+ sink (UriBuilder .fromPath ("" ).build (taint ())); // $hasTaintFlow
218
+ sink (UriBuilder .fromPath ("" ).build ("" , taint ())); // $hasTaintFlow
219
+ sink (UriBuilder .fromPath ("" ).build (taint (), false )); // $hasTaintFlow
220
+ sink (UriBuilder .fromPath ("" ).build ("" , taint (), true )); // $hasTaintFlow
221
+ sink (UriBuilder .fromPath (taint ()).build ("" )); // $hasTaintFlow
222
+ sink (UriBuilder .fromPath (taint ()).build ("" , false )); // $hasTaintFlow
223
+
224
+ sink (UriBuilder .fromPath ("" ).buildFromEncoded (taint ())); // $hasTaintFlow
225
+ sink (UriBuilder .fromPath ("" ).buildFromEncoded ("" , taint ())); // $hasTaintFlow
226
+ sink (UriBuilder .fromPath (taint ()).buildFromEncoded ("" )); // $hasTaintFlow
227
+ sink (UriBuilder .fromPath ("" ).buildFromEncodedMap (taint (new HashMap <String , String >()))); // $hasTaintFlow
228
+ sink (UriBuilder .fromPath (taint ()).buildFromEncodedMap (new HashMap <String , String >())); // $hasTaintFlow
229
+ sink (UriBuilder .fromPath ("" ).buildFromMap (taint (new HashMap <String , String >()), false )); // $hasTaintFlow
230
+ sink (UriBuilder .fromPath (taint ()).buildFromMap (new HashMap <String , String >(), true )); // $hasTaintFlow
231
+
232
+ sink (UriBuilder .fromPath (taint ()).clone ()); // $hasTaintFlow
233
+ sink (UriBuilder .fromPath ("" ).fragment (taint ())); // $hasTaintFlow
234
+ sink (UriBuilder .fromPath (taint ()).fragment ("" )); // $hasTaintFlow
235
+ sink (UriBuilder .fromLink (taint (Link .valueOf ("" )))); // $hasTaintFlow
236
+ sink (UriBuilder .fromPath (taint ())); // $hasTaintFlow
237
+ sink (UriBuilder .fromUri (taint ())); // $hasTaintFlow
238
+ sink (UriBuilder .fromPath ("" ).host (taint ())); // $hasTaintFlow
239
+ sink (UriBuilder .fromPath (taint ()).host ("" )); // $hasTaintFlow
240
+
241
+ sink (UriBuilder .fromPath ("" ).matrixParam (taint (), "" )); // $hasTaintFlow
242
+ sink (UriBuilder .fromPath ("" ).matrixParam ("" , "" , taint ())); // $hasTaintFlow
243
+ sink (UriBuilder .fromPath (taint ()).matrixParam ("" , "" )); // $hasTaintFlow
244
+ sink (UriBuilder .fromPath ("" ).path (taint (Dummy .class ))); // $hasTaintFlow
245
+ sink (UriBuilder .fromPath ("" ).path (Dummy .class , taint ())); // $hasTaintFlow
246
+ sink (UriBuilder .fromPath (taint ()).path (Dummy .class )); // $hasTaintFlow
247
+ sink (UriBuilder .fromPath ("" ).queryParam (taint (), "" )); // $hasTaintFlow
248
+ sink (UriBuilder .fromPath ("" ).queryParam ("" , "" , taint ())); // $hasTaintFlow
249
+ sink (UriBuilder .fromPath (taint ()).queryParam ("" , "" )); // $hasTaintFlow
250
+
251
+ sink (UriBuilder .fromPath ("" ).replaceMatrix (taint ())); // $hasTaintFlow
252
+ sink (UriBuilder .fromPath (taint ()).replaceMatrix ("" )); // $hasTaintFlow
253
+ sink (UriBuilder .fromPath ("" ).replaceMatrixParam (taint (), "" )); // $hasTaintFlow
254
+ sink (UriBuilder .fromPath ("" ).replaceMatrixParam ("" , "" , taint ())); // $hasTaintFlow
255
+ sink (UriBuilder .fromPath (taint ()).replaceMatrixParam ("" , "" )); // $hasTaintFlow
256
+ sink (UriBuilder .fromPath ("" ).replacePath (taint ())); // $hasTaintFlow
257
+ sink (UriBuilder .fromPath (taint ()).replacePath ("" )); // $hasTaintFlow
258
+ sink (UriBuilder .fromPath ("" ).replaceQuery (taint ())); // $hasTaintFlow
259
+ sink (UriBuilder .fromPath (taint ()).replaceQuery ("" )); // $hasTaintFlow
260
+ sink (UriBuilder .fromPath ("" ).replaceQueryParam (taint (), "" )); // $hasTaintFlow
261
+ sink (UriBuilder .fromPath ("" ).replaceQueryParam ("" , "" , taint ())); // $hasTaintFlow
262
+ sink (UriBuilder .fromPath (taint ()).replaceQueryParam ("" , "" )); // $hasTaintFlow
263
+
264
+ sink (UriBuilder .fromPath ("" ).resolveTemplate (taint (), "" )); // $hasTaintFlow
265
+ sink (UriBuilder .fromPath ("" ).resolveTemplate (taint (), "" , false )); // $hasTaintFlow
266
+ sink (UriBuilder .fromPath ("" ).resolveTemplate ("" , taint ())); // $hasTaintFlow
267
+ sink (UriBuilder .fromPath ("" ).resolveTemplate ("" , taint (), true )); // $hasTaintFlow
268
+ sink (UriBuilder .fromPath (taint ()).resolveTemplate ("" , "" )); // $hasTaintFlow
269
+ sink (UriBuilder .fromPath (taint ()).resolveTemplate ("" , "" , false )); // $hasTaintFlow
270
+ sink (UriBuilder .fromPath ("" ).resolveTemplateFromEncoded (taint (), "" )); // $hasTaintFlow
271
+ sink (UriBuilder .fromPath ("" ).resolveTemplateFromEncoded ("" , taint ())); // $hasTaintFlow
272
+ sink (UriBuilder .fromPath (taint ()).resolveTemplateFromEncoded ("" , "" )); // $hasTaintFlow
273
+
274
+ sink (UriBuilder .fromPath ("" ).resolveTemplates (taint (new HashMap <String , Object >()))); // $hasTaintFlow
275
+ sink (UriBuilder .fromPath ("" ).resolveTemplates (taint (new HashMap <String , Object >()), true )); // $hasTaintFlow
276
+ sink (UriBuilder .fromPath (taint ()).resolveTemplates (new HashMap <String , Object >())); // $hasTaintFlow
277
+ sink (UriBuilder .fromPath (taint ()).resolveTemplates (new HashMap <String , Object >(), false )); // $hasTaintFlow
278
+ sink (UriBuilder .fromPath ("" ).resolveTemplatesFromEncoded (taint (new HashMap <String , Object >()))); // $hasTaintFlow
279
+ sink (UriBuilder .fromPath (taint ()).resolveTemplatesFromEncoded (new HashMap <String , Object >())); // $hasTaintFlow
280
+
281
+ sink (UriBuilder .fromPath ("" ).scheme (taint ())); // $hasTaintFlow
282
+ sink (UriBuilder .fromPath (taint ()).scheme ("" )); // $hasTaintFlow
283
+ sink (UriBuilder .fromPath ("" ).schemeSpecificPart (taint ())); // $hasTaintFlow
284
+ sink (UriBuilder .fromPath (taint ()).schemeSpecificPart ("" )); // $hasTaintFlow
285
+ sink (UriBuilder .fromPath ("" ).segment (taint (), "" )); // $hasTaintFlow
286
+ sink (UriBuilder .fromPath ("" ).segment ("" , "" , taint ())); // $hasTaintFlow
287
+ sink (UriBuilder .fromPath (taint ()).segment ("" , "" )); // $hasTaintFlow
288
+ sink (UriBuilder .fromPath (taint ()).toTemplate ()); // $hasTaintFlow
289
+
290
+ sink (UriBuilder .fromPath ("" ).uri (taint ())); // $hasTaintFlow
291
+ sink (UriBuilder .fromPath (taint ()).uri ("" )); // $hasTaintFlow
292
+ sink (UriBuilder .fromPath ("" ).uri (UriSource .taint ())); // $hasTaintFlow
293
+ sink (UriBuilder .fromPath (taint ()).uri (new URI ("" ))); // $hasTaintFlow
294
+ sink (UriBuilder .fromPath ("" ).userInfo (taint ())); // $hasTaintFlow
295
+ sink (UriBuilder .fromPath (taint ()).userInfo ("" )); // $hasTaintFlow
296
+ }
297
+ }
298
+
299
+ class Dummy {
300
+ private static Set <String > foo () { return null ; }
301
+ }
0 commit comments