@mcpolyglot/connector-sql 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -8
- package/dist/.tsbuildinfo +1 -1
- package/dist/__tests__/dialects.integration.test.d.ts +2 -0
- package/dist/__tests__/dialects.integration.test.d.ts.map +1 -0
- package/dist/__tests__/dialects.integration.test.js +183 -0
- package/dist/__tests__/dialects.integration.test.js.map +1 -0
- package/dist/__tests__/policy.test.d.ts +2 -0
- package/dist/__tests__/policy.test.d.ts.map +1 -0
- package/dist/__tests__/policy.test.js +190 -0
- package/dist/__tests__/policy.test.js.map +1 -0
- package/dist/__tests__/sqlite.integration.test.js +182 -4
- package/dist/__tests__/sqlite.integration.test.js.map +1 -1
- package/dist/connector.d.ts +30 -2
- package/dist/connector.d.ts.map +1 -1
- package/dist/connector.js +173 -14
- package/dist/connector.js.map +1 -1
- package/dist/dialect.d.ts +26 -1
- package/dist/dialect.d.ts.map +1 -1
- package/dist/dialect.js +4 -1
- package/dist/dialect.js.map +1 -1
- package/dist/dialects/mysql.d.ts +14 -3
- package/dist/dialects/mysql.d.ts.map +1 -1
- package/dist/dialects/mysql.js +67 -6
- package/dist/dialects/mysql.js.map +1 -1
- package/dist/dialects/postgres.d.ts +14 -3
- package/dist/dialects/postgres.d.ts.map +1 -1
- package/dist/dialects/postgres.js +70 -9
- package/dist/dialects/postgres.js.map +1 -1
- package/dist/dialects/sqlite.d.ts +12 -3
- package/dist/dialects/sqlite.d.ts.map +1 -1
- package/dist/dialects/sqlite.js +31 -4
- package/dist/dialects/sqlite.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/policy.d.ts +56 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +343 -0
- package/dist/policy.js.map +1 -0
- package/package.json +2 -2
package/dist/policy.js
ADDED
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import sqlParser from 'node-sql-parser';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
const { Parser } = sqlParser;
|
|
4
|
+
const parser = new Parser();
|
|
5
|
+
export const AccessSchema = z.enum(['read', 'write', 'none']);
|
|
6
|
+
export const PolicySchema = z
|
|
7
|
+
.object({
|
|
8
|
+
/** Per-table access. Keys are `table` or `schema.table`, case-insensitive. */
|
|
9
|
+
tables: z.record(z.string(), AccessSchema).default({}),
|
|
10
|
+
/** Access for tables not listed in `tables`. Never `write`: writes are opt-in per table. */
|
|
11
|
+
defaultAccess: z.enum(['read', 'none']).default('read'),
|
|
12
|
+
/** Columns no query may reference, as `table.column` (`*.column` matches any table). */
|
|
13
|
+
denyColumns: z.array(z.string()).default([]),
|
|
14
|
+
maxRows: z.number().int().positive().optional(),
|
|
15
|
+
maxWritesPerCall: z.number().int().positive().default(1),
|
|
16
|
+
statementTimeoutMs: z.number().int().positive().optional(),
|
|
17
|
+
/** How long an `execute` idempotencyKey is remembered. */
|
|
18
|
+
idempotencyWindowMinutes: z.number().positive().default(10),
|
|
19
|
+
})
|
|
20
|
+
.strict();
|
|
21
|
+
const DB_FOR = {
|
|
22
|
+
postgres: 'postgresql',
|
|
23
|
+
mysql: 'mysql',
|
|
24
|
+
mariadb: 'mariadb',
|
|
25
|
+
sqlite: 'sqlite',
|
|
26
|
+
};
|
|
27
|
+
const WRITE_STATEMENTS = new Set(['insert', 'update', 'delete', 'replace']);
|
|
28
|
+
/**
|
|
29
|
+
* Functions no policy may call. They read or write the server's filesystem, reach other
|
|
30
|
+
* hosts, or stall the connection, and a read-only transaction does not stop any of them.
|
|
31
|
+
* This list is defense-in-depth: the database role's privileges are the real control.
|
|
32
|
+
*/
|
|
33
|
+
export const DENIED_FUNCTIONS = new Set([
|
|
34
|
+
// Postgres: server filesystem
|
|
35
|
+
'pg_read_file',
|
|
36
|
+
'pg_read_binary_file',
|
|
37
|
+
'pg_ls_dir',
|
|
38
|
+
'pg_ls_logdir',
|
|
39
|
+
'pg_ls_waldir',
|
|
40
|
+
'pg_ls_tmpdir',
|
|
41
|
+
'pg_ls_archive_statusdir',
|
|
42
|
+
'pg_stat_file',
|
|
43
|
+
'lo_import',
|
|
44
|
+
'lo_export',
|
|
45
|
+
'lo_get',
|
|
46
|
+
'lo_put',
|
|
47
|
+
'lo_from_bytea',
|
|
48
|
+
// Postgres: network / other sessions / server state
|
|
49
|
+
'dblink',
|
|
50
|
+
'dblink_connect',
|
|
51
|
+
'dblink_connect_u',
|
|
52
|
+
'dblink_exec',
|
|
53
|
+
'dblink_open',
|
|
54
|
+
'dblink_fetch',
|
|
55
|
+
'dblink_send_query',
|
|
56
|
+
'pg_terminate_backend',
|
|
57
|
+
'pg_cancel_backend',
|
|
58
|
+
'pg_reload_conf',
|
|
59
|
+
'pg_rotate_logfile',
|
|
60
|
+
'set_config',
|
|
61
|
+
'pg_advisory_lock',
|
|
62
|
+
'pg_advisory_xact_lock',
|
|
63
|
+
'pg_sleep',
|
|
64
|
+
'pg_sleep_for',
|
|
65
|
+
'pg_sleep_until',
|
|
66
|
+
// MySQL / MariaDB
|
|
67
|
+
'load_file',
|
|
68
|
+
'sleep',
|
|
69
|
+
'benchmark',
|
|
70
|
+
'sys_exec',
|
|
71
|
+
'sys_eval',
|
|
72
|
+
'sys_get',
|
|
73
|
+
'sys_set',
|
|
74
|
+
// SQLite
|
|
75
|
+
'load_extension',
|
|
76
|
+
'readfile',
|
|
77
|
+
'writefile',
|
|
78
|
+
'edit',
|
|
79
|
+
'fsdir',
|
|
80
|
+
]);
|
|
81
|
+
/** Schemas hidden from every policy unless a `tables` key names one of their tables. */
|
|
82
|
+
const SYSTEM_SCHEMAS = new Set([
|
|
83
|
+
'information_schema',
|
|
84
|
+
'pg_catalog',
|
|
85
|
+
'mysql',
|
|
86
|
+
'performance_schema',
|
|
87
|
+
'sys',
|
|
88
|
+
]);
|
|
89
|
+
const SYSTEM_TABLE_PREFIXES = ['pg_', 'sqlite_'];
|
|
90
|
+
/** Classify one SQL string against a policy. Pure: never touches the database. */
|
|
91
|
+
export function classify(sql, policy, dialect) {
|
|
92
|
+
const opt = { database: DB_FOR[dialect] };
|
|
93
|
+
const deny = (reason, extra = {}) => ({
|
|
94
|
+
allow: false,
|
|
95
|
+
reason,
|
|
96
|
+
tables: [],
|
|
97
|
+
...extra,
|
|
98
|
+
});
|
|
99
|
+
let ast;
|
|
100
|
+
let tableRefs;
|
|
101
|
+
let columnRefs;
|
|
102
|
+
try {
|
|
103
|
+
ast = parser.astify(sql, opt);
|
|
104
|
+
tableRefs = parser.tableList(sql, opt);
|
|
105
|
+
columnRefs = parser.columnList(sql, opt);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
// Unparseable SQL is denied: anything the classifier can't see, it can't vouch for.
|
|
109
|
+
return deny(`Could not parse SQL as ${dialect}: ${err.message.slice(0, 200)}`);
|
|
110
|
+
}
|
|
111
|
+
const stmts = (Array.isArray(ast) ? ast : [ast]);
|
|
112
|
+
if (stmts.length !== 1)
|
|
113
|
+
return deny(`Exactly one statement per call; got ${stmts.length}.`);
|
|
114
|
+
const stmt = stmts[0];
|
|
115
|
+
const type = String(stmt.type ?? 'unknown').toLowerCase();
|
|
116
|
+
if (type !== 'select' && !WRITE_STATEMENTS.has(type)) {
|
|
117
|
+
return deny(`"${type.toUpperCase()}" statements are always blocked (DDL/admin).`, {
|
|
118
|
+
statement: type,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
if ((type === 'update' || type === 'delete') && !stmt.where) {
|
|
122
|
+
return deny(`${type.toUpperCase()} without a WHERE clause is blocked.`, { statement: type });
|
|
123
|
+
}
|
|
124
|
+
if ((type === 'update' || type === 'delete') && !referencesColumn(stmt.where)) {
|
|
125
|
+
return deny(`${type.toUpperCase()} with a WHERE clause that names no column (e.g. WHERE 1=1) is blocked.`, { statement: type });
|
|
126
|
+
}
|
|
127
|
+
// `SELECT ... INTO OUTFILE/DUMPFILE` (MySQL) and `SELECT ... INTO newtable` (Postgres) write
|
|
128
|
+
// to the server even inside a read-only transaction.
|
|
129
|
+
if (stmt.into && (stmt.into.keyword || stmt.into.expr || stmt.into.type)) {
|
|
130
|
+
return deny(`SELECT ... INTO is blocked; it writes to the server.`, { statement: type });
|
|
131
|
+
}
|
|
132
|
+
const fn = findDeniedFunction(ast);
|
|
133
|
+
if (fn) {
|
|
134
|
+
return deny(`Function "${fn}" is always blocked (file, network, or server access).`, {
|
|
135
|
+
statement: type,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
const tables = [];
|
|
139
|
+
for (const ref of tableRefs) {
|
|
140
|
+
const [rawOp, schema, name] = ref.split('::');
|
|
141
|
+
const op = WRITE_STATEMENTS.has(rawOp.toLowerCase()) ? 'write' : 'read';
|
|
142
|
+
const qualified = schema && schema !== 'null' ? `${schema}.${name}` : name;
|
|
143
|
+
tables.push({ name: qualified, op });
|
|
144
|
+
if (isSystemTable(schema, name) && !explicitlyListed(policy, schema, name)) {
|
|
145
|
+
return deny(`System table "${qualified}" is hidden; list it in policy.tables to expose it.`, {
|
|
146
|
+
statement: type,
|
|
147
|
+
tables,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
const access = tableAccess(policy, schema, name);
|
|
151
|
+
if (access === 'none') {
|
|
152
|
+
return deny(`Table "${qualified}" is not accessible under this policy.`, {
|
|
153
|
+
statement: type,
|
|
154
|
+
tables,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
if (op === 'write' && access !== 'write') {
|
|
158
|
+
return deny(`Table "${qualified}" is read-only under this policy; ${type} denied.`, {
|
|
159
|
+
statement: type,
|
|
160
|
+
tables,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const denied = policy.denyColumns.map((c) => {
|
|
165
|
+
const i = c.lastIndexOf('.');
|
|
166
|
+
return { table: c.slice(0, i).toLowerCase(), column: c.slice(i + 1).toLowerCase() };
|
|
167
|
+
});
|
|
168
|
+
if (denied.length > 0) {
|
|
169
|
+
const referenced = tables.map((t) => t.name.split('.').pop().toLowerCase());
|
|
170
|
+
// A column with no table qualifier could come from any referenced table, so it's
|
|
171
|
+
// checked against all of them.
|
|
172
|
+
const deniedFor = (table) => denied.filter((d) => d.table === '*' ||
|
|
173
|
+
(table === null ? referenced.includes(bareName(d.table)) : bareName(d.table) === table));
|
|
174
|
+
// A bare identifier that names a table or alias in FROM is a whole-row reference
|
|
175
|
+
// (`SELECT u FROM users u`, `to_jsonb(u)`, `u::text`): every column, including denied
|
|
176
|
+
// ones, comes back inside one value. Treat it like `SELECT *` on that table.
|
|
177
|
+
const rowRefs = tableNamesAndAliases(ast, referenced);
|
|
178
|
+
for (const ref of columnRefs) {
|
|
179
|
+
const [refOp, rawTable, rawCol] = ref.split('::');
|
|
180
|
+
// DELETE reports `table.(.*)` but returns no columns; its WHERE refs are still checked.
|
|
181
|
+
if (refOp === 'delete' && rawCol === '(.*)')
|
|
182
|
+
continue;
|
|
183
|
+
let table = rawTable === 'null' ? null : bareName(rawTable.toLowerCase());
|
|
184
|
+
let col = rawCol.toLowerCase();
|
|
185
|
+
let wholeRow = col === '(.*)';
|
|
186
|
+
if (table === null && !wholeRow && rowRefs.has(col)) {
|
|
187
|
+
table = rowRefs.get(col);
|
|
188
|
+
col = '(.*)';
|
|
189
|
+
wholeRow = true;
|
|
190
|
+
}
|
|
191
|
+
const hits = deniedFor(table);
|
|
192
|
+
const hit = wholeRow ? hits[0] : hits.find((d) => d.column === col);
|
|
193
|
+
if (hit) {
|
|
194
|
+
const what = rawCol === '(.*)'
|
|
195
|
+
? `SELECT * would expose`
|
|
196
|
+
: wholeRow
|
|
197
|
+
? `Whole-row reference "${rawCol}" would expose`
|
|
198
|
+
: `Query references`;
|
|
199
|
+
return deny(`${what} denied column "${hit.table}.${hit.column}". List allowed columns explicitly.`, { statement: type, tables });
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return { allow: true, reason: 'Allowed by policy.', statement: type, tables };
|
|
204
|
+
}
|
|
205
|
+
const RANK = { none: 0, read: 1, write: 2 };
|
|
206
|
+
function isSystemTable(schema, name) {
|
|
207
|
+
const s = schema && schema !== 'null' ? schema.toLowerCase() : null;
|
|
208
|
+
if (s)
|
|
209
|
+
return SYSTEM_SCHEMAS.has(s);
|
|
210
|
+
const n = name.toLowerCase();
|
|
211
|
+
return SYSTEM_TABLE_PREFIXES.some((p) => n.startsWith(p));
|
|
212
|
+
}
|
|
213
|
+
function explicitlyListed(policy, schema, name) {
|
|
214
|
+
const bare = name.toLowerCase();
|
|
215
|
+
const qualified = schema && schema !== 'null' ? `${schema}.${name}`.toLowerCase() : undefined;
|
|
216
|
+
return Object.keys(policy.tables).some((k) => {
|
|
217
|
+
const key = k.toLowerCase();
|
|
218
|
+
return key === bare || key === qualified;
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
/** Depth-first walk over every object/array in the AST. */
|
|
222
|
+
function* walk(node, seen = new Set()) {
|
|
223
|
+
if (node === null || typeof node !== 'object' || seen.has(node))
|
|
224
|
+
return;
|
|
225
|
+
seen.add(node);
|
|
226
|
+
if (Array.isArray(node)) {
|
|
227
|
+
for (const child of node)
|
|
228
|
+
yield* walk(child, seen);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const obj = node;
|
|
232
|
+
yield obj;
|
|
233
|
+
for (const v of Object.values(obj))
|
|
234
|
+
yield* walk(v, seen);
|
|
235
|
+
}
|
|
236
|
+
/** Function name from the several shapes node-sql-parser uses. */
|
|
237
|
+
function functionName(node) {
|
|
238
|
+
const n = node.name;
|
|
239
|
+
if (typeof n === 'string')
|
|
240
|
+
return n.toLowerCase();
|
|
241
|
+
if (n && typeof n === 'object') {
|
|
242
|
+
const parts = n.name;
|
|
243
|
+
if (Array.isArray(parts)) {
|
|
244
|
+
const last = parts[parts.length - 1];
|
|
245
|
+
if (last && typeof last.value === 'string')
|
|
246
|
+
return last.value.toLowerCase();
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
function findDeniedFunction(ast) {
|
|
252
|
+
for (const node of walk(ast)) {
|
|
253
|
+
if (node.type !== 'function' && node.type !== 'aggr_func')
|
|
254
|
+
continue;
|
|
255
|
+
const name = functionName(node);
|
|
256
|
+
if (name && DENIED_FUNCTIONS.has(name))
|
|
257
|
+
return name;
|
|
258
|
+
}
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
function referencesColumn(where) {
|
|
262
|
+
for (const node of walk(where))
|
|
263
|
+
if (node.type === 'column_ref')
|
|
264
|
+
return true;
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Map of every bare name the query can use as a whole-row reference (table names and
|
|
269
|
+
* FROM aliases, lowercased) to the underlying table's bare name.
|
|
270
|
+
*/
|
|
271
|
+
function tableNamesAndAliases(ast, referenced) {
|
|
272
|
+
const out = new Map();
|
|
273
|
+
for (const t of referenced)
|
|
274
|
+
out.set(t, t);
|
|
275
|
+
for (const node of walk(ast)) {
|
|
276
|
+
if (typeof node.table !== 'string')
|
|
277
|
+
continue;
|
|
278
|
+
const table = bareName(node.table.toLowerCase());
|
|
279
|
+
if (typeof node.as === 'string')
|
|
280
|
+
out.set(node.as.toLowerCase(), table);
|
|
281
|
+
}
|
|
282
|
+
return out;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Every policy key that could name this table matches; the most restrictive wins. An
|
|
286
|
+
* unqualified `users` therefore can't dodge a `public.users: none` rule.
|
|
287
|
+
*/
|
|
288
|
+
export function tableAccess(policy, schema, name) {
|
|
289
|
+
const bare = name.toLowerCase();
|
|
290
|
+
const qualified = schema && schema !== 'null' ? `${schema}.${name}`.toLowerCase() : undefined;
|
|
291
|
+
const matches = Object.entries(policy.tables)
|
|
292
|
+
.filter(([k]) => {
|
|
293
|
+
const key = k.toLowerCase();
|
|
294
|
+
return key === bare || key === qualified || (!qualified && bareName(key) === bare);
|
|
295
|
+
})
|
|
296
|
+
.map(([, v]) => v);
|
|
297
|
+
if (matches.length === 0)
|
|
298
|
+
return policy.defaultAccess;
|
|
299
|
+
return matches.reduce((a, b) => (RANK[a] <= RANK[b] ? a : b));
|
|
300
|
+
}
|
|
301
|
+
function bareName(t) {
|
|
302
|
+
return t.split('.').pop();
|
|
303
|
+
}
|
|
304
|
+
export function isColumnDenied(policy, table, column) {
|
|
305
|
+
const t = bareName(table.toLowerCase());
|
|
306
|
+
const c = column.toLowerCase();
|
|
307
|
+
return policy.denyColumns.some((d) => {
|
|
308
|
+
const i = d.lastIndexOf('.');
|
|
309
|
+
const dt = d.slice(0, i).toLowerCase();
|
|
310
|
+
return d.slice(i + 1).toLowerCase() === c && (dt === '*' || bareName(dt) === t);
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Combine a source policy with a per-agent override so the result is never more
|
|
315
|
+
* permissive than either: per table the most restrictive access wins, deny lists are
|
|
316
|
+
* unioned, and every cap takes the smaller value.
|
|
317
|
+
*/
|
|
318
|
+
export function narrowPolicy(base, override) {
|
|
319
|
+
const lookup = (p, key) => {
|
|
320
|
+
const i = key.lastIndexOf('.');
|
|
321
|
+
return i < 0 ? tableAccess(p, 'null', key) : tableAccess(p, key.slice(0, i), key.slice(i + 1));
|
|
322
|
+
};
|
|
323
|
+
const stricter = (a, b) => (RANK[a] <= RANK[b] ? a : b);
|
|
324
|
+
const min = (a, b) => a === undefined ? b : b === undefined ? a : Math.min(a, b);
|
|
325
|
+
const tables = {};
|
|
326
|
+
for (const key of new Set([...Object.keys(base.tables), ...Object.keys(override.tables)])) {
|
|
327
|
+
tables[key] = stricter(lookup(base, key), lookup(override, key));
|
|
328
|
+
}
|
|
329
|
+
const maxRows = min(base.maxRows, override.maxRows);
|
|
330
|
+
const statementTimeoutMs = min(base.statementTimeoutMs, override.statementTimeoutMs);
|
|
331
|
+
return {
|
|
332
|
+
tables,
|
|
333
|
+
defaultAccess: RANK[base.defaultAccess] <= RANK[override.defaultAccess]
|
|
334
|
+
? base.defaultAccess
|
|
335
|
+
: override.defaultAccess,
|
|
336
|
+
denyColumns: [...new Set([...base.denyColumns, ...override.denyColumns])],
|
|
337
|
+
maxWritesPerCall: Math.min(base.maxWritesPerCall, override.maxWritesPerCall),
|
|
338
|
+
idempotencyWindowMinutes: Math.min(base.idempotencyWindowMinutes, override.idempotencyWindowMinutes),
|
|
339
|
+
...(maxRows !== undefined && { maxRows }),
|
|
340
|
+
...(statementTimeoutMs !== undefined && { statementTimeoutMs }),
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcpolyglot/connector-sql",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Shared SQL connector for mcpolyglot with Postgres, MySQL/MariaDB, and SQLite dialects. Read-only-by-default with per-dialect enforcement.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"node-sql-parser": "^5.3.4",
|
|
25
25
|
"zod": "^4.4.3",
|
|
26
|
-
"@mcpolyglot/core": "^0.
|
|
26
|
+
"@mcpolyglot/core": "^0.4.0"
|
|
27
27
|
},
|
|
28
28
|
"optionalDependencies": {
|
|
29
29
|
"better-sqlite3": "^12.4.1",
|