Skip to content

Commit 37ad59a

Browse files
Rasmus Lerchedahl PetersenRasmus Lerchedahl Petersen
authored andcommitted
Python: subclas of known subclasses
1 parent a3cc9b6 commit 37ad59a

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,9 @@ private module Django {
781781
t.start() and
782782
result = http_attr("HttpResponseRedirect")
783783
or
784+
// subclass
785+
result.asExpr().(ClassExpr).getABase() = classRef(t.continue()).asExpr()
786+
or
784787
exists(DataFlow::TypeTracker t2 | result = classRef(t2).track(t2, t))
785788
}
786789

@@ -842,6 +845,9 @@ private module Django {
842845
t.start() and
843846
result = http_attr("HttpResponsePermanentRedirect")
844847
or
848+
// subclass
849+
result.asExpr().(ClassExpr).getABase() = classRef(t.continue()).asExpr()
850+
or
845851
exists(DataFlow::TypeTracker t2 | result = classRef(t2).track(t2, t))
846852
}
847853

@@ -903,6 +909,9 @@ private module Django {
903909
t.start() and
904910
result = http_attr("HttpResponseNotModified")
905911
or
912+
// subclass
913+
result.asExpr().(ClassExpr).getABase() = classRef(t.continue()).asExpr()
914+
or
906915
exists(DataFlow::TypeTracker t2 | result = classRef(t2).track(t2, t))
907916
}
908917

@@ -962,6 +971,9 @@ private module Django {
962971
t.start() and
963972
result = http_attr("HttpResponseBadRequest")
964973
or
974+
// subclass
975+
result.asExpr().(ClassExpr).getABase() = classRef(t.continue()).asExpr()
976+
or
965977
exists(DataFlow::TypeTracker t2 | result = classRef(t2).track(t2, t))
966978
}
967979

@@ -1023,6 +1035,9 @@ private module Django {
10231035
t.start() and
10241036
result = http_attr("HttpResponseNotFound")
10251037
or
1038+
// subclass
1039+
result.asExpr().(ClassExpr).getABase() = classRef(t.continue()).asExpr()
1040+
or
10261041
exists(DataFlow::TypeTracker t2 | result = classRef(t2).track(t2, t))
10271042
}
10281043

@@ -1084,6 +1099,9 @@ private module Django {
10841099
t.start() and
10851100
result = http_attr("HttpResponseForbidden")
10861101
or
1102+
// subclass
1103+
result.asExpr().(ClassExpr).getABase() = classRef(t.continue()).asExpr()
1104+
or
10871105
exists(DataFlow::TypeTracker t2 | result = classRef(t2).track(t2, t))
10881106
}
10891107

@@ -1145,6 +1163,9 @@ private module Django {
11451163
t.start() and
11461164
result = http_attr("HttpResponseNotAllowed")
11471165
or
1166+
// subclass
1167+
result.asExpr().(ClassExpr).getABase() = classRef(t.continue()).asExpr()
1168+
or
11481169
exists(DataFlow::TypeTracker t2 | result = classRef(t2).track(t2, t))
11491170
}
11501171

@@ -1207,6 +1228,9 @@ private module Django {
12071228
t.start() and
12081229
result = http_attr("HttpResponseGone")
12091230
or
1231+
// subclass
1232+
result.asExpr().(ClassExpr).getABase() = classRef(t.continue()).asExpr()
1233+
or
12101234
exists(DataFlow::TypeTracker t2 | result = classRef(t2).track(t2, t))
12111235
}
12121236

@@ -1268,6 +1292,9 @@ private module Django {
12681292
t.start() and
12691293
result = http_attr("HttpResponseServerError")
12701294
or
1295+
// subclass
1296+
result.asExpr().(ClassExpr).getABase() = classRef(t.continue()).asExpr()
1297+
or
12711298
exists(DataFlow::TypeTracker t2 | result = classRef(t2).track(t2, t))
12721299
}
12731300

@@ -1329,6 +1356,9 @@ private module Django {
13291356
t.start() and
13301357
result = http_attr("JsonResponse")
13311358
or
1359+
// subclass
1360+
result.asExpr().(ClassExpr).getABase() = classRef(t.continue()).asExpr()
1361+
or
13321362
exists(DataFlow::TypeTracker t2 | result = classRef(t2).track(t2, t))
13331363
}
13341364

@@ -1393,6 +1423,9 @@ private module Django {
13931423
t.start() and
13941424
result = http_attr("StreamingHttpResponse")
13951425
or
1426+
// subclass
1427+
result.asExpr().(ClassExpr).getABase() = classRef(t.continue()).asExpr()
1428+
or
13961429
exists(DataFlow::TypeTracker t2 | result = classRef(t2).track(t2, t))
13971430
}
13981431

@@ -1454,6 +1487,9 @@ private module Django {
14541487
t.start() and
14551488
result = http_attr("FileResponse")
14561489
or
1490+
// subclass
1491+
result.asExpr().(ClassExpr).getABase() = classRef(t.continue()).asExpr()
1492+
or
14571493
exists(DataFlow::TypeTracker t2 | result = classRef(t2).track(t2, t))
14581494
}
14591495

python/ql/test/experimental/library-tests/frameworks/django-v1/response_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,4 @@ def __init__(self, banner, content, *args, **kwargs):
5050
super().__init__(content, *args, content_type="text/html", **kwargs)
5151

5252
def safe__custom_json_response(request):
53-
return CustomJsonResponse("ACME Responses", {"foo": request.GET.get("foo")}) # $f-:HttpResponse $f-:mimetype=application/json $f-:responseBody=Dict
53+
return CustomJsonResponse("ACME Responses", {"foo": request.GET.get("foo")}) # $HttpResponse $mimetype=application/json $f-:responseBody=Dict $f+:responseBody="ACME Responses"

0 commit comments

Comments
 (0)