Skip to content

Commit 0b21b27

Browse files
committed
JS: Improve pg model
1 parent 937a620 commit 0b21b27

File tree

4 files changed

+37
-1
lines changed

4 files changed

+37
-1
lines changed

javascript/ql/src/semmle/javascript/frameworks/SQL.qll

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,20 @@ private module Postgres {
134134
// pool.connect(function(err, client) { ... })
135135
result = pool().getMember("connect").getParameter(0).getParameter(1)
136136
or
137+
// await pool.connect()
138+
result = pool().getMember("connect").getReturn().getPromised()
139+
or
137140
result = pgpConnection().getMember("client")
141+
or
142+
exists(API::CallNode call |
143+
call = pool().getMember("on").getACall() and
144+
call.getArgument(0).getStringValue() = ["connect", "acquire"] and
145+
result = call.getParameter(1).getParameter(0)
146+
)
147+
or
148+
result = client().getMember("on").getReturn()
149+
or
150+
result = API::Node::ofType("pg", ["Client", "PoolClient"])
138151
}
139152

140153
/** Gets a constructor that when invoked constructs a new connection pool. */
@@ -151,6 +164,10 @@ private module Postgres {
151164
result = newPool().getInstance()
152165
or
153166
result = pgpDatabase().getMember("$pool")
167+
or
168+
result = pool().getMember("on").getReturn()
169+
or
170+
result = API::Node::ofType("pg", "Pool")
154171
}
155172

156173
/** A call to the Postgres `query` method. */
@@ -162,7 +179,11 @@ private module Postgres {
162179

163180
/** An expression that is passed to the `query` method and hence interpreted as SQL. */
164181
class QueryString extends SQL::SqlString {
165-
QueryString() { this = any(QueryCall qc).getAQueryArgument().asExpr() }
182+
QueryString() {
183+
this = any(QueryCall qc).getAQueryArgument().asExpr()
184+
or
185+
this = API::moduleImport("pg-cursor").getParameter(0).getARhs().asExpr()
186+
}
166187
}
167188

168189
/** An expression that is passed as user name or password when creating a client or a pool. */

javascript/ql/test/library-tests/frameworks/SQL/SqlString.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,12 @@
2323
| mysqlImport.js:3:18:5:1 | {\\n s ... = ?',\\n} |
2424
| postgres1.js:37:21:37:24 | text |
2525
| postgres2.js:30:16:30:41 | 'SELECT ... number' |
26+
| postgres2.js:43:15:43:26 | 'SELECT 123' |
27+
| postgres2.js:46:15:46:47 | new Cur ... users') |
28+
| postgres2.js:46:26:46:46 | 'SELECT ... users' |
2629
| postgres3.js:15:16:15:40 | 'SELECT ... s name' |
2730
| postgres5.js:8:21:8:25 | query |
31+
| postgres-types.ts:4:18:4:29 | 'SELECT 123' |
2832
| postgresImport.js:4:18:4:43 | 'SELECT ... number' |
2933
| sequelize2.js:10:17:10:118 | 'SELECT ... Y name' |
3034
| sequelize.js:8:17:8:118 | 'SELECT ... Y name' |
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { Client } from "pg";
2+
3+
function submitSomething(client: Client) {
4+
client.query('SELECT 123');
5+
}

javascript/ql/test/library-tests/frameworks/SQL/postgres2.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,9 @@ pool.connect(function(err, client, done) {
3838
//output: 1
3939
});
4040
});
41+
42+
let client2 = await pool.connect();
43+
client2.query('SELECT 123');
44+
45+
const Cursor = require('pg-cursor');
46+
client2.query(new Cursor('SELECT * from users'));

0 commit comments

Comments
 (0)