@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../src/dialects/mysql.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,iBAAiB,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../src/dialects/mysql.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +1,34 @@
|
|
|
1
1
|
import type { TableSchema } from '@mcpolyglot/core';
|
|
2
|
-
import type
|
|
2
|
+
import { type PoolOptions, type SqlDialect, type SqlQueryResult } from '../dialect.js';
|
|
3
3
|
export declare class PostgresDialect implements SqlDialect {
|
|
4
4
|
private readonly connectionString;
|
|
5
|
+
private readonly poolOpts;
|
|
5
6
|
readonly kind: "postgres";
|
|
6
7
|
private pool?;
|
|
7
|
-
constructor(connectionString: string);
|
|
8
|
-
connect(
|
|
8
|
+
constructor(connectionString: string, poolOpts?: PoolOptions);
|
|
9
|
+
connect({ writable }?: {
|
|
10
|
+
writable?: boolean;
|
|
11
|
+
}): Promise<void>;
|
|
9
12
|
close(): Promise<void>;
|
|
10
13
|
ping(): Promise<{
|
|
11
14
|
ok: boolean;
|
|
12
15
|
latencyMs: number;
|
|
13
16
|
details?: string;
|
|
14
17
|
}>;
|
|
18
|
+
auditPrivileges(): Promise<string[]>;
|
|
15
19
|
listTables(): Promise<TableSchema[]>;
|
|
16
20
|
runReadOnly(sql: string, params: ReadonlyArray<unknown>, opts: {
|
|
17
21
|
rowCap: number;
|
|
18
22
|
timeoutMs: number;
|
|
19
23
|
signal?: AbortSignal;
|
|
20
24
|
}): Promise<SqlQueryResult>;
|
|
25
|
+
runWrite(sql: string, params: ReadonlyArray<unknown>, opts: {
|
|
26
|
+
maxRowsAffected: number;
|
|
27
|
+
timeoutMs: number;
|
|
28
|
+
signal?: AbortSignal;
|
|
29
|
+
}): Promise<{
|
|
30
|
+
rowsAffected: number;
|
|
31
|
+
}>;
|
|
21
32
|
private requirePool;
|
|
22
33
|
}
|
|
23
34
|
//# sourceMappingURL=postgres.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/dialects/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/dialects/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAe,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpG,qBAAa,eAAgB,YAAW,UAAU;IAK9C,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IACpC,OAAO,CAAC,IAAI,CAAC,CAAoB;gBAGd,gBAAgB,EAAE,MAAM,EACxB,QAAQ,GAAE,WAAgB;IAGvC,OAAO,CAAC,EAAE,QAAgB,EAAE,GAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBzE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,IAAI,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAerE,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA4BpC,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IA0CpC,WAAW,CACf,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,EAC9B,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAChE,OAAO,CAAC,cAAc,CAAC;IAmCpB,QAAQ,CACZ,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,EAC9B,IAAI,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACzE,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAuBpC,OAAO,CAAC,WAAW;CAKpB"}
|
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import { McpolyglotError } from '@mcpolyglot/core';
|
|
2
|
+
import { tooManyRows } from '../dialect.js';
|
|
2
3
|
export class PostgresDialect {
|
|
3
4
|
connectionString;
|
|
5
|
+
poolOpts;
|
|
4
6
|
kind = 'postgres';
|
|
5
7
|
pool;
|
|
6
|
-
constructor(connectionString) {
|
|
8
|
+
constructor(connectionString, poolOpts = {}) {
|
|
7
9
|
this.connectionString = connectionString;
|
|
10
|
+
this.poolOpts = poolOpts;
|
|
8
11
|
}
|
|
9
|
-
async connect() {
|
|
12
|
+
async connect({ writable = false } = {}) {
|
|
10
13
|
const { Pool } = await loadPg();
|
|
11
14
|
this.pool = new Pool({
|
|
12
15
|
connectionString: this.connectionString,
|
|
13
|
-
max: 4,
|
|
14
|
-
idleTimeoutMillis: 30_000,
|
|
16
|
+
max: this.poolOpts.max ?? 4,
|
|
17
|
+
idleTimeoutMillis: this.poolOpts.idleTimeoutMs ?? 30_000,
|
|
15
18
|
application_name: 'mcpolyglot',
|
|
19
|
+
// Every transaction on a read-only pool is read-only unless explicitly overridden.
|
|
20
|
+
...(writable ? {} : { options: '-c default_transaction_read_only=on' }),
|
|
16
21
|
});
|
|
17
22
|
// probe
|
|
18
23
|
const c = await this.pool.connect();
|
|
@@ -43,6 +48,34 @@ export class PostgresDialect {
|
|
|
43
48
|
return { ok: false, latencyMs: Date.now() - t0, details: err.message };
|
|
44
49
|
}
|
|
45
50
|
}
|
|
51
|
+
async auditPrivileges() {
|
|
52
|
+
const c = await this.requirePool().connect();
|
|
53
|
+
try {
|
|
54
|
+
const res = await c.query(`
|
|
55
|
+
SELECT r.rolsuper,
|
|
56
|
+
pg_has_role(current_user, 'pg_read_server_files', 'MEMBER') AS read_files,
|
|
57
|
+
pg_has_role(current_user, 'pg_write_server_files', 'MEMBER') AS write_files,
|
|
58
|
+
pg_has_role(current_user, 'pg_execute_server_program', 'MEMBER') AS exec_program
|
|
59
|
+
FROM pg_roles r WHERE r.rolname = current_user
|
|
60
|
+
`);
|
|
61
|
+
const row = res.rows[0];
|
|
62
|
+
if (!row)
|
|
63
|
+
return [];
|
|
64
|
+
const problems = [];
|
|
65
|
+
if (row.rolsuper)
|
|
66
|
+
problems.push('database user is a superuser; policy cannot be enforced');
|
|
67
|
+
if (row.read_files)
|
|
68
|
+
problems.push('database user is in pg_read_server_files (pg_read_file)');
|
|
69
|
+
if (row.write_files)
|
|
70
|
+
problems.push('database user is in pg_write_server_files (COPY TO)');
|
|
71
|
+
if (row.exec_program)
|
|
72
|
+
problems.push('database user is in pg_execute_server_program');
|
|
73
|
+
return problems;
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
c.release();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
46
79
|
async listTables() {
|
|
47
80
|
const c = await this.requirePool().connect();
|
|
48
81
|
try {
|
|
@@ -106,11 +139,7 @@ export class PostgresDialect {
|
|
|
106
139
|
return { columns: fields, rows, rowCount: rows.length, truncated };
|
|
107
140
|
}
|
|
108
141
|
catch (err) {
|
|
109
|
-
|
|
110
|
-
if (err.code === '25006') {
|
|
111
|
-
throw new McpolyglotError('forbidden.read_only', err.message);
|
|
112
|
-
}
|
|
113
|
-
throw err;
|
|
142
|
+
throw mapReadOnly(err);
|
|
114
143
|
}
|
|
115
144
|
finally {
|
|
116
145
|
opts.signal?.removeEventListener('abort', onAbort);
|
|
@@ -121,12 +150,44 @@ export class PostgresDialect {
|
|
|
121
150
|
c.release();
|
|
122
151
|
}
|
|
123
152
|
}
|
|
153
|
+
async runWrite(sql, params, opts) {
|
|
154
|
+
const c = await this.requirePool().connect();
|
|
155
|
+
const onAbort = () => {
|
|
156
|
+
c.query('SELECT pg_cancel_backend(pg_backend_pid())').catch(() => { });
|
|
157
|
+
};
|
|
158
|
+
try {
|
|
159
|
+
await c.query('BEGIN');
|
|
160
|
+
await c.query(`SET LOCAL statement_timeout = ${Math.max(1, Math.floor(opts.timeoutMs))}`);
|
|
161
|
+
opts.signal?.addEventListener('abort', onAbort, { once: true });
|
|
162
|
+
const res = await c.query({ text: sql, values: params });
|
|
163
|
+
const n = res.rowCount ?? 0;
|
|
164
|
+
if (n > opts.maxRowsAffected)
|
|
165
|
+
throw tooManyRows(n, opts.maxRowsAffected);
|
|
166
|
+
await c.query('COMMIT');
|
|
167
|
+
return { rowsAffected: n };
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
await c.query('ROLLBACK').catch(() => { });
|
|
171
|
+
throw mapReadOnly(err);
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
opts.signal?.removeEventListener('abort', onAbort);
|
|
175
|
+
c.release();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
124
178
|
requirePool() {
|
|
125
179
|
if (!this.pool)
|
|
126
180
|
throw new McpolyglotError('connector.not_initialized', 'PostgresDialect not connected');
|
|
127
181
|
return this.pool;
|
|
128
182
|
}
|
|
129
183
|
}
|
|
184
|
+
// 25006 = read_only_sql_transaction: the DB-level guard caught a write.
|
|
185
|
+
function mapReadOnly(err) {
|
|
186
|
+
if (err.code === '25006') {
|
|
187
|
+
return new McpolyglotError('forbidden.read_only', err.message);
|
|
188
|
+
}
|
|
189
|
+
return err;
|
|
190
|
+
}
|
|
130
191
|
async function loadPg() {
|
|
131
192
|
try {
|
|
132
193
|
return await import('pg');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/dialects/postgres.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/dialects/postgres.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import type { TableSchema } from '@mcpolyglot/core';
|
|
2
|
-
import type
|
|
2
|
+
import { type SqlDialect, type SqlQueryResult } from '../dialect.js';
|
|
3
3
|
export declare class SqliteDialect implements SqlDialect {
|
|
4
4
|
private readonly fileOrUri;
|
|
5
5
|
readonly kind: "sqlite";
|
|
6
6
|
private db?;
|
|
7
7
|
/**
|
|
8
8
|
* @param fileOrUri Either an absolute path or a `sqlite://` URI.
|
|
9
|
-
*
|
|
9
|
+
* Opened read-only unless `connect({ writable: true })`.
|
|
10
10
|
*/
|
|
11
11
|
constructor(fileOrUri: string);
|
|
12
|
-
connect(
|
|
12
|
+
connect({ writable }?: {
|
|
13
|
+
writable?: boolean;
|
|
14
|
+
}): Promise<void>;
|
|
13
15
|
close(): Promise<void>;
|
|
14
16
|
ping(): Promise<{
|
|
15
17
|
ok: boolean;
|
|
@@ -22,6 +24,13 @@ export declare class SqliteDialect implements SqlDialect {
|
|
|
22
24
|
timeoutMs: number;
|
|
23
25
|
signal?: AbortSignal;
|
|
24
26
|
}): Promise<SqlQueryResult>;
|
|
27
|
+
runWrite(sql: string, params: ReadonlyArray<unknown>, opts: {
|
|
28
|
+
maxRowsAffected: number;
|
|
29
|
+
timeoutMs: number;
|
|
30
|
+
signal?: AbortSignal;
|
|
31
|
+
}): Promise<{
|
|
32
|
+
rowsAffected: number;
|
|
33
|
+
}>;
|
|
25
34
|
private requireDb;
|
|
26
35
|
private resolvePath;
|
|
27
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/dialects/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAElE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/dialects/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,kBAAkB,CAAC;AAElE,OAAO,EAAe,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAKlF,qBAAa,aAAc,YAAW,UAAU;IAQlC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAPtC,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,OAAO,CAAC,EAAE,CAAC,CAAwB;IAEnC;;;OAGG;gBAC0B,SAAS,EAAE,MAAM;IAExC,OAAO,CAAC,EAAE,QAAgB,EAAE,GAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,IAAI,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAUrE,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAyBpC,WAAW,CACf,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,EAC9B,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAChE,OAAO,CAAC,cAAc,CAAC;IAsBpB,QAAQ,CACZ,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,EAC9B,IAAI,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GACzE,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAuBpC,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,WAAW;CAKpB"}
|
package/dist/dialects/sqlite.js
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
import { McpolyglotError } from '@mcpolyglot/core';
|
|
2
|
+
import { tooManyRows } from '../dialect.js';
|
|
2
3
|
export class SqliteDialect {
|
|
3
4
|
fileOrUri;
|
|
4
5
|
kind = 'sqlite';
|
|
5
6
|
db;
|
|
6
7
|
/**
|
|
7
8
|
* @param fileOrUri Either an absolute path or a `sqlite://` URI.
|
|
8
|
-
*
|
|
9
|
+
* Opened read-only unless `connect({ writable: true })`.
|
|
9
10
|
*/
|
|
10
11
|
constructor(fileOrUri) {
|
|
11
12
|
this.fileOrUri = fileOrUri;
|
|
12
13
|
}
|
|
13
|
-
async connect() {
|
|
14
|
+
async connect({ writable = false } = {}) {
|
|
14
15
|
const Database = await loadSqlite();
|
|
15
16
|
const path = this.resolvePath();
|
|
16
|
-
const db = new Database(path, { readonly:
|
|
17
|
-
|
|
17
|
+
const db = new Database(path, { readonly: !writable, fileMustExist: true });
|
|
18
|
+
if (!writable)
|
|
19
|
+
db.pragma('query_only = ON');
|
|
18
20
|
this.db = db;
|
|
19
21
|
}
|
|
20
22
|
async close() {
|
|
@@ -68,6 +70,31 @@ export class SqliteDialect {
|
|
|
68
70
|
: (stmt.columns().map((c) => c.name) ?? []);
|
|
69
71
|
return { columns, rows, rowCount: rows.length, truncated };
|
|
70
72
|
}
|
|
73
|
+
async runWrite(sql, params, opts) {
|
|
74
|
+
const db = this.requireDb();
|
|
75
|
+
if (opts.signal?.aborted)
|
|
76
|
+
throw new McpolyglotError('aborted', 'Aborted before execution');
|
|
77
|
+
try {
|
|
78
|
+
// db.transaction() rolls back if the callback throws.
|
|
79
|
+
return db.transaction(() => {
|
|
80
|
+
const startedAt = Date.now();
|
|
81
|
+
const n = db.prepare(sql).run(...params).changes;
|
|
82
|
+
if (Date.now() - startedAt > opts.timeoutMs) {
|
|
83
|
+
throw new McpolyglotError('timeout', `Write exceeded ${opts.timeoutMs}ms; rolled back`);
|
|
84
|
+
}
|
|
85
|
+
if (n > opts.maxRowsAffected)
|
|
86
|
+
throw tooManyRows(n, opts.maxRowsAffected);
|
|
87
|
+
return { rowsAffected: n };
|
|
88
|
+
})();
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
const code = err.code ?? '';
|
|
92
|
+
if (code.startsWith('SQLITE_READONLY')) {
|
|
93
|
+
throw new McpolyglotError('forbidden.read_only', err.message);
|
|
94
|
+
}
|
|
95
|
+
throw err;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
71
98
|
requireDb() {
|
|
72
99
|
if (!this.db)
|
|
73
100
|
throw new McpolyglotError('connector.not_initialized', 'SqliteDialect not connected');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/dialects/sqlite.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/dialects/sqlite.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
export { SqlConnector, type SqlConnectorOptions, type SqlDialectKind } from './connector.js';
|
|
1
|
+
export { SqlConnector, stripDeniedKeys, type SqlConnectorOptions, type SqlDialectKind, } from './connector.js';
|
|
2
2
|
export type { SqlDialect, SqlQueryResult } from './dialect.js';
|
|
3
3
|
export { PostgresDialect } from './dialects/postgres.js';
|
|
4
4
|
export { MysqlDialect } from './dialects/mysql.js';
|
|
5
5
|
export { SqliteDialect } from './dialects/sqlite.js';
|
|
6
|
+
export { classify, DENIED_FUNCTIONS, narrowPolicy, isColumnDenied, tableAccess, PolicySchema, type Policy, type PolicyDecision, type Access, } from './policy.js';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,YAAY,EACZ,KAAK,MAAM,EACX,KAAK,cAAc,EACnB,KAAK,MAAM,GACZ,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export { SqlConnector } from './connector.js';
|
|
1
|
+
export { SqlConnector, stripDeniedKeys, } from './connector.js';
|
|
2
2
|
export { PostgresDialect } from './dialects/postgres.js';
|
|
3
3
|
export { MysqlDialect } from './dialects/mysql.js';
|
|
4
4
|
export { SqliteDialect } from './dialects/sqlite.js';
|
|
5
|
+
export { classify, DENIED_FUNCTIONS, narrowPolicy, isColumnDenied, tableAccess, PolicySchema, } from './policy.js';
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,eAAe,GAGhB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,YAAY,GAIb,MAAM,aAAa,CAAC"}
|
package/dist/policy.d.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { SqlDialect } from './dialect.js';
|
|
3
|
+
export declare const AccessSchema: z.ZodEnum<{
|
|
4
|
+
read: "read";
|
|
5
|
+
write: "write";
|
|
6
|
+
none: "none";
|
|
7
|
+
}>;
|
|
8
|
+
export type Access = z.infer<typeof AccessSchema>;
|
|
9
|
+
export declare const PolicySchema: z.ZodObject<{
|
|
10
|
+
tables: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodEnum<{
|
|
11
|
+
read: "read";
|
|
12
|
+
write: "write";
|
|
13
|
+
none: "none";
|
|
14
|
+
}>>>;
|
|
15
|
+
defaultAccess: z.ZodDefault<z.ZodEnum<{
|
|
16
|
+
read: "read";
|
|
17
|
+
none: "none";
|
|
18
|
+
}>>;
|
|
19
|
+
denyColumns: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
20
|
+
maxRows: z.ZodOptional<z.ZodNumber>;
|
|
21
|
+
maxWritesPerCall: z.ZodDefault<z.ZodNumber>;
|
|
22
|
+
statementTimeoutMs: z.ZodOptional<z.ZodNumber>;
|
|
23
|
+
idempotencyWindowMinutes: z.ZodDefault<z.ZodNumber>;
|
|
24
|
+
}, z.core.$strict>;
|
|
25
|
+
export type Policy = z.infer<typeof PolicySchema>;
|
|
26
|
+
export interface PolicyDecision {
|
|
27
|
+
allow: boolean;
|
|
28
|
+
/** Human-readable reason; always set on deny. */
|
|
29
|
+
reason: string;
|
|
30
|
+
statement?: string;
|
|
31
|
+
tables: {
|
|
32
|
+
name: string;
|
|
33
|
+
op: 'read' | 'write';
|
|
34
|
+
}[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Functions no policy may call. They read or write the server's filesystem, reach other
|
|
38
|
+
* hosts, or stall the connection, and a read-only transaction does not stop any of them.
|
|
39
|
+
* This list is defense-in-depth: the database role's privileges are the real control.
|
|
40
|
+
*/
|
|
41
|
+
export declare const DENIED_FUNCTIONS: ReadonlySet<string>;
|
|
42
|
+
/** Classify one SQL string against a policy. Pure: never touches the database. */
|
|
43
|
+
export declare function classify(sql: string, policy: Policy, dialect: SqlDialect['kind']): PolicyDecision;
|
|
44
|
+
/**
|
|
45
|
+
* Every policy key that could name this table matches; the most restrictive wins. An
|
|
46
|
+
* unqualified `users` therefore can't dodge a `public.users: none` rule.
|
|
47
|
+
*/
|
|
48
|
+
export declare function tableAccess(policy: Policy, schema: string, name: string): Access;
|
|
49
|
+
export declare function isColumnDenied(policy: Policy, table: string, column: string): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Combine a source policy with a per-agent override so the result is never more
|
|
52
|
+
* permissive than either: per table the most restrictive access wins, deny lists are
|
|
53
|
+
* unioned, and every cap takes the smaller value.
|
|
54
|
+
*/
|
|
55
|
+
export declare function narrowPolicy(base: Policy, override: Policy): Policy;
|
|
56
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAK/C,eAAO,MAAM,YAAY;;;;EAAoC,CAAC;AAC9D,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;kBAcd,CAAC;AACZ,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,EAAE,CAAC;CAClD;AAUD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CA+C/C,CAAC;AAYH,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,cAAc,CAsIjG;AA4ED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAWhF;AAMD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQrF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA8BnE"}
|