Skip to content

Commit 9aea725

Browse files
authored
Merge pull request github#12053 from hmac/actioncontroller-renderer-2
Ruby: Model ApplicationController.renderer
2 parents 49be5fd + 4e07fd3 commit 9aea725

File tree

5 files changed

+47
-16
lines changed

5 files changed

+47
-16
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Calls to `ApplicationController#render` and `ApplicationController::Renderer#render` are recognized as Rails rendering calls.

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,21 @@ private class ActionControllerRenderToCall extends RenderToCallImpl {
364364
}
365365
}
366366

367+
/** A call to `ActionController::Renderer#render`. */
368+
private class RendererRenderCall extends RenderCallImpl {
369+
RendererRenderCall() {
370+
this =
371+
[
372+
// ActionController#render is an alias for ActionController::Renderer#render
373+
any(ActionControllerClass c).getAnImmediateReference().getAMethodCall("render"),
374+
any(ActionControllerClass c)
375+
.getAnImmediateReference()
376+
.getAMethodCall("renderer")
377+
.getAMethodCall("render")
378+
].asExpr().getExpr()
379+
}
380+
}
381+
367382
/** A call to `html_escape` from within a controller. */
368383
private class ActionControllerHtmlEscapeCall extends HtmlEscapeCallImpl {
369384
ActionControllerHtmlEscapeCall() {

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ actionControllerControllerClasses
33
| controllers/comments_controller.rb:1:1:104:3 | CommentsController |
44
| controllers/foo/bars_controller.rb:3:1:46:3 | BarsController |
55
| controllers/photos_controller.rb:1:1:10:3 | PhotosController |
6-
| controllers/posts_controller.rb:1:1:30:3 | PostsController |
6+
| controllers/posts_controller.rb:1:1:32:3 | PostsController |
77
| controllers/tags_controller.rb:1:1:2:3 | TagsController |
88
| controllers/users/notifications_controller.rb:2:3:5:5 | Users::NotificationsController |
99
| input_access.rb:1:1:50:3 | UsersController |
@@ -23,9 +23,9 @@ actionControllerActionMethods
2323
| controllers/foo/bars_controller.rb:34:3:39:5 | show_2 |
2424
| controllers/photos_controller.rb:3:3:6:5 | show |
2525
| controllers/photos_controller.rb:8:3:9:5 | foo |
26-
| controllers/posts_controller.rb:12:3:13:5 | index |
27-
| controllers/posts_controller.rb:15:3:16:5 | show |
28-
| controllers/posts_controller.rb:18:3:19:5 | upvote |
26+
| controllers/posts_controller.rb:12:3:15:5 | index |
27+
| controllers/posts_controller.rb:17:3:18:5 | show |
28+
| controllers/posts_controller.rb:20:3:21:5 | upvote |
2929
| controllers/users/notifications_controller.rb:3:5:4:7 | mark_as_read |
3030
| input_access.rb:2:3:49:5 | index |
3131
| logging.rb:2:5:8:7 | index |
@@ -71,7 +71,7 @@ paramsCalls
7171
| controllers/foo/bars_controller.rb:14:10:14:15 | call to params |
7272
| controllers/foo/bars_controller.rb:21:21:21:26 | call to params |
7373
| controllers/foo/bars_controller.rb:22:10:22:15 | call to params |
74-
| controllers/posts_controller.rb:24:23:24:28 | call to params |
74+
| controllers/posts_controller.rb:26:23:26:28 | call to params |
7575
| params_flow.rb:3:10:3:15 | call to params |
7676
| params_flow.rb:7:10:7:15 | call to params |
7777
| params_flow.rb:11:10:11:15 | call to params |
@@ -126,7 +126,7 @@ paramsSources
126126
| controllers/foo/bars_controller.rb:14:10:14:15 | call to params |
127127
| controllers/foo/bars_controller.rb:21:21:21:26 | call to params |
128128
| controllers/foo/bars_controller.rb:22:10:22:15 | call to params |
129-
| controllers/posts_controller.rb:24:23:24:28 | call to params |
129+
| controllers/posts_controller.rb:26:23:26:28 | call to params |
130130
| params_flow.rb:3:10:3:15 | call to params |
131131
| params_flow.rb:7:10:7:15 | call to params |
132132
| params_flow.rb:11:10:11:15 | call to params |
@@ -191,7 +191,7 @@ httpInputAccesses
191191
| controllers/foo/bars_controller.rb:14:10:14:15 | call to params | ActionController::Metal#params |
192192
| controllers/foo/bars_controller.rb:21:21:21:26 | call to params | ActionController::Metal#params |
193193
| controllers/foo/bars_controller.rb:22:10:22:15 | call to params | ActionController::Metal#params |
194-
| controllers/posts_controller.rb:24:23:24:28 | call to params | ActionController::Metal#params |
194+
| controllers/posts_controller.rb:26:23:26:28 | call to params | ActionController::Metal#params |
195195
| input_access.rb:3:5:3:18 | call to params | ActionDispatch::Request#params |
196196
| input_access.rb:4:5:4:22 | call to parameters | ActionDispatch::Request#parameters |
197197
| input_access.rb:5:5:5:15 | call to GET | ActionDispatch::Request#GET |
@@ -297,6 +297,9 @@ renderCalls
297297
| controllers/foo/bars_controller.rb:35:5:35:33 | call to render |
298298
| controllers/foo/bars_controller.rb:38:5:38:50 | call to render |
299299
| controllers/foo/bars_controller.rb:44:5:44:17 | call to render |
300+
| controllers/posts_controller.rb:13:5:13:51 | call to render |
301+
| controllers/posts_controller.rb:14:5:14:127 | call to render |
302+
| controllers/posts_controller.rb:36:5:36:51 | call to render |
300303
httpResponses
301304
| controllers/comments_controller.rb:26:5:26:17 | call to body= | controllers/comments_controller.rb:26:21:26:34 | ... = ... |
302305
| controllers/comments_controller.rb:36:5:36:37 | call to send_file | controllers/comments_controller.rb:36:24:36:36 | "my-file.ext" |

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@
4242
| controllers/comments_controller.rb:68:3:70:5 | destroy | controllers/comments_controller.rb:102:3:103:5 | bar | controllers/comments_controller.rb:68:3:70:5 | destroy |
4343
| controllers/photos_controller.rb:3:3:6:5 | show | controllers/application_controller.rb:10:3:12:5 | log_request | controllers/photos_controller.rb:3:3:6:5 | show |
4444
| controllers/photos_controller.rb:3:3:6:5 | show | controllers/photos_controller.rb:3:3:6:5 | show | controllers/photos_controller.rb:8:3:9:5 | foo |
45-
| controllers/posts_controller.rb:12:3:13:5 | index | controllers/application_controller.rb:6:3:8:5 | set_user | controllers/posts_controller.rb:12:3:13:5 | index |
46-
| controllers/posts_controller.rb:12:3:13:5 | index | controllers/application_controller.rb:10:3:12:5 | log_request | controllers/application_controller.rb:6:3:8:5 | set_user |
47-
| controllers/posts_controller.rb:15:3:16:5 | show | controllers/application_controller.rb:6:3:8:5 | set_user | controllers/posts_controller.rb:15:3:16:5 | show |
48-
| controllers/posts_controller.rb:15:3:16:5 | show | controllers/application_controller.rb:10:3:12:5 | log_request | controllers/posts_controller.rb:23:3:25:5 | set_post |
49-
| controllers/posts_controller.rb:15:3:16:5 | show | controllers/posts_controller.rb:23:3:25:5 | set_post | controllers/application_controller.rb:6:3:8:5 | set_user |
50-
| controllers/posts_controller.rb:18:3:19:5 | upvote | controllers/application_controller.rb:6:3:8:5 | set_user | controllers/posts_controller.rb:18:3:19:5 | upvote |
51-
| controllers/posts_controller.rb:18:3:19:5 | upvote | controllers/application_controller.rb:10:3:12:5 | log_request | controllers/posts_controller.rb:23:3:25:5 | set_post |
52-
| controllers/posts_controller.rb:18:3:19:5 | upvote | controllers/posts_controller.rb:18:3:19:5 | upvote | controllers/posts_controller.rb:27:3:29:5 | log_upvote |
53-
| controllers/posts_controller.rb:18:3:19:5 | upvote | controllers/posts_controller.rb:23:3:25:5 | set_post | controllers/application_controller.rb:6:3:8:5 | set_user |
45+
| controllers/posts_controller.rb:12:3:15:5 | index | controllers/application_controller.rb:6:3:8:5 | set_user | controllers/posts_controller.rb:12:3:15:5 | index |
46+
| controllers/posts_controller.rb:12:3:15:5 | index | controllers/application_controller.rb:10:3:12:5 | log_request | controllers/application_controller.rb:6:3:8:5 | set_user |
47+
| controllers/posts_controller.rb:17:3:18:5 | show | controllers/application_controller.rb:6:3:8:5 | set_user | controllers/posts_controller.rb:17:3:18:5 | show |
48+
| controllers/posts_controller.rb:17:3:18:5 | show | controllers/application_controller.rb:10:3:12:5 | log_request | controllers/posts_controller.rb:25:3:27:5 | set_post |
49+
| controllers/posts_controller.rb:17:3:18:5 | show | controllers/posts_controller.rb:25:3:27:5 | set_post | controllers/application_controller.rb:6:3:8:5 | set_user |
50+
| controllers/posts_controller.rb:20:3:21:5 | upvote | controllers/application_controller.rb:6:3:8:5 | set_user | controllers/posts_controller.rb:20:3:21:5 | upvote |
51+
| controllers/posts_controller.rb:20:3:21:5 | upvote | controllers/application_controller.rb:10:3:12:5 | log_request | controllers/posts_controller.rb:25:3:27:5 | set_post |
52+
| controllers/posts_controller.rb:20:3:21:5 | upvote | controllers/posts_controller.rb:20:3:21:5 | upvote | controllers/posts_controller.rb:29:3:31:5 | log_upvote |
53+
| controllers/posts_controller.rb:20:3:21:5 | upvote | controllers/posts_controller.rb:25:3:27:5 | set_post | controllers/application_controller.rb:6:3:8:5 | set_user |

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ class PostsController < ApplicationController
1010
before_action :set_user
1111

1212
def index
13+
PostsController.render(template: "posts/index")
14+
PostsController.renderer.render(template: "posts/index", locals: { show_full_post: true }, assigns: { @posts => Post.all })
1315
end
1416

1517
def show
@@ -28,3 +30,10 @@ def log_upvote
2830
Rails.logger.info("Post upvoted: #{@post.id}")
2931
end
3032
end
33+
34+
class NotAController
35+
def foo
36+
PostsController.render(template: "posts/index")
37+
end
38+
end
39+

0 commit comments

Comments
 (0)