Skip to content

Commit b7483a5

Browse files
committed
Python: Add modeledSubclassRef for Django views/fields/forms
1 parent 322bdcb commit b7483a5

File tree

1 file changed

+26
-28
lines changed

1 file changed

+26
-28
lines changed

python/ql/src/semmle/python/frameworks/Django.qll

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1526,8 +1526,11 @@ private module Django {
15261526
* - https://docs.djangoproject.com/en/3.1/ref/class-based-views/
15271527
*/
15281528
module View {
1529-
/** Gets a reference to the `django.views.generic.View` class or any subclass. */
1530-
API::Node subclassRef() {
1529+
/**
1530+
* Get a references to: the `django.views.generic.View` class, or any subclass
1531+
* that has explicitly been modeled in the CodeQL libraries.
1532+
*/
1533+
API::Node modeledSubclassRef() {
15311534
exists(string moduleName, string className |
15321535
// canonical definition
15331536
result =
@@ -1536,15 +1539,13 @@ private module Django {
15361539
.getMember("generic")
15371540
.getMember(moduleName)
15381541
.getMember(className)
1539-
.getASubclass*()
15401542
or
15411543
// alias from `django.view.generic`
15421544
result =
15431545
API::moduleImport("django")
15441546
.getMember("view")
15451547
.getMember("generic")
15461548
.getMember(className)
1547-
.getASubclass*()
15481549
|
15491550
moduleName = "base" and
15501551
className in ["RedirectView", "TemplateView", "View"]
@@ -1566,8 +1567,11 @@ private module Django {
15661567
)
15671568
or
15681569
// `django.views.View` alias
1569-
result = API::moduleImport("django").getMember("views").getMember("View").getASubclass*()
1570+
result = API::moduleImport("django").getMember("views").getMember("View")
15701571
}
1572+
1573+
/** Gets a reference to the `django.views.generic.View` class or any subclass. */
1574+
API::Node subclassRef() { result = modeledSubclassRef().getASubclass*() }
15711575
}
15721576
}
15731577

@@ -1638,29 +1642,29 @@ private module Django {
16381642
* See https://docs.djangoproject.com/en/3.1/ref/forms/api/
16391643
*/
16401644
module Form {
1641-
/** Gets a reference to the `django.forms.forms.BaseForm` class or any subclass. */
1642-
API::Node subclassRef() {
1645+
/**
1646+
* Get a references to: the `django.forms.forms.BaseForm` class, or any subclass
1647+
* that has explicitly been modeled in the CodeQL libraries.
1648+
*/
1649+
API::Node modeledSubclassRef() {
16431650
// canonical definition
16441651
result =
16451652
API::moduleImport("django")
16461653
.getMember("forms")
16471654
.getMember("forms")
16481655
.getMember(["BaseForm", "Form"])
1649-
.getASubclass*()
16501656
or
16511657
result =
16521658
API::moduleImport("django")
16531659
.getMember("forms")
16541660
.getMember("models")
16551661
.getMember(["BaseModelForm", "ModelForm"])
1656-
.getASubclass*()
16571662
or
16581663
// aliases from `django.forms`
16591664
result =
16601665
API::moduleImport("django")
16611666
.getMember("forms")
16621667
.getMember(["BaseForm", "Form", "BaseModelForm", "ModelForm"])
1663-
.getASubclass*()
16641668
or
16651669
// other Form subclasses defined in Django
16661670
result =
@@ -1669,15 +1673,13 @@ private module Django {
16691673
.getMember("admin")
16701674
.getMember("forms")
16711675
.getMember(["AdminAuthenticationForm", "AdminPasswordChangeForm"])
1672-
.getASubclass*()
16731676
or
16741677
result =
16751678
API::moduleImport("django")
16761679
.getMember("contrib")
16771680
.getMember("admin")
16781681
.getMember("helpers")
16791682
.getMember("ActionForm")
1680-
.getASubclass*()
16811683
or
16821684
result =
16831685
API::moduleImport("django")
@@ -1686,7 +1688,6 @@ private module Django {
16861688
.getMember("views")
16871689
.getMember("main")
16881690
.getMember("ChangeListSearchForm")
1689-
.getASubclass*()
16901691
or
16911692
result =
16921693
API::moduleImport("django")
@@ -1698,30 +1699,29 @@ private module Django {
16981699
"AdminPasswordChangeForm", "PasswordChangeForm", "AuthenticationForm",
16991700
"UserCreationForm"
17001701
])
1701-
.getASubclass*()
17021702
or
17031703
result =
17041704
API::moduleImport("django")
17051705
.getMember("contrib")
17061706
.getMember("flatpages")
17071707
.getMember("forms")
17081708
.getMember("FlatpageForm")
1709-
.getASubclass*()
17101709
or
17111710
result =
17121711
API::moduleImport("django")
17131712
.getMember("forms")
17141713
.getMember("formsets")
17151714
.getMember("ManagementForm")
1716-
.getASubclass*()
17171715
or
17181716
result =
17191717
API::moduleImport("django")
17201718
.getMember("forms")
17211719
.getMember("models")
17221720
.getMember(["ModelForm", "BaseModelForm"])
1723-
.getASubclass*()
17241721
}
1722+
1723+
/** Gets a reference to the `django.forms.forms.BaseForm` class or any subclass. */
1724+
API::Node subclassRef() { result = modeledSubclassRef().getASubclass*() }
17251725
}
17261726

17271727
/**
@@ -1731,20 +1731,21 @@ private module Django {
17311731
* See https://docs.djangoproject.com/en/3.1/ref/forms/fields/
17321732
*/
17331733
module Field {
1734-
/** Gets a reference to the `django.forms.fields.Field` class or any subclass. */
1735-
API::Node subclassRef() {
1734+
/**
1735+
* Get a references to: the `django.forms.fields.Field` class, or any subclass
1736+
* that has explicitly been modeled in the CodeQL libraries.
1737+
*/
1738+
API::Node modeledSubclassRef() {
17361739
exists(string moduleName, string className |
17371740
// canonical definition
17381741
result =
17391742
API::moduleImport("django")
17401743
.getMember("forms")
17411744
.getMember(moduleName)
17421745
.getMember(className)
1743-
.getASubclass*()
17441746
or
17451747
// alias from `django.forms`
1746-
result =
1747-
API::moduleImport("django").getMember("forms").getMember(className).getASubclass*()
1748+
result = API::moduleImport("django").getMember("forms").getMember(className)
17481749
|
17491750
moduleName = "fields" and
17501751
className in [
@@ -1770,7 +1771,6 @@ private module Django {
17701771
.getMember("auth")
17711772
.getMember("forms")
17721773
.getMember(["ReadOnlyPasswordHashField", "UsernameField"])
1773-
.getASubclass*()
17741774
or
17751775
result =
17761776
API::moduleImport("django")
@@ -1783,7 +1783,6 @@ private module Django {
17831783
"MultiLineStringField", "MultiPointField", "MultiPolygonField", "PointField",
17841784
"PolygonField"
17851785
])
1786-
.getASubclass*()
17871786
or
17881787
result =
17891788
API::moduleImport("django")
@@ -1792,7 +1791,6 @@ private module Django {
17921791
.getMember("forms")
17931792
.getMember("array")
17941793
.getMember(["SimpleArrayField", "SplitArrayField"])
1795-
.getASubclass*()
17961794
or
17971795
result =
17981796
API::moduleImport("django")
@@ -1801,7 +1799,6 @@ private module Django {
18011799
.getMember("forms")
18021800
.getMember("hstore")
18031801
.getMember("HStoreField")
1804-
.getASubclass*()
18051802
or
18061803
result =
18071804
API::moduleImport("django")
@@ -1813,15 +1810,16 @@ private module Django {
18131810
"BaseRangeField", "DateRangeField", "DateTimeRangeField", "DecimalRangeField",
18141811
"IntegerRangeField"
18151812
])
1816-
.getASubclass*()
18171813
or
18181814
result =
18191815
API::moduleImport("django")
18201816
.getMember("forms")
18211817
.getMember("models")
18221818
.getMember(["InlineForeignKeyField", "ModelChoiceField", "ModelMultipleChoiceField"])
1823-
.getASubclass*()
18241819
}
1820+
1821+
/** Gets a reference to the `django.forms.fields.Field` class or any subclass. */
1822+
API::Node subclassRef() { result = modeledSubclassRef().getASubclass*() }
18251823
}
18261824
}
18271825

0 commit comments

Comments
 (0)