@@ -2183,15 +2183,24 @@ module StdlibPrivate {
2183
2183
* for how a request is processed and given to an application.
2184
2184
*/
2185
2185
class WsgirefSimpleServerApplication extends Http:: Server:: RequestHandler:: Range {
2186
+ boolean validator ;
2187
+
2186
2188
WsgirefSimpleServerApplication ( ) {
2187
2189
exists ( DataFlow:: Node appArg , DataFlow:: CallCfgNode setAppCall |
2188
2190
(
2189
2191
setAppCall =
2190
- WsgirefSimpleServer:: subclassRef ( ) .getReturn ( ) .getMember ( "set_app" ) .getACall ( )
2192
+ WsgirefSimpleServer:: subclassRef ( ) .getReturn ( ) .getMember ( "set_app" ) .getACall ( ) and
2193
+ validator = false
2191
2194
or
2192
2195
setAppCall
2193
2196
.( DataFlow:: MethodCallNode )
2194
- .calls ( any ( WsgiServerSubclass cls ) .getASelfRef ( ) , "set_app" )
2197
+ .calls ( any ( WsgiServerSubclass cls ) .getASelfRef ( ) , "set_app" ) and
2198
+ validator = false
2199
+ or
2200
+ // assume an application that is passed to `wsgiref.validate.validator` is eventually passed to `set_app`
2201
+ setAppCall =
2202
+ API:: moduleImport ( "wsgiref" ) .getMember ( "validate" ) .getMember ( "validator" ) .getACall ( ) and
2203
+ validator = true
2195
2204
) and
2196
2205
appArg in [ setAppCall .getArg ( 0 ) , setAppCall .getArgByName ( "application" ) ]
2197
2206
or
@@ -2201,7 +2210,8 @@ module StdlibPrivate {
2201
2210
.getMember ( "simple_server" )
2202
2211
.getMember ( "make_server" )
2203
2212
.getACall ( ) and
2204
- appArg in [ setAppCall .getArg ( 2 ) , setAppCall .getArgByName ( "app" ) ]
2213
+ appArg in [ setAppCall .getArg ( 2 ) , setAppCall .getArgByName ( "app" ) ] and
2214
+ validator = false
2205
2215
|
2206
2216
appArg = poorMansFunctionTracker ( this )
2207
2217
)
@@ -2210,6 +2220,9 @@ module StdlibPrivate {
2210
2220
override Parameter getARoutedParameter ( ) { none ( ) }
2211
2221
2212
2222
override string getFramework ( ) { result = "Stdlib: wsgiref.simple_server application" }
2223
+
2224
+ /** Holds if this simple server application was passed to `wsgiref.validate.validator`. */
2225
+ predicate isValidated ( ) { validator = true }
2213
2226
}
2214
2227
2215
2228
/**
@@ -2324,7 +2337,7 @@ module StdlibPrivate {
2324
2337
API:: Node classRef ( ) {
2325
2338
result = API:: moduleImport ( "wsgiref" ) .getMember ( "headers" ) .getMember ( "Headers" )
2326
2339
or
2327
- result = ModelOutput:: getATypeNode ( "wsqiref .headers.Headers~Subclass" ) .getASubclass * ( )
2340
+ result = ModelOutput:: getATypeNode ( "wsgiref .headers.Headers~Subclass" ) .getASubclass * ( )
2328
2341
}
2329
2342
2330
2343
/** Gets a reference to an instance of `wsgiref.headers.Headers`. */
@@ -2338,6 +2351,11 @@ module StdlibPrivate {
2338
2351
/** Gets a reference to an instance of `wsgiref.headers.Headers`. */
2339
2352
DataFlow:: Node instance ( ) { instance ( DataFlow:: TypeTracker:: end ( ) ) .flowsTo ( result ) }
2340
2353
2354
+ /** Holds if there exists an application that is validated by `wsgiref.validate.validator`. */
2355
+ private predicate existsValidatedApplication ( ) {
2356
+ exists ( WsgirefSimpleServerApplication app | app .isValidated ( ) )
2357
+ }
2358
+
2341
2359
/** A class instantiation of `wsgiref.headers.Headers`, conidered as a write to a response header. */
2342
2360
private class WsgirefHeadersInstantiation extends Http:: Server:: ResponseHeaderBulkWrite:: Range ,
2343
2361
DataFlow:: CallCfgNode
@@ -2348,28 +2366,10 @@ module StdlibPrivate {
2348
2366
result = [ this .getArg ( 0 ) , this .getArgByName ( "headers" ) ]
2349
2367
}
2350
2368
2351
- // TODO: implement validator
2352
- override predicate nameAllowsNewline ( ) { any ( ) }
2353
-
2354
- override predicate valueAllowsNewline ( ) { any ( ) }
2355
- }
2356
-
2357
- /**
2358
- * A call to a `start_response` function that sets the response headers.
2359
- */
2360
- private class WsgirefSimpleServerSetHeaders extends Http:: Server:: ResponseHeaderBulkWrite:: Range ,
2361
- DataFlow:: CallCfgNode
2362
- {
2363
- WsgirefSimpleServerSetHeaders ( ) { this .getFunction ( ) = startResponse ( ) }
2364
-
2365
- override DataFlow:: Node getBulkArg ( ) {
2366
- result = [ this .getArg ( 1 ) , this .getArgByName ( "headers" ) ]
2367
- }
2368
-
2369
- // TODO: implement validator
2370
- override predicate nameAllowsNewline ( ) { any ( ) }
2369
+ // TODO: These checks perhaps could be made more precise.
2370
+ override predicate nameAllowsNewline ( ) { not existsValidatedApplication ( ) }
2371
2371
2372
- override predicate valueAllowsNewline ( ) { any ( ) }
2372
+ override predicate valueAllowsNewline ( ) { not existsValidatedApplication ( ) }
2373
2373
}
2374
2374
2375
2375
/** A call to a method that writes to a response header. */
@@ -2384,10 +2384,10 @@ module StdlibPrivate {
2384
2384
2385
2385
override DataFlow:: Node getValueArg ( ) { result = this .getArg ( 1 ) }
2386
2386
2387
- // TODO: implement validator
2388
- override predicate nameAllowsNewline ( ) { any ( ) }
2387
+ // TODO: These checks perhaps could be made more precise.
2388
+ override predicate nameAllowsNewline ( ) { not existsValidatedApplication ( ) }
2389
2389
2390
- override predicate valueAllowsNewline ( ) { any ( ) }
2390
+ override predicate valueAllowsNewline ( ) { not existsValidatedApplication ( ) }
2391
2391
}
2392
2392
2393
2393
/** A dict-like write to a response header. */
@@ -2410,10 +2410,28 @@ module StdlibPrivate {
2410
2410
2411
2411
override DataFlow:: Node getValueArg ( ) { result = value }
2412
2412
2413
- // TODO: implement validator
2414
- override predicate nameAllowsNewline ( ) { any ( ) }
2413
+ // TODO: These checks perhaps could be made more precise.
2414
+ override predicate nameAllowsNewline ( ) { not existsValidatedApplication ( ) }
2415
+
2416
+ override predicate valueAllowsNewline ( ) { not existsValidatedApplication ( ) }
2417
+ }
2418
+
2419
+ /**
2420
+ * A call to a `start_response` function that sets the response headers.
2421
+ */
2422
+ private class WsgirefSimpleServerSetHeaders extends Http:: Server:: ResponseHeaderBulkWrite:: Range ,
2423
+ DataFlow:: CallCfgNode
2424
+ {
2425
+ WsgirefSimpleServerSetHeaders ( ) { this .getFunction ( ) = startResponse ( ) }
2426
+
2427
+ override DataFlow:: Node getBulkArg ( ) {
2428
+ result = [ this .getArg ( 1 ) , this .getArgByName ( "headers" ) ]
2429
+ }
2430
+
2431
+ // TODO: These checks perhaps could be made more precise.
2432
+ override predicate nameAllowsNewline ( ) { not existsValidatedApplication ( ) }
2415
2433
2416
- override predicate valueAllowsNewline ( ) { any ( ) }
2434
+ override predicate valueAllowsNewline ( ) { not existsValidatedApplication ( ) }
2417
2435
}
2418
2436
}
2419
2437
}
0 commit comments