Skip to content

Commit a83c70f

Browse files
Add tests
1 parent ba06990 commit a83c70f

File tree

5 files changed

+45
-2
lines changed

5 files changed

+45
-2
lines changed

python/ql/lib/semmle/python/Frameworks.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ private import semmle.python.frameworks.Sanic
7878
private import semmle.python.frameworks.ServerLess
7979
private import semmle.python.frameworks.Setuptools
8080
private import semmle.python.frameworks.Simplejson
81+
private import semmle.python.frameworks.Socketio
8182
private import semmle.python.frameworks.SqlAlchemy
8283
private import semmle.python.frameworks.Starlette
8384
private import semmle.python.frameworks.Stdlib

python/ql/lib/semmle/python/frameworks/Socketio.qll

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
private import python
77
private import semmle.python.dataflow.new.DataFlow
88
private import semmle.python.dataflow.new.TaintTracking
9+
private import semmle.python.dataflow.new.RemoteFlowSources
910
private import semmle.python.Concepts
1011
private import semmle.python.ApiGraphs
1112
private import semmle.python.frameworks.internal.PoorMansFunctionResolution
@@ -31,7 +32,9 @@ module SocketIO {
3132
serverEventAnnotation().getAValueReachableFromSource().asExpr() = this.getADecorator()
3233
}
3334

34-
override Parameter getARoutedParameter() { result = this.getAnArg() }
35+
override Parameter getARoutedParameter() {
36+
result = this.getAnArg() and not result = this.getArg(0)
37+
}
3538

3639
override string getFramework() { result = "socketio" }
3740
}
@@ -52,8 +55,16 @@ module SocketIO {
5255
private class CallbackHandler extends Http::Server::RequestHandler::Range {
5356
CallbackHandler() { any(CallbackArgument ca) = poorMansFunctionTracker(this) }
5457

55-
override Parameter getARoutedParameter() { result = this.getAnArg() }
58+
override Parameter getARoutedParameter() {
59+
result = this.getAnArg() and not result = this.getArg(0)
60+
}
5661

5762
override string getFramework() { result = "socketio" }
5863
}
64+
65+
private class SocketIOCall extends RemoteFlowSource::Range {
66+
SocketIOCall() { this = server().getMember("call").getACall() }
67+
68+
override string getSourceType() { result = "socketio call" }
69+
}
5970
}

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

Whitespace-only changes.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import python
2+
import experimental.meta.ConceptsTest
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import socketio
2+
3+
sio = socketio.Server()
4+
5+
@sio.on("connect")
6+
def connect(sid, environ, auth): # $ requestHandler routedParameter=environ routedParameter=auth
7+
print("connect", sid, environ, auth)
8+
9+
@sio.on("event1")
10+
def handle(sid, data): # $ requestHandler routedParameter=data
11+
print("e1", sid, data)
12+
13+
@sio.event
14+
def event2(sid, data): # $ requestHandler routedParameter=data
15+
print("e2", sid, data)
16+
17+
def event3(sid, data): # $ requestHandler routedParameter=data
18+
print("e3", sid, data)
19+
20+
sio.on("event3", handler=event3)
21+
22+
sio.on("event4", lambda sid,data: print("e4", sid, data)) # $ requestHandler routedParameter=data
23+
24+
25+
26+
if __name__ == "__main__":
27+
app = socketio.WSGIApp(sio)
28+
import eventlet
29+
eventlet.wsgi.server(eventlet.listen(('', 8000)), app)

0 commit comments

Comments
 (0)