Skip to content

Commit 9f35783

Browse files
committed
Ruby: Model send_data as an HTTP response
1 parent 5cfc494 commit 9f35783

File tree

4 files changed

+47
-2
lines changed

4 files changed

+47
-2
lines changed

ruby/ql/lib/codeql/ruby/frameworks/ActionController.qll

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,12 +539,38 @@ private class ActionControllerProtectFromForgeryCall extends CsrfProtectionSetti
539539
/**
540540
* A call to `send_file`, which sends the file at the given path to the client.
541541
*/
542-
private class SendFile extends FileSystemAccess::Range, DataFlow::CallNode {
542+
private class SendFile extends FileSystemAccess::Range, Http::Server::HttpResponse::Range,
543+
DataFlow::CallNode {
543544
SendFile() {
544545
this = [actionControllerInstance(), Response::response()].getAMethodCall("send_file")
545546
}
546547

547548
override DataFlow::Node getAPathArgument() { result = this.getArgument(0) }
549+
550+
override DataFlow::Node getBody() { result = this.getArgument(0) }
551+
552+
override DataFlow::Node getMimetypeOrContentTypeArg() { none() }
553+
554+
override string getMimetypeDefault() { result = "application/octet-stream" }
555+
}
556+
557+
/**
558+
* A call to `send_data`, which sends the given data to the client.
559+
*/
560+
class SendDataCall extends DataFlow::CallNode, Http::Server::HttpResponse::Range {
561+
SendDataCall() {
562+
this.getMethodName() = "send_data" and
563+
(
564+
this.asExpr().getExpr() instanceof ActionControllerContextCall or
565+
this.getReceiver().asExpr().getExpr() instanceof Response::ResponseCall
566+
)
567+
}
568+
569+
override DataFlow::Node getBody() { result = this.getArgument(0) }
570+
571+
override DataFlow::Node getMimetypeOrContentTypeArg() { none() }
572+
573+
override string getMimetypeDefault() { result = "application/octet-stream" }
548574
}
549575

550576
private module ParamsSummaries {

ruby/ql/test/library-tests/frameworks/action_controller/ActionController.expected

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
actionControllerControllerClasses
2-
| controllers/comments_controller.rb:1:1:45:3 | CommentsController |
2+
| controllers/comments_controller.rb:1:1:49:3 | CommentsController |
33
| controllers/foo/bars_controller.rb:3:1:46:3 | BarsController |
44
| controllers/photos_controller.rb:1:1:4:3 | PhotosController |
55
| controllers/posts_controller.rb:1:1:10:3 | PostsController |
@@ -11,6 +11,7 @@ actionControllerControllerClasses
1111
actionControllerActionMethods
1212
| controllers/comments_controller.rb:2:3:36:5 | index |
1313
| controllers/comments_controller.rb:38:3:44:5 | show |
14+
| controllers/comments_controller.rb:46:3:48:5 | photo |
1415
| controllers/foo/bars_controller.rb:5:3:7:5 | index |
1516
| controllers/foo/bars_controller.rb:9:3:18:5 | show_debug |
1617
| controllers/foo/bars_controller.rb:20:3:24:5 | show |
@@ -262,6 +263,16 @@ renderCalls
262263
| controllers/foo/bars_controller.rb:35:5:35:33 | call to render |
263264
| controllers/foo/bars_controller.rb:38:5:38:50 | call to render |
264265
| controllers/foo/bars_controller.rb:44:5:44:17 | call to render |
266+
httpResponses
267+
| controllers/comments_controller.rb:11:5:11:17 | call to body= | controllers/comments_controller.rb:11:21:11:34 | ... = ... |
268+
| controllers/comments_controller.rb:21:5:21:37 | call to send_file | controllers/comments_controller.rb:21:24:21:36 | "my-file.ext" |
269+
| controllers/comments_controller.rb:47:5:47:20 | call to send_data | controllers/comments_controller.rb:47:15:47:20 | @photo |
270+
| controllers/foo/bars_controller.rb:15:16:15:97 | call to render_to_string | controllers/foo/bars_controller.rb:15:33:15:47 | "foo/bars/show" |
271+
| controllers/foo/bars_controller.rb:23:5:23:76 | call to render | controllers/foo/bars_controller.rb:23:12:23:26 | "foo/bars/show" |
272+
| controllers/foo/bars_controller.rb:35:5:35:33 | call to render | controllers/foo/bars_controller.rb:35:18:35:33 | call to [] |
273+
| controllers/foo/bars_controller.rb:36:12:36:67 | call to render_to_string | controllers/foo/bars_controller.rb:36:29:36:33 | @user |
274+
| controllers/foo/bars_controller.rb:38:5:38:50 | call to render | controllers/foo/bars_controller.rb:38:12:38:22 | call to backtrace |
275+
| controllers/foo/bars_controller.rb:44:5:44:17 | call to render | controllers/foo/bars_controller.rb:44:12:44:17 | "show" |
265276
actionControllerHelperMethods
266277
getAssociatedControllerClasses
267278
controllerTemplateFiles

ruby/ql/test/library-tests/frameworks/action_controller/ActionController.ql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ query predicate redirectToCalls(RedirectToCall c) { any() }
2525

2626
query predicate renderCalls(Rails::RenderCall c) { any() }
2727

28+
query predicate httpResponses(Http::Server::HttpResponse r, DataFlow::Node body) {
29+
body = r.getBody()
30+
}
31+
2832
query predicate actionControllerHelperMethods(ActionControllerHelperMethod m) { any() }
2933

3034
query predicate getAssociatedControllerClasses(ActionControllerClass cls, ErbFile f) {

ruby/ql/test/library-tests/frameworks/action_controller/controllers/comments_controller.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,8 @@ def show
4242
format.xml { render xml: @comment.to_xml(include: @photo) }
4343
end
4444
end
45+
46+
def photo
47+
send_data @photo
48+
end
4549
end

0 commit comments

Comments
 (0)