@coffre/db 0.8.2 → 0.10.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.
Files changed (65) hide show
  1. package/dist/connect.d.ts +1 -1
  2. package/dist/{database-BEnexh-3.d.ts → database-BFnO2b2P.d.ts} +1 -1
  3. package/dist/dialect.d.ts +1 -1
  4. package/dist/grants.d.ts +2 -2
  5. package/dist/hyperdrive.d.ts +1 -1
  6. package/dist/index.d.ts +2 -2
  7. package/dist/log.d.ts +7 -1
  8. package/dist/log.js +11 -1
  9. package/dist/migrations/postgres/0010_handle_places.sql +2 -0
  10. package/dist/migrations/postgres/0011_plain_values.sql +19 -0
  11. package/dist/migrations/postgres/0012_sensitive_values.sql +18 -0
  12. package/dist/migrations/postgres/0013_contributor_role.sql +5 -0
  13. package/dist/migrations/postgres/0014_custom_roles.sql +4 -0
  14. package/dist/migrations/postgres/meta/0010_snapshot.json +2991 -0
  15. package/dist/migrations/postgres/meta/0011_snapshot.json +2997 -0
  16. package/dist/migrations/postgres/meta/0012_snapshot.json +3004 -0
  17. package/dist/migrations/postgres/meta/0013_snapshot.json +3004 -0
  18. package/dist/migrations/postgres/meta/0014_snapshot.json +3000 -0
  19. package/dist/migrations/postgres/meta/_journal.json +35 -0
  20. package/dist/migrations/sqlite/0010_handle_places.sql +2 -0
  21. package/dist/migrations/sqlite/0011_plain_values.sql +14 -0
  22. package/dist/migrations/sqlite/0012_sensitive_values.sql +15 -0
  23. package/dist/migrations/sqlite/0013_contributor_role.sql +28 -0
  24. package/dist/migrations/sqlite/0014_custom_roles.sql +27 -0
  25. package/dist/migrations/sqlite/meta/0010_snapshot.json +2711 -0
  26. package/dist/migrations/sqlite/meta/0011_snapshot.json +2718 -0
  27. package/dist/migrations/sqlite/meta/0012_snapshot.json +2726 -0
  28. package/dist/migrations/sqlite/meta/0013_snapshot.json +2726 -0
  29. package/dist/migrations/sqlite/meta/0014_snapshot.json +2722 -0
  30. package/dist/migrations/sqlite/meta/_journal.json +35 -0
  31. package/dist/portable.d.ts +2 -2
  32. package/dist/{schema-BZRkBJQZ.d.ts → schema-NBVA9q-s.d.ts} +51 -0
  33. package/dist/schema-sqlite.d.ts +55 -0
  34. package/dist/schema-sqlite.js +5 -6
  35. package/dist/schema-version.d.ts +1 -1
  36. package/dist/schema-version.js +70 -0
  37. package/dist/schema.d.ts +1 -1
  38. package/dist/schema.js +5 -7
  39. package/package.json +2 -2
  40. package/src/grants.ts +3 -2
  41. package/src/log.ts +16 -0
  42. package/src/migrations/postgres/0010_handle_places.sql +2 -0
  43. package/src/migrations/postgres/0011_plain_values.sql +19 -0
  44. package/src/migrations/postgres/0012_sensitive_values.sql +18 -0
  45. package/src/migrations/postgres/0013_contributor_role.sql +5 -0
  46. package/src/migrations/postgres/0014_custom_roles.sql +4 -0
  47. package/src/migrations/postgres/meta/0010_snapshot.json +2991 -0
  48. package/src/migrations/postgres/meta/0011_snapshot.json +2997 -0
  49. package/src/migrations/postgres/meta/0012_snapshot.json +3004 -0
  50. package/src/migrations/postgres/meta/0013_snapshot.json +3004 -0
  51. package/src/migrations/postgres/meta/0014_snapshot.json +3000 -0
  52. package/src/migrations/postgres/meta/_journal.json +35 -0
  53. package/src/migrations/sqlite/0010_handle_places.sql +2 -0
  54. package/src/migrations/sqlite/0011_plain_values.sql +14 -0
  55. package/src/migrations/sqlite/0012_sensitive_values.sql +15 -0
  56. package/src/migrations/sqlite/0013_contributor_role.sql +28 -0
  57. package/src/migrations/sqlite/0014_custom_roles.sql +27 -0
  58. package/src/migrations/sqlite/meta/0010_snapshot.json +2711 -0
  59. package/src/migrations/sqlite/meta/0011_snapshot.json +2718 -0
  60. package/src/migrations/sqlite/meta/0012_snapshot.json +2726 -0
  61. package/src/migrations/sqlite/meta/0013_snapshot.json +2726 -0
  62. package/src/migrations/sqlite/meta/0014_snapshot.json +2722 -0
  63. package/src/migrations/sqlite/meta/_journal.json +35 -0
  64. package/src/schema.sqlite.ts +15 -9
  65. package/src/schema.ts +15 -10
package/dist/connect.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { t as Database } from "./database-BEnexh-3.js";
1
+ import { t as Database } from "./database-BFnO2b2P.js";
2
2
  import { Engine } from "./dialect.js";
3
3
  import { ClientConfig } from "pg";
4
4
  //#region src/postgres.d.ts
@@ -1,4 +1,4 @@
1
- import { m as schema_d_exports } from "./schema-BZRkBJQZ.js";
1
+ import { m as schema_d_exports } from "./schema-NBVA9q-s.js";
2
2
  import { Table } from "drizzle-orm";
3
3
  import { NodePgDatabase } from "drizzle-orm/node-postgres";
4
4
  import pg from "pg";
package/dist/dialect.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { i as Queryable } from "./database-BEnexh-3.js";
1
+ import { i as Queryable } from "./database-BFnO2b2P.js";
2
2
  import { SQL, SQLWrapper } from "drizzle-orm";
3
3
  import { PgTable } from "drizzle-orm/pg-core";
4
4
  //#region src/dialect.d.ts
package/dist/grants.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { i as Queryable } from "./database-BEnexh-3.js";
1
+ import { i as Queryable } from "./database-BFnO2b2P.js";
2
2
  import { Authenticity, Newest } from "./log.js";
3
- import { Conversion, ConversionInput, InstanceRole, Scope } from "@coffre/core/access";
4
3
  import { StoredEntry } from "@coffre/core/audit";
4
+ import { Conversion, ConversionInput, InstanceRole, Scope } from "@coffre/core/access";
5
5
  //#region src/grants.d.ts
6
6
  /**
7
7
  * One grant, as `vault_grants` holds it: on a project (`environmentId`
@@ -1,4 +1,4 @@
1
- import { n as PoolLike } from "./database-BEnexh-3.js";
1
+ import { n as PoolLike } from "./database-BFnO2b2P.js";
2
2
  import pg from "pg";
3
3
  //#region src/hyperdrive.d.ts
4
4
  /** Postgres through a Hyperdrive binding: `postgres(env.HYPERDRIVE)`. */
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import { m as schema_d_exports } from "./schema-BZRkBJQZ.js";
2
- import { a as Transaction, c as tablesOf, i as Queryable, n as PoolLike, o as createDatabase, r as QueryOutsideTransaction, s as own, t as Database } from "./database-BEnexh-3.js";
1
+ import { m as schema_d_exports } from "./schema-NBVA9q-s.js";
2
+ import { a as Transaction, c as tablesOf, i as Queryable, n as PoolLike, o as createDatabase, r as QueryOutsideTransaction, s as own, t as Database } from "./database-BFnO2b2P.js";
3
3
  export { Database, PoolLike, QueryOutsideTransaction, Queryable, Transaction, createDatabase, own, schema_d_exports as schema, tablesOf };
package/dist/log.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as Transaction, i as Queryable } from "./database-BEnexh-3.js";
1
+ import { a as Transaction, i as Queryable } from "./database-BFnO2b2P.js";
2
2
  import { SQL } from "drizzle-orm";
3
3
  import { LogKey, StoredEntry } from "@coffre/core/audit";
4
4
  //#region src/log.d.ts
@@ -473,6 +473,12 @@ export type Authenticity = {
473
473
  };
474
474
  /** Up to `limit` of the entries in the vault's name, allowed, of one `action`, before `before` (the newest when undefined), newest first. */
475
475
  export declare function newestVaultEntries(db: Queryable, action: string, limit: number, before?: bigint): Promise<StoredEntry[]>;
476
+ /**
477
+ * The number of the newest entry in the vault's name, allowed, of one
478
+ * `action`, or null for none: whether one was appended since, and nothing
479
+ * of what it says, so its MAC is not checked. One indexed read.
480
+ */
481
+ export declare function newestVaultSeq(db: Queryable, action: string): Promise<bigint | null>;
476
482
  /** How many entries in its name the vault reads back, a page at a time, for its own newest of a kind (`newestAuthentic`). */
477
483
  export declare const LOOK_BACK: {
478
484
  page: number;
package/dist/log.js CHANGED
@@ -203,6 +203,16 @@ async function newestVaultEntries(db, action, limit, before) {
203
203
  const { auditLog } = tablesOf(db);
204
204
  return await db.select(entryColumns(db)).from(auditLog).where(and(eq(auditLog.author, "vault"), eq(auditLog.action, action), eq(auditLog.decision, "allow"), before === void 0 ? void 0 : lt(auditLog.seq, before))).orderBy(desc(auditLog.seq)).limit(limit);
205
205
  }
206
+ /**
207
+ * The number of the newest entry in the vault's name, allowed, of one
208
+ * `action`, or null for none: whether one was appended since, and nothing
209
+ * of what it says, so its MAC is not checked. One indexed read.
210
+ */
211
+ async function newestVaultSeq(db, action) {
212
+ const { auditLog } = tablesOf(db);
213
+ const [row] = await db.select({ seq: auditLog.seq }).from(auditLog).where(and(eq(auditLog.author, "vault"), eq(auditLog.action, action), eq(auditLog.decision, "allow"))).orderBy(desc(auditLog.seq)).limit(1);
214
+ return row?.seq ?? null;
215
+ }
206
216
  /** How many entries in its name the vault reads back, a page at a time, for its own newest of a kind (`newestAuthentic`). */
207
217
  const LOOK_BACK = {
208
218
  page: 32,
@@ -229,4 +239,4 @@ async function newestAuthentic(page, check) {
229
239
  return "unreached";
230
240
  }
231
241
  //#endregion
232
- export { BATCH_BYTES, LOOK_BACK, LogHeadMismatch, LogRewound, appendEntries, entryColumns, forgetLogHeads, lockLogHead, newestAuthentic, newestVaultEntries, withinBytes };
242
+ export { BATCH_BYTES, LOOK_BACK, LogHeadMismatch, LogRewound, appendEntries, entryColumns, forgetLogHeads, lockLogHead, newestAuthentic, newestVaultEntries, newestVaultSeq, withinBytes };
@@ -0,0 +1,2 @@
1
+ -- A handle's places (0.9): the environments it was made for, by id and whether as @me, which the proxy's stable URL resolves to. A nullable column the release before neither reads nor writes; the app sets it when it makes a handle, and never after (no UPDATE grant).
2
+ ALTER TABLE "credentials" ADD COLUMN "places" text;
@@ -0,0 +1,19 @@
1
+ -- Plain values (0.9): a version of a key marked not secret holds its value in the clear too. Nullable, so the release before writes on as it did.
2
+ ALTER TABLE "secret_versions" ADD COLUMN "plaintext" text;--> statement-breakpoint
3
+ -- A version is still only ever erased, and an erased one holds no value, in the clear or not.
4
+ CREATE OR REPLACE FUNCTION secret_versions_erase_only() RETURNS trigger LANGUAGE plpgsql AS $$
5
+ BEGIN
6
+ IF octet_length(NEW.ciphertext) <> 0 OR octet_length(NEW.wrapped_dek) <> 0 OR NEW.plaintext IS NOT NULL
7
+ OR (NEW.id, NEW.secret_id, NEW.version, NEW.envelope_version, NEW.iv, NEW.auth_tag,
8
+ NEW.kek_provider, NEW.kek_id, NEW.kek_version, NEW.created_at, NEW.created_by,
9
+ NEW.recipe, NEW.pair_id, NEW.pair_half)
10
+ IS DISTINCT FROM
11
+ (OLD.id, OLD.secret_id, OLD.version, OLD.envelope_version, OLD.iv, OLD.auth_tag,
12
+ OLD.kek_provider, OLD.kek_id, OLD.kek_version, OLD.created_at, OLD.created_by,
13
+ OLD.recipe, OLD.pair_id, OLD.pair_half) THEN
14
+ RAISE EXCEPTION 'a secret version is only ever erased' USING ERRCODE = 'insufficient_privilege';
15
+ END IF;
16
+ RETURN NEW;
17
+ END
18
+ $$;--> statement-breakpoint
19
+ GRANT UPDATE (plaintext) ON secret_versions TO coffre_app;
@@ -0,0 +1,18 @@
1
+ -- Sensitive values (0.10): a version never handed back to a person, which the vault's wrap of its data key binds. Defaults to false, so the release before writes on as it did.
2
+ ALTER TABLE "secret_versions" ADD COLUMN "sensitive" boolean DEFAULT false NOT NULL;--> statement-breakpoint
3
+ -- A version is still only ever erased: its sensitivity with the rest of it.
4
+ CREATE OR REPLACE FUNCTION secret_versions_erase_only() RETURNS trigger LANGUAGE plpgsql AS $$
5
+ BEGIN
6
+ IF octet_length(NEW.ciphertext) <> 0 OR octet_length(NEW.wrapped_dek) <> 0 OR NEW.plaintext IS NOT NULL
7
+ OR (NEW.id, NEW.secret_id, NEW.version, NEW.envelope_version, NEW.iv, NEW.auth_tag,
8
+ NEW.kek_provider, NEW.kek_id, NEW.kek_version, NEW.created_at, NEW.created_by,
9
+ NEW.recipe, NEW.pair_id, NEW.pair_half, NEW.sensitive)
10
+ IS DISTINCT FROM
11
+ (OLD.id, OLD.secret_id, OLD.version, OLD.envelope_version, OLD.iv, OLD.auth_tag,
12
+ OLD.kek_provider, OLD.kek_id, OLD.kek_version, OLD.created_at, OLD.created_by,
13
+ OLD.recipe, OLD.pair_id, OLD.pair_half, OLD.sensitive) THEN
14
+ RAISE EXCEPTION 'a secret version is only ever erased' USING ERRCODE = 'insufficient_privilege';
15
+ END IF;
16
+ RETURN NEW;
17
+ END
18
+ $$;
@@ -0,0 +1,5 @@
1
+ -- The Contributor role (0.10): use and write, never read. The role checks widen to it, which the release before never grants.
2
+ ALTER TABLE "vault_grants" DROP CONSTRAINT "vault_grants_role_check";--> statement-breakpoint
3
+ ALTER TABLE "vault_grants" DROP CONSTRAINT "vault_grants_environment_role_check";--> statement-breakpoint
4
+ ALTER TABLE "vault_grants" ADD CONSTRAINT "vault_grants_role_check" CHECK ("vault_grants"."role" IN ('viewer', 'contributor', 'developer', 'maintainer', 'access-manager', 'auditor', 'owner'));--> statement-breakpoint
5
+ ALTER TABLE "vault_grants" ADD CONSTRAINT "vault_grants_environment_role_check" CHECK (("vault_grants"."environment_id" IS NULL AND "vault_grants"."environment_slug" IS NULL) OR "vault_grants"."role" IN ('viewer', 'contributor', 'developer', 'auditor'));
@@ -0,0 +1,4 @@
1
+ -- Roles an Owner makes (0.10): a grant names a role by its id, which the vault's policy defines; which of them an environment may be granted, the vault decides. The checks widen: the release before grants only the roles it ships.
2
+ ALTER TABLE "vault_grants" DROP CONSTRAINT "vault_grants_environment_role_check";--> statement-breakpoint
3
+ ALTER TABLE "vault_grants" DROP CONSTRAINT "vault_grants_role_check";--> statement-breakpoint
4
+ ALTER TABLE "vault_grants" ADD CONSTRAINT "vault_grants_role_check" CHECK ("vault_grants"."role" ~ '^[a-z][a-z0-9-]{1,31}$');