Skip to content

Commit a08b292

Browse files
Add models for Typhoeus::Request
1 parent 9133a13 commit a08b292

File tree

1 file changed

+40
-4
lines changed

1 file changed

+40
-4
lines changed

ruby/ql/lib/codeql/ruby/frameworks/http_clients/Typhoeus.qll

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,30 @@ private import codeql.ruby.DataFlow
1616
*/
1717
class TyphoeusHttpRequest extends Http::Client::Request::Range, DataFlow::CallNode {
1818
API::Node requestNode;
19+
boolean directResponse;
1920

2021
TyphoeusHttpRequest() {
2122
this = requestNode.asSource() and
22-
requestNode =
23-
API::getTopLevelMember("Typhoeus")
24-
.getReturn(["get", "head", "delete", "options", "post", "put", "patch"])
23+
(
24+
directResponse = true and
25+
requestNode =
26+
API::getTopLevelMember("Typhoeus")
27+
.getReturn(["get", "head", "delete", "options", "post", "put", "patch"])
28+
or
29+
directResponse = false and
30+
requestNode = API::getTopLevelMember("Typhoeus").getMember("Request").getReturn("new")
31+
)
2532
}
2633

2734
override DataFlow::Node getAUrlPart() { result = this.getArgument(0) }
2835

29-
override DataFlow::Node getResponseBody() { result = requestNode.getAMethodCall("body") }
36+
override DataFlow::Node getResponseBody() {
37+
directResponse = true and
38+
result = getBodyFromResponse(requestNode)
39+
or
40+
directResponse = false and
41+
result = getBodyFromRequest(requestNode)
42+
}
3043

3144
/** Gets the value that controls certificate validation, if any. */
3245
DataFlow::Node getCertificateValidationControllingValue() {
@@ -55,3 +68,26 @@ private module TyphoeusDisablesCertificateValidationConfig implements DataFlow::
5568

5669
private module TyphoeusDisablesCertificateValidationFlow =
5770
DataFlow::Global<TyphoeusDisablesCertificateValidationConfig>;
71+
72+
private DataFlow::Node getBodyFromRequest(API::Node requestNode) {
73+
result =
74+
[
75+
getBodyFromResponse(getResponseFromRequest(requestNode)),
76+
requestNode.getMethod("on_body").getBlock().getParameter(0).asSource()
77+
]
78+
}
79+
80+
private API::Node getResponseFromRequest(API::Node requestNode) {
81+
result =
82+
[
83+
requestNode.getReturn(["run", "response"]),
84+
requestNode
85+
.getMethod(["on_complete", "on_success", "on_headers", "on_failure", "on_progress"])
86+
.getBlock()
87+
.getParameter(0)
88+
]
89+
}
90+
91+
private DataFlow::Node getBodyFromResponse(API::Node responseNode) {
92+
result = responseNode.getAMethodCall(["body", "response_body"])
93+
}

0 commit comments

Comments
 (0)