@@ -83,8 +83,8 @@ class ActionControllerClass extends DataFlow::ClassNode {
83
83
}
84
84
}
85
85
86
- private DataFlow :: LocalSourceNode actionControllerInstance ( ) {
87
- result = any ( ActionControllerClass cls ) .getSelf ( )
86
+ private API :: Node actionControllerInstance ( ) {
87
+ result = any ( ActionControllerClass cls ) .getSelf ( ) . track ( )
88
88
}
89
89
90
90
/**
@@ -222,19 +222,19 @@ private class ActionControllerRenderToCall extends RenderToCallImpl {
222
222
}
223
223
}
224
224
225
+ pragma [ nomagic]
226
+ private DataFlow:: CallNode renderCall ( ) {
227
+ // ActionController#render is an alias for ActionController::Renderer#render
228
+ result =
229
+ [
230
+ any ( ActionControllerClass c ) .trackModule ( ) .getAMethodCall ( "render" ) ,
231
+ any ( ActionControllerClass c ) .trackModule ( ) .getReturn ( "renderer" ) .getAMethodCall ( "render" )
232
+ ]
233
+ }
234
+
225
235
/** A call to `ActionController::Renderer#render`. */
226
236
private class RendererRenderCall extends RenderCallImpl {
227
- RendererRenderCall ( ) {
228
- this =
229
- [
230
- // ActionController#render is an alias for ActionController::Renderer#render
231
- any ( ActionControllerClass c ) .getAnImmediateReference ( ) .getAMethodCall ( "render" ) ,
232
- any ( ActionControllerClass c )
233
- .getAnImmediateReference ( )
234
- .getAMethodCall ( "renderer" )
235
- .getAMethodCall ( "render" )
236
- ] .asExpr ( ) .getExpr ( )
237
- }
237
+ RendererRenderCall ( ) { this = renderCall ( ) .asExpr ( ) .getExpr ( ) }
238
238
}
239
239
240
240
/** A call to `html_escape` from within a controller. */
@@ -260,6 +260,7 @@ class RedirectToCall extends MethodCall {
260
260
this =
261
261
controller
262
262
.getSelf ( )
263
+ .track ( )
263
264
.getAMethodCall ( [ "redirect_to" , "redirect_back" , "redirect_back_or_to" ] )
264
265
.asExpr ( )
265
266
.getExpr ( )
@@ -600,9 +601,7 @@ private module ParamsSummaries {
600
601
* response.
601
602
*/
602
603
private module Response {
603
- DataFlow:: LocalSourceNode response ( ) {
604
- result = actionControllerInstance ( ) .getAMethodCall ( "response" )
605
- }
604
+ API:: Node response ( ) { result = actionControllerInstance ( ) .getReturn ( "response" ) }
606
605
607
606
class BodyWrite extends DataFlow:: CallNode , Http:: Server:: HttpResponse:: Range {
608
607
BodyWrite ( ) { this = response ( ) .getAMethodCall ( "body=" ) }
@@ -628,7 +627,7 @@ private module Response {
628
627
HeaderWrite ( ) {
629
628
// response.header[key] = val
630
629
// response.headers[key] = val
631
- this = response ( ) .getAMethodCall ( [ "header" , "headers" ] ) .getAMethodCall ( "[]=" )
630
+ this = response ( ) .getReturn ( [ "header" , "headers" ] ) .getAMethodCall ( "[]=" )
632
631
or
633
632
// response.set_header(key) = val
634
633
// response[header] = val
@@ -673,18 +672,12 @@ private module Response {
673
672
}
674
673
}
675
674
676
- private class ActionControllerLoggerInstance extends DataFlow:: Node {
677
- ActionControllerLoggerInstance ( ) {
678
- this = actionControllerInstance ( ) .getAMethodCall ( "logger" )
679
- or
680
- any ( ActionControllerLoggerInstance i ) .( DataFlow:: LocalSourceNode ) .flowsTo ( this )
681
- }
682
- }
683
-
684
675
private class ActionControllerLoggingCall extends DataFlow:: CallNode , Logging:: Range {
685
676
ActionControllerLoggingCall ( ) {
686
- this .getReceiver ( ) instanceof ActionControllerLoggerInstance and
687
- this .getMethodName ( ) = [ "debug" , "error" , "fatal" , "info" , "unknown" , "warn" ]
677
+ this =
678
+ actionControllerInstance ( )
679
+ .getReturn ( "logger" )
680
+ .getAMethodCall ( [ "debug" , "error" , "fatal" , "info" , "unknown" , "warn" ] )
688
681
}
689
682
690
683
// Note: this is identical to the definition `stdlib.Logger.LoggerInfoStyleCall`.
0 commit comments