@@ -410,6 +410,47 @@ private module Django {
410
410
UploadedFileFileLikeInstances ( ) { this .( DataFlow:: AttrRead ) .accesses ( instance ( ) , "file" ) }
411
411
}
412
412
}
413
+
414
+ /**
415
+ * Provides models for the `django.urls.ResolverMatch` class
416
+ *
417
+ * See https://docs.djangoproject.com/en/3.0/ref/urlresolvers/#django.urls.ResolverMatch.
418
+ */
419
+ module ResolverMatch {
420
+ /**
421
+ * A source of instances of `django.urls.ResolverMatch`, extend this class to model new instances.
422
+ *
423
+ * This can include instantiations of the class, return values from function
424
+ * calls, or a special parameter that will be set when functions are called by an external
425
+ * library.
426
+ *
427
+ * Use the predicate `ResolverMatch::instance()` to get references to instances of `django.urls.ResolverMatch`.
428
+ */
429
+ abstract class InstanceSource extends DataFlow:: LocalSourceNode { }
430
+
431
+ /** Gets a reference to an instance of `django.urls.ResolverMatch`. */
432
+ private DataFlow:: TypeTrackingNode instance ( DataFlow:: TypeTracker t ) {
433
+ t .start ( ) and
434
+ result instanceof InstanceSource
435
+ or
436
+ exists ( DataFlow:: TypeTracker t2 | result = instance ( t2 ) .track ( t2 , t ) )
437
+ }
438
+
439
+ /** Gets a reference to an instance of `django.urls.ResolverMatch`. */
440
+ DataFlow:: Node instance ( ) { instance ( DataFlow:: TypeTracker:: end ( ) ) .flowsTo ( result ) }
441
+
442
+ /**
443
+ * Taint propagation for `django.urls.ResolverMatch`.
444
+ */
445
+ class ResolverMatchAdditionalTaintStep extends TaintTracking:: AdditionalTaintStep {
446
+ override predicate step ( DataFlow:: Node nodeFrom , DataFlow:: Node nodeTo ) {
447
+ // Attributes
448
+ nodeFrom = instance ( ) and
449
+ nodeTo .( DataFlow:: AttrRead ) .getObject ( ) = nodeFrom and
450
+ nodeTo .( DataFlow:: AttrRead ) .getAttributeName ( ) in [ "args" , "kwargs" ]
451
+ }
452
+ }
453
+ }
413
454
}
414
455
415
456
/**
@@ -2053,7 +2094,6 @@ private module PrivateDjango {
2053
2094
// MultiValueDict[str, UploadedFile]
2054
2095
"FILES" ,
2055
2096
// django.urls.ResolverMatch
2056
- // TODO: Model ResolverMatch
2057
2097
"resolver_match"
2058
2098
]
2059
2099
// TODO: Handle that a HttpRequest is iterable
@@ -2068,6 +2108,14 @@ private module PrivateDjango {
2068
2108
}
2069
2109
}
2070
2110
2111
+ /** An attribute read on an django request that is a `ResolverMatch` instance. */
2112
+ class DjangoHttpRequestResolverMatchInstances extends Django:: ResolverMatch:: InstanceSource {
2113
+ DjangoHttpRequestResolverMatchInstances ( ) {
2114
+ this .( DataFlow:: AttrRead ) .getObject ( ) = django:: http:: request:: HttpRequest:: instance ( ) and
2115
+ this .( DataFlow:: AttrRead ) .getAttributeName ( ) = "resolver_match"
2116
+ }
2117
+ }
2118
+
2071
2119
/** An `UploadedFile` instance that originates from a django request. */
2072
2120
class DjangoHttpRequestUploadedFileInstances extends Django:: UploadedFile:: InstanceSource {
2073
2121
DjangoHttpRequestUploadedFileInstances ( ) {
0 commit comments