Skip to content

Commit 19e8081

Browse files
committed
refactor definesExplicitly to use DataFlow::Node
1 parent ce0175a commit 19e8081

File tree

7 files changed

+32
-23
lines changed

7 files changed

+32
-23
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -737,9 +737,9 @@ module Express {
737737
*/
738738
private DataFlow::SourceNode getAHeaderSource() { result.flowsTo(this.getArgument(0)) }
739739

740-
override predicate definesExplicitly(string headerName, Expr headerValue) {
740+
override predicate definesHeaderValue(string headerName, DataFlow::Node headerValue) {
741741
exists(string header |
742-
this.getAHeaderSource().hasPropertyWrite(header, DataFlow::valueNode(headerValue)) and
742+
this.getAHeaderSource().hasPropertyWrite(header, headerValue) and
743743
headerName = header.toLowerCase()
744744
)
745745
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -392,9 +392,9 @@ module Fastify {
392392
*/
393393
private DataFlow::SourceNode getAHeaderSource() { result.flowsTo(this.getArgument(0)) }
394394

395-
override predicate definesExplicitly(string headerName, Expr headerValue) {
395+
override predicate definesHeaderValue(string headerName, DataFlow::Node headerValue) {
396396
exists(string header |
397-
this.getAHeaderSource().hasPropertyWrite(header, headerValue.flow()) and
397+
this.getAHeaderSource().hasPropertyWrite(header, headerValue) and
398398
headerName = header.toLowerCase()
399399
)
400400
}

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

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,19 +56,25 @@ module HTTP {
5656
* An expression that sets HTTP response headers explicitly.
5757
*/
5858
abstract class ExplicitHeaderDefinition extends HeaderDefinition {
59-
override string getAHeaderName() { this.definesExplicitly(result, _) }
59+
override string getAHeaderName() { this.definesHeaderValue(result, _) }
6060

6161
override predicate defines(string headerName, string headerValue) {
62-
exists(Expr e |
63-
this.definesExplicitly(headerName, e) and
62+
exists(DataFlow::Node e |
63+
this.definesHeaderValue(headerName, e) and
6464
headerValue = e.getStringValue()
6565
)
6666
}
6767

6868
/**
69+
* DEPRECATED: use `definesHeaderValue` instead.
6970
* Holds if the header with (lower-case) name `headerName` is set to the value of `headerValue`.
7071
*/
71-
abstract predicate definesExplicitly(string headerName, Expr headerValue); // TODO: DataFlow::Node.
72+
deprecated predicate definesExplicitly(string headerName, Expr headerValue) {
73+
this.definesHeaderValue(headerName, headerValue.flow())
74+
}
75+
76+
/** Holds if the header with (lower-case) name `headerName` is set to the value of `headerValue`. */
77+
abstract predicate definesHeaderValue(string headerName, DataFlow::Node headerValue);
7278

7379
/**
7480
* DEPRECATED: Use `getNameNode()` instead.
@@ -128,20 +134,21 @@ module HTTP {
128134
* An expression that sets a cookie in an HTTP response.
129135
*/
130136
abstract class CookieDefinition extends Expr {
137+
// TODO: DataFlow::Node
131138
/**
132139
* Gets the argument, if any, specifying the raw cookie header.
133140
*/
134-
Expr getHeaderArgument() { none() }
141+
Expr getHeaderArgument() { none() } // TODO: DataFlow::Node
135142

136143
/**
137144
* Gets the argument, if any, specifying the cookie name.
138145
*/
139-
Expr getNameArgument() { none() }
146+
Expr getNameArgument() { none() } // TODO: DataFlow::Node
140147

141148
/**
142149
* Gets the argument, if any, specifying the cookie value.
143150
*/
144-
Expr getValueArgument() { none() }
151+
Expr getValueArgument() { none() } // TODO: DataFlow::Node
145152

146153
/** Gets the route handler that sets this cookie. */
147154
abstract RouteHandler getRouteHandler();
@@ -159,7 +166,7 @@ module HTTP {
159166
}
160167

161168
override Expr getHeaderArgument() {
162-
header.(ExplicitHeaderDefinition).definesExplicitly("set-cookie", result)
169+
header.(ExplicitHeaderDefinition).definesHeaderValue("set-cookie", result.flow())
163170
}
164171

165172
override RouteHandler getRouteHandler() { result = header.getRouteHandler() }
@@ -384,9 +391,9 @@ module HTTP {
384391
*/
385392
abstract class StandardHeaderDefinition extends ExplicitHeaderDefinition,
386393
DataFlow::MethodCallNode {
387-
override predicate definesExplicitly(string headerName, Expr headerValue) {
394+
override predicate definesHeaderValue(string headerName, DataFlow::Node headerValue) {
388395
headerName = this.getNameNode().getStringValue().toLowerCase() and
389-
headerValue = this.getArgument(1).asExpr()
396+
headerValue = this.getArgument(1)
390397
}
391398

392399
override DataFlow::Node getNameNode() { result = this.getArgument(0) }

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,11 +280,11 @@ module NodeJSLib {
280280
this.getNumArgument() >= 1
281281
}
282282

283-
override predicate definesExplicitly(string headerName, Expr headerValue) {
283+
override predicate definesHeaderValue(string headerName, DataFlow::Node headerValue) {
284284
this.getNumArgument() > 1 and
285285
exists(DataFlow::SourceNode headers, string header |
286286
headers.flowsTo(this.getLastArgument()) and
287-
headers.hasPropertyWrite(header, DataFlow::valueNode(headerValue)) and
287+
headers.hasPropertyWrite(header, headerValue) and
288288
headerName = header.toLowerCase()
289289
)
290290
}

javascript/ql/lib/semmle/javascript/security/dataflow/CorsMisconfigurationForCredentialsCustomizations.qll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,12 @@ module CorsMisconfigurationForCredentials {
4646
CorsOriginHeaderWithAssociatedCredentialHeader() {
4747
exists(
4848
HTTP::RouteHandler routeHandler, HTTP::ExplicitHeaderDefinition origin,
49-
Expr credentialsValue
49+
DataFlow::Node credentialsValue
5050
|
5151
routeHandler.getAResponseHeader(_) = origin and
5252
routeHandler.getAResponseHeader(_) = credentials and
53-
origin.definesExplicitly("access-control-allow-origin", this.asExpr()) and
54-
credentials.definesExplicitly("access-control-allow-credentials", credentialsValue)
53+
origin.definesHeaderValue("access-control-allow-origin", this) and
54+
credentials.definesHeaderValue("access-control-allow-credentials", credentialsValue)
5555
|
5656
credentialsValue.mayHaveBooleanValue(true) or
5757
credentialsValue.mayHaveStringValue("true")

javascript/ql/lib/semmle/javascript/security/dataflow/ServerSideUrlRedirectCustomizations.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ module ServerSideUrlRedirect {
4141
* A definition of the HTTP "Location" header, considered as a sink for
4242
* `Configuration`.
4343
*/
44-
class LocationHeaderSink extends Sink, DataFlow::ValueNode {
44+
class LocationHeaderSink extends Sink {
4545
LocationHeaderSink() {
46-
any(HTTP::ExplicitHeaderDefinition def).definesExplicitly("location", astNode)
46+
any(HTTP::ExplicitHeaderDefinition def).definesHeaderValue("location", this)
4747
}
4848
}
4949

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import javascript
22

3-
query predicate test_HeaderDefinition_getNameExpr(HTTP::ExplicitHeaderDefinition hd, Expr res) {
4-
hd.getRouteHandler() instanceof Express::RouteHandler and res = hd.getNameExpr()
3+
query predicate test_HeaderDefinition_getNameExpr(
4+
HTTP::ExplicitHeaderDefinition hd, DataFlow::Node res
5+
) {
6+
hd.getRouteHandler() instanceof Express::RouteHandler and res = hd.getNameNode()
57
}

0 commit comments

Comments
 (0)