@@ -24,7 +24,7 @@ module Koa {
2424
2525 HeaderDefinition ( ) {
2626 // ctx.set('Cache-Control', 'no-cache');
27- astNode .calls ( rh .getAContextExpr ( ) , "set" )
27+ astNode .calls ( rh .getAResponseOrContextExpr ( ) , "set" )
2828 or
2929 // ctx.response.header('Cache-Control', 'no-cache')
3030 astNode .calls ( rh .getAResponseExpr ( ) , "header" )
@@ -58,6 +58,23 @@ module Koa {
5858 * route handler.
5959 */
6060 Expr getAContextExpr ( ) { result .( ContextExpr ) .getRouteHandler ( ) = this }
61+
62+ /**
63+ * Gets an expression that contains the context or response
64+ * object of a route handler invocation.
65+ */
66+ Expr getAResponseOrContextExpr ( ) {
67+ result = getAResponseExpr ( ) or result = getAContextExpr ( )
68+ }
69+
70+ /**
71+ * Gets an expression that contains the context or request
72+ * object of a route handler invocation.
73+ */
74+ Expr getARequestOrContextExpr ( ) {
75+ result = getARequestExpr ( ) or result = getAContextExpr ( )
76+ }
77+
6178 }
6279
6380 /**
@@ -159,35 +176,39 @@ module Koa {
159176 string kind ;
160177
161178 RequestInputAccess ( ) {
162- exists ( Expr request | request = rh .getARequestExpr ( ) |
163- // `ctx.request.body`
164- kind = "body" and
165- this .asExpr ( ) .( PropAccess ) .accesses ( request , "body" )
166- or
167- kind = "parameter" and
168- this = getAQueryParameterAccess ( rh )
169- or
179+ kind = "parameter" and
180+ this = getAQueryParameterAccess ( rh )
181+ or
182+ exists ( Expr e | rh .getARequestOrContextExpr ( ) = e |
183+ // `ctx.request.url`, `ctx.request.originalUrl`, or `ctx.request.href`
170184 exists ( string propName |
171- // `ctx.request.url`, `ctx.request.originalUrl`, or `ctx.request.href`
172185 kind = "url" and
173- this .asExpr ( ) .( PropAccess ) .accesses ( request , propName )
174- |
175- propName = "url" or
176- propName = "originalUrl" or
186+ this .asExpr ( ) .( PropAccess ) .accesses ( e , propName )
187+ |
188+ propName = "url"
189+ or
190+ propName = "originalUrl"
191+ or
177192 propName = "href"
178193 )
179- )
180- or
181- exists ( PropAccess cookies |
194+ or
195+ // `ctx.request.body`
196+ e instanceof RequestExpr and
197+ kind = "body" and
198+ this .asExpr ( ) .( PropAccess ) .accesses ( e , "body" )
199+ or
182200 // `ctx.cookies.get(<name>)`
183- kind = "cookie" and
184- cookies .accesses ( rh .getAContextExpr ( ) , "cookies" ) and
185- this .asExpr ( ) .( MethodCallExpr ) .calls ( cookies , "get" )
186- )
187- or
188- exists ( RequestHeaderAccess access | access = this |
189- rh = access .getRouteHandler ( ) and
190- kind = "header"
201+ exists ( PropAccess cookies |
202+ e instanceof ContextExpr and
203+ kind = "cookie" and
204+ cookies .accesses ( e , "cookies" ) and
205+ this .asExpr ( ) .( MethodCallExpr ) .calls ( cookies , "get" )
206+ )
207+ or
208+ exists ( RequestHeaderAccess access | access = this |
209+ rh = access .getRouteHandler ( ) and
210+ kind = "header"
211+ )
191212 )
192213 }
193214
@@ -199,8 +220,8 @@ module Koa {
199220 }
200221
201222 private DataFlow:: Node getAQueryParameterAccess ( RouteHandler rh ) {
202- // `ctx.request.query.name`
203- result .asExpr ( ) .( PropAccess ) .getBase ( ) .( PropAccess ) .accesses ( rh .getARequestExpr ( ) , "query" )
223+ // `ctx.query.name` or `ctx. request.query.name`
224+ result .asExpr ( ) .( PropAccess ) .getBase ( ) .( PropAccess ) .accesses ( rh .getARequestOrContextExpr ( ) , "query" )
204225 }
205226
206227 /**
@@ -210,18 +231,18 @@ module Koa {
210231 RouteHandler rh ;
211232
212233 RequestHeaderAccess ( ) {
213- exists ( Expr request | request = rh .getARequestExpr ( ) |
234+ exists ( Expr e | e = rh .getARequestOrContextExpr ( ) |
214235 exists ( string propName , PropAccess headers |
215236 // `ctx.request.header.<name>`, `ctx.request.headers.<name>`
216- headers .accesses ( request , propName ) and
237+ headers .accesses ( e , propName ) and
217238 this .asExpr ( ) .( PropAccess ) .accesses ( headers , _)
218239 |
219240 propName = "header" or
220241 propName = "headers"
221242 )
222243 or
223244 // `ctx.request.get(<name>)`
224- this .asExpr ( ) .( MethodCallExpr ) .calls ( request , "get" )
245+ this .asExpr ( ) .( MethodCallExpr ) .calls ( e , "get" )
225246 )
226247 }
227248
@@ -264,7 +285,7 @@ module Koa {
264285
265286 ResponseSendArgument ( ) {
266287 exists ( DataFlow:: PropWrite pwn |
267- pwn .writes ( DataFlow:: valueNode ( rh .getAResponseExpr ( ) ) , "body" , DataFlow:: valueNode ( this ) )
288+ pwn .writes ( DataFlow:: valueNode ( rh .getAResponseOrContextExpr ( ) ) , "body" , DataFlow:: valueNode ( this ) )
268289 )
269290 }
270291
0 commit comments