@coffre/db 0.14.5 → 0.15.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/README.md +2 -1
- package/dist/change-records-_fKvahvs.js +55 -0
- package/dist/connect.d.ts +22 -10
- package/dist/connect.js +74 -12
- package/dist/database-CVteLhp1.d.ts +410 -0
- package/dist/{database-BadNeeN-.js → database-D55ENPX-.js} +46 -25
- package/dist/dialect.d.ts +4 -3
- package/dist/dialect.js +14 -5
- package/dist/grants.d.ts +4 -4
- package/dist/grants.js +4 -4
- package/dist/hyperdrive.d.ts +48 -23
- package/dist/hyperdrive.js +168 -91
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -1
- package/dist/log-DaD7fyUq.d.ts +722 -0
- package/dist/log.d.ts +2 -622
- package/dist/log.js +178 -13
- package/dist/migrate.d.ts +43 -3
- package/dist/migrate.js +149 -29
- package/dist/migrations/postgres/0022_log_015.sql +672 -0
- package/dist/migrations/postgres/0023_change_path.sql +153 -0
- package/dist/migrations/postgres/0024_use_015.sql +556 -0
- package/dist/migrations/postgres/0025_app_change.sql +221 -0
- package/dist/migrations/postgres/0026_issue_lock.sql +106 -0
- package/dist/migrations/postgres/0027_retention.sql +118 -0
- package/dist/migrations/postgres/0028_use_stalls.sql +594 -0
- package/dist/migrations/postgres/0029_use_objects.sql +887 -0
- package/dist/migrations/postgres/0030_unarchive_restores.sql +259 -0
- package/dist/migrations/postgres/0031_app_read.sql +65 -0
- package/dist/migrations/postgres/0032_secrets_live_index.sql +4 -0
- package/dist/migrations/postgres/0033_use_generations.sql +582 -0
- package/dist/migrations/postgres/0034_vault_credentials.sql +153 -0
- package/dist/migrations/postgres/0035_first_days.sql +3 -0
- package/dist/migrations/postgres/0036_vault_issues.sql +91 -0
- package/dist/migrations/postgres/0037_vault_bindings.sql +271 -0
- package/dist/migrations/postgres/0040_binding_origin.sql +159 -0
- package/dist/migrations/postgres/0041_cutover.sql +132 -0
- package/dist/migrations/postgres/0042_sign_in_index.sql +7 -0
- package/dist/migrations/postgres/0043_issue_revoke_index.sql +4 -0
- package/dist/migrations/postgres/0044_use_by_name.sql +705 -0
- package/dist/migrations/postgres/0045_decide_first.sql +878 -0
- package/dist/migrations/postgres/0046_way_in_uses.sql +1149 -0
- package/dist/migrations/postgres/0047_cutover_finish.sql +268 -0
- package/dist/migrations/postgres/0048_use_batch.sql +59 -0
- package/dist/migrations/postgres/0049_reads.sql +171 -0
- package/dist/migrations/postgres/meta/0022_snapshot.json +3831 -0
- package/dist/migrations/postgres/meta/0023_snapshot.json +3831 -0
- package/dist/migrations/postgres/meta/0024_snapshot.json +3831 -0
- package/dist/migrations/postgres/meta/0025_snapshot.json +3831 -0
- package/dist/migrations/postgres/meta/0026_snapshot.json +3831 -0
- package/dist/migrations/postgres/meta/0027_snapshot.json +3853 -0
- package/dist/migrations/postgres/meta/0028_snapshot.json +3853 -0
- package/dist/migrations/postgres/meta/0029_snapshot.json +3859 -0
- package/dist/migrations/postgres/meta/0030_snapshot.json +3859 -0
- package/dist/migrations/postgres/meta/0031_snapshot.json +3859 -0
- package/dist/migrations/postgres/meta/0032_snapshot.json +3875 -0
- package/dist/migrations/postgres/meta/0033_snapshot.json +3875 -0
- package/dist/migrations/postgres/meta/0034_snapshot.json +3875 -0
- package/dist/migrations/postgres/meta/0035_snapshot.json +3875 -0
- package/dist/migrations/postgres/meta/0036_snapshot.json +3875 -0
- package/dist/migrations/postgres/meta/0037_snapshot.json +3875 -0
- package/dist/migrations/postgres/meta/0038_snapshot.json +3881 -0
- package/dist/migrations/postgres/meta/0039_snapshot.json +3881 -0
- package/dist/migrations/postgres/meta/0040_snapshot.json +3931 -0
- package/dist/migrations/postgres/meta/0041_snapshot.json +3981 -0
- package/dist/migrations/postgres/meta/0042_snapshot.json +3981 -0
- package/dist/migrations/postgres/meta/0043_snapshot.json +3981 -0
- package/dist/migrations/postgres/meta/0044_snapshot.json +3991 -0
- package/dist/migrations/postgres/meta/0045_snapshot.json +3997 -0
- package/dist/migrations/postgres/meta/0046_snapshot.json +3997 -0
- package/dist/migrations/postgres/meta/0047_snapshot.json +4234 -0
- package/dist/migrations/postgres/meta/_journal.json +182 -0
- package/dist/migrations/sqlite/0018_log_015.sql +84 -0
- package/dist/migrations/sqlite/0019_retention.sql +2 -0
- package/dist/migrations/sqlite/0020_ended_references.sql +1 -0
- package/dist/migrations/sqlite/0021_secrets_live_index.sql +1 -0
- package/dist/migrations/sqlite/0022_binding_origin.sql +1 -0
- package/dist/migrations/sqlite/0023_sign_in_index.sql +2 -0
- package/dist/migrations/sqlite/0024_issue_revoke_index.sql +2 -0
- package/dist/migrations/sqlite/0025_way_in_uses.sql +42 -0
- package/dist/migrations/sqlite/0026_cutover_finish.sql +11 -0
- package/dist/migrations/sqlite/0027_reads.sql +38 -0
- package/dist/migrations/sqlite/meta/0018_snapshot.json +3529 -0
- package/dist/migrations/sqlite/meta/0019_snapshot.json +3538 -0
- package/dist/migrations/sqlite/meta/0020_snapshot.json +3545 -0
- package/dist/migrations/sqlite/meta/0021_snapshot.json +3553 -0
- package/dist/migrations/sqlite/meta/0022_snapshot.json +3560 -0
- package/dist/migrations/sqlite/meta/0023_snapshot.json +3579 -0
- package/dist/migrations/sqlite/meta/0024_snapshot.json +3598 -0
- package/dist/migrations/sqlite/meta/0025_snapshot.json +3609 -0
- package/dist/migrations/sqlite/meta/0026_snapshot.json +3616 -0
- package/dist/migrations/sqlite/meta/0027_snapshot.json +3834 -0
- package/dist/migrations/sqlite/meta/_journal.json +70 -0
- package/dist/platform-Y3gICK6n.d.ts +58 -0
- package/dist/portable.d.ts +2 -2
- package/dist/postgres-BI3xTnyw.js +1718 -0
- package/dist/postgres-platform-node.d.ts +14 -0
- package/dist/postgres-platform-node.js +21 -0
- package/dist/postgres-platform-workerd.d.ts +61 -0
- package/dist/postgres-platform-workerd.js +163 -0
- package/dist/{schema-BfQEBqFv.d.ts → schema-DgoPqqsI.d.ts} +1326 -7
- package/dist/schema-sqlite.d.ts +1306 -6
- package/dist/schema-sqlite.js +154 -18
- package/dist/schema-version.d.ts +1 -1
- package/dist/schema-version.js +254 -2
- package/dist/schema.d.ts +2 -2
- package/dist/schema.js +226 -20
- package/package.json +13 -5
- package/src/active-subject.ts +9 -0
- package/src/change-records.ts +38 -0
- package/src/connect.ts +67 -13
- package/src/database.ts +67 -51
- package/src/dialect.ts +17 -8
- package/src/grants.ts +3 -3
- package/src/hyperdrive.ts +181 -104
- package/src/log.ts +196 -15
- package/src/migrate.ts +157 -30
- package/src/migrations/postgres/0022_log_015.sql +672 -0
- package/src/migrations/postgres/0023_change_path.sql +153 -0
- package/src/migrations/postgres/0024_use_015.sql +556 -0
- package/src/migrations/postgres/0025_app_change.sql +221 -0
- package/src/migrations/postgres/0026_issue_lock.sql +106 -0
- package/src/migrations/postgres/0027_retention.sql +118 -0
- package/src/migrations/postgres/0028_use_stalls.sql +594 -0
- package/src/migrations/postgres/0029_use_objects.sql +887 -0
- package/src/migrations/postgres/0030_unarchive_restores.sql +259 -0
- package/src/migrations/postgres/0031_app_read.sql +65 -0
- package/src/migrations/postgres/0032_secrets_live_index.sql +4 -0
- package/src/migrations/postgres/0033_use_generations.sql +582 -0
- package/src/migrations/postgres/0034_vault_credentials.sql +153 -0
- package/src/migrations/postgres/0035_first_days.sql +3 -0
- package/src/migrations/postgres/0036_vault_issues.sql +91 -0
- package/src/migrations/postgres/0037_vault_bindings.sql +271 -0
- package/src/migrations/postgres/0040_binding_origin.sql +159 -0
- package/src/migrations/postgres/0041_cutover.sql +132 -0
- package/src/migrations/postgres/0042_sign_in_index.sql +7 -0
- package/src/migrations/postgres/0043_issue_revoke_index.sql +4 -0
- package/src/migrations/postgres/0044_use_by_name.sql +705 -0
- package/src/migrations/postgres/0045_decide_first.sql +878 -0
- package/src/migrations/postgres/0046_way_in_uses.sql +1149 -0
- package/src/migrations/postgres/0047_cutover_finish.sql +268 -0
- package/src/migrations/postgres/0048_use_batch.sql +59 -0
- package/src/migrations/postgres/0049_reads.sql +171 -0
- package/src/migrations/postgres/meta/0022_snapshot.json +3831 -0
- package/src/migrations/postgres/meta/0023_snapshot.json +3831 -0
- package/src/migrations/postgres/meta/0024_snapshot.json +3831 -0
- package/src/migrations/postgres/meta/0025_snapshot.json +3831 -0
- package/src/migrations/postgres/meta/0026_snapshot.json +3831 -0
- package/src/migrations/postgres/meta/0027_snapshot.json +3853 -0
- package/src/migrations/postgres/meta/0028_snapshot.json +3853 -0
- package/src/migrations/postgres/meta/0029_snapshot.json +3859 -0
- package/src/migrations/postgres/meta/0030_snapshot.json +3859 -0
- package/src/migrations/postgres/meta/0031_snapshot.json +3859 -0
- package/src/migrations/postgres/meta/0032_snapshot.json +3875 -0
- package/src/migrations/postgres/meta/0033_snapshot.json +3875 -0
- package/src/migrations/postgres/meta/0034_snapshot.json +3875 -0
- package/src/migrations/postgres/meta/0035_snapshot.json +3875 -0
- package/src/migrations/postgres/meta/0036_snapshot.json +3875 -0
- package/src/migrations/postgres/meta/0037_snapshot.json +3875 -0
- package/src/migrations/postgres/meta/0038_snapshot.json +3881 -0
- package/src/migrations/postgres/meta/0039_snapshot.json +3881 -0
- package/src/migrations/postgres/meta/0040_snapshot.json +3931 -0
- package/src/migrations/postgres/meta/0041_snapshot.json +3981 -0
- package/src/migrations/postgres/meta/0042_snapshot.json +3981 -0
- package/src/migrations/postgres/meta/0043_snapshot.json +3981 -0
- package/src/migrations/postgres/meta/0044_snapshot.json +3991 -0
- package/src/migrations/postgres/meta/0045_snapshot.json +3997 -0
- package/src/migrations/postgres/meta/0046_snapshot.json +3997 -0
- package/src/migrations/postgres/meta/0047_snapshot.json +4234 -0
- package/src/migrations/postgres/meta/_journal.json +182 -0
- package/src/migrations/sqlite/0018_log_015.sql +84 -0
- package/src/migrations/sqlite/0019_retention.sql +2 -0
- package/src/migrations/sqlite/0020_ended_references.sql +1 -0
- package/src/migrations/sqlite/0021_secrets_live_index.sql +1 -0
- package/src/migrations/sqlite/0022_binding_origin.sql +1 -0
- package/src/migrations/sqlite/0023_sign_in_index.sql +2 -0
- package/src/migrations/sqlite/0024_issue_revoke_index.sql +2 -0
- package/src/migrations/sqlite/0025_way_in_uses.sql +42 -0
- package/src/migrations/sqlite/0026_cutover_finish.sql +11 -0
- package/src/migrations/sqlite/0027_reads.sql +38 -0
- package/src/migrations/sqlite/meta/0018_snapshot.json +3529 -0
- package/src/migrations/sqlite/meta/0019_snapshot.json +3538 -0
- package/src/migrations/sqlite/meta/0020_snapshot.json +3545 -0
- package/src/migrations/sqlite/meta/0021_snapshot.json +3553 -0
- package/src/migrations/sqlite/meta/0022_snapshot.json +3560 -0
- package/src/migrations/sqlite/meta/0023_snapshot.json +3579 -0
- package/src/migrations/sqlite/meta/0024_snapshot.json +3598 -0
- package/src/migrations/sqlite/meta/0025_snapshot.json +3609 -0
- package/src/migrations/sqlite/meta/0026_snapshot.json +3616 -0
- package/src/migrations/sqlite/meta/0027_snapshot.json +3834 -0
- package/src/migrations/sqlite/meta/_journal.json +70 -0
- package/src/postgres-js/README.md +183 -0
- package/src/postgres-js/UNLICENSE +24 -0
- package/src/postgres-js/bytes.ts +89 -0
- package/src/postgres-js/connection.ts +882 -0
- package/src/postgres-js/errors.ts +84 -0
- package/src/postgres-js/index.ts +516 -0
- package/src/postgres-js/platform.node.ts +29 -0
- package/src/postgres-js/platform.ts +60 -0
- package/src/postgres-js/platform.workerd.ts +225 -0
- package/src/postgres-js/query.ts +123 -0
- package/src/postgres-js/queue.ts +42 -0
- package/src/postgres-js/result.ts +46 -0
- package/src/postgres-js/types.ts +52 -0
- package/src/postgres.ts +375 -26
- package/src/schema-version.ts +2 -2
- package/src/schema.sqlite.ts +198 -7
- package/src/schema.ts +291 -6
- package/src/verify-runtime.ts +18 -29
- package/LICENSE +0 -21
- package/dist/database-wq1AVRAP.d.ts +0 -73
- package/dist/postgres-Bmar8y0q.js +0 -29
- package/dist/relations-BfR3JjT1.js +0 -38
- package/src/relations.ts +0 -40
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
-- 0.15's change path (docs/design/0.15-plan.md, PR 4a; the spec: formal/HotPathOne.tla's change actions, formal/Migration015.tla's lock order): `change_input` takes every change the vault makes to the inputs it decides on, not only the cutover's `genesis`. It replaces 0022's, which nothing called (log-015.md), with one more argument, `p_value`: the object as the change leaves it, which the vault made with `applyOp` and sealed, written into the rows this function keeps (an environment's, the roles' and the policy's), which the vault's login cannot write. It only replaces a function nothing calls: 0.14's code serves on it as before.
|
|
2
|
+
DROP FUNCTION change_input(text, text, text, bigint, text, text, bytea, bytea, bytea);
|
|
3
|
+
--> statement-breakpoint
|
|
4
|
+
-- A change (hot-path-one.md, "A change"): the fence exclusive, so that no use overlaps it; a retry finds its entry and answers its number (a request id names one change: another under it is refused); a row that is not its object's newest change's is refused, as a use refuses it (ChangeChecksSeal: else a row put back from before a change, validly sealed once, would be sealed again under the next change, and serve what the log says was taken away); the object's row moves only from the seal the vault read (ChangeCAS: of two changes to one object, the second finds another seal and does nothing: null); then its entry, numbered now (ChangeNumberUnderLock). Every lock is the transaction's, let go at its commit (LockToCommit). It answers the number, which a change waits to see sealed before it answers (R51, CommitBeforeAnswer).
|
|
5
|
+
--
|
|
6
|
+
-- What each kind's change writes:
|
|
7
|
+
-- - principal: its seal. A member's row and grants are the vault's own tables, which 0.14's decision writes in the same transaction, its MAC and entry with them, until 0.16 (the plan's dual fencing); the vault reads them back and holds them to the object it seals before it calls this.
|
|
8
|
+
-- - environment: its slug, protection and archiving from `p_value` (`environment.rename`, `environment.protect`, `environment.archive`), and its seal; what never changes (its project, parent and owner) and whether it was deleted must be the row's, or nothing is done. A genesis with no value seals the row as it is.
|
|
9
|
+
-- - roles, policy: the one row each, `log_config`, its value `p_value` (a genesis: the payload's `value`).
|
|
10
|
+
-- - credential, secret: genesis only, the row sealed as it is: the app writes them, and their changes come with its writes (plan PR 4b).
|
|
11
|
+
CREATE FUNCTION change_input(
|
|
12
|
+
p_kind text, p_id text, p_request text, p_at bigint, p_actor text, p_payload text, p_value text, p_seal_from bytea, p_seal bytea, p_mac bytea
|
|
13
|
+
) RETURNS bigint
|
|
14
|
+
LANGUAGE plpgsql SECURITY DEFINER SET search_path = pg_catalog, pg_temp AS $$
|
|
15
|
+
DECLARE
|
|
16
|
+
op jsonb := p_payload::jsonb;
|
|
17
|
+
v jsonb := p_value::jsonb;
|
|
18
|
+
change text := op ->> 'op';
|
|
19
|
+
target uuid := public.log_object(p_kind, p_id);
|
|
20
|
+
n bigint;
|
|
21
|
+
done integer;
|
|
22
|
+
member text;
|
|
23
|
+
held bytea;
|
|
24
|
+
newest bytea;
|
|
25
|
+
config jsonb;
|
|
26
|
+
BEGIN
|
|
27
|
+
-- Its locks in the order 0.14's writers take theirs, so that none waits on the other in a circle until 0.16 (row,
|
|
28
|
+
-- head, fence: Migration015.tla's RowFirst, ChangeHeadFirst): the member's queue (MEMBER_QUEUE, 0x636f666d) and row
|
|
29
|
+
-- first, a principal's own or a credential's (0.14's vault locks them before the head, lockMembers; a change made
|
|
30
|
+
-- inside a 0.14 decision holds them already), then 0.14's head (its app takes it before its rows), then the fence
|
|
31
|
+
-- (0.14's appends take it after the head, audit_log_fence). The head held, no 0.14 write lands between this change
|
|
32
|
+
-- and its entry.
|
|
33
|
+
member := CASE p_kind
|
|
34
|
+
WHEN 'principal' THEN p_id
|
|
35
|
+
WHEN 'credential' THEN coalesce(
|
|
36
|
+
(SELECT c.principal FROM public.credentials c WHERE c.id = p_id::uuid),
|
|
37
|
+
(SELECT b.principal FROM public.service_bindings b WHERE b.id = p_id::uuid))
|
|
38
|
+
END;
|
|
39
|
+
IF member IS NOT NULL THEN
|
|
40
|
+
PERFORM pg_advisory_xact_lock(1668245101, hashtext(m.principal)) FROM public.vault_members m WHERE m.principal = member FOR NO KEY UPDATE;
|
|
41
|
+
END IF;
|
|
42
|
+
PERFORM 1 FROM public.audit_chain_head WHERE only_row FOR UPDATE;
|
|
43
|
+
-- ChangeLocks: exclusive, so that it waits for every use in flight, and every use after it waits for its commit.
|
|
44
|
+
PERFORM pg_advisory_xact_lock(1668244070, 0);
|
|
45
|
+
SELECT c.number INTO n FROM public.log_changes c WHERE c.request_id = p_request;
|
|
46
|
+
IF FOUND THEN
|
|
47
|
+
IF NOT EXISTS (
|
|
48
|
+
SELECT 1 FROM public.log_changes c
|
|
49
|
+
WHERE c.request_id = p_request AND c.object = target AND c.payload = p_payload AND c.seal IS NOT DISTINCT FROM p_seal
|
|
50
|
+
) THEN
|
|
51
|
+
RAISE EXCEPTION 'request % names another change', p_request USING ERRCODE = 'unique_violation';
|
|
52
|
+
END IF;
|
|
53
|
+
RETURN n;
|
|
54
|
+
END IF;
|
|
55
|
+
IF NOT (change = 'genesis'
|
|
56
|
+
OR (p_kind = 'principal' AND change IN ('member.add', 'member.role', 'member.remove', 'member.restore', 'access.grant', 'access.revoke'))
|
|
57
|
+
OR (p_kind = 'environment' AND change IN ('environment.protect', 'environment.rename', 'environment.archive'))
|
|
58
|
+
OR (p_kind = 'roles' AND change = 'role.define')
|
|
59
|
+
OR (p_kind = 'policy' AND change = 'bulk.limit')) THEN
|
|
60
|
+
RAISE EXCEPTION 'this schema knows no change % to a %', coalesce(change, 'without an op'), p_kind USING ERRCODE = 'invalid_parameter_value';
|
|
61
|
+
END IF;
|
|
62
|
+
-- The payload names its object (`ref`), so that a replay knows what each change is to: the column holds only its
|
|
63
|
+
-- key. The cutover's genesis may leave it out, its value naming it.
|
|
64
|
+
IF (change <> 'genesis' OR op ? 'ref') AND (op -> 'ref' ->> 'kind' IS DISTINCT FROM p_kind OR op -> 'ref' ->> 'id' IS DISTINCT FROM p_id) THEN
|
|
65
|
+
RAISE EXCEPTION 'a change names the object it is to: %, %', p_kind, p_id USING ERRCODE = 'invalid_parameter_value';
|
|
66
|
+
END IF;
|
|
67
|
+
-- A value is the object as this function writes it: an environment's, which a genesis may leave out to seal the
|
|
68
|
+
-- row as it is; the roles' and the policy's, but at their genesis, whose payload holds it. The others' rows are
|
|
69
|
+
-- written by whoever keeps them, and carry none.
|
|
70
|
+
IF (CASE
|
|
71
|
+
WHEN p_kind = 'environment' THEN change <> 'genesis' AND v IS NULL
|
|
72
|
+
WHEN p_kind IN ('roles', 'policy') THEN (change = 'genesis') = (v IS NOT NULL)
|
|
73
|
+
ELSE v IS NOT NULL
|
|
74
|
+
END) THEN
|
|
75
|
+
RAISE EXCEPTION 'a % change % carries the object it leaves exactly when this function writes it', p_kind, change USING ERRCODE = 'invalid_parameter_value';
|
|
76
|
+
END IF;
|
|
77
|
+
-- ChangeChecksSeal: the row's seal is its object's newest change's, or the object has neither yet (one probe, as
|
|
78
|
+
-- a use makes). A row deleted outright, or a seal no change wrote, is stale too.
|
|
79
|
+
held := CASE p_kind
|
|
80
|
+
WHEN 'principal' THEN (SELECT m.seal FROM public.vault_members m WHERE m.principal = p_id)
|
|
81
|
+
WHEN 'credential' THEN coalesce(
|
|
82
|
+
(SELECT c.seal FROM public.credentials c WHERE c.id = p_id::uuid),
|
|
83
|
+
(SELECT b.seal FROM public.service_bindings b WHERE b.id = p_id::uuid))
|
|
84
|
+
WHEN 'environment' THEN (SELECT e.seal FROM public.environments e WHERE e.id = p_id::uuid)
|
|
85
|
+
WHEN 'secret' THEN (SELECT x.seal FROM public.secrets x WHERE x.id = p_id::uuid)
|
|
86
|
+
WHEN 'policy' THEN (SELECT g.seal FROM public.log_config g WHERE g.name = 'policy')
|
|
87
|
+
WHEN 'roles' THEN (SELECT g.seal FROM public.log_config g WHERE g.name = 'roles')
|
|
88
|
+
END;
|
|
89
|
+
newest := (SELECT c.seal FROM public.log_changes c WHERE c.object = target ORDER BY c.number DESC LIMIT 1);
|
|
90
|
+
IF held IS DISTINCT FROM newest THEN
|
|
91
|
+
RAISE EXCEPTION 'the % object''s row is not its newest change''s: stale', p_kind USING ERRCODE = 'data_corrupted';
|
|
92
|
+
END IF;
|
|
93
|
+
-- ChangeCAS: each write moves the row only from the seal the vault read.
|
|
94
|
+
CASE p_kind
|
|
95
|
+
WHEN 'principal' THEN
|
|
96
|
+
UPDATE public.vault_members SET seal = p_seal WHERE principal = p_id AND seal IS NOT DISTINCT FROM p_seal_from;
|
|
97
|
+
WHEN 'credential' THEN
|
|
98
|
+
-- A token's row, or a trust binding's: one kind of object, ids that never meet.
|
|
99
|
+
UPDATE public.credentials SET seal = p_seal WHERE id = p_id::uuid AND seal IS NOT DISTINCT FROM p_seal_from;
|
|
100
|
+
GET DIAGNOSTICS done = ROW_COUNT;
|
|
101
|
+
IF done = 0 THEN
|
|
102
|
+
UPDATE public.service_bindings SET seal = p_seal WHERE id = p_id::uuid AND seal IS NOT DISTINCT FROM p_seal_from;
|
|
103
|
+
END IF;
|
|
104
|
+
WHEN 'environment' THEN
|
|
105
|
+
IF v IS NULL THEN
|
|
106
|
+
UPDATE public.environments SET seal = p_seal WHERE id = p_id::uuid AND seal IS NOT DISTINCT FROM p_seal_from;
|
|
107
|
+
ELSE
|
|
108
|
+
-- A tombstone's slug holds a `~` (@coffre/core/schemas's isTombstone): an environment deleted stays so,
|
|
109
|
+
-- and none is deleted here.
|
|
110
|
+
UPDATE public.environments e
|
|
111
|
+
SET slug = v ->> 'slug',
|
|
112
|
+
protected = (v ->> 'protected')::boolean,
|
|
113
|
+
archived_at = CASE WHEN (v ->> 'archived')::boolean THEN coalesce(e.archived_at, to_timestamp(p_at / 1000.0)) END,
|
|
114
|
+
seal = p_seal
|
|
115
|
+
WHERE e.id = p_id::uuid AND e.seal IS NOT DISTINCT FROM p_seal_from
|
|
116
|
+
AND v ->> 'kind' = 'environment' AND v ->> 'id' = p_id
|
|
117
|
+
AND e.project_id = (v ->> 'projectId')::uuid
|
|
118
|
+
AND e.parent_id IS NOT DISTINCT FROM (v ->> 'parentId')::uuid
|
|
119
|
+
AND e.owner IS NOT DISTINCT FROM v ->> 'owner'
|
|
120
|
+
AND (strpos(e.slug, '~') > 0) = (v ->> 'deleted')::boolean
|
|
121
|
+
AND (strpos(v ->> 'slug', '~') > 0) = (v ->> 'deleted')::boolean
|
|
122
|
+
AND (NOT (v ->> 'deleted')::boolean OR e.slug = v ->> 'slug');
|
|
123
|
+
END IF;
|
|
124
|
+
WHEN 'secret' THEN
|
|
125
|
+
UPDATE public.secrets SET seal = p_seal WHERE id = p_id::uuid AND seal IS NOT DISTINCT FROM p_seal_from;
|
|
126
|
+
WHEN 'policy', 'roles' THEN
|
|
127
|
+
config := CASE change WHEN 'genesis' THEN op -> 'value' ELSE v END;
|
|
128
|
+
IF p_id <> 'instance' OR config IS NULL OR jsonb_typeof(config) <> 'object' OR (change = 'genesis' AND p_seal_from IS NOT NULL) THEN
|
|
129
|
+
RAISE EXCEPTION 'the % object is one, made once from its value and changed from its seal', p_kind USING ERRCODE = 'invalid_parameter_value';
|
|
130
|
+
END IF;
|
|
131
|
+
-- Made by its first change (genesis, or the first role defined, the first cap set); moved after from its seal.
|
|
132
|
+
IF p_seal_from IS NULL THEN
|
|
133
|
+
INSERT INTO public.log_config (name, value, seal) VALUES (p_kind, config::text, p_seal) ON CONFLICT (name) DO NOTHING;
|
|
134
|
+
ELSE
|
|
135
|
+
UPDATE public.log_config SET value = config::text, seal = p_seal WHERE log_config.name = p_kind AND seal = p_seal_from;
|
|
136
|
+
END IF;
|
|
137
|
+
ELSE
|
|
138
|
+
RAISE EXCEPTION 'no object kind %', p_kind USING ERRCODE = 'invalid_parameter_value';
|
|
139
|
+
END CASE;
|
|
140
|
+
-- A row gone, a row whose seal is no longer the one read, an environment that is not what the value says it
|
|
141
|
+
-- stays, or an object made already: nothing was done.
|
|
142
|
+
GET DIAGNOSTICS done = ROW_COUNT;
|
|
143
|
+
IF done = 0 THEN RETURN NULL; END IF;
|
|
144
|
+
INSERT INTO public.log_changes (number, at, request_id, object, actor, payload, seal, mac)
|
|
145
|
+
VALUES (nextval('public.log_number'), p_at, p_request, target, p_actor, p_payload, p_seal, p_mac)
|
|
146
|
+
RETURNING number INTO n;
|
|
147
|
+
RETURN n;
|
|
148
|
+
END
|
|
149
|
+
$$;
|
|
150
|
+
--> statement-breakpoint
|
|
151
|
+
REVOKE ALL ON FUNCTION change_input(text, text, text, bigint, text, text, text, bytea, bytea, bytea) FROM PUBLIC;
|
|
152
|
+
--> statement-breakpoint
|
|
153
|
+
GRANT EXECUTE ON FUNCTION change_input(text, text, text, bigint, text, text, text, bytea, bytea, bytea) TO coffre_vault;
|