@nodii/db-rls 0.10.0 → 0.12.0
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/dist/auth-schema.d.ts +120 -0
- package/dist/auth-schema.d.ts.map +1 -1
- package/dist/auth-schema.js +177 -0
- package/dist/auth-schema.js.map +1 -1
- package/dist/context.d.ts +26 -8
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +35 -24
- package/dist/context.js.map +1 -1
- package/dist/drizzle-client.d.ts +17 -5
- package/dist/drizzle-client.d.ts.map +1 -1
- package/dist/drizzle-client.js +19 -18
- package/dist/drizzle-client.js.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -7
- package/dist/index.js.map +1 -1
- package/dist/postgres-js-client.d.ts +17 -10
- package/dist/postgres-js-client.d.ts.map +1 -1
- package/dist/postgres-js-client.js +19 -21
- package/dist/postgres-js-client.js.map +1 -1
- package/dist/rls-policy-gen.d.ts +43 -27
- package/dist/rls-policy-gen.d.ts.map +1 -1
- package/dist/rls-policy-gen.js +40 -15
- package/dist/rls-policy-gen.js.map +1 -1
- package/dist/rls-policy.d.ts +11 -1
- package/dist/rls-policy.d.ts.map +1 -1
- package/dist/rls-policy.js +31 -4
- package/dist/rls-policy.js.map +1 -1
- package/dist/tenant-fence.d.ts +165 -0
- package/dist/tenant-fence.d.ts.map +1 -0
- package/dist/tenant-fence.js +542 -0
- package/dist/tenant-fence.js.map +1 -0
- package/dist/types.d.ts +18 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +22 -0
- package/dist/types.js.map +1 -1
- package/dist/verify-rls-cli.d.ts.map +1 -1
- package/dist/verify-rls-cli.js +86 -10
- package/dist/verify-rls-cli.js.map +1 -1
- package/dist/verify-rls.d.ts +26 -5
- package/dist/verify-rls.d.ts.map +1 -1
- package/dist/verify-rls.js +73 -5
- package/dist/verify-rls.js.map +1 -1
- package/package.json +2 -2
package/dist/verify-rls-cli.js
CHANGED
|
@@ -6,9 +6,55 @@
|
|
|
6
6
|
// deliverable — this is the optional bin mirror of migrate-gen's CLI.
|
|
7
7
|
//
|
|
8
8
|
// Connection string comes from `--db <url>` or the `DATABASE_URL` /
|
|
9
|
-
// `DB_RLS_PG_URL` env var (in that order).
|
|
10
|
-
//
|
|
9
|
+
// `DB_RLS_PG_URL` env var (in that order).
|
|
10
|
+
//
|
|
11
|
+
// DRIVER (0.12.0): both `pg` and `postgres` are OPTIONAL peer deps and both
|
|
12
|
+
// are imported LAZILY, so importing the library requires neither and the CLI
|
|
13
|
+
// runs on whichever the host service actually installed. Before 0.12.0 this
|
|
14
|
+
// path did an unconditional `await import("pg")` — and most Nodii services
|
|
15
|
+
// run postgres-js and have no `pg` at all (finance, billing, auth all lack
|
|
16
|
+
// it), so `nodii-db-rls verify-rls` threw `Cannot find package 'pg'` for the
|
|
17
|
+
// majority of the fleet. That, plus the node-pg-only `verifyRls` signature,
|
|
18
|
+
// is why the function had zero adoption while five services hand-rolled the
|
|
19
|
+
// same catalog query in tests.
|
|
20
|
+
//
|
|
21
|
+
// Preference order: `postgres` (postgres-js) FIRST, since it is the fleet
|
|
22
|
+
// default, then `pg`. `--driver pg|postgres-js` pins it explicitly.
|
|
11
23
|
import { RlsCoverageError, verifyRls } from "./verify-rls.js";
|
|
24
|
+
/**
|
|
25
|
+
* Open a connection with whichever supported driver is installed.
|
|
26
|
+
* Returns `null` (with the attempted-driver list) when neither resolves, so
|
|
27
|
+
* the caller can emit an actionable usage error instead of a raw MODULE_NOT_-
|
|
28
|
+
* FOUND.
|
|
29
|
+
*/
|
|
30
|
+
async function connect(connectionString, pinned) {
|
|
31
|
+
const order = pinned ? [pinned] : ["postgres-js", "pg"];
|
|
32
|
+
const failed = [];
|
|
33
|
+
for (const driver of order) {
|
|
34
|
+
try {
|
|
35
|
+
if (driver === "postgres-js") {
|
|
36
|
+
const mod = (await import("postgres"));
|
|
37
|
+
const sql = mod.default(connectionString, { max: 1 });
|
|
38
|
+
return {
|
|
39
|
+
pool: sql,
|
|
40
|
+
close: () => sql.end(),
|
|
41
|
+
driver,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const { Pool } = await import("pg");
|
|
45
|
+
const pool = new Pool({ connectionString, max: 1 });
|
|
46
|
+
return {
|
|
47
|
+
pool: pool,
|
|
48
|
+
close: () => pool.end(),
|
|
49
|
+
driver,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
failed.push(`${driver}: ${err instanceof Error ? err.message : String(err)}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return { failed };
|
|
57
|
+
}
|
|
12
58
|
function splitList(value) {
|
|
13
59
|
if (!value)
|
|
14
60
|
return [];
|
|
@@ -17,6 +63,15 @@ function splitList(value) {
|
|
|
17
63
|
.map((s) => s.trim())
|
|
18
64
|
.filter((s) => s.length > 0);
|
|
19
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Invariant head of the "no usable driver" message. Split out so the message
|
|
68
|
+
* is ONE template literal (biome `lint/style/useTemplate` rejects
|
|
69
|
+
* `"literal" + template`) without a 200-column line. Literal-to-literal `+`
|
|
70
|
+
* is fine — only concatenating with an interpolation trips the rule. The
|
|
71
|
+
* trailing space is load-bearing: `--driver.` continues this sentence.
|
|
72
|
+
*/
|
|
73
|
+
const NO_DRIVER_DETAIL = "verify-rls: no usable Postgres driver. Install `postgres` (postgres-js, " +
|
|
74
|
+
"the Nodii default) or `pg` (node-postgres), or pin one with ";
|
|
20
75
|
/**
|
|
21
76
|
* Parses argv (without the leading `verify-rls` token) and runs the
|
|
22
77
|
* coverage check. Returns an exit code + message rather than calling
|
|
@@ -34,6 +89,7 @@ export async function runVerifyRlsCli(args) {
|
|
|
34
89
|
let refs;
|
|
35
90
|
let schema;
|
|
36
91
|
let dbUrl;
|
|
92
|
+
let driver;
|
|
37
93
|
for (let i = 0; i < args.length; i++) {
|
|
38
94
|
const a = args[i];
|
|
39
95
|
if (a === "--tables" && i + 1 < args.length)
|
|
@@ -44,6 +100,16 @@ export async function runVerifyRlsCli(args) {
|
|
|
44
100
|
schema = args[++i];
|
|
45
101
|
else if (a === "--db" && i + 1 < args.length)
|
|
46
102
|
dbUrl = args[++i];
|
|
103
|
+
else if (a === "--driver" && i + 1 < args.length) {
|
|
104
|
+
const v = args[++i];
|
|
105
|
+
if (v !== "pg" && v !== "postgres-js") {
|
|
106
|
+
return {
|
|
107
|
+
code: 2,
|
|
108
|
+
message: `verify-rls: --driver must be \`pg\` or \`postgres-js\` (got \`${v}\`).`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
driver = v;
|
|
112
|
+
}
|
|
47
113
|
else if (a === "--help" || a === "-h") {
|
|
48
114
|
return { code: 0, message: usage() };
|
|
49
115
|
}
|
|
@@ -59,19 +125,24 @@ export async function runVerifyRlsCli(args) {
|
|
|
59
125
|
message: "verify-rls: no connection string — pass --db <url> or set DATABASE_URL / DB_RLS_PG_URL.",
|
|
60
126
|
};
|
|
61
127
|
}
|
|
62
|
-
// Lazy-import
|
|
63
|
-
//
|
|
64
|
-
const
|
|
65
|
-
|
|
128
|
+
// Lazy-import whichever driver the host service installed (both are
|
|
129
|
+
// OPTIONAL peer deps). Keeps the library importable with neither.
|
|
130
|
+
const conn = await connect(connectionString, driver);
|
|
131
|
+
if ("failed" in conn) {
|
|
132
|
+
return {
|
|
133
|
+
code: 2,
|
|
134
|
+
message: `${NO_DRIVER_DETAIL}--driver.\nAttempted:\n ${conn.failed.join("\n ")}`,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
66
137
|
try {
|
|
67
|
-
await verifyRls(pool, {
|
|
138
|
+
await verifyRls(conn.pool, {
|
|
68
139
|
requiredTables,
|
|
69
140
|
schema,
|
|
70
141
|
referenceTables: splitList(refs),
|
|
71
142
|
});
|
|
72
143
|
return {
|
|
73
144
|
code: 0,
|
|
74
|
-
message: `verify-rls: OK — ${requiredTables.length} RLS-required table(s) covered.`,
|
|
145
|
+
message: `verify-rls: OK — ${requiredTables.length} RLS-required table(s) covered (driver: ${conn.driver}).`,
|
|
75
146
|
};
|
|
76
147
|
}
|
|
77
148
|
catch (err) {
|
|
@@ -81,11 +152,11 @@ export async function runVerifyRlsCli(args) {
|
|
|
81
152
|
throw err;
|
|
82
153
|
}
|
|
83
154
|
finally {
|
|
84
|
-
await
|
|
155
|
+
await conn.close().catch(() => { });
|
|
85
156
|
}
|
|
86
157
|
}
|
|
87
158
|
function usage() {
|
|
88
|
-
return `usage: verify-rls --tables <a,b,c> [--ref <x,y>] [--schema <name>] [--db <url>]
|
|
159
|
+
return `usage: verify-rls --tables <a,b,c> [--ref <x,y>] [--schema <name>] [--db <url>] [--driver pg|postgres-js]
|
|
89
160
|
|
|
90
161
|
Verifies every --tables relation has ROW LEVEL SECURITY enabled
|
|
91
162
|
(pg_class.relrowsecurity = true), exempting any --ref reference table
|
|
@@ -93,6 +164,11 @@ Verifies every --tables relation has ROW LEVEL SECURITY enabled
|
|
|
93
164
|
any RLS-required table is missing RLS.
|
|
94
165
|
|
|
95
166
|
Connection string: --db <url>, else DATABASE_URL, else DB_RLS_PG_URL.
|
|
167
|
+
Driver: auto-detected — postgres-js (\`postgres\`) preferred, then \`pg\`.
|
|
168
|
+
Both are optional peer deps; pin one with --driver.
|
|
169
|
+
|
|
170
|
+
Wire it as a db:setup gate, AFTER migrations apply:
|
|
171
|
+
"db:setup": "... && nodii-db-rls verify-rls --tables \\"$(...)\\""
|
|
96
172
|
|
|
97
173
|
Spec: @nodii/db-rls 08-rls § A1 (RLS on every tenant-scoped table).`;
|
|
98
174
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-rls-cli.js","sourceRoot":"","sources":["../src/verify-rls-cli.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,EAAE;AACF,sEAAsE;AACtE,wEAAwE;AACxE,2EAA2E;AAC3E,sEAAsE;AACtE,EAAE;AACF,oEAAoE;AACpE,
|
|
1
|
+
{"version":3,"file":"verify-rls-cli.js","sourceRoot":"","sources":["../src/verify-rls-cli.ts"],"names":[],"mappings":"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"}
|
package/dist/verify-rls.d.ts
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import { DbRlsError } from "./types.js";
|
|
2
|
-
/**
|
|
3
|
-
* `
|
|
4
|
-
*
|
|
5
|
-
* single read, not a GUC-scoped transaction. */
|
|
2
|
+
/** node-postgres-shaped query surface (`pg.Pool` / `pg.PoolClient` /
|
|
3
|
+
* `PgClientPool.rawPool`). We deliberately do NOT reuse the tx-bound
|
|
4
|
+
* `PgPool` — the preflight is a single read, not a GUC-scoped transaction. */
|
|
6
5
|
export interface RlsQuerier {
|
|
7
6
|
query<R = unknown>(sql: string, params?: readonly unknown[]): Promise<{
|
|
8
7
|
rows: R[];
|
|
9
8
|
}>;
|
|
10
9
|
}
|
|
10
|
+
/** postgres-js (porsager) query surface — `sql.unsafe(text, params)` resolves
|
|
11
|
+
* to a bare row ARRAY, not a `{ rows }` envelope. This is the shape every
|
|
12
|
+
* postgres-js Nodii service already has in hand. */
|
|
13
|
+
export interface RlsQuerierPostgresJs {
|
|
14
|
+
unsafe<R = unknown>(sql: string, params?: readonly unknown[]): Promise<R[]>;
|
|
15
|
+
}
|
|
16
|
+
/** Either supported driver shape. */
|
|
17
|
+
export type AnyRlsQuerier = RlsQuerier | RlsQuerierPostgresJs;
|
|
11
18
|
/** A predicate that returns `true` when `table` is a reference table
|
|
12
19
|
* (GRANT-controlled, NO RLS by design — § 7.6) and must therefore be
|
|
13
20
|
* EXEMPT from the RLS-coverage check. `table` is the table name exactly
|
|
@@ -88,6 +95,20 @@ export declare class RlsCoverageError extends DbRlsError {
|
|
|
88
95
|
* The query is a single read against `pg_class` joined to `pg_namespace`
|
|
89
96
|
* — read-only, no GUCs, no writes. Run it from a migration / `db:setup`
|
|
90
97
|
* gate against any pool (typically the owner/admin pool).
|
|
98
|
+
*
|
|
99
|
+
* `pool` accepts EITHER driver shape (0.12.0): node-postgres
|
|
100
|
+
* (`query(sql, params) → { rows }`) or postgres-js
|
|
101
|
+
* (`unsafe(sql, params) → rows[]`). Wire it into `db:setup` after
|
|
102
|
+
* migrations apply:
|
|
103
|
+
*
|
|
104
|
+
* ```ts
|
|
105
|
+
* // postgres-js service (the common Nodii case)
|
|
106
|
+
* import { verifyRls } from "@nodii/db-rls";
|
|
107
|
+
* await verifyRls(getPools().owner.sql, {
|
|
108
|
+
* requiredTables: ["finance_journal_entries", "finance_ledger_entries"],
|
|
109
|
+
* referenceTables: ["currency_codes"], // § 7.6 — GRANT-controlled, no RLS
|
|
110
|
+
* });
|
|
111
|
+
* ```
|
|
91
112
|
*/
|
|
92
|
-
export declare function verifyRls(pool:
|
|
113
|
+
export declare function verifyRls(pool: AnyRlsQuerier, opts: VerifyRlsOpts): Promise<void>;
|
|
93
114
|
//# sourceMappingURL=verify-rls.d.ts.map
|
package/dist/verify-rls.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-rls.d.ts","sourceRoot":"","sources":["../src/verify-rls.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verify-rls.d.ts","sourceRoot":"","sources":["../src/verify-rls.ts"],"names":[],"mappings":"AAuDA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;+EAE+E;AAC/E,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,CAAC,GAAG,OAAO,EACf,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAC1B,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,EAAE,CAAA;KAAE,CAAC,CAAC;CAC3B;AAED;;qDAEqD;AACrD,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;CAC7E;AAED,qCAAqC;AACrC,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,oBAAoB,CAAC;AAoC9D;;;mEAGmE;AACnE,MAAM,MAAM,uBAAuB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B;;0CAEsC;IACtC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;oEAIgE;IAChE,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;sCAGkC;IAClC,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;IAC3C;;4EAEwE;IACxE,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;;;;;;;;;yEAWqE;IACrE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;0BAC0B;AAC1B,MAAM,WAAW,mBAAmB;IAClC,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;;;2EAOuE;IACvE,MAAM,EAAE,cAAc,GAAG,WAAW,GAAG,gBAAgB,CAAC;CACzD;AAED;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,UAAU;IAC9C,QAAQ,CAAC,SAAS,EAAE,SAAS,mBAAmB,EAAE,CAAC;gBACvC,SAAS,EAAE,SAAS,mBAAmB,EAAE;CAKtD;AA+CD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,aAAa,EACnB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CA0Ff"}
|
package/dist/verify-rls.js
CHANGED
|
@@ -21,11 +21,65 @@
|
|
|
21
21
|
// RLS is an error; a reference table missing RLS is expected.
|
|
22
22
|
//
|
|
23
23
|
// The verify path is a single read-only catalog query — it does NOT need
|
|
24
|
-
// the GUC/tx-bound `PgPool` surface.
|
|
25
|
-
// `query(sql, params)` returning `{ rows }`, which `pg.Pool` /
|
|
26
|
-
// `PgClientPool.rawPool` satisfy directly. Byte-consistent error semantics
|
|
24
|
+
// the GUC/tx-bound `PgPool` surface. Byte-consistent error semantics
|
|
27
25
|
// across TS / Python / Go ports.
|
|
26
|
+
//
|
|
27
|
+
// DRIVER SHAPE (0.12.0) — WHY THIS WAS ZERO-ADOPTED
|
|
28
|
+
// -------------------------------------------------
|
|
29
|
+
// Until 0.12.0 the first parameter was typed ONLY as
|
|
30
|
+
// `{ query(sql, params): Promise<{ rows: R[] }> }` — the node-postgres result
|
|
31
|
+
// shape. This barrel's own header says why that was fatal: "every Nodii
|
|
32
|
+
// service runs postgres-js (porsager), which never installs `pg`". A
|
|
33
|
+
// postgres-js service literally cannot pass its pool here; it would have to
|
|
34
|
+
// hand-wrap `sql.unsafe(text, args)` (which resolves to a bare `T[]`) into a
|
|
35
|
+
// `{ rows }` envelope first. And the shipped `verify-rls` CLI does
|
|
36
|
+
// `await import("pg")`, so the CLI was unusable for the same services.
|
|
37
|
+
//
|
|
38
|
+
// The result, at the 0.12.0 audit: `verifyRls` had ZERO references across all
|
|
39
|
+
// 16 service repos, while FIVE services hand-rolled the identical
|
|
40
|
+
// `SELECT relname, relrowsecurity FROM pg_class` check in their own tests —
|
|
41
|
+
// billing, finance, vendor, ticketing, and obs-interface (Go). Of the five,
|
|
42
|
+
// finance and billing have no `pg` dependency at all. The barrel comment
|
|
43
|
+
// claiming "service db:setup gates call verifyRls() after migrations" was
|
|
44
|
+
// describing an API nobody could reach.
|
|
45
|
+
//
|
|
46
|
+
// So `verifyRls` now accepts EITHER driver shape and normalises internally:
|
|
47
|
+
//
|
|
48
|
+
// node-postgres { query(sql, params) } → Promise<{ rows: R[] }>
|
|
49
|
+
// postgres-js { unsafe(sql, params) } → Promise<R[]>
|
|
50
|
+
//
|
|
51
|
+
// Both satisfy a single read-only catalog SELECT with positional parameters;
|
|
52
|
+
// nothing driver-specific is used. `pg.Pool`, `pg.PoolClient`,
|
|
53
|
+
// `PgClientPool.rawPool`, a porsager `Sql` instance, and
|
|
54
|
+
// `PgPostgresJsPool`'s underlying `sql` all work unchanged.
|
|
28
55
|
import { DbRlsError } from "./types.js";
|
|
56
|
+
/**
|
|
57
|
+
* Run one positional-parameter SELECT against either driver shape and return
|
|
58
|
+
* a plain row array.
|
|
59
|
+
*
|
|
60
|
+
* Duck-typed rather than flagged: a pool that exposes BOTH (a drizzle
|
|
61
|
+
* postgres-js client wrapping a porsager `Sql`, say) is served by `query`,
|
|
62
|
+
* which is the stricter, better-typed path.
|
|
63
|
+
*/
|
|
64
|
+
async function queryRows(pool, sql, params) {
|
|
65
|
+
const asNodePg = pool;
|
|
66
|
+
if (typeof asNodePg.query === "function") {
|
|
67
|
+
const res = await asNodePg.query(sql, params);
|
|
68
|
+
// A postgres-js `Sql` tagged template is ALSO callable, and some wrappers
|
|
69
|
+
// expose a `query` that resolves to an array. Accept both results rather
|
|
70
|
+
// than reading `.rows` off an array and silently getting `undefined`.
|
|
71
|
+
return Array.isArray(res) ? res : res.rows;
|
|
72
|
+
}
|
|
73
|
+
const asPgJs = pool;
|
|
74
|
+
if (typeof asPgJs.unsafe === "function") {
|
|
75
|
+
const rows = await asPgJs.unsafe(sql, params);
|
|
76
|
+
return rows;
|
|
77
|
+
}
|
|
78
|
+
throw new DbRlsError("verifyRls: the supplied pool exposes neither `query(sql, params)` " +
|
|
79
|
+
"(node-postgres) nor `unsafe(sql, params)` (postgres-js). Pass a " +
|
|
80
|
+
"`pg.Pool`/`pg.PoolClient`, a `PgClientPool.rawPool`, or a postgres-js " +
|
|
81
|
+
"`Sql` instance (e.g. `getPools().owner.sql`).");
|
|
82
|
+
}
|
|
29
83
|
/**
|
|
30
84
|
* Thrown by `verifyRls` when one or more RLS-required tables are missing
|
|
31
85
|
* row-level security (or are absent). Carries the structured offender list
|
|
@@ -82,6 +136,20 @@ function key(r) {
|
|
|
82
136
|
* The query is a single read against `pg_class` joined to `pg_namespace`
|
|
83
137
|
* — read-only, no GUCs, no writes. Run it from a migration / `db:setup`
|
|
84
138
|
* gate against any pool (typically the owner/admin pool).
|
|
139
|
+
*
|
|
140
|
+
* `pool` accepts EITHER driver shape (0.12.0): node-postgres
|
|
141
|
+
* (`query(sql, params) → { rows }`) or postgres-js
|
|
142
|
+
* (`unsafe(sql, params) → rows[]`). Wire it into `db:setup` after
|
|
143
|
+
* migrations apply:
|
|
144
|
+
*
|
|
145
|
+
* ```ts
|
|
146
|
+
* // postgres-js service (the common Nodii case)
|
|
147
|
+
* import { verifyRls } from "@nodii/db-rls";
|
|
148
|
+
* await verifyRls(getPools().owner.sql, {
|
|
149
|
+
* requiredTables: ["finance_journal_entries", "finance_ledger_entries"],
|
|
150
|
+
* referenceTables: ["currency_codes"], // § 7.6 — GRANT-controlled, no RLS
|
|
151
|
+
* });
|
|
152
|
+
* ```
|
|
85
153
|
*/
|
|
86
154
|
export async function verifyRls(pool, opts) {
|
|
87
155
|
const defaultSchema = opts.schema ?? "public";
|
|
@@ -113,7 +181,7 @@ export async function verifyRls(pool, opts) {
|
|
|
113
181
|
// resolves every table; missing rows are detected by set difference.
|
|
114
182
|
const schemas = toCheck.map((t) => t.schema);
|
|
115
183
|
const relnames = toCheck.map((t) => t.relname);
|
|
116
|
-
const
|
|
184
|
+
const rows = await queryRows(pool, `SELECT n.nspname, c.relname, c.relrowsecurity, c.relforcerowsecurity
|
|
117
185
|
FROM unnest($1::text[], $2::text[]) AS req(schemaname, tablename)
|
|
118
186
|
JOIN pg_namespace n ON n.nspname = req.schemaname
|
|
119
187
|
JOIN pg_class c ON c.relnamespace = n.oid
|
|
@@ -121,7 +189,7 @@ export async function verifyRls(pool, opts) {
|
|
|
121
189
|
AND c.relkind IN ('r', 'p')`, [schemas, relnames]);
|
|
122
190
|
// Index the catalog rows by schema.relname.
|
|
123
191
|
const found = new Map();
|
|
124
|
-
for (const row of
|
|
192
|
+
for (const row of rows) {
|
|
125
193
|
found.set(`${row.nspname}.${row.relname}`, {
|
|
126
194
|
enabled: row.relrowsecurity,
|
|
127
195
|
forced: row.relforcerowsecurity,
|
package/dist/verify-rls.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-rls.js","sourceRoot":"","sources":["../src/verify-rls.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,EAAE;AACF,yEAAyE;AACzE,2EAA2E;AAC3E,wEAAwE;AACxE,6DAA6D;AAC7D,uEAAuE;AACvE,oCAAoC;AACpC,EAAE;AACF,2EAA2E;AAC3E,oEAAoE;AACpE,oEAAoE;AACpE,yEAAyE;AACzE,sCAAsC;AACtC,EAAE;AACF,wEAAwE;AACxE,8DAA8D;AAC9D,kFAAkF;AAClF,0EAA0E;AAC1E,6EAA6E;AAC7E,8DAA8D;AAC9D,EAAE;AACF,yEAAyE;AACzE,
|
|
1
|
+
{"version":3,"file":"verify-rls.js","sourceRoot":"","sources":["../src/verify-rls.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nodii/db-rls",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "Three-pool RLS dispatch + GUC-set + entry-point helpers + RLS policy DDL generator for the Nodii microservice stack. Polyglot per D159 (TS + Python + Go). Spec: planning hub docKey=db-rls.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
}
|
|
63
63
|
},
|
|
64
64
|
"devDependencies": {
|
|
65
|
-
"@nodii/telemetry": "0.
|
|
65
|
+
"@nodii/telemetry": "0.26.0",
|
|
66
66
|
"@types/bun": "^1.3.13",
|
|
67
67
|
"@types/pg": "^8.11.10",
|
|
68
68
|
"drizzle-orm": "^0.45.2",
|