Skip to content

Commit 151a733

Browse files
committed
1 parent 44b9de0 commit 151a733

File tree

7 files changed

+208
-0
lines changed

7 files changed

+208
-0
lines changed

python/ql/test/library-tests/frameworks/twisted/ConceptsTest.expected

Whitespace-only changes.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import python
2+
import experimental.meta.ConceptsTest
3+
4+
class DedicatedResponseTest extends HttpServerHttpResponseTest {
5+
DedicatedResponseTest() { file.getShortName() = "response_test.py" }
6+
}
7+
8+
class OtherResponseTest extends HttpServerHttpResponseTest {
9+
OtherResponseTest() { not this instanceof DedicatedResponseTest }
10+
11+
override string getARelevantTag() { result = "HttpResponse" }
12+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
argumentToEnsureNotTaintedNotMarkedAsSpurious
2+
untaintedArgumentToEnsureTaintedNotMarkedAsMissing
3+
failures
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import experimental.meta.InlineTaintTest
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
from twisted.web.server import Site, Request, NOT_DONE_YET
2+
from twisted.web.resource import Resource
3+
from twisted.internet import reactor, endpoints, defer
4+
5+
6+
root = Resource()
7+
8+
class Now(Resource):
9+
def render(self, request: Request):
10+
return b"now"
11+
12+
13+
class AlsoNow(Resource):
14+
def render(self, request: Request):
15+
request.write(b"also now")
16+
return b""
17+
18+
19+
def process_later(request: Request):
20+
print("process_later called")
21+
request.write(b"later")
22+
request.finish()
23+
24+
25+
class Later(Resource):
26+
def render(self, request: Request):
27+
# process the request in 1 second
28+
print("setting up callback for process_later")
29+
reactor.callLater(1, process_later, request)
30+
return NOT_DONE_YET
31+
32+
33+
class PlainText(Resource):
34+
def render(self, request: Request):
35+
request.setHeader(b"content-type", "text/plain")
36+
return b"this is plain text"
37+
38+
39+
class Redirect(Resource):
40+
def render_GET(self, request: Request):
41+
request.redirect("/new-location")
42+
# By default, this `hello` output is not returned... not even when
43+
# requested with curl.
44+
return b"hello"
45+
46+
47+
class NonHttpBodyOutput(Resource):
48+
"""Examples of provides values in response that is not in the body
49+
"""
50+
def render_GET(self, request: Request):
51+
request.responseHeaders.addRawHeader("key", "value")
52+
request.setHeader("key2", "value")
53+
54+
request.addCookie("key", "value")
55+
request.cookies.append(b"key2=value")
56+
57+
return b""
58+
59+
60+
root.putChild(b"now", Now())
61+
root.putChild(b"also-now", AlsoNow())
62+
root.putChild(b"later", Later())
63+
root.putChild(b"plain-text", PlainText())
64+
root.putChild(b"redirect", Redirect())
65+
root.putChild(b"non-body", NonHttpBodyOutput())
66+
67+
68+
if __name__ == "__main__":
69+
factory = Site(root)
70+
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8880)
71+
endpoint.listen(factory)
72+
73+
print("Will run on http://localhost:8880")
74+
75+
reactor.run()
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from twisted.web.server import Site, Request
2+
from twisted.web.resource import Resource
3+
from twisted.internet import reactor, endpoints
4+
5+
6+
root = Resource()
7+
8+
9+
class Foo(Resource):
10+
def render(self, request: Request):
11+
print(f"{request.content=}")
12+
print(f"{request.cookies=}")
13+
print(f"{request.received_cookies=}")
14+
return b"I am Foo"
15+
16+
17+
root.putChild(b"foo", Foo())
18+
19+
20+
class Child(Resource):
21+
def __init__(self, name):
22+
self.name = name.decode("utf-8")
23+
24+
def render_GET(self, request):
25+
return f"Hi, I'm child '{self.name}'".encode("utf-8")
26+
27+
28+
class Parent(Resource):
29+
def getChild(self, path, request):
30+
print(path, type(path))
31+
return Child(path)
32+
33+
def render_GET(self, request):
34+
return b"Hi, I'm parent"
35+
36+
37+
root.putChild(b"parent", Parent())
38+
39+
40+
if __name__ == "__main__":
41+
factory = Site(root)
42+
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8880)
43+
endpoint.listen(factory)
44+
45+
print("Will run on http://localhost:8880")
46+
47+
reactor.run()
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
from twisted.web.resource import Resource
2+
from twisted.web.server import Request
3+
4+
class MyTaintTest(Resource):
5+
def getChild(self, path, request):
6+
ensure_tainted(path, request) # $ MISSING: tainted
7+
8+
def render(self, request):
9+
ensure_tainted(request) # $ MISSING: tainted
10+
11+
def render_GET(self, request: Request):
12+
# see https://twistedmatrix.com/documents/21.2.0/api/twisted.web.server.Request.html
13+
ensure_tainted(
14+
request, # $ MISSING: tainted
15+
16+
request.uri, # $ MISSING: tainted
17+
request.path, # $ MISSING: tainted
18+
request.prepath, # $ MISSING: tainted
19+
request.postpath, # $ MISSING: tainted
20+
21+
# file-like
22+
request.content, # $ MISSING: tainted
23+
request.content.read(), # $ MISSING: tainted
24+
25+
# Dict[bytes, List[bytes]] (for query args)
26+
request.args, # $ MISSING: tainted
27+
request.args[b"key"], # $ MISSING: tainted
28+
request.args[b"key"][0], # $ MISSING: tainted
29+
request.args.get(b"key"), # $ MISSING: tainted
30+
request.args.get(b"key")[0], # $ MISSING: tainted
31+
32+
request.received_cookies, # $ MISSING: tainted
33+
request.received_cookies["key"], # $ MISSING: tainted
34+
request.received_cookies.get("key"), # $ MISSING: tainted
35+
request.getCookie(b"key"), # $ MISSING: tainted
36+
37+
# twisted.web.http_headers.Headers
38+
# see https://twistedmatrix.com/documents/21.2.0/api/twisted.web.http_headers.Headers.html
39+
request.requestHeaders, # $ MISSING: tainted
40+
request.requestHeaders.getRawHeaders("key"), # $ MISSING: tainted
41+
request.requestHeaders.getRawHeaders("key")[0], # $ MISSING: tainted
42+
request.requestHeaders.getAllRawHeaders(), # $ MISSING: tainted
43+
list(request.requestHeaders.getAllRawHeaders()), # $ MISSING: tainted
44+
45+
request.getHeader("key"), # $ MISSING: tainted
46+
request.getAllHeaders(), # $ MISSING: tainted
47+
request.getAllHeaders()["key"], # $ MISSING: tainted
48+
49+
request.user, # $ MISSING: tainted
50+
request.getUser(), # $ MISSING: tainted
51+
52+
request.password, # $ MISSING: tainted
53+
request.getPassword(), # $ MISSING: tainted
54+
55+
request.host, # $ MISSING: tainted
56+
request.getHost(), # $ MISSING: tainted
57+
request.getRequestHostname(), # $ MISSING: tainted
58+
)
59+
60+
# technically user-controlled, but unlike to lead to vulnerabilities.
61+
ensure_not_tainted(
62+
request.method,
63+
)
64+
65+
# not tainted at all
66+
ensure_not_tainted(
67+
# outgoing things
68+
request.cookies,
69+
request.responseHeaders,
70+
)

0 commit comments

Comments
 (0)