Skip to content

Commit 8602a6f

Browse files
committed
Add models for OkHttp and Retrofit
1 parent 1d44694 commit 8602a6f

File tree

113 files changed

+6014
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+6014
-0
lines changed

java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,10 @@ private module Frameworks {
102102
private import semmle.code.java.frameworks.JsonJava
103103
private import semmle.code.java.frameworks.Logging
104104
private import semmle.code.java.frameworks.Objects
105+
private import semmle.code.java.frameworks.OkHttp
105106
private import semmle.code.java.frameworks.Optional
106107
private import semmle.code.java.frameworks.Regex
108+
private import semmle.code.java.frameworks.Retrofit
107109
private import semmle.code.java.frameworks.Stream
108110
private import semmle.code.java.frameworks.Strings
109111
private import semmle.code.java.frameworks.ratpack.Ratpack
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/**
2+
* Provides classes and predicates for working with the OkHttp client.
3+
*/
4+
5+
import java
6+
import semmle.code.java.dataflow.ExternalFlow
7+
8+
private class OkHttpOpenUrlSinks extends SinkModelCsv {
9+
override predicate row(string row) {
10+
row =
11+
[
12+
"okhttp3;Request;true;Request;;;Argument[0];open-url",
13+
"okhttp3;Request$Builder;true;url;;;Argument[0];open-url"
14+
]
15+
}
16+
}
17+
18+
private class OKHttpSummaries extends SummaryModelCsv {
19+
override predicate row(string row) {
20+
row =
21+
[
22+
"okhttp3;HttpUrl;false;parse;;;Argument[0];ReturnValue;taint",
23+
"okhttp3;HttpUrl;false;uri;;;Argument[-1];ReturnValue;taint",
24+
"okhttp3;HttpUrl;false;url;;;Argument[-1];ReturnValue;taint",
25+
"okhttp3;HttpUrl$Builder;false;addEncodedPathSegment;;;Argument[-1];ReturnValue;value",
26+
"okhttp3;HttpUrl$Builder;false;addEncodedPathSegments;;;Argument[-1];ReturnValue;value",
27+
"okhttp3;HttpUrl$Builder;false;addEncodedQueryParameter;;;Argument[-1];ReturnValue;value",
28+
"okhttp3;HttpUrl$Builder;false;addPathSegment;;;Argument[-1];ReturnValue;value",
29+
"okhttp3;HttpUrl$Builder;false;addPathSegments;;;Argument[-1];ReturnValue;value",
30+
"okhttp3;HttpUrl$Builder;false;addQueryParameter;;;Argument[-1];ReturnValue;value",
31+
"okhttp3;HttpUrl$Builder;false;build;;;Argument[-1];ReturnValue;taint",
32+
"okhttp3;HttpUrl$Builder;false;encodedFragment;;;Argument[-1];ReturnValue;value",
33+
"okhttp3;HttpUrl$Builder;false;encodedPassword;;;Argument[-1];ReturnValue;value",
34+
"okhttp3;HttpUrl$Builder;false;encodedPath;;;Argument[-1];ReturnValue;value",
35+
"okhttp3;HttpUrl$Builder;false;encodedQuery;;;Argument[-1];ReturnValue;value",
36+
"okhttp3;HttpUrl$Builder;false;encodedUsername;;;Argument[-1];ReturnValue;value",
37+
"okhttp3;HttpUrl$Builder;false;fragment;;;Argument[-1];ReturnValue;value",
38+
"okhttp3;HttpUrl$Builder;false;fragment;;;Argument[-1];ReturnValue;value",
39+
"okhttp3;HttpUrl$Builder;false;host;;;Argument[-1];ReturnValue;value",
40+
"okhttp3;HttpUrl$Builder;false;password;;;Argument[-1];ReturnValue;value",
41+
"okhttp3;HttpUrl$Builder;false;port;;;Argument[-1];ReturnValue;value",
42+
"okhttp3;HttpUrl$Builder;false;query;;;Argument[-1];ReturnValue;value",
43+
"okhttp3;HttpUrl$Builder;false;removeAllEncodedQueryParameters;;;Argument[-1];ReturnValue;value",
44+
"okhttp3;HttpUrl$Builder;false;removeAllQueryParameters;;;Argument[-1];ReturnValue;value",
45+
"okhttp3;HttpUrl$Builder;false;removePathSegment;;;Argument[-1];ReturnValue;value",
46+
"okhttp3;HttpUrl$Builder;false;scheme;;;Argument[-1];ReturnValue;value",
47+
"okhttp3;HttpUrl$Builder;false;scheme;;;Argument[0];Argument[-1];taint",
48+
"okhttp3;HttpUrl$Builder;false;setEncodedPathSegment;;;Argument[-1];ReturnValue;value",
49+
"okhttp3;HttpUrl$Builder;false;setEncodedQueryParameter;;;Argument[-1];ReturnValue;value",
50+
"okhttp3;HttpUrl$Builder;false;setPathSegment;;;Argument[-1];ReturnValue;value",
51+
"okhttp3;HttpUrl$Builder;false;setQueryParameter;;;Argument[-1];ReturnValue;value",
52+
"okhttp3;HttpUrl$Builder;false;username;;;Argument[-1];ReturnValue;value",
53+
]
54+
}
55+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* Provides classes and predicates for working with the Retrofit API client.
3+
*/
4+
5+
import java
6+
import semmle.code.java.dataflow.ExternalFlow
7+
8+
private class RetrofitOpenUrlSinks extends SinkModelCsv {
9+
override predicate row(string row) {
10+
row = "retrofit2;Retrofit$Builder;true;baseUrl;;;Argument[0];open-url"
11+
}
12+
}
Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
package generatedtest;
2+
3+
import java.net.URI;
4+
import java.net.URL;
5+
import okhttp3.HttpUrl;
6+
import okhttp3.Request;
7+
8+
// Test case generated by GenerateFlowTestCase.ql
9+
public class Test {
10+
11+
Object source() {
12+
return null;
13+
}
14+
15+
void sink(Object o) {}
16+
17+
public void testSinks() {
18+
new Request((HttpUrl) source(), null, null, null, null); // $ hasValueFlow
19+
new Request.Builder().url((String) source()); // $ hasValueFlow
20+
}
21+
22+
public void test() throws Exception {
23+
24+
{
25+
// "okhttp3;HttpUrl$Builder;false;addEncodedPathSegment;;;Argument[-1];ReturnValue;value"
26+
HttpUrl.Builder out = null;
27+
HttpUrl.Builder in = (HttpUrl.Builder) source();
28+
out = in.addEncodedPathSegment(null);
29+
sink(out); // $ hasValueFlow
30+
}
31+
{
32+
// "okhttp3;HttpUrl$Builder;false;addEncodedPathSegments;;;Argument[-1];ReturnValue;value"
33+
HttpUrl.Builder out = null;
34+
HttpUrl.Builder in = (HttpUrl.Builder) source();
35+
out = in.addEncodedPathSegments(null);
36+
sink(out); // $ hasValueFlow
37+
}
38+
{
39+
// "okhttp3;HttpUrl$Builder;false;addEncodedQueryParameter;;;Argument[-1];ReturnValue;value"
40+
HttpUrl.Builder out = null;
41+
HttpUrl.Builder in = (HttpUrl.Builder) source();
42+
out = in.addEncodedQueryParameter(null, null);
43+
sink(out); // $ hasValueFlow
44+
}
45+
{
46+
// "okhttp3;HttpUrl$Builder;false;addPathSegment;;;Argument[-1];ReturnValue;value"
47+
HttpUrl.Builder out = null;
48+
HttpUrl.Builder in = (HttpUrl.Builder) source();
49+
out = in.addPathSegment(null);
50+
sink(out); // $ hasValueFlow
51+
}
52+
{
53+
// "okhttp3;HttpUrl$Builder;false;addPathSegments;;;Argument[-1];ReturnValue;value"
54+
HttpUrl.Builder out = null;
55+
HttpUrl.Builder in = (HttpUrl.Builder) source();
56+
out = in.addPathSegments(null);
57+
sink(out); // $ hasValueFlow
58+
}
59+
{
60+
// "okhttp3;HttpUrl$Builder;false;addQueryParameter;;;Argument[-1];ReturnValue;value"
61+
HttpUrl.Builder out = null;
62+
HttpUrl.Builder in = (HttpUrl.Builder) source();
63+
out = in.addQueryParameter(null, null);
64+
sink(out); // $ hasValueFlow
65+
}
66+
{
67+
// "okhttp3;HttpUrl$Builder;false;build;;;Argument[-1];ReturnValue;taint"
68+
HttpUrl out = null;
69+
HttpUrl.Builder in = (HttpUrl.Builder) source();
70+
out = in.build();
71+
sink(out); // $ hasTaintFlow
72+
}
73+
{
74+
// "okhttp3;HttpUrl$Builder;false;encodedFragment;;;Argument[-1];ReturnValue;value"
75+
HttpUrl.Builder out = null;
76+
HttpUrl.Builder in = (HttpUrl.Builder) source();
77+
out = in.encodedFragment(null);
78+
sink(out); // $ hasValueFlow
79+
}
80+
{
81+
// "okhttp3;HttpUrl$Builder;false;encodedPassword;;;Argument[-1];ReturnValue;value"
82+
HttpUrl.Builder out = null;
83+
HttpUrl.Builder in = (HttpUrl.Builder) source();
84+
out = in.encodedPassword(null);
85+
sink(out); // $ hasValueFlow
86+
}
87+
{
88+
// "okhttp3;HttpUrl$Builder;false;encodedPath;;;Argument[-1];ReturnValue;value"
89+
HttpUrl.Builder out = null;
90+
HttpUrl.Builder in = (HttpUrl.Builder) source();
91+
out = in.encodedPath(null);
92+
sink(out); // $ hasValueFlow
93+
}
94+
{
95+
// "okhttp3;HttpUrl$Builder;false;encodedQuery;;;Argument[-1];ReturnValue;value"
96+
HttpUrl.Builder out = null;
97+
HttpUrl.Builder in = (HttpUrl.Builder) source();
98+
out = in.encodedQuery(null);
99+
sink(out); // $ hasValueFlow
100+
}
101+
{
102+
// "okhttp3;HttpUrl$Builder;false;encodedUsername;;;Argument[-1];ReturnValue;value"
103+
HttpUrl.Builder out = null;
104+
HttpUrl.Builder in = (HttpUrl.Builder) source();
105+
out = in.encodedUsername(null);
106+
sink(out); // $ hasValueFlow
107+
}
108+
{
109+
// "okhttp3;HttpUrl$Builder;false;fragment;;;Argument[-1];ReturnValue;value"
110+
HttpUrl.Builder out = null;
111+
HttpUrl.Builder in = (HttpUrl.Builder) source();
112+
out = in.fragment(null);
113+
sink(out); // $ hasValueFlow
114+
}
115+
{
116+
// "okhttp3;HttpUrl$Builder;false;host;;;Argument[-1];ReturnValue;value"
117+
HttpUrl.Builder out = null;
118+
HttpUrl.Builder in = (HttpUrl.Builder) source();
119+
out = in.host(null);
120+
sink(out); // $ hasValueFlow
121+
}
122+
{
123+
// "okhttp3;HttpUrl$Builder;false;password;;;Argument[-1];ReturnValue;value"
124+
HttpUrl.Builder out = null;
125+
HttpUrl.Builder in = (HttpUrl.Builder) source();
126+
out = in.password(null);
127+
sink(out); // $ hasValueFlow
128+
}
129+
{
130+
// "okhttp3;HttpUrl$Builder;false;port;;;Argument[-1];ReturnValue;value"
131+
HttpUrl.Builder out = null;
132+
HttpUrl.Builder in = (HttpUrl.Builder) source();
133+
out = in.port(0);
134+
sink(out); // $ hasValueFlow
135+
}
136+
{
137+
// "okhttp3;HttpUrl$Builder;false;query;;;Argument[-1];ReturnValue;value"
138+
HttpUrl.Builder out = null;
139+
HttpUrl.Builder in = (HttpUrl.Builder) source();
140+
out = in.query(null);
141+
sink(out); // $ hasValueFlow
142+
}
143+
{
144+
// "okhttp3;HttpUrl$Builder;false;removeAllEncodedQueryParameters;;;Argument[-1];ReturnValue;value"
145+
HttpUrl.Builder out = null;
146+
HttpUrl.Builder in = (HttpUrl.Builder) source();
147+
out = in.removeAllEncodedQueryParameters(null);
148+
sink(out); // $ hasValueFlow
149+
}
150+
{
151+
// "okhttp3;HttpUrl$Builder;false;removeAllQueryParameters;;;Argument[-1];ReturnValue;value"
152+
HttpUrl.Builder out = null;
153+
HttpUrl.Builder in = (HttpUrl.Builder) source();
154+
out = in.removeAllQueryParameters(null);
155+
sink(out); // $ hasValueFlow
156+
}
157+
{
158+
// "okhttp3;HttpUrl$Builder;false;removePathSegment;;;Argument[-1];ReturnValue;value"
159+
HttpUrl.Builder out = null;
160+
HttpUrl.Builder in = (HttpUrl.Builder) source();
161+
out = in.removePathSegment(0);
162+
sink(out); // $ hasValueFlow
163+
}
164+
{
165+
// "okhttp3;HttpUrl$Builder;false;scheme;;;Argument[-1];ReturnValue;value"
166+
HttpUrl.Builder out = null;
167+
HttpUrl.Builder in = (HttpUrl.Builder) source();
168+
out = in.scheme(null);
169+
sink(out); // $ hasValueFlow
170+
}
171+
{
172+
// "okhttp3;HttpUrl$Builder;false;scheme;;;Argument[0];Argument[-1];taint"
173+
HttpUrl.Builder out = null;
174+
String in = (String) source();
175+
out.scheme(in);
176+
sink(out); // $ hasTaintFlow
177+
}
178+
{
179+
// "okhttp3;HttpUrl$Builder;false;setEncodedPathSegment;;;Argument[-1];ReturnValue;value"
180+
HttpUrl.Builder out = null;
181+
HttpUrl.Builder in = (HttpUrl.Builder) source();
182+
out = in.setEncodedPathSegment(0, null);
183+
sink(out); // $ hasValueFlow
184+
}
185+
{
186+
// "okhttp3;HttpUrl$Builder;false;setEncodedQueryParameter;;;Argument[-1];ReturnValue;value"
187+
HttpUrl.Builder out = null;
188+
HttpUrl.Builder in = (HttpUrl.Builder) source();
189+
out = in.setEncodedQueryParameter(null, null);
190+
sink(out); // $ hasValueFlow
191+
}
192+
{
193+
// "okhttp3;HttpUrl$Builder;false;setPathSegment;;;Argument[-1];ReturnValue;value"
194+
HttpUrl.Builder out = null;
195+
HttpUrl.Builder in = (HttpUrl.Builder) source();
196+
out = in.setPathSegment(0, null);
197+
sink(out); // $ hasValueFlow
198+
}
199+
{
200+
// "okhttp3;HttpUrl$Builder;false;setQueryParameter;;;Argument[-1];ReturnValue;value"
201+
HttpUrl.Builder out = null;
202+
HttpUrl.Builder in = (HttpUrl.Builder) source();
203+
out = in.setQueryParameter(null, null);
204+
sink(out); // $ hasValueFlow
205+
}
206+
{
207+
// "okhttp3;HttpUrl$Builder;false;username;;;Argument[-1];ReturnValue;value"
208+
HttpUrl.Builder out = null;
209+
HttpUrl.Builder in = (HttpUrl.Builder) source();
210+
out = in.username(null);
211+
sink(out); // $ hasValueFlow
212+
}
213+
{
214+
// "okhttp3;HttpUrl;false;parse;;;Argument[0];ReturnValue;taint"
215+
HttpUrl out = null;
216+
String in = (String) source();
217+
out = HttpUrl.parse(in);
218+
sink(out); // $ hasTaintFlow
219+
}
220+
{
221+
// "okhttp3;HttpUrl;false;uri;;;Argument[-1];ReturnValue;taint"
222+
URI out = null;
223+
HttpUrl in = (HttpUrl) source();
224+
out = in.uri();
225+
sink(out); // $ hasTaintFlow
226+
}
227+
{
228+
// "okhttp3;HttpUrl;false;url;;;Argument[-1];ReturnValue;taint"
229+
URL out = null;
230+
HttpUrl in = (HttpUrl) source();
231+
out = in.url();
232+
sink(out); // $ hasTaintFlow
233+
}
234+
235+
}
236+
237+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/okhttp-4.9.3

java/ql/test/library-tests/frameworks/okhttp/test.expected

Whitespace-only changes.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import java
2+
import TestUtilities.InlineFlowTest
3+
4+
class FlowConf extends DefaultValueFlowConf {
5+
override predicate isSink(DataFlow::Node n) { super.isSink(n) or sinkNode(n, "open-url") }
6+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import java.net.URL;
2+
import okhttp3.HttpUrl;
3+
import retrofit2.Retrofit;
4+
5+
public class Test {
6+
public Object source() {
7+
return null;
8+
}
9+
10+
public void test() {
11+
Retrofit.Builder builder = new Retrofit.Builder();
12+
builder.baseUrl((String) source()); // $ hasValueFlow
13+
builder.baseUrl((URL) source()); // $ hasValueFlow
14+
builder.baseUrl((HttpUrl) source()); // $ hasValueFlow
15+
}
16+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
//semmle-extractor-options: --javac-args -cp ${testdir}/../../../stubs/okhttp-4.9.3:${testdir}/../../../stubs/retrofit-2.9.0

java/ql/test/library-tests/frameworks/retrofit/test.expected

Whitespace-only changes.

0 commit comments

Comments
 (0)