@@ -10,48 +10,6 @@ private import codeql.ruby.DataFlow
10
10
* Models routing configuration specified using the `ActionDispatch` library, which is part of Rails.
11
11
*/
12
12
module ActionDispatch {
13
- private newtype TRouteBlock =
14
- TTopLevelRouteBlock ( MethodCall routes , MethodCall draw , Block b ) {
15
- routes .getMethodName ( ) = "routes" and
16
- draw .getMethodName ( ) = "draw" and
17
- draw .getReceiver ( ) = routes and
18
- draw .getBlock ( ) = b
19
- } or
20
- // constraints(foo: /some_regex/) do
21
- // get "/posts/:foo", to "posts#something"
22
- // end
23
- TConstraintsRouteBlock ( RouteBlock parent , MethodCall constraints , Block b ) {
24
- parent .getAStmt ( ) = constraints and
25
- constraints .getMethodName ( ) = "constraints" and
26
- constraints .getBlock ( ) = b
27
- } or
28
- // scope(path: "/some_path", module: "some_module") do
29
- // get "/posts/:foo", to "posts#something"
30
- // end
31
- TScopeRouteBlock ( RouteBlock parent , MethodCall scope , Block b ) {
32
- parent .getAStmt ( ) = scope and scope .getMethodName ( ) = "scope" and scope .getBlock ( ) = b
33
- } or
34
- // resources :articles do
35
- // get "/comments", to "comments#index"
36
- // end
37
- TResourcesRouteBlock ( RouteBlock parent , MethodCall resources , Block b ) {
38
- parent .getAStmt ( ) = resources and
39
- resources .getMethodName ( ) = "resources" and
40
- resources .getBlock ( ) = b
41
- } or
42
- // A conditional statement guarding some routes.
43
- // We ignore the condition and analyze both branches to obtain as
44
- // much routing information as possible.
45
- TConditionalRouteBlock ( RouteBlock parent , ConditionalExpr e ) { parent .getAStmt ( ) = e } or
46
- // namespace :admin do
47
- // resources :posts
48
- // end
49
- TNamespaceRouteBlock ( RouteBlock parent , MethodCall namespace , Block b ) {
50
- parent .getAStmt ( ) = namespace and
51
- namespace .getMethodName ( ) = "namespace" and
52
- namespace .getBlock ( ) = b
53
- }
54
-
55
13
/**
56
14
* A block that defines some routes.
57
15
* Route blocks can contribute to the path or controller namespace of their child routes.
@@ -314,39 +272,6 @@ module ActionDispatch {
314
272
override Location getLocation ( ) { result = call .getLocation ( ) }
315
273
}
316
274
317
- /**
318
- * A route configuration. See `Route` for more info
319
- */
320
- newtype TRoute =
321
- /**
322
- * See `ExplicitRoute`
323
- */
324
- TExplicitRoute ( RouteBlock b , MethodCall m ) {
325
- b .getAStmt ( ) = m and m .getMethodName ( ) = anyHttpMethod ( )
326
- } or
327
- /**
328
- * See `ResourcesRoute`
329
- */
330
- TResourcesRoute ( RouteBlock b , MethodCall m , string action ) {
331
- b .getAStmt ( ) = m and
332
- m .getMethodName ( ) = "resources" and
333
- action in [ "show" , "index" , "new" , "edit" , "create" , "update" , "destroy" ] and
334
- applyActionFilters ( m , action )
335
- } or
336
- /**
337
- * See `SingularResourceRoute`
338
- */
339
- TResourceRoute ( RouteBlock b , MethodCall m , string action ) {
340
- b .getAStmt ( ) = m and
341
- m .getMethodName ( ) = "resource" and
342
- action in [ "show" , "new" , "edit" , "create" , "update" , "destroy" ] and
343
- applyActionFilters ( m , action )
344
- } or
345
- /**
346
- * See `MatchRoute`
347
- */
348
- TMatchRoute ( RouteBlock b , MethodCall m ) { b .getAStmt ( ) = m and m .getMethodName ( ) = "match" }
349
-
350
275
/**
351
276
* A route configuration. This defines a combination of HTTP method and URL
352
277
* path which should be routed to a particular controller-action pair.
@@ -726,6 +651,91 @@ module ActionDispatch {
726
651
}
727
652
}
728
653
654
+ import Cached
655
+
656
+ /**
657
+ * This module contains the IPA types backing `RouteBlock` and `Route`, cached for performance.
658
+ */
659
+ cached
660
+ private module Cached {
661
+ cached
662
+ newtype TRouteBlock =
663
+ TTopLevelRouteBlock ( MethodCall routes , MethodCall draw , Block b ) {
664
+ routes .getMethodName ( ) = "routes" and
665
+ draw .getMethodName ( ) = "draw" and
666
+ draw .getReceiver ( ) = routes and
667
+ draw .getBlock ( ) = b
668
+ } or
669
+ // constraints(foo: /some_regex/) do
670
+ // get "/posts/:foo", to "posts#something"
671
+ // end
672
+ TConstraintsRouteBlock ( RouteBlock parent , MethodCall constraints , Block b ) {
673
+ parent .getAStmt ( ) = constraints and
674
+ constraints .getMethodName ( ) = "constraints" and
675
+ constraints .getBlock ( ) = b
676
+ } or
677
+ // scope(path: "/some_path", module: "some_module") do
678
+ // get "/posts/:foo", to "posts#something"
679
+ // end
680
+ TScopeRouteBlock ( RouteBlock parent , MethodCall scope , Block b ) {
681
+ parent .getAStmt ( ) = scope and scope .getMethodName ( ) = "scope" and scope .getBlock ( ) = b
682
+ } or
683
+ // resources :articles do
684
+ // get "/comments", to "comments#index"
685
+ // end
686
+ TResourcesRouteBlock ( RouteBlock parent , MethodCall resources , Block b ) {
687
+ parent .getAStmt ( ) = resources and
688
+ resources .getMethodName ( ) = "resources" and
689
+ resources .getBlock ( ) = b
690
+ } or
691
+ // A conditional statement guarding some routes.
692
+ // We ignore the condition and analyze both branches to obtain as
693
+ // much routing information as possible.
694
+ TConditionalRouteBlock ( RouteBlock parent , ConditionalExpr e ) { parent .getAStmt ( ) = e } or
695
+ // namespace :admin do
696
+ // resources :posts
697
+ // end
698
+ TNamespaceRouteBlock ( RouteBlock parent , MethodCall namespace , Block b ) {
699
+ parent .getAStmt ( ) = namespace and
700
+ namespace .getMethodName ( ) = "namespace" and
701
+ namespace .getBlock ( ) = b
702
+ }
703
+
704
+ /**
705
+ * A route configuration. See `Route` for more info
706
+ */
707
+ cached
708
+ newtype TRoute =
709
+ /**
710
+ * See `ExplicitRoute`
711
+ */
712
+ TExplicitRoute ( RouteBlock b , MethodCall m ) {
713
+ b .getAStmt ( ) = m and m .getMethodName ( ) = anyHttpMethod ( )
714
+ } or
715
+ /**
716
+ * See `ResourcesRoute`
717
+ */
718
+ TResourcesRoute ( RouteBlock b , MethodCall m , string action ) {
719
+ b .getAStmt ( ) = m and
720
+ m .getMethodName ( ) = "resources" and
721
+ action in [ "show" , "index" , "new" , "edit" , "create" , "update" , "destroy" ] and
722
+ applyActionFilters ( m , action )
723
+ } or
724
+ /**
725
+ * See `SingularResourceRoute`
726
+ */
727
+ TResourceRoute ( RouteBlock b , MethodCall m , string action ) {
728
+ b .getAStmt ( ) = m and
729
+ m .getMethodName ( ) = "resource" and
730
+ action in [ "show" , "new" , "edit" , "create" , "update" , "destroy" ] and
731
+ applyActionFilters ( m , action )
732
+ } or
733
+ /**
734
+ * See `MatchRoute`
735
+ */
736
+ TMatchRoute ( RouteBlock b , MethodCall m ) { b .getAStmt ( ) = m and m .getMethodName ( ) = "match" }
737
+ }
738
+
729
739
/**
730
740
* Several routing methods support the keyword arguments `only:` and `except:`.
731
741
* - `only:` restricts the set of actions to just those in the argument.
0 commit comments