Skip to content

Commit dfb7782

Browse files
committed
replace getA?RouteHandlerExpr with getA?RouteHandlerNode
1 parent 288230d commit dfb7782

File tree

8 files changed

+77
-27
lines changed

8 files changed

+77
-27
lines changed

javascript/ql/lib/semmle/javascript/frameworks/Connect.qll

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,23 @@ module Connect {
7979

8080
private DataFlow::SourceNode getARouteHandler(DataFlow::TypeBackTracker t) {
8181
t.start() and
82-
result = getARouteHandlerExpr().flow().getALocalSource()
82+
result = getARouteHandlerNode().getALocalSource()
8383
or
8484
exists(DataFlow::TypeBackTracker t2 | result = getARouteHandler(t2).backtrack(t2, t))
8585
}
8686

8787
override DataFlow::Node getServer() { result = server }
8888

89-
/** Gets an argument that represents a route handler being registered. */
90-
Expr getARouteHandlerExpr() { result = getAnArgument().asExpr() } // TODO: DataFlow::Node
89+
/**
90+
* DEPRECATED: Use `getARouteHandlerNode` instead.
91+
* Gets an argument that represents a route handler being registered.
92+
*/
93+
deprecated Expr getARouteHandlerExpr() { result = getARouteHandlerNode().asExpr() }
94+
95+
/**
96+
* Gets an argument that represents a route handler being registered.
97+
*/
98+
DataFlow::Node getARouteHandlerNode() { result = getAnArgument() }
9199
}
92100

93101
/** An expression that is passed as `basicAuthConnect(<user>, <password>)`. */

javascript/ql/lib/semmle/javascript/frameworks/Express.qll

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -157,39 +157,65 @@ module Express {
157157
predicate isUseCall() { this.getMethodName() = "use" }
158158

159159
/**
160+
* DEPRECATED: Use `getRouteHandlerNode` instead.
160161
* Gets the `n`th handler registered by this setup, with 0 being the first.
161162
*
162163
* This differs from `getARouteHandler` in that the argument expression is
163164
* returned, not its dataflow source.
164165
*/
165-
Expr getRouteHandlerExpr(int index) {
166-
// TODO: DataFlow::Node
166+
deprecated Expr getRouteHandlerExpr(int index) { result = getRouteHandlerNode(index).asExpr() }
167+
168+
/**
169+
* Gets the `n`th handler registered by this setup, with 0 being the first.
170+
*
171+
* This differs from `getARouteHandler` in that the argument expression is
172+
* returned, not its dataflow source.
173+
*/
174+
DataFlow::Node getRouteHandlerNode(int index) {
167175
// The first argument is a URI pattern if it is a string. If it could possibly be
168176
// a function, we consider it to be a route handler, otherwise a URI pattern.
169177
exists(AnalyzedNode firstArg | firstArg = this.getArgument(0).analyze() |
170178
if firstArg.getAType() = TTFunction()
171-
then result = this.getArgument(index).asExpr()
179+
then result = this.getArgument(index)
172180
else (
173-
index >= 0 and result = this.getArgument(index + 1).asExpr()
181+
index >= 0 and result = this.getArgument(index + 1)
174182
)
175183
)
176184
}
177185

178-
/** Gets an argument that represents a route handler being registered. */
179-
Expr getARouteHandlerExpr() { result = this.getRouteHandlerExpr(_) }
186+
/**
187+
* DEPRECATED: Use `getARouteHandlerNode` instead.
188+
* Gets an argument that represents a route handler being registered.
189+
*/
190+
deprecated Expr getARouteHandlerExpr() { result = this.getRouteHandlerExpr(_) }
180191

181-
/** Gets the last argument representing a route handler being registered. */
182-
Expr getLastRouteHandlerExpr() {
192+
/**
193+
* Gets an argument that represents a route handler being registered.
194+
*/
195+
DataFlow::Node getARouteHandlerNode() { result = this.getRouteHandlerNode(_) }
196+
197+
/**
198+
* DEPRECATED: Use `getLastRouteHandlerExpr` instead.
199+
* Gets the last argument representing a route handler being registered.
200+
*/
201+
deprecated Expr getLastRouteHandlerExpr() {
183202
result = max(int i | | this.getRouteHandlerExpr(i) order by i)
184203
}
185204

205+
/**
206+
* Gets the last argument representing a route handler being registered.
207+
*/
208+
DataFlow::Node getLastRouteHandlerNode() {
209+
result = max(int i | | this.getRouteHandlerNode(i) order by i)
210+
}
211+
186212
override DataFlow::SourceNode getARouteHandler() {
187213
result = this.getARouteHandler(DataFlow::TypeBackTracker::end())
188214
}
189215

190216
private DataFlow::SourceNode getARouteHandler(DataFlow::TypeBackTracker t) {
191217
t.start() and
192-
result = this.getARouteHandlerExpr().flow().getALocalSource()
218+
result = this.getARouteHandlerNode().getALocalSource()
193219
or
194220
exists(DataFlow::TypeBackTracker t2, DataFlow::SourceNode succ |
195221
succ = this.getARouteHandler(t2)
@@ -284,10 +310,11 @@ module Express {
284310
* a function that flows into such an argument.
285311
*/
286312
class RouteHandlerExpr extends Expr {
313+
// TODO: DataFlow::Node
287314
RouteSetup setup;
288315
int index;
289316

290-
RouteHandlerExpr() { this = setup.getRouteHandlerExpr(index) }
317+
RouteHandlerExpr() { this = setup.getRouteHandlerNode(index).asExpr() }
291318

292319
/**
293320
* Gets the setup call that registers this route handler.
@@ -310,7 +337,7 @@ module Express {
310337
*/
311338
predicate isLastHandler() {
312339
not setup.isUseCall() and
313-
not exists(setup.getRouteHandlerExpr(index + 1))
340+
not exists(setup.getRouteHandlerNode(index + 1))
314341
}
315342

316343
/**
@@ -339,7 +366,7 @@ module Express {
339366
index = 0 and
340367
result = setup.getRouter().getMiddlewareStackAt(setup.asExpr().getAPredecessor())
341368
or
342-
index > 0 and result = setup.getRouteHandlerExpr(index - 1)
369+
index > 0 and result = setup.getRouteHandlerNode(index - 1).asExpr()
343370
or
344371
// Outside the router's original container, use the flow-insensitive model of its middleware stack.
345372
// Its state is not tracked to CFG nodes outside its original container.
@@ -920,11 +947,14 @@ module Express {
920947
* If `node` is not in the same container where `router` was defined, the predicate has no result.
921948
*/
922949
Express::RouteHandlerExpr getMiddlewareStackAt(ControlFlowNode node) {
950+
// TODO: DataFlow::Node?
923951
if
924952
exists(Express::RouteSetup setup | node = setup.asExpr() and setup.getRouter() = this |
925953
setup.isUseCall()
926954
)
927-
then result = node.(AST::ValueNode).flow().(Express::RouteSetup).getLastRouteHandlerExpr()
955+
then
956+
result =
957+
node.(AST::ValueNode).flow().(Express::RouteSetup).getLastRouteHandlerNode().asExpr()
928958
else result = this.getMiddlewareStackAt(node.getAPredecessor())
929959
}
930960

javascript/ql/lib/semmle/javascript/frameworks/Fastify.qll

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,15 +147,21 @@ module Fastify {
147147

148148
private DataFlow::SourceNode getARouteHandler(DataFlow::TypeBackTracker t) {
149149
t.start() and
150-
result = this.getARouteHandlerExpr().getALocalSource()
150+
result = this.getARouteHandlerNode().getALocalSource()
151151
or
152152
exists(DataFlow::TypeBackTracker t2 | result = this.getARouteHandler(t2).backtrack(t2, t))
153153
}
154154

155155
override DataFlow::SourceNode getServer() { result = server }
156156

157-
/** Gets an argument that represents a route handler being registered. */
158-
DataFlow::Node getARouteHandlerExpr() {
157+
/**
158+
* DEPRECATED: Use `getARouteHandlerNode` instead.
159+
* Gets an argument that represents a route handler being registered.
160+
*/
161+
deprecated DataFlow::Node getARouteHandlerExpr() { result = this.getARouteHandlerNode() }
162+
163+
/** Gets an argument that represents a route handler being registered. */
164+
DataFlow::Node getARouteHandlerNode() {
159165
if methodName = "route"
160166
then result = this.getOptionArgument(0, getNthHandlerName(_))
161167
else result = this.getLastArgument()

javascript/ql/lib/semmle/javascript/frameworks/Hapi.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ module Hapi {
231231
pragma[noinline]
232232
private DataFlow::Node getRouteHandler() { result = handler }
233233

234-
Expr getRouteHandlerExpr() { result = handler.asExpr() } // TODO: DataFlow::Node
234+
deprecated Expr getRouteHandlerExpr() { result = handler.asExpr() }
235235

236236
override DataFlow::Node getServer() { result = server }
237237
}

javascript/ql/lib/semmle/javascript/frameworks/NodeJSLib.qll

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,9 +290,15 @@ module NodeJSLib {
290290
override DataFlow::Node getServer() { result = server }
291291

292292
/**
293+
* DEPRECATED: Use `getRouteHandlerNode` instead.
293294
* Gets the expression for the handler registered by this setup.
294295
*/
295-
Expr getRouteHandlerExpr() { result = handler.asExpr() } // TODO: DataFlow::Node
296+
deprecated Expr getRouteHandlerExpr() { result = handler.asExpr() }
297+
298+
/**
299+
* Gets the expression for the handler registered by this setup.
300+
*/
301+
DataFlow::Node getRouteHandlerNode() { result = handler }
296302
}
297303

298304
abstract private class HeaderDefinition extends HTTP::Servers::StandardHeaderDefinition {
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import javascript
22

3-
query predicate test_RouteSetup_getARouteHandlerExpr(Express::RouteSetup r, Expr res) {
4-
res = r.getARouteHandlerExpr()
3+
query predicate test_RouteSetup_getARouteHandlerExpr(Express::RouteSetup r, DataFlow::Node res) {
4+
res = r.getARouteHandlerNode()
55
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import javascript
22

3-
query predicate test_RouteSetup_getLastRouteHandlerExpr(Express::RouteSetup r, Expr res) {
4-
res = r.getLastRouteHandlerExpr()
3+
query predicate test_RouteSetup_getLastRouteHandlerExpr(Express::RouteSetup r, DataFlow::Node res) {
4+
res = r.getLastRouteHandlerNode()
55
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import javascript
22

3-
query predicate test_RouteSetup_getRouteHandlerExpr(Express::RouteSetup r, int i, Expr res) {
4-
res = r.getRouteHandlerExpr(i)
3+
query predicate test_RouteSetup_getRouteHandlerExpr(Express::RouteSetup r, int i, DataFlow::Node res) {
4+
res = r.getRouteHandlerNode(i)
55
}

0 commit comments

Comments
 (0)