Skip to content

Commit 30d9299

Browse files
committed
deprecate RequestExpr and ResponseExpr and use ResponseNode and RequestNode instead
1 parent 9cb7522 commit 30d9299

31 files changed

+290
-133
lines changed

javascript/ql/experimental/adaptivethreatmodeling/lib/experimental/adaptivethreatmodeling/NosqlInjectionATM.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ module SinkEndpointFilter {
4242
result = "modeled database access"
4343
or
4444
// Remove calls to APIs that aren't relevant to NoSQL injection
45-
call.getReceiver().asExpr() instanceof HTTP::RequestExpr and
45+
call.getReceiver() instanceof HTTP::RequestNode and
4646
result = "receiver is a HTTP request expression"
4747
or
48-
call.getReceiver().asExpr() instanceof HTTP::ResponseExpr and
48+
call.getReceiver() instanceof HTTP::ResponseNode and
4949
result = "receiver is a HTTP response expression"
5050
)
5151
or

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,22 +108,24 @@ module Connect {
108108
override string getCredentialsKind() { result = kind }
109109
}
110110

111-
class RequestExpr = NodeJSLib::RequestExpr;
111+
deprecated class RequestExpr = NodeJSLib::RequestExpr;
112+
113+
class RequestNode = NodeJSLib::RequestNode;
112114

113115
/**
114116
* An access to a user-controlled Connect request input.
115117
*/
116-
private class RequestInputAccess extends HTTP::RequestInputAccess {
117-
RequestExpr request;
118+
private class RequestInputAccess extends HTTP::RequestInputAccess instanceof DataFlow::MethodCallNode {
119+
RequestNode request;
118120
string kind;
119121

120122
RequestInputAccess() {
121123
request.getRouteHandler() instanceof StandardRouteHandler and
122-
exists(PropAccess cookies |
124+
exists(DataFlow::PropRead cookies |
123125
// `req.cookies.get(<name>)`
124126
kind = "cookie" and
125127
cookies.accesses(request, "cookies") and
126-
this.asExpr().(MethodCallExpr).calls(cookies, "get")
128+
super.calls(cookies, "get")
127129
)
128130
}
129131

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

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -409,22 +409,24 @@ module Express {
409409
*
410410
* `kind` is one of: "error", "request", "response", "next", or "parameter".
411411
*/
412-
abstract Parameter getRouteHandlerParameter(string kind);
412+
abstract Parameter getRouteHandlerParameter(string kind); // TODO: DataFlow::ParameterNode
413413

414414
/**
415415
* Gets the parameter of the route handler that contains the request object.
416416
*/
417-
Parameter getRequestParameter() { result = this.getRouteHandlerParameter("request") }
417+
Parameter getRequestParameter() { result = this.getRouteHandlerParameter("request") } // TODO: DataFlow::ParameterNode
418418

419419
/**
420420
* Gets the parameter of the route handler that contains the response object.
421421
*/
422-
Parameter getResponseParameter() { result = this.getRouteHandlerParameter("response") }
422+
Parameter getResponseParameter() { result = this.getRouteHandlerParameter("response") } // TODO: DataFlow::ParameterNode
423423

424424
/**
425425
* Gets a request body access of this handler.
426426
*/
427-
Expr getARequestBodyAccess() { result.(PropAccess).accesses(this.getARequestExpr(), "body") }
427+
Expr getARequestBodyAccess() {
428+
result.(PropAccess).accesses(this.getARequestNode().asExpr(), "body")
429+
} // TODO: DataFlow::Node
428430
}
429431

430432
/**
@@ -448,7 +450,8 @@ module Express {
448450
* Holds if `call` is a chainable method call on the response object of `handler`.
449451
*/
450452
private predicate isChainableResponseMethodCall(RouteHandler handler, MethodCallExpr call) {
451-
exists(string name | call.calls(handler.getAResponseExpr(), name) |
453+
// TODO: DataFlow::MethodCallNode
454+
exists(string name | call.calls(handler.getAResponseNode().asExpr(), name) |
452455
name =
453456
[
454457
"append", "attachment", "location", "send", "sendStatus", "set", "status", "type", "vary",
@@ -516,16 +519,32 @@ module Express {
516519
}
517520

518521
/**
522+
* DEPRECATED: Use `ResponseNode` instead.
519523
* An Express response expression.
520524
*/
521-
class ResponseExpr extends NodeJSLib::ResponseExpr {
525+
deprecated class ResponseExpr extends NodeJSLib::ResponseExpr {
526+
ResponseExpr() { this.flow() instanceof ResponseNode }
527+
}
528+
529+
/**
530+
* An Express response expression.
531+
*/
532+
class ResponseNode extends NodeJSLib::ResponseNode {
522533
override ResponseSource src;
523534
}
524535

536+
/**
537+
* DEPRECATED: Use `RequestNode` instead.
538+
* An Express request expression.
539+
*/
540+
deprecated class RequestExpr extends NodeJSLib::RequestExpr {
541+
RequestExpr() { this.flow() instanceof RequestNode }
542+
}
543+
525544
/**
526545
* An Express request expression.
527546
*/
528-
class RequestExpr extends NodeJSLib::RequestExpr {
547+
class RequestNode extends NodeJSLib::RequestNode {
529548
override RequestSource src;
530549
}
531550

@@ -679,12 +698,12 @@ module Express {
679698
/**
680699
* Holds if `e` is an HTTP request object.
681700
*/
682-
predicate isRequest(Expr e) { any(RouteHandler rh).getARequestExpr() = e } // TODO: DataFlow::Node
701+
predicate isRequest(Expr e) { any(RouteHandler rh).getARequestNode().asExpr() = e } // TODO: DataFlow::Node
683702

684703
/**
685704
* Holds if `e` is an HTTP response object.
686705
*/
687-
predicate isResponse(Expr e) { any(RouteHandler rh).getAResponseExpr() = e } // TODO: DataFlow::Node
706+
predicate isResponse(Expr e) { any(RouteHandler rh).getAResponseNode().asExpr() = e } // TODO: DataFlow::Node
688707

689708
/**
690709
* An access to the HTTP request body.
@@ -696,9 +715,7 @@ module Express {
696715
abstract private class HeaderDefinition extends HTTP::Servers::StandardHeaderDefinition {
697716
HeaderDefinition() { isResponse(this.getReceiver().asExpr()) }
698717

699-
override RouteHandler getRouteHandler() {
700-
this.getReceiver().asExpr() = result.getAResponseExpr()
701-
}
718+
override RouteHandler getRouteHandler() { this.getReceiver() = result.getAResponseNode() }
702719
}
703720

704721
/**
@@ -876,9 +893,7 @@ module Express {
876893
*
877894
* Example: `router2` for `router1.use(router2)` or `router1.use("/route2", router2)`
878895
*/
879-
RouterDefinition getASubRouter() {
880-
result.ref().flowsTo(this.getARouteSetup().getAnArgument())
881-
}
896+
RouterDefinition getASubRouter() { result.ref().flowsTo(this.getARouteSetup().getAnArgument()) }
882897

883898
/**
884899
* Gets a route handler registered on this router.
@@ -948,7 +963,7 @@ module Express {
948963
DataFlow::MethodCallNode {
949964
ResponseSendFileAsFileSystemAccess() {
950965
exists(string name | name = "sendFile" or name = "sendfile" |
951-
this.calls(any(ResponseExpr res).flow(), name)
966+
this.calls(any(ResponseNode res), name)
952967
)
953968
}
954969

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

Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -208,16 +208,30 @@ module HTTP {
208208
final Servers::ResponseSource getAResponseSource() { result.getRouteHandler() = this }
209209

210210
/**
211+
* DEPRECATED: Use `getARequestNode()` instead.
211212
* Gets an expression that contains a request object handled
212213
* by this handler.
213214
*/
214-
RequestExpr getARequestExpr() { result.getRouteHandler() = this } // TODO: DataFlow::Node
215+
deprecated RequestExpr getARequestExpr() { result.flow() = this.getARequestNode() }
216+
217+
/**
218+
* Gets an expression that contains a request object handled
219+
* by this handler.
220+
*/
221+
RequestNode getARequestNode() { result.getRouteHandler() = this }
222+
223+
/**
224+
* DEPRECATED: Use `getAResponseNode()` instead.
225+
* Gets an expression that contains a response object provided
226+
* by this handler.
227+
*/
228+
deprecated ResponseExpr getAResponseExpr() { result.flow() = this.getAResponseNode() }
215229

216230
/**
217231
* Gets an expression that contains a response object provided
218232
* by this handler.
219233
*/
220-
ResponseExpr getAResponseExpr() { result.getRouteHandler() = this } // TODO: DataFlow::Node
234+
ResponseNode getAResponseNode() { result.getRouteHandler() = this }
221235
}
222236

223237
/**
@@ -244,26 +258,40 @@ module HTTP {
244258
*/
245259
abstract class RouteSetup extends DataFlow::Node { }
246260

261+
/** A dataflow node that may contain a request object. */
262+
abstract class RequestNode extends DataFlow::Node {
263+
/** Gets the route handler that handles this request. */
264+
abstract RouteHandler getRouteHandler();
265+
}
266+
267+
/** An dataflow node that may contain a response object. */
268+
abstract class ResponseNode extends DataFlow::Node {
269+
/** Gets the route handler that handles this request. */
270+
abstract RouteHandler getRouteHandler();
271+
}
272+
247273
/**
274+
* DEPRECATED: Use `RequestNode` instead.
248275
* An expression that may contain a request object.
249276
*/
250-
abstract class RequestExpr extends Expr {
251-
// TODO: DataFlow::Node
277+
deprecated class RequestExpr extends Expr {
278+
RequestExpr() { this.flow() instanceof ResponseNode }
279+
252280
/**
253281
* Gets the route handler that handles this request.
254282
*/
255-
abstract RouteHandler getRouteHandler();
283+
RouteHandler getRouteHandler() { result = this.flow().(ResponseNode).getRouteHandler() }
256284
}
257285

258286
/**
287+
* DEPRECATED: Use `ResponseNode` instead.
259288
* An expression that may contain a response object.
260289
*/
261-
abstract class ResponseExpr extends Expr {
262-
// TODO: DataFlow::Node
290+
deprecated class ResponseExpr extends Expr {
263291
/**
264292
* Gets the route handler that handles this request.
265293
*/
266-
abstract RouteHandler getRouteHandler();
294+
RouteHandler getRouteHandler() { result = this.flow().(ResponseNode).getRouteHandler() }
267295
}
268296

269297
/**
@@ -366,25 +394,49 @@ module HTTP {
366394
/**
367395
* A request expression arising from a request source.
368396
*/
369-
class StandardRequestExpr extends RequestExpr {
397+
class StandardRequestNode extends RequestNode {
370398
RequestSource src;
371399

372-
StandardRequestExpr() { src.ref().flowsTo(DataFlow::valueNode(this)) }
400+
StandardRequestNode() { src.ref().flowsTo(this) }
373401

374402
override RouteHandler getRouteHandler() { result = src.getRouteHandler() }
375403
}
376404

377405
/**
378406
* A response expression arising from a response source.
379407
*/
380-
class StandardResponseExpr extends ResponseExpr {
408+
class StandardResponseNode extends ResponseNode {
381409
ResponseSource src;
382410

383-
StandardResponseExpr() { src.ref().flowsTo(DataFlow::valueNode(this)) }
411+
StandardResponseNode() { src.ref().flowsTo(this) }
384412

385413
override RouteHandler getRouteHandler() { result = src.getRouteHandler() }
386414
}
387415

416+
/**
417+
* A request expression arising from a request source.
418+
*/
419+
deprecated class StandardRequestExpr extends RequestExpr {
420+
RequestSource src;
421+
422+
StandardRequestExpr() { src.ref().flowsToExpr(this) }
423+
424+
override RouteHandler getRouteHandler() { result = src.getRouteHandler() }
425+
}
426+
427+
/**
428+
* A response expression arising from a response source.
429+
*/
430+
deprecated class StandardResponseExpr extends ResponseExpr {
431+
ResponseSource src;
432+
433+
StandardResponseExpr() { src.ref().flowsToExpr(this) }
434+
435+
override RouteHandler getRouteHandler() {
436+
result = this.flow().(StandardResponseNode).getRouteHandler()
437+
}
438+
}
439+
388440
/**
389441
* A standard header definition.
390442
*/

0 commit comments

Comments
 (0)