Skip to content

Commit c6399db

Browse files
committed
simplify the connect model by reusing NodeJSLib::RouteHandler
1 parent c8a5397 commit c6399db

File tree

3 files changed

+8
-79
lines changed

3 files changed

+8
-79
lines changed

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

Lines changed: 6 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ module Connect {
2424
* but support for other kinds of route handlers can be added by implementing
2525
* additional subclasses of this class.
2626
*/
27-
abstract class RouteHandler extends HTTP::Servers::StandardRouteHandler, DataFlow::ValueNode {
27+
abstract class RouteHandler extends HTTP::Servers::StandardRouteHandler, NodeJSLib::RouteHandler,
28+
DataFlow::ValueNode {
2829
/**
2930
* Gets the parameter of kind `kind` of this route handler.
3031
*
@@ -35,12 +36,12 @@ module Connect {
3536
/**
3637
* Gets the parameter of the route handler that contains the request object.
3738
*/
38-
Parameter getRequestParameter() { result = getRouteHandlerParameter("request") }
39+
override Parameter getRequestParameter() { result = getRouteHandlerParameter("request") }
3940

4041
/**
4142
* Gets the parameter of the route handler that contains the response object.
4243
*/
43-
Parameter getResponseParameter() { result = getRouteHandlerParameter("response") }
44+
override Parameter getResponseParameter() { result = getRouteHandlerParameter("response") }
4445
}
4546

4647
/**
@@ -56,50 +57,6 @@ module Connect {
5657
}
5758
}
5859

59-
/**
60-
* A Connect response source, that is, the response parameter of a
61-
* route handler.
62-
*/
63-
private class ResponseSource extends HTTP::Servers::ResponseSource {
64-
RouteHandler rh;
65-
66-
ResponseSource() { this = DataFlow::parameterNode(rh.getResponseParameter()) }
67-
68-
/**
69-
* Gets the route handler that provides this response.
70-
*/
71-
override RouteHandler getRouteHandler() { result = rh }
72-
}
73-
74-
/**
75-
* A Connect request source, that is, the request parameter of a
76-
* route handler.
77-
*/
78-
private class RequestSource extends HTTP::Servers::RequestSource {
79-
RouteHandler rh;
80-
81-
RequestSource() { this = DataFlow::parameterNode(rh.getRequestParameter()) }
82-
83-
/**
84-
* Gets the route handler that handles this request.
85-
*/
86-
override RouteHandler getRouteHandler() { result = rh }
87-
}
88-
89-
/**
90-
* A Node.js HTTP response provided by Connect.
91-
*/
92-
class ResponseExpr extends NodeJSLib::ResponseExpr {
93-
ResponseExpr() { src instanceof ResponseSource }
94-
}
95-
96-
/**
97-
* A Node.js HTTP request provided by Connect.
98-
*/
99-
class RequestExpr extends NodeJSLib::RequestExpr {
100-
RequestExpr() { src instanceof RequestSource }
101-
}
102-
10360
/**
10461
* A call to a Connect method that sets up a route.
10562
*/
@@ -156,10 +113,11 @@ module Connect {
156113
* An access to a user-controlled Connect request input.
157114
*/
158115
private class RequestInputAccess extends HTTP::RequestInputAccess {
159-
RequestExpr request;
116+
NodeJSLib::RequestExpr request;
160117
string kind;
161118

162119
RequestInputAccess() {
120+
request.getRouteHandler() instanceof StandardRouteHandler and
163121
exists(PropAccess cookies |
164122
// `req.cookies.get(<name>)`
165123
kind = "cookie" and
@@ -172,33 +130,4 @@ module Connect {
172130

173131
override string getKind() { result = kind }
174132
}
175-
176-
/**
177-
* A function that flows to a route setup.
178-
*/
179-
private class TrackedRouteHandlerCandidateWithSetup extends RouteHandler,
180-
HTTP::Servers::StandardRouteHandler, DataFlow::FunctionNode {
181-
TrackedRouteHandlerCandidateWithSetup() { this = any(RouteSetup s).getARouteHandler() }
182-
183-
override Parameter getRouteHandlerParameter(string kind) {
184-
result = getRouteHandlerParameter(astNode, kind)
185-
}
186-
}
187-
188-
/**
189-
* A call that looks like a route setup on a Connect server.
190-
*
191-
* For example, this could be the call `router.use(handler)` where
192-
* it is unknown if `router` is a Connect router.
193-
*/
194-
class RouteSetupCandidate extends HTTP::RouteSetupCandidate, DataFlow::MethodCallNode {
195-
DataFlow::ValueNode routeHandlerArg;
196-
197-
RouteSetupCandidate() {
198-
getMethodName() = "use" and
199-
routeHandlerArg = getAnArgument()
200-
}
201-
202-
override DataFlow::ValueNode getARouteHandlerArg() { result = routeHandlerArg }
203-
}
204133
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import javascript
22

3-
query predicate test_RequestExpr(Connect::RequestExpr e, HTTP::RouteHandler res) {
3+
query predicate test_RequestExpr(HTTP::RequestExpr e, HTTP::RouteHandler res) {
44
res = e.getRouteHandler()
55
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import javascript
22

3-
query predicate test_ResponseExpr(Connect::ResponseExpr e, HTTP::RouteHandler res) {
3+
query predicate test_ResponseExpr(HTTP::ResponseExpr e, HTTP::RouteHandler res) {
44
res = e.getRouteHandler()
55
}

0 commit comments

Comments
 (0)