@substrat-run/kernel 0.143.0 → 0.144.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/capability.d.ts +20 -2
- package/dist/capability.d.ts.map +1 -1
- package/dist/capability.js +73 -13
- package/dist/capability.js.map +1 -1
- package/dist/derived-handlers.d.ts.map +1 -1
- package/dist/derived-handlers.js +111 -19
- package/dist/derived-handlers.js.map +1 -1
- package/dist/entity-binding.d.ts +121 -0
- package/dist/entity-binding.d.ts.map +1 -0
- package/dist/entity-binding.js +235 -0
- package/dist/entity-binding.js.map +1 -0
- package/dist/entity-grant-shape.d.ts +50 -7
- package/dist/entity-grant-shape.d.ts.map +1 -1
- package/dist/entity-grant-shape.js +253 -94
- package/dist/entity-grant-shape.js.map +1 -1
- package/dist/entity-grant.d.ts +5 -2
- package/dist/entity-grant.d.ts.map +1 -1
- package/dist/entity-grant.js +6 -3
- package/dist/entity-grant.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/module-erasure.d.ts +2 -1
- package/dist/module-erasure.d.ts.map +1 -1
- package/dist/module-erasure.js +12 -1
- package/dist/module-erasure.js.map +1 -1
- package/dist/scope-host.d.ts +4 -2
- package/dist/scope-host.d.ts.map +1 -1
- package/dist/scope-host.js.map +1 -1
- package/dist/sql-identifier.d.ts +3 -0
- package/dist/sql-identifier.d.ts.map +1 -1
- package/dist/sql-identifier.js +2 -0
- package/dist/sql-identifier.js.map +1 -1
- package/dist/system-switch.d.ts +5 -0
- package/dist/system-switch.d.ts.map +1 -1
- package/dist/system-switch.js +7 -0
- package/dist/system-switch.js.map +1 -1
- package/package.json +2 -2
- package/dist/connect-state.d.ts +0 -103
- package/dist/connect-state.d.ts.map +0 -1
- package/dist/connect-state.js +0 -128
- package/dist/connect-state.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ENTITY_GRANTS_RETIRED, ENTITY_GRANTS_TOPPED_UP, ENTITY_SHAPE_MARKER_RELATION, domainEvent, entityGrantsRetiredPayload, entityGrantsToppedUpPayload, entityObjectRef, eventId, } from '@substrat-run/contracts';
|
|
2
2
|
import { assertKernelAuthoredType, substratError } from '@substrat-run/contracts';
|
|
3
3
|
import { KERNEL_ACTOR, kernelOutboxInsertSql } from './kernel-outbox.js';
|
|
4
|
-
import {
|
|
4
|
+
import { SHAPE_PROTECTED_KEY_RELATION, explicitTupleSql } from './entity-grant.js';
|
|
5
5
|
import { liveTupleSql } from './permission-eval.js';
|
|
6
6
|
import { assertSqlIdentifier } from './sql-identifier.js';
|
|
7
7
|
/**
|
|
@@ -40,13 +40,25 @@ import { assertSqlIdentifier } from './sql-identifier.js';
|
|
|
40
40
|
* the principal; a table column naming the principal), and a person is marked only on their
|
|
41
41
|
* own record, and only when they hold a row there (live or tombstoned) for some key of the
|
|
42
42
|
* shape — evidence they were given it. Someone `ctx.grant`ed even the whole shape on another
|
|
43
|
-
* person's record is never marked. A shape with no `holder` gets no backfill.
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
43
|
+
* person's record is never marked. A shape with no `holder` gets no backfill. It is read in
|
|
44
|
+
* windows like the walks (#2154): each pass reads at most its read budget of rows, in an index
|
|
45
|
+
* order, marks at most its write budget, and hands back the last row it read as the cursor's
|
|
46
|
+
* `row`, so the next pass seeks past it rather than re-reading from the start. A record tuple
|
|
47
|
+
* (`shape:<type>`, `shape-backfilled`, `scope:<id>`) ends it once a read reaches the end of the
|
|
48
|
+
* range, and never before. A table holder's read is keyed on `idColumn` and then the row's own
|
|
49
|
+
* identity (its `rowid`, or a `WITHOUT ROWID` table's primary key), because nothing makes
|
|
50
|
+
* `idColumn` unique or the principal non-NULL, and a key that ties lets a window's edge skip a row.
|
|
51
|
+
*
|
|
52
|
+
* The cut-off is the cursor. Evidence that lands behind it while the backfill runs (a direct
|
|
53
|
+
* grant of a shape key to the person on their own record, for `'self'` or a table holder) is not
|
|
54
|
+
* marked, and once the record is written nothing is: the same accepted gap as a grant landing
|
|
55
|
+
* after the record. There is deliberately no confirming walk, as a retirement has: it would
|
|
56
|
+
* double every first backfill's reads to catch a grant that a shape grant should have made. For
|
|
57
|
+
* `'grantee'` nothing can land at all, since the first pass records the grantee keys and the
|
|
58
|
+
* tuple writer refuses them to every other grant from then on.
|
|
47
59
|
* - `holder: 'grantee'` (#2083), for a record that names no principal (a portal customer, a
|
|
48
60
|
* contact): whoever holds a live current or retired key of the shape on such an entity was given it.
|
|
49
|
-
* Each
|
|
61
|
+
* Each reconcile records current and retired keys (`shape-grantee-key`), and the explicit tuple
|
|
50
62
|
* writer makes non-shape grants refuse them on that entity type. A tuple from before the
|
|
51
63
|
* first such pass cannot be told apart. A marker already written by a shape grant persists
|
|
52
64
|
* through retirement, so its holder receives the new keys even if their old key was K alone.
|
|
@@ -69,7 +81,8 @@ export const SHAPE_MARKER_INDEX_DDL = `CREATE INDEX IF NOT EXISTS _substrat_tupl
|
|
|
69
81
|
/** Holders topped up per pass — one transaction each, so a large scope never holds one long. */
|
|
70
82
|
export const SHAPE_TOP_UP_BATCH = 500;
|
|
71
83
|
/**
|
|
72
|
-
*
|
|
84
|
+
* Rows a pass may READ, per row of work it may write: markers on a walk, and the tuples or table
|
|
85
|
+
* rows the backfill reads for candidates (#2154). The budget bounds writes, but finding
|
|
73
86
|
* the holders who need one means reading past the ones who do not, and on a scope where nobody
|
|
74
87
|
* does (the common reconcile: nothing changed) that is every marker. Ten per row keeps a pass at
|
|
75
88
|
* 5000 index rows by default, short on any scope, while a rollout still spends most of each pass
|
|
@@ -125,7 +138,8 @@ export function grantEntityShapeIn(db, principal, entity, permissions) {
|
|
|
125
138
|
}
|
|
126
139
|
/**
|
|
127
140
|
* One pass of the reconcile over one scope, at most `limit` rows of work and
|
|
128
|
-
* `limit × SHAPE_MARKER_READS_PER_ROW`
|
|
141
|
+
* `limit × SHAPE_MARKER_READS_PER_ROW` rows read (markers, and the backfill's tuples or table
|
|
142
|
+
* rows): backfill marks for any shape whose backfill
|
|
129
143
|
* is not done here, then holders whose retired keys are taken back, each with its
|
|
130
144
|
* `entity.grants-retired` event, then holders topped up, each with its `entity.grants-topped-up`
|
|
131
145
|
* event. `next` is `null` once the scope is done; otherwise the caller runs another pass with it
|
|
@@ -139,7 +153,9 @@ export function topUpEntityGrantShapes(db, pass) {
|
|
|
139
153
|
// a caller looping until it does would never stop.
|
|
140
154
|
const limit = shapeTopUpBatch(pass.limit);
|
|
141
155
|
const room = { writes: limit, reads: limit * SHAPE_MARKER_READS_PER_ROW };
|
|
142
|
-
|
|
156
|
+
// The registry is the same for every pass of one reconcile, so its facts are recorded by the first.
|
|
157
|
+
if (!pass.after)
|
|
158
|
+
recordShapeFacts(db, pass.shapes);
|
|
143
159
|
let toppedUp = 0;
|
|
144
160
|
let retired = 0;
|
|
145
161
|
let retirementsLeftOpen = 0;
|
|
@@ -158,19 +174,19 @@ export function topUpEntityGrantShapes(db, pass) {
|
|
|
158
174
|
const resume = from?.shape === i ? from : null;
|
|
159
175
|
const at = resume?.step ?? 'backfill';
|
|
160
176
|
const marker = (step) => (resume?.step === step ? resume.marker : null);
|
|
161
|
-
const stop = (step, last,
|
|
177
|
+
const stop = (step, last, more) => ({
|
|
162
178
|
toppedUp,
|
|
163
179
|
retired,
|
|
164
180
|
retirementsLeftOpen,
|
|
165
|
-
next: { shape: i, step, marker: last, ...
|
|
181
|
+
next: { shape: i, step, marker: last, ...more },
|
|
166
182
|
});
|
|
167
183
|
const prefix = `${shape.entityType}:`;
|
|
168
184
|
if (at === 'backfill') {
|
|
169
185
|
// A live retired key still identifies a legacy holder so this pass can retire it.
|
|
170
186
|
// The grantee query excludes tombstoned tuples.
|
|
171
|
-
|
|
172
|
-
if (
|
|
173
|
-
return stop('backfill', null);
|
|
187
|
+
const read = backfill(db, pass, shape, prefix, JSON.stringify([...keys, ...gone]), room, resume?.row ?? null);
|
|
188
|
+
if (!read.done)
|
|
189
|
+
return stop('backfill', null, read.at ? { row: read.at } : undefined);
|
|
174
190
|
}
|
|
175
191
|
if (at !== 'topUp') {
|
|
176
192
|
reopenRetirements(db, pass, shape.entityType, keys);
|
|
@@ -183,7 +199,7 @@ export function topUpEntityGrantShapes(db, pass) {
|
|
|
183
199
|
if (confirm)
|
|
184
200
|
confirm = { ...confirm, clean: confirm.clean && took.found.length === 0 };
|
|
185
201
|
if (!took.done)
|
|
186
|
-
return stop('retire', took.at, confirm);
|
|
202
|
+
return stop('retire', took.at, confirm ? { confirm } : undefined);
|
|
187
203
|
if (confirm?.clean)
|
|
188
204
|
break; // `retire` recorded the retirement finished
|
|
189
205
|
// A confirming walk from the first marker, for what landed behind this one; a walk that
|
|
@@ -207,11 +223,36 @@ export function topUpEntityGrantShapes(db, pass) {
|
|
|
207
223
|
}
|
|
208
224
|
/** A step with nothing to walk: done, having read nothing. */
|
|
209
225
|
const NOTHING_TO_WALK = { found: [], done: true, at: null };
|
|
226
|
+
/**
|
|
227
|
+
* One window of a step's read, fetched in sort order with each row's `hit` computed in the SELECT
|
|
228
|
+
* rather than filtered in the WHERE, so `LIMIT window` bounds the rows read and not only the rows
|
|
229
|
+
* wanted. Takes the wanted pairs, each once, until the write budget is spent, and charges every
|
|
230
|
+
* row FETCHED to the read budget: the whole window, not only up to where the writes ran out,
|
|
231
|
+
* because SQLite evaluated `hit` on every row it returned. `done` once every row fetched was taken
|
|
232
|
+
* and the fetch came back short of the window; `last` is the last row taken, where the next
|
|
233
|
+
* window starts after.
|
|
234
|
+
*/
|
|
235
|
+
function takeWindow(rows, window, room) {
|
|
236
|
+
const found = [];
|
|
237
|
+
// A pair can come back on several rows of one window (a tuple per key it holds); it is one write.
|
|
238
|
+
const seen = new Set();
|
|
239
|
+
let read = 0;
|
|
240
|
+
while (read < rows.length && found.length < room.writes) {
|
|
241
|
+
const r = rows[read++];
|
|
242
|
+
const pair = `${r.subject}\n${r.object}`;
|
|
243
|
+
if (!r.hit || seen.has(pair))
|
|
244
|
+
continue;
|
|
245
|
+
seen.add(pair);
|
|
246
|
+
found.push(r);
|
|
247
|
+
}
|
|
248
|
+
room.reads -= rows.length;
|
|
249
|
+
room.writes -= found.length;
|
|
250
|
+
return { found, done: read === rows.length && rows.length < window, last: rows[read - 1] };
|
|
251
|
+
}
|
|
210
252
|
/**
|
|
211
253
|
* The live markers of one shape after `after`, in index order, that are `wanted` (a SQL predicate
|
|
212
|
-
* on the marker `m`, binding one parameter: `json`), as many as `room` allows
|
|
213
|
-
*
|
|
214
|
-
* writes ran out, because SQLite evaluated `wanted` on every row it returned.
|
|
254
|
+
* on the marker `m`, binding one parameter: `json`), as many as `room` allows, read as one
|
|
255
|
+
* {@link takeWindow}.
|
|
215
256
|
*/
|
|
216
257
|
function walkMarkers(db, now, prefix, after, room, wanted, json) {
|
|
217
258
|
if (room.writes === 0 || room.reads === 0)
|
|
@@ -227,22 +268,8 @@ function walkMarkers(db, now, prefix, after, room, wanted, json) {
|
|
|
227
268
|
LIMIT ?`, now, json,
|
|
228
269
|
// A row-value seek: a resumed walk starts after the cursor and reads none of what it passed.
|
|
229
270
|
from.object, from.subject, end, window);
|
|
230
|
-
const found =
|
|
231
|
-
|
|
232
|
-
while (read < rows.length && found.length < room.writes) {
|
|
233
|
-
const r = rows[read++];
|
|
234
|
-
if (r.hit)
|
|
235
|
-
found.push({ subject: r.subject, object: r.object });
|
|
236
|
-
}
|
|
237
|
-
room.reads -= rows.length;
|
|
238
|
-
room.writes -= found.length;
|
|
239
|
-
const last = rows[read - 1];
|
|
240
|
-
return {
|
|
241
|
-
found,
|
|
242
|
-
// Every marker it fetched was read, and the fetch came back short of the window: no more.
|
|
243
|
-
done: read === rows.length && rows.length < window,
|
|
244
|
-
at: last ? { object: last.object, subject: last.subject } : after,
|
|
245
|
-
};
|
|
271
|
+
const { found, done, last } = takeWindow(rows, window, room);
|
|
272
|
+
return { found, done, at: last ? { object: last.object, subject: last.subject } : after };
|
|
246
273
|
}
|
|
247
274
|
/**
|
|
248
275
|
* One bounded walk of a shape's top-up: each live marker whose entity lacks a key of the current
|
|
@@ -323,93 +350,225 @@ function reopenRetirements(db, pass, entityType, keys) {
|
|
|
323
350
|
AND relation IN (SELECT '${RETIRED_RELATION}' || value FROM json_each(?))`, pass.now, ...recordRefs(entityType, pass.scopeId), JSON.stringify(keys));
|
|
324
351
|
}
|
|
325
352
|
/**
|
|
326
|
-
* One
|
|
327
|
-
*
|
|
328
|
-
*
|
|
353
|
+
* One window of the backfill for one shape after `after` (#2154), as one {@link takeWindow}: at
|
|
354
|
+
* most `room.reads` rows read, in an index order a cursor can seek, and at most `room.writes`
|
|
355
|
+
* marks; `done` once it read its whole range, else `at` is the last row it read. The run-once record is written only by the window that reads to the end of the range, so
|
|
356
|
+
* a backfill cut short by either budget hands back where it stopped and keeps no record. See the
|
|
357
|
+
* module comment: provenance only, from the shape's declared `holder`.
|
|
329
358
|
*/
|
|
330
|
-
function backfill(db, pass, shape, prefix, json,
|
|
331
|
-
if (!shape.holder
|
|
332
|
-
return
|
|
359
|
+
function backfill(db, pass, shape, prefix, json, room, after) {
|
|
360
|
+
if (!shape.holder)
|
|
361
|
+
return { done: true, at: null };
|
|
333
362
|
const [shapeRef, scopeRef] = recordRefs(shape.entityType, pass.scopeId);
|
|
334
363
|
const record = [shapeRef, BACKFILLED_RELATION, scopeRef];
|
|
335
364
|
if (db.all('SELECT 1 FROM _substrat_tuples WHERE subject = ? AND relation = ? AND object = ?', ...record).length > 0) {
|
|
336
|
-
return
|
|
365
|
+
return { done: true, at: null };
|
|
337
366
|
}
|
|
367
|
+
if (room.writes === 0 || room.reads === 0)
|
|
368
|
+
return { done: false, at: after };
|
|
369
|
+
const window = room.reads;
|
|
338
370
|
// Not yet a holder in any state: a tombstoned marker is a revoke of the holding, kept.
|
|
339
371
|
const unmarked = (subject, object) => `NOT EXISTS (SELECT 1 FROM _substrat_tuples m WHERE m.subject = ${subject} AND m.relation = '${ENTITY_SHAPE_MARKER_RELATION}' AND m.object = ${object})`;
|
|
340
372
|
const heldThere = (subject, object) => `EXISTS (SELECT 1 FROM _substrat_tuples g WHERE g.subject = ${subject} AND g.object = ${object}
|
|
341
373
|
AND g.relation IN (SELECT 'granted:' || value FROM json_each(?)))`;
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
374
|
+
const shapeKey = `t.relation IN (SELECT 'granted:' || value FROM json_each(?))`;
|
|
375
|
+
// The rows of the window, and the sort key the cursor carries for a row.
|
|
376
|
+
let rows;
|
|
377
|
+
let keyOf;
|
|
378
|
+
if (shape.holder === 'self' || shape.holder === 'grantee') {
|
|
379
|
+
// The type's tuples on `_substrat_tuples_object_relation_subject`, in its order, so the cursor
|
|
380
|
+
// is a row-value seek into the range. Every tuple of the type is read, a key of another shape
|
|
381
|
+
// or a marker included; which of them make a candidate is `hit`.
|
|
382
|
+
const [, end] = typeRange(prefix);
|
|
383
|
+
const from = after ?? [prefix, '', ''];
|
|
384
|
+
const [holds, holdsParams] = shape.holder === 'self'
|
|
385
|
+
? // The entity id IS the principal: `owner:<p>` belongs to `principal:<p>` and nobody else.
|
|
386
|
+
[`t.subject = '${PRINCIPAL}' || substr(t.object, ${prefix.length + 1})`, []]
|
|
387
|
+
: // Whoever holds a LIVE key of the shape on an entity of this type. Live, unlike the other
|
|
388
|
+
// two holders: with no record naming the person, a key taken back from them is no evidence
|
|
389
|
+
// they still belong there, and marking them would hand a revoked portal the next key it gains.
|
|
390
|
+
[`substr(t.subject, 1, ${PRINCIPAL.length}) = '${PRINCIPAL}' AND ${liveTupleSql('t')}`, [pass.now]];
|
|
391
|
+
rows = db.all(`SELECT t.object, t.relation, t.subject, (${shapeKey} AND ${holds} AND ${unmarked('t.subject', 't.object')}) AS hit
|
|
392
|
+
FROM _substrat_tuples t
|
|
393
|
+
WHERE (t.object, t.relation, t.subject) > (?, ?, ?) AND t.object < ?
|
|
394
|
+
ORDER BY t.object, t.relation, t.subject
|
|
395
|
+
LIMIT ?`, json, ...holdsParams, ...from, end, window);
|
|
396
|
+
keyOf = (r) => [r.object, r.relation, r.subject];
|
|
365
397
|
}
|
|
366
398
|
else {
|
|
367
|
-
const { table, idColumn, principalColumn } = shape.holder;
|
|
368
|
-
const where = `entityGrants holder of '${shape.entityType}'`;
|
|
369
|
-
for (const [kind, name] of [['a table', table], ['a column', idColumn], ['a column', principalColumn]]) {
|
|
370
|
-
assertSqlIdentifier('reconcileEntityGrantShapes', kind, name, where);
|
|
371
|
-
}
|
|
399
|
+
const { table, idColumn, principalColumn } = holderNames(shape.holder, 'reconcileEntityGrantShapes', `entityGrants holder of '${shape.entityType}'`);
|
|
372
400
|
// The vertical's table may not exist yet on this scope (a module not migrated): nothing to
|
|
373
401
|
// mark, and the backfill stays open for the next reconcile rather than being recorded done.
|
|
374
|
-
|
|
375
|
-
|
|
402
|
+
// Asked of SQLite, not read off the DDL's text, which keeps table options in any order and
|
|
403
|
+
// comments after them (#2159 review).
|
|
404
|
+
const listed = db.all(`SELECT wr FROM pragma_table_list WHERE schema = 'main' AND type = 'table' AND name = ?`, table)[0];
|
|
405
|
+
if (!listed)
|
|
406
|
+
return { done: true, at: null };
|
|
376
407
|
const subject = `'${PRINCIPAL}' || e."${principalColumn}"`;
|
|
377
408
|
const object = `? || e."${idColumn}"`;
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
409
|
+
// The table in `idColumn` order, the cursor a seek on it: the raw values, so they compare as the
|
|
410
|
+
// columns do. Nothing makes `idColumn` unique, and the principal may be NULL, so the key goes on
|
|
411
|
+
// to the row's own identity (#2159 review): rows sharing an id are never skipped at a window's
|
|
412
|
+
// edge. Bounded only where `idColumn` leads an index (an entity id is the primary key);
|
|
413
|
+
// otherwise every window sorts the whole table, which `warnUnboundedRead` reports.
|
|
414
|
+
const key = [`e."${idColumn}"`, ...rowIdentity(db, table, idColumn, Number(listed['wr']) === 1)];
|
|
415
|
+
const sql = `SELECT ${key.map((k, i) => `${k} AS k${i}`).join(', ')}, ${subject} AS subject, ${object} AS object,
|
|
416
|
+
(e."${principalColumn}" IS NOT NULL AND ${heldThere(subject, object)} AND ${unmarked(subject, object)}) AS hit
|
|
417
|
+
FROM "${table}" e
|
|
418
|
+
WHERE ${after ? `(${key.join(', ')}) > (${key.map(() => '?').join(', ')})` : `e."${idColumn}" IS NOT NULL`}
|
|
419
|
+
ORDER BY ${key.join(', ')}
|
|
420
|
+
LIMIT ?`;
|
|
421
|
+
const params = [prefix, prefix, json, prefix, ...(after ?? []), window];
|
|
422
|
+
if (!after)
|
|
423
|
+
warnUnboundedRead(db, pass, shape.entityType, { table, idColumn }, sql, params);
|
|
424
|
+
rows = db.all(sql, ...params);
|
|
425
|
+
keyOf = (r) => key.map((_, i) => r[`k${i}`]);
|
|
384
426
|
}
|
|
385
|
-
|
|
427
|
+
const { found, done, last } = takeWindow(rows, window, room);
|
|
428
|
+
for (const c of found) {
|
|
386
429
|
db.run('INSERT OR IGNORE INTO _substrat_tuples (subject, relation, object) VALUES (?, ?, ?)', c.subject, ENTITY_SHAPE_MARKER_RELATION, c.object);
|
|
387
430
|
}
|
|
388
|
-
if (
|
|
431
|
+
if (done)
|
|
389
432
|
db.run('INSERT OR IGNORE INTO _substrat_tuples (subject, relation, object) VALUES (?, ?, ?)', ...record);
|
|
433
|
+
return { done, at: last ? keyOf(last) : after };
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* What tells apart two rows of a holder table that share an `idColumn`, after it in the read's key:
|
|
437
|
+
* the `rowid`, unique, never NULL, and already the last column of every index on a rowid table, so
|
|
438
|
+
* an index leading with `idColumn` serves the whole key with no sort. Named by the first of its three
|
|
439
|
+
* names that no column of the table has taken: a column called `rowid` is that column, not the row's
|
|
440
|
+
* identity. A table that takes all three is refused (`validation_failed`) rather than read with a key
|
|
441
|
+
* that can tie: a rowid table's primary key may hold NULLs, so it cannot stand in. A `WITHOUT ROWID` table has
|
|
442
|
+
* none; its primary key columns are NOT NULL, unique, and end each of its indexes the same way, so
|
|
443
|
+
* they stand in, read in key order (those already `idColumn`'s left out: a key of `idColumn`
|
|
444
|
+
* alone is unique, and needs nothing after it).
|
|
445
|
+
*/
|
|
446
|
+
function rowIdentity(db, table, idColumn, withoutRowid) {
|
|
447
|
+
const columns = db.all('SELECT name, pk FROM pragma_table_info(?) ORDER BY pk', table).map((r) => ({ name: String(r['name']), pk: Number(r['pk']) }));
|
|
448
|
+
if (withoutRowid) {
|
|
449
|
+
return columns.filter((c) => c.pk > 0 && c.name !== idColumn).map((c) => `e."${c.name.replaceAll('"', '""')}"`);
|
|
450
|
+
}
|
|
451
|
+
const taken = new Set(columns.map((c) => c.name.toLowerCase()));
|
|
452
|
+
const alias = ROWID_NAMES.find((n) => !taken.has(n));
|
|
453
|
+
if (!alias) {
|
|
454
|
+
throw substratError('validation_failed', `reconcileEntityGrantShapes: holder table "${table}" has columns named rowid, _rowid_ and oid, so its rows cannot be told apart; rename one`, { errors: [{ path: 'holder.table', message: 'a table that leaves one of rowid, _rowid_ or oid to the row' }] });
|
|
455
|
+
}
|
|
456
|
+
return [`e.${alias}`];
|
|
457
|
+
}
|
|
458
|
+
/** The names SQLite answers a rowid table's row identity to, unless a column has taken one. */
|
|
459
|
+
const ROWID_NAMES = ['rowid', '_rowid_', 'oid'];
|
|
460
|
+
/**
|
|
461
|
+
* A table holder's backfill is bounded only where SQLite reads the table in `idColumn` order off
|
|
462
|
+
* an index; where it must sort instead (`idColumn` leads no index), every window reads the whole
|
|
463
|
+
* table. The schema is the vertical's, known only on the scope, so the backfill's first window
|
|
464
|
+
* asks SQLite for the plan of the read it is about to send and writes one structured warn line
|
|
465
|
+
* when the plan sorts the whole table (`USE TEMP B-TREE FOR ORDER BY`), its keys a contract as the
|
|
466
|
+
* log lines' are. The read still runs: the backfill is correct, only unbounded. A sort of only the
|
|
467
|
+
* key's LAST TERM is not reported: an index on `(idColumn, principalColumn)` serves `idColumn` but
|
|
468
|
+
* not the row identity after it, so SQLite sorts the rows of one id at a time, which is bounded by
|
|
469
|
+
* the rows sharing an id, not by the table.
|
|
470
|
+
*/
|
|
471
|
+
function warnUnboundedRead(db, pass, entityType, holder, sql, params) {
|
|
472
|
+
const plan = db.all(`EXPLAIN QUERY PLAN ${sql}`, ...params).map((r) => String(r['detail']));
|
|
473
|
+
if (!plan.some((d) => d.startsWith('USE TEMP B-TREE FOR ORDER BY')))
|
|
474
|
+
return;
|
|
475
|
+
console.warn(JSON.stringify({
|
|
476
|
+
substrat: 'shape-backfill-unbounded',
|
|
477
|
+
level: 'warn',
|
|
478
|
+
tenantId: pass.tenantId,
|
|
479
|
+
scopeId: pass.scopeId,
|
|
480
|
+
entityType,
|
|
481
|
+
...holder,
|
|
482
|
+
message: `the entity-grant backfill of '${entityType}' sorts all of "${holder.table}" on every pass: index "${holder.idColumn}" to bound it`,
|
|
483
|
+
}));
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* A BINDING shape's record (#1686), on the scope's tuple spine beside the grantee keys: which
|
|
487
|
+
* table column names the record's person (`<table>.<idColumn>.<principalColumn>`), the key that
|
|
488
|
+
* lets someone bind or unbind them, and the shape's current keys — what a binding invite's claim
|
|
489
|
+
* gives. The claim and an unbind read these, never the vertical's code: the shape is the reviewed
|
|
490
|
+
* registry the platform last reconciled this scope with. Each identifier is a SQL identifier, so
|
|
491
|
+
* `.` cannot occur inside one.
|
|
492
|
+
*/
|
|
493
|
+
export const BIND_HOLDER_RELATION = 'shape-bind-holder';
|
|
494
|
+
export const BIND_PERMISSION_RELATION = 'shape-bind-permission';
|
|
495
|
+
export const BIND_KEY_RELATION = 'shape-bind-key';
|
|
496
|
+
/**
|
|
497
|
+
* `(shape:<type>, shape-bound, bound)`: this scope has declared a binding for `<type>` (#1686).
|
|
498
|
+
* Written by the first reconcile that records the binding (and by every claim, to the same effect)
|
|
499
|
+
* and STICKY — no reconcile removes it, whatever later
|
|
500
|
+
* versions declare — so an erasure keeps releasing that type's holders after a version drops the
|
|
501
|
+
* shape, drops its `bind` or moves its holder column. A spine tuple like the others here, so
|
|
502
|
+
* module code can never write one (`ctx.sql` refuses every `_substrat_*` write).
|
|
503
|
+
*/
|
|
504
|
+
export const BOUND_EVER_RELATION = 'shape-bound';
|
|
505
|
+
/** A shape the reconcile records as binding: bootstrap, a table holder, and a `bind`. */
|
|
506
|
+
const binds = (s) => !!s.bootstrap && !!s.bind && typeof s.holder === 'object';
|
|
507
|
+
/** A table holder's three names, each checked as a SQL identifier before anything interpolates it. */
|
|
508
|
+
function holderNames(holder, area, where) {
|
|
509
|
+
for (const [kind, name] of [['a table', holder.table], ['a column', holder.idColumn], ['a column', holder.principalColumn]]) {
|
|
510
|
+
assertSqlIdentifier(area, kind, name, where);
|
|
390
511
|
}
|
|
391
|
-
return
|
|
512
|
+
return holder;
|
|
392
513
|
}
|
|
393
514
|
/**
|
|
394
|
-
* The
|
|
395
|
-
*
|
|
396
|
-
*
|
|
397
|
-
*
|
|
398
|
-
*
|
|
515
|
+
* The registry facts a reconcile records for the explicit tuple writer and a binding claim, made to
|
|
516
|
+
* match the reached version's whole reviewed registry exactly, so a declaration a later version
|
|
517
|
+
* drops stops counting:
|
|
518
|
+
* - every current and retired key of each `holder: 'grantee'` or BOUND bootstrap shape
|
|
519
|
+
* (`shape-grantee-key`), which every non-shape grant then refuses on that entity type;
|
|
520
|
+
* - each bound shape's holder column and current keys, and — only while it declares `bind` — its
|
|
521
|
+
* bind key (#1686).
|
|
522
|
+
*
|
|
523
|
+
* A type that has ever bound (`shape-bound`) keeps its protected keys whatever later versions
|
|
524
|
+
* declare, so the keys stay refused to direct grants while its holders keep the shape; a key a
|
|
525
|
+
* later version gives the shape joins them.
|
|
526
|
+
*
|
|
527
|
+
* A shape is BOUND while it declares `bind`, and stays bound after a version drops `bind` for as
|
|
528
|
+
* long as it is still a bootstrap shape with the same table holder: records may already name their
|
|
529
|
+
* people in that column, holding the shape through it, and an erasure releases them by these
|
|
530
|
+
* facts. Without the bind key nobody can mint, claim or unbind any more; what was bound stays as a
|
|
531
|
+
* shape holder does when a key is dropped without being retired. A version that drops the shape,
|
|
532
|
+
* or changes its holder, drops the facts with it.
|
|
533
|
+
* Three statements, bounded by the declared shapes, so it runs without a budget.
|
|
399
534
|
*/
|
|
400
|
-
function
|
|
401
|
-
const
|
|
402
|
-
|
|
403
|
-
|
|
535
|
+
function recordShapeFacts(db, shapes) {
|
|
536
|
+
const ref = (s) => `shape:${s.entityType}`;
|
|
537
|
+
const holderOf = (s) => {
|
|
538
|
+
const { table, idColumn, principalColumn } = holderNames(s.holder, 'reconcileEntityGrantShapes', `entityGrants bind of '${s.entityType}'`);
|
|
539
|
+
return `${table}.${idColumn}.${principalColumn}`;
|
|
540
|
+
};
|
|
541
|
+
const recorded = new Map(db.all(`SELECT subject, object FROM _substrat_tuples WHERE subject >= 'shape:' AND subject < 'shape;' AND relation = ?`, BIND_HOLDER_RELATION).map((r) => [r.subject, r.object]));
|
|
542
|
+
const tableHeld = (s) => !!s.bootstrap && typeof s.holder === 'object';
|
|
543
|
+
const bound = shapes.filter(tableHeld).filter((s) => binds(s) || recorded.get(ref(s)) === holderOf(s));
|
|
544
|
+
const boundTypes = new Set(bound.map((s) => s.entityType));
|
|
545
|
+
const facts = [
|
|
546
|
+
...shapes
|
|
547
|
+
.filter((s) => (s.bootstrap && s.holder === 'grantee') || boundTypes.has(s.entityType))
|
|
548
|
+
.flatMap((s) => keysOf([...s.permissions, ...(s.retired ?? [])]).map((k) => [ref(s), SHAPE_PROTECTED_KEY_RELATION, `granted:${k}`])),
|
|
549
|
+
...bound.map((s) => [ref(s), BIND_HOLDER_RELATION, holderOf(s)]),
|
|
550
|
+
...shapes.filter(binds).map((s) => [ref(s), BIND_PERMISSION_RELATION, s.bind.permission]),
|
|
551
|
+
// A declared binding is sticky from the first reconcile that records it, not only from its first
|
|
552
|
+
// claim: its keys stay refused and its holders (backfilled ones included) stay reachable by an
|
|
553
|
+
// erasure, whatever later versions declare. Never deleted: the DELETE below names other relations.
|
|
554
|
+
...shapes.filter(binds).map((s) => [ref(s), BOUND_EVER_RELATION, 'bound']),
|
|
555
|
+
...bound.flatMap((s) => keysOf(s.permissions).map((k) => [ref(s), BIND_KEY_RELATION, `granted:${k}`])),
|
|
556
|
+
];
|
|
557
|
+
const json = JSON.stringify(facts);
|
|
404
558
|
db.run(
|
|
405
559
|
// The subject range keeps it on the primary key: `shape:` rows only, never the whole table.
|
|
406
|
-
`DELETE FROM _substrat_tuples WHERE subject >= 'shape:' AND subject < 'shape;' AND relation
|
|
560
|
+
`DELETE FROM _substrat_tuples WHERE subject >= 'shape:' AND subject < 'shape;' AND relation IN (?, ?, ?, ?)
|
|
407
561
|
AND NOT EXISTS (SELECT 1 FROM json_each(?) r
|
|
408
562
|
WHERE json_extract(r.value, '$[0]') = _substrat_tuples.subject
|
|
409
|
-
AND json_extract(r.value, '$[1]') = _substrat_tuples.
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
563
|
+
AND json_extract(r.value, '$[1]') = _substrat_tuples.relation
|
|
564
|
+
AND json_extract(r.value, '$[2]') = _substrat_tuples.object)
|
|
565
|
+
-- A type that ever bound keeps its protected keys whatever this version declares (#1686):
|
|
566
|
+
-- its holders keep the shape until released, and a direct grant of a key of it made while
|
|
567
|
+
-- the shape is out of the registry would be a holder no marker, unbind or held check sees.
|
|
568
|
+
AND NOT (relation = ? AND EXISTS (SELECT 1 FROM _substrat_tuples b
|
|
569
|
+
WHERE b.subject = _substrat_tuples.subject AND b.relation = ?))`, SHAPE_PROTECTED_KEY_RELATION, BIND_HOLDER_RELATION, BIND_PERMISSION_RELATION, BIND_KEY_RELATION, json, SHAPE_PROTECTED_KEY_RELATION, BOUND_EVER_RELATION);
|
|
570
|
+
db.run(`INSERT OR IGNORE INTO _substrat_tuples (subject, relation, object)
|
|
571
|
+
SELECT json_extract(value, '$[0]'), json_extract(value, '$[1]'), json_extract(value, '$[2]') FROM json_each(?)`, json);
|
|
413
572
|
}
|
|
414
573
|
/**
|
|
415
574
|
* The kernel's event for one (person, entity) a pass changed — a top-up or a retirement — the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-grant-shape.js","sourceRoot":"","sources":["../src/entity-grant-shape.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"entity-grant-shape.js","sourceRoot":"","sources":["../src/entity-grant-shape.ts"],"names":[],"mappings":"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"}
|
package/dist/entity-grant.d.ts
CHANGED
|
@@ -14,8 +14,11 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import type { SwitchSql } from './system-switch.js';
|
|
16
16
|
type Params = [string, string, string];
|
|
17
|
-
/**
|
|
18
|
-
|
|
17
|
+
/**
|
|
18
|
+
* A key only its shape may give, stored on the scope's tuple spine: every current and retired key of
|
|
19
|
+
* a reconciled `'grantee'` or binding shape (#2083, #1686). The stored relation keeps its first name.
|
|
20
|
+
*/
|
|
21
|
+
export declare const SHAPE_PROTECTED_KEY_RELATION = "shape-grantee-key";
|
|
19
22
|
/** The explicit scope-tuple write for admin/local grants and ctx.grant, behind one shape guard. */
|
|
20
23
|
export declare function writeExplicitTupleIn(db: SwitchSql, subject: string, relation: string, object: string, mode: {
|
|
21
24
|
kind: 'replace';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-grant.d.ts","sourceRoot":"","sources":["../src/entity-grant.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,KAAK,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEvC
|
|
1
|
+
{"version":3,"file":"entity-grant.d.ts","sourceRoot":"","sources":["../src/entity-grant.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,KAAK,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEvC;;;GAGG;AACH,eAAO,MAAM,4BAA4B,sBAAsB,CAAC;AAgBhE,mGAAmG;AACnG,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,SAAS,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GAC1E,IAAI,CAcN;AAQD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAOnH;AAED,mGAAmG;AACnG,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,GACT;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAA;CAAE,CAM9C"}
|
package/dist/entity-grant.js
CHANGED
|
@@ -13,8 +13,11 @@
|
|
|
13
13
|
* expiry included, because `ctx.grant` has never shortened or lengthened a grant it found.
|
|
14
14
|
*/
|
|
15
15
|
import { PermissionDenied } from './permission-checker.js';
|
|
16
|
-
/**
|
|
17
|
-
|
|
16
|
+
/**
|
|
17
|
+
* A key only its shape may give, stored on the scope's tuple spine: every current and retired key of
|
|
18
|
+
* a reconciled `'grantee'` or binding shape (#2083, #1686). The stored relation keeps its first name.
|
|
19
|
+
*/
|
|
20
|
+
export const SHAPE_PROTECTED_KEY_RELATION = 'shape-grantee-key';
|
|
18
21
|
/** Every explicit non-shape scope tuple write uses this guard, including administrative writes. */
|
|
19
22
|
function assertDelegableTuple(db, relation, object) {
|
|
20
23
|
if (!relation.startsWith('granted:'))
|
|
@@ -23,7 +26,7 @@ function assertDelegableTuple(db, relation, object) {
|
|
|
23
26
|
if (colon < 0)
|
|
24
27
|
return;
|
|
25
28
|
const entityType = object.slice(0, colon);
|
|
26
|
-
if (db.all('SELECT 1 FROM _substrat_tuples WHERE subject = ? AND relation = ? AND object = ?', `shape:${entityType}`,
|
|
29
|
+
if (db.all('SELECT 1 FROM _substrat_tuples WHERE subject = ? AND relation = ? AND object = ?', `shape:${entityType}`, SHAPE_PROTECTED_KEY_RELATION, relation).length > 0) {
|
|
27
30
|
throw new PermissionDenied(`cannot grant '${relation.slice('granted:'.length)}' on ${object} — ` +
|
|
28
31
|
`it is a key of the declared '${entityType}' shape, given only by the shape grant`);
|
|
29
32
|
}
|
package/dist/entity-grant.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-grant.js","sourceRoot":"","sources":["../src/entity-grant.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAK3D
|
|
1
|
+
{"version":3,"file":"entity-grant.js","sourceRoot":"","sources":["../src/entity-grant.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAK3D;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,mBAAmB,CAAC;AAEhE,mGAAmG;AACnG,SAAS,oBAAoB,CAAC,EAAa,EAAE,QAAgB,EAAE,MAAc;IAC3E,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO;IACtB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1C,IAAI,EAAE,CAAC,GAAG,CAAC,kFAAkF,EAAE,SAAS,UAAU,EAAE,EAAE,4BAA4B,EAAE,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzK,MAAM,IAAI,gBAAgB,CACxB,iBAAiB,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,MAAM,KAAK;YACnE,gCAAgC,UAAU,wCAAwC,CACrF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,oBAAoB,CAClC,EAAa,EACb,OAAe,EACf,QAAgB,EAChB,MAAc,EACd,IAA2E;IAE3E,oBAAoB,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,EAAE,CAAC,GAAG,CACJ,qGAAqG,EACrG,OAAO,EACP,QAAQ,EACR,MAAM,EACN,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC1D,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,IAAI,GAAG,CAAC,SAAiB,EAAE,UAAkB,EAAE,MAAc,EAAU,EAAE,CAAC;IAC9E,aAAa,SAAS,EAAE;IACxB,WAAW,UAAU,EAAE;IACvB,MAAM;CACP,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,QAAgB,EAAE,MAAc;IAChF,OAAO;QACL,GAAG,EAAE;;wDAE+C;QACpD,MAAM,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,UAAkB,EAClB,MAAc,EACd,EAAU;IAEV,OAAO;QACL,GAAG,EAAE;oFAC2E;QAChF,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;KACrD,CAAC;AACJ,CAAC"}
|