@@ -447,6 +447,61 @@ module NestJS {
447447 }
448448 }
449449
450+ /**
451+ * A NestJS Middleware Class
452+ */
453+ private class NestMiddlewareClass extends DataFlow:: ClassNode {
454+ NestMiddlewareClass ( ) {
455+ exists ( ClassDefinition cls |
456+ this = cls .flow ( ) and
457+ cls .getASuperInterface ( ) .hasUnderlyingType ( "@nestjs/common" , "NestMiddleware" )
458+ )
459+ }
460+
461+ DataFlow:: FunctionNode getUseFunction ( ) { result = this .getInstanceMethod ( "use" ) }
462+ }
463+
464+ /**
465+ * A NestJS Middleware Class route handler (the `use` method)
466+ */
467+ private class MiddlewareRouteHandler extends Http:: RouteHandler , DataFlow:: FunctionNode {
468+ MiddlewareRouteHandler ( ) { this = any ( NestMiddlewareClass m ) .getUseFunction ( ) }
469+
470+ override Http:: HeaderDefinition getAResponseHeader ( string name ) { none ( ) }
471+
472+ /**
473+ * Gets the request object used by this route
474+ */
475+ DataFlow:: ParameterNode getRequest ( ) { result = this .getParameter ( 0 ) }
476+
477+ /**
478+ * Gets the response object used by this route
479+ */
480+ DataFlow:: ParameterNode getResponse ( ) { result = this .getParameter ( 1 ) }
481+ }
482+
483+ /**
484+ * A source of `express` request objects for NestJS middlewares
485+ */
486+ private class MiddlewareRequestSource extends Express:: RequestSource {
487+ MiddlewareRouteHandler middlewareRouteHandler ;
488+
489+ MiddlewareRequestSource ( ) { this = middlewareRouteHandler .getRequest ( ) }
490+
491+ override Http:: RouteHandler getRouteHandler ( ) { result = middlewareRouteHandler }
492+ }
493+
494+ /**
495+ * A source of `express` response objects for NestJS middlewares
496+ */
497+ private class MiddlewareResponseSource extends Express:: ResponseSource {
498+ MiddlewareRouteHandler middlewareRouteHandler ;
499+
500+ MiddlewareResponseSource ( ) { this = middlewareRouteHandler .getResponse ( ) }
501+
502+ override Http:: RouteHandler getRouteHandler ( ) { result = middlewareRouteHandler }
503+ }
504+
450505 /**
451506 * A value passed in the `providers` array in:
452507 * ```js
@@ -455,21 +510,53 @@ module NestJS {
455510 * ```
456511 */
457512 private DataFlow:: Node providerTuple ( ) {
458- result =
459- DataFlow:: moduleImport ( "@nestjs/common" )
460- .getAPropertyRead ( "Module" )
461- .getACall ( )
462- .getOptionArgument ( 0 , "providers" )
463- .getALocalSource ( )
464- .( DataFlow:: ArrayCreationNode )
465- .getAnElement ( )
513+ exists ( DataFlow:: CallNode moduleCall |
514+ moduleCall = DataFlow:: moduleImport ( "@nestjs/common" ) .getAPropertyRead ( "Module" ) .getACall ( ) and
515+ result = providerTupleAux ( moduleCall .getArgument ( 0 ) .getALocalSource ( ) )
516+ )
517+ }
518+
519+ private DataFlow:: Node providerTupleAux ( DataFlow:: ObjectLiteralNode o ) {
520+ (
521+ result =
522+ o .getAPropertyWrite ( "providers" )
523+ .getRhs ( )
524+ .getALocalSource ( )
525+ .( DataFlow:: ArrayCreationNode )
526+ .getAnElement ( )
527+ or
528+ result =
529+ providerTupleAux ( o .getAPropertyWrite ( "imports" )
530+ .getRhs ( )
531+ .getALocalSource ( )
532+ .( DataFlow:: ArrayCreationNode )
533+ .getAnElement ( )
534+ .( DataFlow:: CallNode )
535+ .getCalleeNode ( )
536+ .getAFunctionValue ( )
537+ .getFunction ( )
538+ .getAReturnedExpr ( )
539+ .flow ( ) )
540+ )
541+ }
542+
543+ private DataFlow:: Node getConcreteClassFromProviderTuple ( DataFlow:: SourceNode tuple ) {
544+ result = tuple .getAPropertyWrite ( "useClass" ) .getRhs ( )
545+ or
546+ exists ( DataFlow:: FunctionNode f |
547+ f = tuple .getAPropertyWrite ( "useFactory" ) .getRhs ( ) .getAFunctionValue ( ) and
548+ result .getAstNode ( ) = f .getFunction ( ) .getAReturnedExpr ( ) .getType ( ) .( ClassType ) .getClass ( )
549+ )
550+ or
551+ result .getAstNode ( ) =
552+ tuple .getAPropertyWrite ( "useValue" ) .getRhs ( ) .asExpr ( ) .getType ( ) .( ClassType ) .getClass ( )
466553 }
467554
468555 private predicate providerPair ( DataFlow:: Node interface , DataFlow:: Node concreteClass ) {
469556 exists ( DataFlow:: SourceNode tuple |
470557 tuple = providerTuple ( ) .getALocalSource ( ) and
471558 interface = tuple .getAPropertyWrite ( "provide" ) .getRhs ( ) and
472- concreteClass = tuple . getAPropertyWrite ( "useClass" ) . getRhs ( )
559+ concreteClass = getConcreteClassFromProviderTuple ( tuple )
473560 )
474561 }
475562
0 commit comments