@haverstack/core 0.42.0 → 0.43.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 (150) hide show
  1. package/README.md +5 -7
  2. package/dist/access.d.ts +30 -32
  3. package/dist/access.d.ts.map +1 -1
  4. package/dist/access.js +40 -98
  5. package/dist/access.js.map +1 -1
  6. package/dist/adapter/combine.d.ts.map +1 -1
  7. package/dist/adapter/combine.js +11 -3
  8. package/dist/adapter/combine.js.map +1 -1
  9. package/dist/adapter/index.d.ts +6 -4
  10. package/dist/adapter/index.d.ts.map +1 -1
  11. package/dist/adapter/index.js +4 -3
  12. package/dist/adapter/index.js.map +1 -1
  13. package/dist/adapter/reach.d.ts +14 -0
  14. package/dist/adapter/reach.d.ts.map +1 -0
  15. package/dist/adapter/reach.js +31 -0
  16. package/dist/adapter/reach.js.map +1 -0
  17. package/dist/associations/identity.d.ts +18 -42
  18. package/dist/associations/identity.d.ts.map +1 -1
  19. package/dist/associations/identity.js +60 -84
  20. package/dist/associations/identity.js.map +1 -1
  21. package/dist/associations/validation.d.ts +1 -8
  22. package/dist/associations/validation.d.ts.map +1 -1
  23. package/dist/associations/validation.js +3 -30
  24. package/dist/associations/validation.js.map +1 -1
  25. package/dist/collection.d.ts +7 -11
  26. package/dist/collection.d.ts.map +1 -1
  27. package/dist/collection.js +24 -34
  28. package/dist/collection.js.map +1 -1
  29. package/dist/content-match.d.ts +2 -2
  30. package/dist/content-match.js +2 -2
  31. package/dist/errors.d.ts +23 -8
  32. package/dist/errors.d.ts.map +1 -1
  33. package/dist/errors.js +28 -9
  34. package/dist/errors.js.map +1 -1
  35. package/dist/grants.d.ts +3 -3
  36. package/dist/grants.d.ts.map +1 -1
  37. package/dist/grants.js +4 -21
  38. package/dist/grants.js.map +1 -1
  39. package/dist/index.d.ts +5 -5
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +2 -2
  42. package/dist/index.js.map +1 -1
  43. package/dist/lazy.d.ts +13 -0
  44. package/dist/lazy.d.ts.map +1 -0
  45. package/dist/lazy.js +27 -0
  46. package/dist/lazy.js.map +1 -0
  47. package/dist/merge.d.ts +1 -1
  48. package/dist/merge.js +1 -1
  49. package/dist/query-validation.d.ts +41 -28
  50. package/dist/query-validation.d.ts.map +1 -1
  51. package/dist/query-validation.js +85 -71
  52. package/dist/query-validation.js.map +1 -1
  53. package/dist/record-changes.d.ts +12 -36
  54. package/dist/record-changes.d.ts.map +1 -1
  55. package/dist/record-changes.js +9 -98
  56. package/dist/record-changes.js.map +1 -1
  57. package/dist/scoped-stack/authority-snapshot.d.ts +37 -0
  58. package/dist/scoped-stack/authority-snapshot.d.ts.map +1 -0
  59. package/dist/scoped-stack/authority-snapshot.js +49 -0
  60. package/dist/scoped-stack/authority-snapshot.js.map +1 -0
  61. package/dist/scoped-stack/authority.d.ts +51 -38
  62. package/dist/scoped-stack/authority.d.ts.map +1 -1
  63. package/dist/scoped-stack/authority.js +160 -136
  64. package/dist/scoped-stack/authority.js.map +1 -1
  65. package/dist/scoped-stack/family-policy.d.ts +59 -0
  66. package/dist/scoped-stack/family-policy.d.ts.map +1 -0
  67. package/dist/scoped-stack/family-policy.js +68 -0
  68. package/dist/scoped-stack/family-policy.js.map +1 -0
  69. package/dist/scoped-stack/scoped-stack.d.ts +66 -86
  70. package/dist/scoped-stack/scoped-stack.d.ts.map +1 -1
  71. package/dist/scoped-stack/scoped-stack.js +243 -324
  72. package/dist/scoped-stack/scoped-stack.js.map +1 -1
  73. package/dist/scoped-stack/subscription.d.ts +14 -33
  74. package/dist/scoped-stack/subscription.d.ts.map +1 -1
  75. package/dist/scoped-stack/subscription.js +16 -57
  76. package/dist/scoped-stack/subscription.js.map +1 -1
  77. package/dist/stack/arguments.d.ts +27 -0
  78. package/dist/stack/arguments.d.ts.map +1 -0
  79. package/dist/stack/arguments.js +53 -0
  80. package/dist/stack/arguments.js.map +1 -0
  81. package/dist/stack/attachments.d.ts +1 -1
  82. package/dist/stack/attachments.js +1 -1
  83. package/dist/stack/changes.d.ts +4 -10
  84. package/dist/stack/changes.d.ts.map +1 -1
  85. package/dist/stack/changes.js +8 -8
  86. package/dist/stack/changes.js.map +1 -1
  87. package/dist/stack/client.d.ts +34 -58
  88. package/dist/stack/client.d.ts.map +1 -1
  89. package/dist/stack/install-app.d.ts.map +1 -1
  90. package/dist/stack/install-app.js +7 -5
  91. package/dist/stack/install-app.js.map +1 -1
  92. package/dist/stack/integrity.js +2 -2
  93. package/dist/stack/integrity.js.map +1 -1
  94. package/dist/stack/limits.d.ts +1 -1
  95. package/dist/stack/limits.js +1 -1
  96. package/dist/stack/reads.d.ts +9 -5
  97. package/dist/stack/reads.d.ts.map +1 -1
  98. package/dist/stack/reads.js +24 -4
  99. package/dist/stack/reads.js.map +1 -1
  100. package/dist/stack/stack.d.ts +77 -71
  101. package/dist/stack/stack.d.ts.map +1 -1
  102. package/dist/stack/stack.js +229 -256
  103. package/dist/stack/stack.js.map +1 -1
  104. package/dist/stack/type-grants.d.ts.map +1 -1
  105. package/dist/stack/type-grants.js +4 -4
  106. package/dist/stack/type-grants.js.map +1 -1
  107. package/dist/stack/write-expectation.d.ts +13 -12
  108. package/dist/stack/write-expectation.d.ts.map +1 -1
  109. package/dist/stack/write-expectation.js.map +1 -1
  110. package/dist/stack/write-gate.d.ts +23 -0
  111. package/dist/stack/write-gate.d.ts.map +1 -0
  112. package/dist/stack/write-gate.js +17 -0
  113. package/dist/stack/write-gate.js.map +1 -0
  114. package/dist/testing.d.ts +25 -9
  115. package/dist/testing.d.ts.map +1 -1
  116. package/dist/testing.js +147 -123
  117. package/dist/testing.js.map +1 -1
  118. package/dist/types/adapter.d.ts +90 -31
  119. package/dist/types/adapter.d.ts.map +1 -1
  120. package/dist/types/associations.d.ts +1 -17
  121. package/dist/types/associations.d.ts.map +1 -1
  122. package/dist/types/associations.js +1 -8
  123. package/dist/types/associations.js.map +1 -1
  124. package/dist/types/capabilities.d.ts +8 -8
  125. package/dist/types/capabilities.d.ts.map +1 -1
  126. package/dist/types/events.d.ts +3 -8
  127. package/dist/types/events.d.ts.map +1 -1
  128. package/dist/types/query.d.ts +4 -4
  129. package/dist/types/system.d.ts +1 -1
  130. package/dist/validate.d.ts +2 -0
  131. package/dist/validate.d.ts.map +1 -1
  132. package/dist/validate.js +2 -1
  133. package/dist/validate.js.map +1 -1
  134. package/dist/wire/body.d.ts +32 -9
  135. package/dist/wire/body.d.ts.map +1 -1
  136. package/dist/wire/body.js +69 -8
  137. package/dist/wire/body.js.map +1 -1
  138. package/dist/wire/index.d.ts +4 -4
  139. package/dist/wire/index.d.ts.map +1 -1
  140. package/dist/wire/index.js +3 -3
  141. package/dist/wire/index.js.map +1 -1
  142. package/dist/wire/record.d.ts +1 -8
  143. package/dist/wire/record.d.ts.map +1 -1
  144. package/dist/wire/record.js +0 -48
  145. package/dist/wire/record.js.map +1 -1
  146. package/dist/wire/request.d.ts +18 -18
  147. package/dist/wire/request.d.ts.map +1 -1
  148. package/dist/wire/request.js +41 -36
  149. package/dist/wire/request.js.map +1 -1
  150. package/package.json +1 -1
@@ -8,30 +8,70 @@
8
8
  * writes. See docs/spec/access-control.md § Delegation: principal and
9
9
  * subject.
10
10
  */
11
- import { checkAccess, groupRoleFromAssociations, isGroupRecord, isOwnerActingAlone, } from '../access.js';
11
+ import { groupRoleFromAssociations, isOwnerActingAlone, readCompanions, roleSatisfies, } from '../access.js';
12
+ import { inReach } from '../adapter/reach.js';
12
13
  import { StackError, StackNotFoundError, StackPermissionError } from '../errors.js';
13
14
  import { UNGRANTABLE_SYSTEM_TYPES, grantConveys, grantCoversGrantee, grantReach, } from '../grants.js';
14
- import { filtersContent } from '../query-validation.js';
15
+ import { filtersContent, splitQuery } from '../query-validation.js';
15
16
  import { baseIdOf, fileRefFields } from '../schema.js';
17
+ import { familyPolicy } from './family-policy.js';
16
18
  import { claimedFamilies, familyStanding, INSTALL_APP_LABEL, linkedIds } from '../install.js';
17
- import { findFirstMatch, loadGrantRecords, loadInstallRecords, queryAllPages, } from '../stack/reads.js';
19
+ import { findFirstMatch, loadGrantRecords, loadInstallRecords, loadRosterRoles, queryAllPages, } from '../stack/reads.js';
20
+ import { AuthoritySnapshot } from './authority-snapshot.js';
18
21
  import { SYSTEM_TYPES } from '../types/index.js';
22
+ /**
23
+ * How each side of a request reads a grant. The subject is the entity a
24
+ * grant is written about, so every tier counts; on the principal's side
25
+ * only a grant naming it directly counts. See
26
+ * docs/spec/access-control.md § Delegation: principal and subject.
27
+ */
28
+ const SUBJECT_SIDE = { allowDefault: true, allowGroup: true };
29
+ const PRINCIPAL_SIDE = { allowDefault: false, allowGroup: false };
30
+ /**
31
+ * What each verb is granted by: the grant action reaching a family whole,
32
+ * the one reaching the subject's own Records in it, and the permission bit
33
+ * reaching one Record. See docs/spec/access-control.md § Reach.
34
+ */
35
+ const VERBS = {
36
+ create: { any: 'create' },
37
+ read: { any: 'read-any', own: 'read-own', bit: 'read' },
38
+ update: { any: 'update-any', own: 'update-own', bit: 'write' },
39
+ delete: { any: 'delete-any', own: 'delete-own', bit: 'write' },
40
+ };
41
+ const ANYONE = { kind: 'anyone', label: 'read' };
19
42
  export class ScopeAuthority {
20
43
  stack;
21
44
  principalId;
22
45
  subjectId;
46
+ queryReadable;
23
47
  constructor(stack,
24
48
  /** Whose grants bound what this request may do — see ScopedStack.principalId. */
25
49
  principalId,
26
50
  /** Whom this request acts for and attributes writes to — see ScopedStack.subjectId. */
27
- subjectId) {
51
+ subjectId,
52
+ /** Stack.query() within a reach — see ScopedStack.query(). */
53
+ queryReadable) {
28
54
  this.stack = stack;
29
55
  this.principalId = principalId;
30
56
  this.subjectId = subjectId;
57
+ this.queryReadable = queryReadable;
58
+ }
59
+ /**
60
+ * The authority this request acts with, for one operation: pass it to
61
+ * each check the operation makes, so the grants, the rosters and each
62
+ * verb's reach are read at most once. An anonymous request is named by no
63
+ * grant and held by no roster, so it reads neither.
64
+ */
65
+ snapshot() {
66
+ const subject = this.subjectId;
67
+ return new AuthoritySnapshot({
68
+ grants: () => this.identified ? loadGrantRecords((q) => this.stack.query(q)) : Promise.resolve([]),
69
+ roles: () => subject === null
70
+ ? Promise.resolve(new Map())
71
+ : loadRosterRoles((q) => this.stack.query(q), subject),
72
+ reach: (verb, snapshot) => this.buildReach(verb, snapshot),
73
+ });
31
74
  }
32
- resolveRecord = (id) => this.stack.get(id, { includeDeleted: true });
33
- /** Every `_grant` Record — see loadGrantRecords(). */
34
- loadGrants = () => loadGrantRecords((q) => this.stack.query(q));
35
75
  /** Whether a delegated app is acting for someone other than itself. */
36
76
  get delegated() {
37
77
  return this.subjectId !== this.principalId;
@@ -68,105 +108,116 @@ export class ScopeAuthority {
68
108
  get ownerActingAlone() {
69
109
  return isOwnerActingAlone({ principalId: this.principalId, subjectId: this.subjectId }, this.stack.ownerEntityId);
70
110
  }
71
- /** Whether the record's own permissions let the subject `mode` it. */
72
- recordPermits(record, mode) {
73
- return checkAccess(record, this.subjectId, this.stack.ownerEntityId, mode, this.resolveRecord);
111
+ /**
112
+ * Whether no grant bounds the principal: undelegated, it is the subject
113
+ * itself, and the owner as principal is the owner's own software.
114
+ * See docs/spec/access-control.md § Delegation: principal and subject.
115
+ */
116
+ get principalUnbounded() {
117
+ return !this.delegated || this.principalId === this.stack.ownerEntityId;
74
118
  }
75
119
  /**
76
- * Whether `grantee` holds a _grant covering one of `actions` on the type's
77
- * family. The flags are fixed per side of a delegation and mean nothing
78
- * alone, so this is reached only through subjectAllows() and
79
- * principalHolds(). See docs/spec/access-control.md § Who a grant reaches.
120
+ * The families `grantee`'s grants convey one of `actions` on, read the way
121
+ * `side` reads a grant. Only the subject's side counts a group, so the
122
+ * rosters read are always the subject's.
123
+ * See docs/spec/access-control.md § Who a grant reaches.
80
124
  */
81
- async hasGrant(typeId, actions, opts) {
82
- const { grantee, record, prefetchedGrants, matchOwn = true, allowDefault = true, allowGroup = true, } = opts;
125
+ async familiesConveying(grantee, side, actions, snapshot) {
83
126
  if (!grantee)
84
- return false;
85
- // Absent when the caller has no operation-scoped map to share — one
86
- // call's worth of memoization, which is still every grant record in
87
- // this loop naming the same group.
88
- const groupRoles = opts.groupRoles ?? new Map();
89
- const familyId = baseIdOf(typeId);
90
- // grantType() refuses to write these, but a _grant record is an ordinary
91
- // Record: an unscoped Stack, an import, or a server mapping a request
92
- // body onto Stack can mint one anyway. Refusing at the point of use is
93
- // what makes the rule hold regardless of how the record got there.
94
- if (UNGRANTABLE_SYSTEM_TYPES.has(familyId))
95
- return false;
96
- let grantRecords;
97
- if (prefetchedGrants !== undefined) {
98
- grantRecords = prefetchedGrants;
99
- }
100
- else {
101
- // Cursor-walked to see grants past page one. A stored baseId is
102
- // judged by grantReach(), which refuses a versioned one.
103
- grantRecords = await this.loadGrants();
104
- }
105
- for (const r of grantRecords) {
127
+ return [];
128
+ const families = new Set();
129
+ for (const r of await snapshot.grants()) {
106
130
  const c = r.content;
131
+ // A stored baseId is judged by grantReach(), which refuses a
132
+ // versioned one.
107
133
  const reach = grantReach(c);
108
- if (!reach || reach.familyId !== familyId)
134
+ if (!reach || families.has(reach.familyId))
109
135
  continue;
110
- const covers = await grantCoversGrantee(c, grantee, {
111
- allowDefault,
112
- allowGroup,
113
- groupRoles,
114
- resolveRecord: this.resolveRecord,
115
- });
116
- if (!covers)
136
+ // grantType() refuses to write these, but a _grant record is an
137
+ // ordinary Record: an unscoped Stack, an import, or a server mapping
138
+ // a request body onto Stack can mint one anyway. Refusing at the
139
+ // point of use is what makes the rule hold regardless of how the
140
+ // record got there.
141
+ if (UNGRANTABLE_SYSTEM_TYPES.has(reach.familyId))
117
142
  continue;
118
- const matches = actions.some((action) => {
119
- if (!grantConveys(reach.actions, action))
120
- return false;
121
- if (matchOwn && action.endsWith('-own'))
122
- return record?.createdBy?.subjectId === grantee;
123
- return true;
124
- });
125
- if (matches)
126
- return true;
143
+ if (!actions.some((a) => grantConveys(reach.actions, a)))
144
+ continue;
145
+ if (await grantCoversGrantee(c, grantee, { ...side, roles: snapshot.roles })) {
146
+ families.add(reach.familyId);
147
+ }
127
148
  }
128
- return false;
149
+ return [...families];
129
150
  }
130
151
  /**
131
- * The principal half of a delegated request's authority, which bounds
132
- * what the subject's reaches so neither lends its reach to the other.
133
- * Vacuously true without delegation. Default and group grants do not
134
- * count — see docs/spec/access-control.md § Who a grant reaches.
152
+ * What this request may do with `verb` — that verb's rules, built whole
153
+ * even where a Record's own permissions would settle it, since every gate
154
+ * asks one value at a flat cost. The principal's grants fence it; within,
155
+ * the subject reaches what grants and permissions give it, an owner
156
+ * subject everything. See docs/spec/access-control.md § Reach.
135
157
  */
136
- principalAllows(typeId, actions, prefetchedGrants) {
137
- if (!this.delegated)
138
- return Promise.resolve(true);
139
- if (this.principalId === this.stack.ownerEntityId)
140
- return Promise.resolve(true);
141
- return this.principalHolds(typeId, actions, prefetchedGrants);
158
+ async buildReach(verb, snapshot) {
159
+ const { any, own, bit } = VERBS[verb];
160
+ const reach = this.principalUnbounded
161
+ ? {}
162
+ : {
163
+ fence: await this.familiesConveying(this.principalId, PRINCIPAL_SIDE, own ? [any, own] : [any], snapshot),
164
+ };
165
+ const subject = this.subjectId;
166
+ if (subject === this.stack.ownerEntityId)
167
+ return reach;
168
+ const families = (action) => this.familiesConveying(subject, SUBJECT_SIDE, [action], snapshot);
169
+ reach.within = {
170
+ baseIds: await families(any),
171
+ ...(subject !== null &&
172
+ own && { authored: { subjectId: subject, baseIds: await families(own) } }),
173
+ permissions: bit ? await this.elementSets(bit, snapshot) : [],
174
+ };
175
+ return reach;
142
176
  }
143
177
  /**
144
- * principalAllows() without its shortcuts: whether the principal itself
145
- * holds a grant naming it for these verbs, read the principal-side way.
146
- * Also what an installed app's own migration authority rests on — see
147
- * installMayMigrate().
178
+ * The permission elements carrying `bit` to the subject, as the sets a
179
+ * Record must hold whole. A `read` stands alone, as does `anyone`; a
180
+ * `write` stands beside one of its readCompanions().
148
181
  */
149
- principalHolds(typeId, actions, prefetchedGrants) {
150
- return this.hasGrant(typeId, actions, {
151
- grantee: this.principalId,
152
- prefetchedGrants,
153
- matchOwn: false,
154
- allowDefault: false,
155
- allowGroup: false,
182
+ async elementSets(bit, snapshot) {
183
+ const grantees = [];
184
+ const subject = this.subjectId;
185
+ if (subject !== null) {
186
+ grantees.push({ kind: 'entity', entityId: subject });
187
+ for (const [groupId, held] of await snapshot.roles()) {
188
+ for (const role of ['member', 'admin']) {
189
+ if (roleSatisfies(held, role))
190
+ grantees.push({ kind: 'group', groupId, role });
191
+ }
192
+ }
193
+ }
194
+ const element = (label, grantee) => ({
195
+ kind: 'permission',
196
+ label,
197
+ grantee,
156
198
  });
199
+ if (bit === 'read')
200
+ return [[ANYONE], ...grantees.map((g) => [element('read', g)])];
201
+ return grantees.flatMap((g) => readCompanions(g).map((c) => [element('write', g), c]));
202
+ }
203
+ /** Whether this request may `verb` the Record: its reach, asked of one Record. */
204
+ async may(verb, record, snapshot) {
205
+ return inReach(record, await snapshot.reach(verb));
157
206
  }
158
207
  /**
159
- * The subject half: which records are reachable, with `-own` matching and
160
- * default grants in force — the ordinary reading of a grant, since the
161
- * subject is the entity a grant is written about.
208
+ * may() with the principal's fence set aside — whether the subject alone
209
+ * reaches the Record, for a refusal that says which side lacked the verb.
162
210
  */
163
- subjectAllows(typeId, actions, opts = {}) {
164
- return this.hasGrant(typeId, actions, {
165
- grantee: this.subjectId,
166
- record: opts.record,
167
- prefetchedGrants: opts.prefetchedGrants,
168
- groupRoles: opts.groupRoles,
169
- });
211
+ async subjectMay(verb, record, snapshot) {
212
+ const { within } = await snapshot.reach(verb);
213
+ return inReach(record, within ? { within } : {});
214
+ }
215
+ canRead(record, snapshot) {
216
+ return this.may('read', record, snapshot);
217
+ }
218
+ /** Whether this request may create a Record of the type, asked of the Record it would make. */
219
+ canCreate(typeId, snapshot) {
220
+ return this.may('create', { typeId, createdBy: this.requester }, snapshot);
170
221
  }
171
222
  /**
172
223
  * How to refuse a record this request addressed by ID: a permission error
@@ -174,35 +225,11 @@ export class ScopeAuthority {
174
225
  * `message` only reaches someone holding the record already.
175
226
  * See docs/spec/disclosure.md § Which refusal a Record answers with.
176
227
  */
177
- async denialFor(record, message) {
178
- // Prefetched here rather than threaded down from the gate: a write
179
- // carried by a record-level permission settles without reading a grant
180
- // at all, and that path must not pay for this one. Both halves of
181
- // canRead share the one scan.
182
- const grants = this.identified ? await this.loadGrants() : undefined;
183
- if (await this.canRead(record, grants))
228
+ async denialFor(record, message, snapshot) {
229
+ if (await this.canRead(record, snapshot))
184
230
  return new StackPermissionError(message);
185
231
  return new StackNotFoundError(`Record not found: "${record.id}"`);
186
232
  }
187
- async canRead(record, prefetchedGrants, groupRoles) {
188
- const reachable = (await this.recordPermits(record, 'read')) ||
189
- (await this.subjectAllows(record.typeId, ['read-own', 'read-any'], {
190
- record,
191
- prefetchedGrants,
192
- groupRoles,
193
- }));
194
- if (!reachable)
195
- return false;
196
- return this.principalAllows(record.typeId, ['read-own', 'read-any'], prefetchedGrants);
197
- }
198
- async checkCreateGrant(typeId) {
199
- if (this.ownerActingAlone)
200
- return true;
201
- const reachable = this.subjectId === this.stack.ownerEntityId || (await this.subjectAllows(typeId, ['create']));
202
- if (!reachable)
203
- return false;
204
- return this.principalAllows(typeId, ['create']);
205
- }
206
233
  /**
207
234
  * `_group` records are managed, not merely written: only the owner or an
208
235
  * `admin` roster holder may mutate them — ordinary write permissions and
@@ -228,13 +255,13 @@ export class ScopeAuthority {
228
255
  * owner acting alone skips the lookup and leaves absence to `Stack`.
229
256
  * See docs/spec/access-control.md § Reference-creation gating.
230
257
  */
231
- async canReadReferent(recordId) {
258
+ async canReadReferent(recordId, snapshot) {
232
259
  if (this.ownerActingAlone)
233
260
  return true;
234
261
  const record = await this.stack.get(recordId, { includeDeleted: true });
235
262
  if (!record)
236
263
  return false;
237
- return this.canRead(record);
264
+ return this.canRead(record, snapshot);
238
265
  }
239
266
  /**
240
267
  * Whether this request can read some record referencing `fileId`, other
@@ -242,14 +269,12 @@ export class ScopeAuthority {
242
269
  * unlock unlimited further metadata records for the file.
243
270
  * See docs/spec/attachments.md § Creating `_attachment@1` records directly.
244
271
  */
245
- async hasReadableReference(fileId) {
246
- const prefetchedGrants = this.identified ? await this.loadGrants() : undefined;
247
- const groupRoles = new Map();
248
- const match = await findFirstMatch((q) => this.stack.query(q),
272
+ async hasReadableReference(fileId, snapshot) {
273
+ const reach = await snapshot.reach('read');
274
+ const match = await findFirstMatch((q) => this.queryReadable(splitQuery(q), reach),
249
275
  // Reach, not enumeration: a record readable by ID conveys the file it
250
276
  // references. See docs/spec/unlisted.md.
251
- { filter: { referencesFileId: fileId, includeUnlisted: true } }, (record) => baseIdOf(record.typeId) !== SYSTEM_TYPES.ATTACHMENT &&
252
- this.canRead(record, prefetchedGrants, groupRoles));
277
+ { filter: { referencesFileId: fileId, includeUnlisted: true } }, (record) => baseIdOf(record.typeId) !== SYSTEM_TYPES.ATTACHMENT);
253
278
  return match !== undefined;
254
279
  }
255
280
  /**
@@ -258,22 +283,22 @@ export class ScopeAuthority {
258
283
  * indistinguishable (both false), so no confirmation oracle for guessed
259
284
  * hashes. See docs/spec/access-control.md § Reference-creation gating.
260
285
  */
261
- async canAccessFile(fileId) {
286
+ async canAccessFile(fileId, snapshot) {
262
287
  if (this.ownerActingAlone)
263
288
  return true;
264
289
  // Reaching a file through a record this request can read is already
265
- // fully intersected — canRead() applied the principal's mask against
266
- // that record's own type, which is the type the reference lives on.
267
- if (await this.hasReadableReference(fileId))
290
+ // fully intersected — the reach fences that record's own type, which
291
+ // is the type the reference lives on.
292
+ if (await this.hasReadableReference(fileId, snapshot))
268
293
  return true;
269
294
  if (!this.subjectId)
270
295
  return false;
271
296
  // The remaining paths are authorship facts about the subject, so they
272
297
  // decide *which* files match — they are not themselves a grant, and the
273
298
  // principal still needs one of its own on the attachment type.
274
- if (!(await this.principalAllows(`${SYSTEM_TYPES.ATTACHMENT}@1`, ['read-own', 'read-any']))) {
299
+ const { fence } = await snapshot.reach('read');
300
+ if (fence && !fence.includes(SYSTEM_TYPES.ATTACHMENT))
275
301
  return false;
276
- }
277
302
  if (this.subjectId === this.stack.ownerEntityId)
278
303
  return true;
279
304
  // `includeUnlisted`, as hasReadableReference() above: withholding a
@@ -303,7 +328,7 @@ export class ScopeAuthority {
303
328
  * owner approved, holding `update-any` on each directly.
304
329
  * See docs/spec/apps.md § Migrating an installed app's types.
305
330
  */
306
- async installMayMigrate(record, toTypeId) {
331
+ async installMayMigrate(record, toTypeId, snapshot) {
307
332
  const principal = this.principalId;
308
333
  if (!principal || this.delegated)
309
334
  return false;
@@ -335,12 +360,10 @@ export class ScopeAuthority {
335
360
  }
336
361
  if (!linked)
337
362
  return false;
338
- const grants = await this.loadGrants();
339
- for (const family of families) {
340
- if (!(await this.principalHolds(`${family}@1`, ['update-any'], grants)))
341
- return false;
342
- }
343
- return true;
363
+ // Grants naming the app itself: an install reaches only families the
364
+ // owner named it to, whoever else holds them.
365
+ const held = await this.familiesConveying(principal, PRINCIPAL_SIDE, ['update-any'], snapshot);
366
+ return [...families].every((family) => held.includes(family));
344
367
  }
345
368
  /** Names of the type's top-level file-ref fields — the content-reference half of referencesFileId matching. */
346
369
  async fileRefFieldNames(typeId) {
@@ -354,7 +377,7 @@ export class ScopeAuthority {
354
377
  * See docs/spec/access-control.md § Delegation: principal and subject.
355
378
  */
356
379
  mayGrantAccess() {
357
- return !this.delegated || this.principalId === this.stack.ownerEntityId;
380
+ return this.principalUnbounded;
358
381
  }
359
382
  /**
360
383
  * Whether one identity, on its own, may decide who else reaches `record`
@@ -374,8 +397,9 @@ export class ScopeAuthority {
374
397
  * See docs/spec/access-control.md § Record-level permissions.
375
398
  */
376
399
  canReshare(record) {
377
- if (isGroupRecord(record))
400
+ if (familyPolicy(record.typeId).writers === 'group-managers') {
378
401
  return this.isGroupManager(record);
402
+ }
379
403
  if (!this.mayReshare(this.principalId, record))
380
404
  return false;
381
405
  return !this.delegated || this.mayReshare(this.subjectId, record);
@@ -1 +1 @@
1
- {"version":3,"file":"authority.js","sourceRoot":"","sources":["../../src/scoped-stack/authority.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authority.js","sourceRoot":"","sources":["../../src/scoped-stack/authority.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * System family policies
3
+ * -------------------------------------------------------
4
+ * The rules a system family holds a scoped writer to on top of the
5
+ * ordinary gates: who may write its Records at all, which content values
6
+ * are the owner's alone to set, and what a create must already be able to
7
+ * reach. One entry per family, read by every verb through the questions
8
+ * below, so a rule reaches each verb that writes what it governs — create,
9
+ * patchContent(), restoreVersion() and commitMigration() alike — rather
10
+ * than only the ones that remembered to ask it.
11
+ *
12
+ * A family with no entry is ordinary. Grants on a family are refused
13
+ * separately, at the write and at evaluation (UNGRANTABLE_SYSTEM_TYPES in
14
+ * grants.ts), since a grant is not a scoped write.
15
+ *
16
+ * See docs/spec/access-control.md § Per-verb gates.
17
+ */
18
+ import type { EntityId, TypeId } from '../types/index.js';
19
+ /**
20
+ * Who may write a Record of a family, whatever its own `permissions` and
21
+ * any grant say: anyone the ordinary write gate admits, the owner acting
22
+ * alone, or the Group's admins and the owner.
23
+ */
24
+ export type FamilyWriters = 'ordinary' | 'owner-alone' | 'group-managers';
25
+ type FamilyPolicy = {
26
+ writers: FamilyWriters;
27
+ /**
28
+ * Content fields only the owner acting alone may set, and when: `any`
29
+ * change, or only a value naming the owner's own DID.
30
+ */
31
+ ownerFields?: {
32
+ fields: readonly string[];
33
+ when: 'any' | 'owner-did';
34
+ message: string;
35
+ };
36
+ /**
37
+ * A content field naming a file a non-owner create must already be able
38
+ * to read through some other Record — see docs/spec/attachments.md
39
+ * § Creating `_attachment@1` records directly.
40
+ */
41
+ createNamesFile?: string;
42
+ /**
43
+ * Whether `relationship` associations are a roster naming Entities
44
+ * rather than references to readable Records, and so carry no
45
+ * reference gate — see docs/spec/access-control.md § Reference-creation gating.
46
+ */
47
+ rosterAssociations?: boolean;
48
+ };
49
+ /** The policy a Record of `typeId` is held to. */
50
+ export declare const familyPolicy: (typeId: TypeId) => FamilyPolicy;
51
+ /**
52
+ * The refusal a write owes when it moves content only the owner acting
53
+ * alone may set, or null when it moves none. Compared value-wise between
54
+ * `before` (absent at create) and `after`, so re-sending a value a Record
55
+ * already holds claims nothing.
56
+ */
57
+ export declare const ownerFieldRefusal: (typeId: TypeId, before: Record<string, unknown> | undefined, after: Record<string, unknown>, ownerEntityId: EntityId) => string | null;
58
+ export {};
59
+ //# sourceMappingURL=family-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"family-policy.d.ts","sourceRoot":"","sources":["../../src/scoped-stack/family-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,aAAa,GAAG,gBAAgB,CAAC;AAE1E,KAAK,YAAY,GAAG;IAClB,OAAO,EAAE,aAAa,CAAC;IACvB;;;OAGG;IACH,WAAW,CAAC,EAAE;QAAE,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,IAAI,EAAE,KAAK,GAAG,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACxF;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAoCF,kDAAkD;AAClD,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,YACF,CAAC;AAE7C;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,MAAM,EACd,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC3C,OAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,eAAe,QAAQ,KACtB,MAAM,GAAG,IAQX,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * System family policies
3
+ * -------------------------------------------------------
4
+ * The rules a system family holds a scoped writer to on top of the
5
+ * ordinary gates: who may write its Records at all, which content values
6
+ * are the owner's alone to set, and what a create must already be able to
7
+ * reach. One entry per family, read by every verb through the questions
8
+ * below, so a rule reaches each verb that writes what it governs — create,
9
+ * patchContent(), restoreVersion() and commitMigration() alike — rather
10
+ * than only the ones that remembered to ask it.
11
+ *
12
+ * A family with no entry is ordinary. Grants on a family are refused
13
+ * separately, at the write and at evaluation (UNGRANTABLE_SYSTEM_TYPES in
14
+ * grants.ts), since a grant is not a scoped write.
15
+ *
16
+ * See docs/spec/access-control.md § Per-verb gates.
17
+ */
18
+ import { baseIdOf } from '../schema.js';
19
+ import { bindingFieldsOf } from '../stack/identity-bindings.js';
20
+ import { SYSTEM_TYPES } from '../types/index.js';
21
+ const ORDINARY = { writers: 'ordinary' };
22
+ const POLICIES = new Map([
23
+ // Authority itself: see docs/spec/access-control.md § What a grant covers.
24
+ [SYSTEM_TYPES.GRANT, { writers: 'owner-alone' }],
25
+ [SYSTEM_TYPES.INSTALL, { writers: 'owner-alone' }],
26
+ // Managed, not merely written: see docs/spec/identity.md § Group.
27
+ [SYSTEM_TYPES.GROUP, { writers: 'group-managers', rosterAssociations: true }],
28
+ // See docs/spec/identity.md § DID bindings.
29
+ [
30
+ SYSTEM_TYPES.APP,
31
+ {
32
+ writers: 'ordinary',
33
+ ownerFields: {
34
+ fields: bindingFieldsOf(SYSTEM_TYPES.APP),
35
+ when: 'any',
36
+ message: 'Only the stack owner may set an _app record’s did or appId',
37
+ },
38
+ },
39
+ ],
40
+ [
41
+ SYSTEM_TYPES.ENTITY,
42
+ {
43
+ writers: 'ordinary',
44
+ ownerFields: {
45
+ fields: ['did'],
46
+ when: 'owner-did',
47
+ message: 'Only the stack owner may claim the owner’s own did',
48
+ },
49
+ },
50
+ ],
51
+ [SYSTEM_TYPES.ATTACHMENT, { writers: 'ordinary', createNamesFile: 'fileId' }],
52
+ ]);
53
+ /** The policy a Record of `typeId` is held to. */
54
+ export const familyPolicy = (typeId) => POLICIES.get(baseIdOf(typeId)) ?? ORDINARY;
55
+ /**
56
+ * The refusal a write owes when it moves content only the owner acting
57
+ * alone may set, or null when it moves none. Compared value-wise between
58
+ * `before` (absent at create) and `after`, so re-sending a value a Record
59
+ * already holds claims nothing.
60
+ */
61
+ export const ownerFieldRefusal = (typeId, before, after, ownerEntityId) => {
62
+ const rule = familyPolicy(typeId).ownerFields;
63
+ if (!rule)
64
+ return null;
65
+ const moved = rule.fields.some((field) => after[field] !== before?.[field] && (rule.when === 'any' || after[field] === ownerEntityId));
66
+ return moved ? rule.message : null;
67
+ };
68
+ //# sourceMappingURL=family-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"family-policy.js","sourceRoot":"","sources":["../../src/scoped-stack/family-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AA+BjD,MAAM,QAAQ,GAAiB,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AAEvD,MAAM,QAAQ,GAAsC,IAAI,GAAG,CAAuB;IAChF,2EAA2E;IAC3E,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IAChD,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IAClD,kEAAkE;IAClE,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAC7E,4CAA4C;IAC5C;QACE,YAAY,CAAC,GAAG;QAChB;YACE,OAAO,EAAE,UAAU;YACnB,WAAW,EAAE;gBACX,MAAM,EAAE,eAAe,CAAC,YAAY,CAAC,GAAG,CAAC;gBACzC,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,4DAA4D;aACtE;SACF;KACF;IACD;QACE,YAAY,CAAC,MAAM;QACnB;YACE,OAAO,EAAE,UAAU;YACnB,WAAW,EAAE;gBACX,MAAM,EAAE,CAAC,KAAK,CAAC;gBACf,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,oDAAoD;aAC9D;SACF;KACF;IACD,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;CAC9E,CAAC,CAAC;AAEH,kDAAkD;AAClD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAc,EAAgB,EAAE,CAC3D,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,QAAQ,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,MAAc,EACd,MAA2C,EAC3C,KAA8B,EAC9B,aAAuB,EACR,EAAE;IACjB,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC;IAC9C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAC5B,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,KAAK,CAAC,KAAK,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,aAAa,CAAC,CAC9F,CAAC;IACF,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACrC,CAAC,CAAC"}