Skip to content

Commit c5fbbc0

Browse files
committed
Refactor SqlAlchemy model
- Replaced classes that look for SqlAlchemy instances with predicates - General clean-up of code
1 parent a854fb8 commit c5fbbc0

File tree

1 file changed

+23
-34
lines changed

1 file changed

+23
-34
lines changed

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

Lines changed: 23 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -11,43 +11,29 @@ private import semmle.python.Concepts
1111

1212
private module SqlAlchemy {
1313
/**
14-
* An instantization of a SqlAlchemy Session object.
14+
* Returns an instantization of a SqlAlchemy Session object.
1515
* See https://docs.sqlalchemy.org/en/14/orm/session_api.html#sqlalchemy.orm.Session and
1616
* https://docs.sqlalchemy.org/en/14/orm/session_api.html#sqlalchemy.orm.sessionmaker
1717
*/
18-
private class SqlAlchemySessionInstance extends API::Node {
19-
SqlAlchemySessionInstance() {
20-
this in [
21-
API::moduleImport("sqlalchemy.orm").getMember("Session").getReturn(),
22-
API::moduleImport("sqlalchemy.orm").getMember("sessionmaker").getReturn().getReturn()
23-
]
24-
}
25-
26-
override string toString() { result = "Use of SqlAlchemy Session instantization" }
18+
private API::Node getSqlAlchemySessionInstance() {
19+
result = API::moduleImport("sqlalchemy.orm").getMember("Session").getReturn() or
20+
result = API::moduleImport("sqlalchemy.orm").getMember("sessionmaker").getReturn().getReturn()
2721
}
2822

2923
/**
30-
* An instantization of a SqlAlchemy Engine object.
24+
* Returns an instantization of a SqlAlchemy Engine object.
3125
* See https://docs.sqlalchemy.org/en/14/core/engines.html#sqlalchemy.create_engine
3226
*/
33-
private class SqlAlchemyEngineInstance extends API::Node {
34-
SqlAlchemyEngineInstance() {
35-
this = API::moduleImport("sqlalchemy").getMember("create_engine").getReturn()
36-
}
37-
38-
override string toString() { result = "Use of SqlAlchemy create_engine member" }
27+
private API::Node getSqlAlchemyEngineInstance() {
28+
result = API::moduleImport("sqlalchemy").getMember("create_engine").getReturn()
3929
}
4030

4131
/**
42-
* An instantization of a SqlAlchemy Query object.
32+
* Returns an instantization of a SqlAlchemy Query object.
4333
* See https://docs.sqlalchemy.org/en/14/orm/query.html?highlight=query#sqlalchemy.orm.Query
4434
*/
45-
private class SqlAlchemyQueryInstance extends API::Node {
46-
SqlAlchemyQueryInstance() {
47-
this = any(SqlAlchemySessionInstance sessionInstance).getMember("query").getReturn()
48-
}
49-
50-
override string toString() { result = "Use of SqlAlchemy Session Query member" }
35+
private API::Node getSqlAlchemyQueryInstance() {
36+
result = getSqlAlchemySessionInstance().getMember("query").getReturn()
5137
}
5238

5339
/**
@@ -59,11 +45,14 @@ private module SqlAlchemy {
5945
*/
6046
private class SqlAlchemyExecuteCall extends DataFlow::CallCfgNode, SqlExecution::Range {
6147
SqlAlchemyExecuteCall() {
62-
exists(SqlAlchemySessionInstance sessionInstance, SqlAlchemyEngineInstance engineInstance |
63-
this = sessionInstance.getMember("execute").getACall() or
64-
this = engineInstance.getMember("connect").getReturn().getMember("execute").getACall() or
65-
this = engineInstance.getMember("begin").getReturn().getMember("execute").getACall()
66-
)
48+
// new way
49+
this = getSqlAlchemySessionInstance().getMember("execute").getACall() or
50+
this =
51+
getSqlAlchemyEngineInstance()
52+
.getMember(["connect", "begin"])
53+
.getReturn()
54+
.getMember("execute")
55+
.getACall()
6756
}
6857

6958
override DataFlow::Node getSql() { result = this.getArg(0) }
@@ -76,8 +65,10 @@ private module SqlAlchemy {
7665
*/
7766
private class SqlAlchemyScalarCall extends DataFlow::CallCfgNode, SqlExecution::Range {
7867
SqlAlchemyScalarCall() {
79-
this = any(SqlAlchemySessionInstance sessionInstance).getMember("scalar").getACall() or
80-
this = any(SqlAlchemyEngineInstance engineInstance).getMember("scalar").getACall()
68+
this =
69+
[getSqlAlchemySessionInstance(), getSqlAlchemyEngineInstance()]
70+
.getMember("scalar")
71+
.getACall()
8172
}
8273

8374
override DataFlow::Node getSql() { result = this.getArg(0) }
@@ -88,9 +79,7 @@ private module SqlAlchemy {
8879
* See https://docs.sqlalchemy.org/en/14/orm/query.html?highlight=query#sqlalchemy.orm.Query
8980
*/
9081
private class SqlAlchemyQueryCall extends DataFlow::CallCfgNode, SqlExecution::Range {
91-
SqlAlchemyQueryCall() {
92-
this = any(SqlAlchemyQueryInstance queryInstance).getAMember().getACall()
93-
}
82+
SqlAlchemyQueryCall() { this = getSqlAlchemyQueryInstance().getAMember().getACall() }
9483

9584
override DataFlow::Node getSql() { result = this.getArg(0) }
9685
}

0 commit comments

Comments
 (0)