Skip to content

Commit bb3b973

Browse files
committed
Ruby: use new features in ActionController
1 parent fbfa319 commit bb3b973

File tree

1 file changed

+20
-27
lines changed

1 file changed

+20
-27
lines changed

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

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ class ActionControllerClass extends DataFlow::ClassNode {
8383
}
8484
}
8585

86-
private DataFlow::LocalSourceNode actionControllerInstance() {
87-
result = any(ActionControllerClass cls).getSelf()
86+
private API::Node actionControllerInstance() {
87+
result = any(ActionControllerClass cls).getSelf().track()
8888
}
8989

9090
/**
@@ -222,19 +222,19 @@ private class ActionControllerRenderToCall extends RenderToCallImpl {
222222
}
223223
}
224224

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+
225235
/** A call to `ActionController::Renderer#render`. */
226236
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() }
238238
}
239239

240240
/** A call to `html_escape` from within a controller. */
@@ -260,6 +260,7 @@ class RedirectToCall extends MethodCall {
260260
this =
261261
controller
262262
.getSelf()
263+
.track()
263264
.getAMethodCall(["redirect_to", "redirect_back", "redirect_back_or_to"])
264265
.asExpr()
265266
.getExpr()
@@ -600,9 +601,7 @@ private module ParamsSummaries {
600601
* response.
601602
*/
602603
private module Response {
603-
DataFlow::LocalSourceNode response() {
604-
result = actionControllerInstance().getAMethodCall("response")
605-
}
604+
API::Node response() { result = actionControllerInstance().getReturn("response") }
606605

607606
class BodyWrite extends DataFlow::CallNode, Http::Server::HttpResponse::Range {
608607
BodyWrite() { this = response().getAMethodCall("body=") }
@@ -628,7 +627,7 @@ private module Response {
628627
HeaderWrite() {
629628
// response.header[key] = val
630629
// response.headers[key] = val
631-
this = response().getAMethodCall(["header", "headers"]).getAMethodCall("[]=")
630+
this = response().getReturn(["header", "headers"]).getAMethodCall("[]=")
632631
or
633632
// response.set_header(key) = val
634633
// response[header] = val
@@ -673,18 +672,12 @@ private module Response {
673672
}
674673
}
675674

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-
684675
private class ActionControllerLoggingCall extends DataFlow::CallNode, Logging::Range {
685676
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"])
688681
}
689682

690683
// Note: this is identical to the definition `stdlib.Logger.LoggerInfoStyleCall`.

0 commit comments

Comments
 (0)