@haverstack/core 0.40.0 → 0.42.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 (287) hide show
  1. package/README.md +121 -59
  2. package/dist/access.d.ts +34 -36
  3. package/dist/access.d.ts.map +1 -1
  4. package/dist/access.js +65 -42
  5. package/dist/access.js.map +1 -1
  6. package/dist/{combine.d.ts → adapter/combine.d.ts} +8 -1
  7. package/dist/adapter/combine.d.ts.map +1 -0
  8. package/dist/{combine.js → adapter/combine.js} +7 -0
  9. package/dist/adapter/combine.js.map +1 -0
  10. package/dist/{adapter-entry.d.ts → adapter/index.d.ts} +6 -5
  11. package/dist/adapter/index.d.ts.map +1 -0
  12. package/dist/{adapter-entry.js → adapter/index.js} +5 -4
  13. package/dist/adapter/index.js.map +1 -0
  14. package/dist/{sort.d.ts → adapter/sort.d.ts} +20 -20
  15. package/dist/adapter/sort.d.ts.map +1 -0
  16. package/dist/{sort.js → adapter/sort.js} +37 -27
  17. package/dist/adapter/sort.js.map +1 -0
  18. package/dist/associations/identity.d.ts +93 -0
  19. package/dist/associations/identity.d.ts.map +1 -0
  20. package/dist/associations/identity.js +198 -0
  21. package/dist/associations/identity.js.map +1 -0
  22. package/dist/associations/validation.d.ts +90 -0
  23. package/dist/associations/validation.d.ts.map +1 -0
  24. package/dist/associations/validation.js +339 -0
  25. package/dist/associations/validation.js.map +1 -0
  26. package/dist/attachment-records.d.ts +48 -0
  27. package/dist/attachment-records.d.ts.map +1 -0
  28. package/dist/attachment-records.js +52 -0
  29. package/dist/attachment-records.js.map +1 -0
  30. package/dist/collection.d.ts +182 -0
  31. package/dist/collection.d.ts.map +1 -0
  32. package/dist/collection.js +407 -0
  33. package/dist/collection.js.map +1 -0
  34. package/dist/content-match.d.ts +25 -0
  35. package/dist/content-match.d.ts.map +1 -0
  36. package/dist/content-match.js +51 -0
  37. package/dist/content-match.js.map +1 -0
  38. package/dist/content-translation.d.ts +42 -0
  39. package/dist/content-translation.d.ts.map +1 -0
  40. package/dist/content-translation.js +108 -0
  41. package/dist/content-translation.js.map +1 -0
  42. package/dist/did/did.d.ts.map +1 -0
  43. package/dist/{did.js → did/did.js} +3 -4
  44. package/dist/did/did.js.map +1 -0
  45. package/dist/{did-entry.d.ts → did/index.d.ts} +1 -1
  46. package/dist/did/index.d.ts.map +1 -0
  47. package/dist/{did-entry.js → did/index.js} +3 -3
  48. package/dist/did/index.js.map +1 -0
  49. package/dist/errors.d.ts +36 -63
  50. package/dist/errors.d.ts.map +1 -1
  51. package/dist/errors.js +35 -58
  52. package/dist/errors.js.map +1 -1
  53. package/dist/grants.d.ts +20 -43
  54. package/dist/grants.d.ts.map +1 -1
  55. package/dist/grants.js +71 -134
  56. package/dist/grants.js.map +1 -1
  57. package/dist/id.d.ts +13 -31
  58. package/dist/id.d.ts.map +1 -1
  59. package/dist/id.js +13 -31
  60. package/dist/id.js.map +1 -1
  61. package/dist/index.d.ts +14 -8
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +9 -5
  64. package/dist/index.js.map +1 -1
  65. package/dist/install.d.ts +141 -0
  66. package/dist/install.d.ts.map +1 -0
  67. package/dist/install.js +219 -0
  68. package/dist/install.js.map +1 -0
  69. package/dist/merge.d.ts.map +1 -1
  70. package/dist/merge.js +5 -11
  71. package/dist/merge.js.map +1 -1
  72. package/dist/migration-steps.d.ts +102 -0
  73. package/dist/migration-steps.d.ts.map +1 -0
  74. package/dist/migration-steps.js +293 -0
  75. package/dist/migration-steps.js.map +1 -0
  76. package/dist/query-validation.d.ts +28 -94
  77. package/dist/query-validation.d.ts.map +1 -1
  78. package/dist/query-validation.js +156 -336
  79. package/dist/query-validation.js.map +1 -1
  80. package/dist/record-changes.d.ts +2 -117
  81. package/dist/record-changes.d.ts.map +1 -1
  82. package/dist/record-changes.js +10 -212
  83. package/dist/record-changes.js.map +1 -1
  84. package/dist/schema.d.ts +18 -7
  85. package/dist/schema.d.ts.map +1 -1
  86. package/dist/schema.js +59 -30
  87. package/dist/schema.js.map +1 -1
  88. package/dist/scoped-stack/authority.d.ts +156 -0
  89. package/dist/scoped-stack/authority.d.ts.map +1 -0
  90. package/dist/scoped-stack/authority.js +384 -0
  91. package/dist/scoped-stack/authority.js.map +1 -0
  92. package/dist/scoped-stack/scoped-stack.d.ts +338 -0
  93. package/dist/scoped-stack/scoped-stack.d.ts.map +1 -0
  94. package/dist/scoped-stack/scoped-stack.js +776 -0
  95. package/dist/scoped-stack/scoped-stack.js.map +1 -0
  96. package/dist/scoped-stack/subscription.d.ts +55 -0
  97. package/dist/scoped-stack/subscription.d.ts.map +1 -0
  98. package/dist/scoped-stack/subscription.js +110 -0
  99. package/dist/scoped-stack/subscription.js.map +1 -0
  100. package/dist/stack/attachments.d.ts +24 -0
  101. package/dist/stack/attachments.d.ts.map +1 -0
  102. package/dist/stack/attachments.js +113 -0
  103. package/dist/stack/attachments.js.map +1 -0
  104. package/dist/{changes.d.ts → stack/changes.d.ts} +29 -65
  105. package/dist/stack/changes.d.ts.map +1 -0
  106. package/dist/{changes.js → stack/changes.js} +32 -66
  107. package/dist/stack/changes.js.map +1 -0
  108. package/dist/stack/client.d.ts +271 -0
  109. package/dist/stack/client.d.ts.map +1 -0
  110. package/dist/stack/client.js +9 -0
  111. package/dist/stack/client.js.map +1 -0
  112. package/dist/stack/identity-bindings.d.ts.map +1 -0
  113. package/dist/{identity-bindings.js → stack/identity-bindings.js} +8 -14
  114. package/dist/stack/identity-bindings.js.map +1 -0
  115. package/dist/stack/install-app.d.ts +22 -0
  116. package/dist/stack/install-app.d.ts.map +1 -0
  117. package/dist/stack/install-app.js +260 -0
  118. package/dist/stack/install-app.js.map +1 -0
  119. package/dist/stack/integrity.d.ts +94 -0
  120. package/dist/stack/integrity.d.ts.map +1 -0
  121. package/dist/stack/integrity.js +268 -0
  122. package/dist/stack/integrity.js.map +1 -0
  123. package/dist/{limits.d.ts → stack/limits.d.ts} +2 -5
  124. package/dist/stack/limits.d.ts.map +1 -0
  125. package/dist/{limits.js → stack/limits.js} +3 -6
  126. package/dist/stack/limits.js.map +1 -0
  127. package/dist/stack/migrations.d.ts +59 -0
  128. package/dist/stack/migrations.d.ts.map +1 -0
  129. package/dist/stack/migrations.js +141 -0
  130. package/dist/stack/migrations.js.map +1 -0
  131. package/dist/{stack-reads.d.ts → stack/reads.d.ts} +33 -6
  132. package/dist/stack/reads.d.ts.map +1 -0
  133. package/dist/{stack-reads.js → stack/reads.js} +49 -7
  134. package/dist/stack/reads.js.map +1 -0
  135. package/dist/stack/record-id.d.ts +35 -0
  136. package/dist/stack/record-id.d.ts.map +1 -0
  137. package/dist/stack/record-id.js +82 -0
  138. package/dist/stack/record-id.js.map +1 -0
  139. package/dist/stack/stack.d.ts +438 -0
  140. package/dist/stack/stack.d.ts.map +1 -0
  141. package/dist/stack/stack.js +1366 -0
  142. package/dist/stack/stack.js.map +1 -0
  143. package/dist/stack/system-types.d.ts +16 -0
  144. package/dist/stack/system-types.d.ts.map +1 -0
  145. package/dist/stack/system-types.js +111 -0
  146. package/dist/stack/system-types.js.map +1 -0
  147. package/dist/stack/type-grants.d.ts +20 -0
  148. package/dist/stack/type-grants.d.ts.map +1 -0
  149. package/dist/stack/type-grants.js +69 -0
  150. package/dist/stack/type-grants.js.map +1 -0
  151. package/dist/stack/write-expectation.d.ts +78 -0
  152. package/dist/stack/write-expectation.d.ts.map +1 -0
  153. package/dist/stack/write-expectation.js +71 -0
  154. package/dist/stack/write-expectation.js.map +1 -0
  155. package/dist/testing.d.ts +21 -26
  156. package/dist/testing.d.ts.map +1 -1
  157. package/dist/testing.js +50 -70
  158. package/dist/testing.js.map +1 -1
  159. package/dist/type-handle.d.ts +67 -78
  160. package/dist/type-handle.d.ts.map +1 -1
  161. package/dist/type-handle.js +44 -111
  162. package/dist/type-handle.js.map +1 -1
  163. package/dist/types/adapter.d.ts +223 -0
  164. package/dist/types/adapter.d.ts.map +1 -0
  165. package/dist/types/adapter.js +5 -0
  166. package/dist/types/adapter.js.map +1 -0
  167. package/dist/types/associations.d.ts +156 -0
  168. package/dist/types/associations.d.ts.map +1 -0
  169. package/dist/types/associations.js +13 -0
  170. package/dist/types/associations.js.map +1 -0
  171. package/dist/types/capabilities.d.ts +89 -0
  172. package/dist/types/capabilities.d.ts.map +1 -0
  173. package/dist/types/capabilities.js +5 -0
  174. package/dist/types/capabilities.js.map +1 -0
  175. package/dist/types/events.d.ts +155 -0
  176. package/dist/types/events.d.ts.map +1 -0
  177. package/dist/types/events.js +5 -0
  178. package/dist/types/events.js.map +1 -0
  179. package/dist/types/ids.d.ts +43 -0
  180. package/dist/types/ids.d.ts.map +1 -0
  181. package/dist/types/ids.js +5 -0
  182. package/dist/types/ids.js.map +1 -0
  183. package/dist/types/index.d.ts +19 -0
  184. package/dist/types/index.d.ts.map +1 -0
  185. package/dist/types/index.js +19 -0
  186. package/dist/types/index.js.map +1 -0
  187. package/dist/types/journal.d.ts +47 -0
  188. package/dist/types/journal.d.ts.map +1 -0
  189. package/dist/types/journal.js +5 -0
  190. package/dist/types/journal.js.map +1 -0
  191. package/dist/types/query.d.ts +185 -0
  192. package/dist/types/query.d.ts.map +1 -0
  193. package/dist/types/query.js +10 -0
  194. package/dist/types/query.js.map +1 -0
  195. package/dist/types/records.d.ts +76 -0
  196. package/dist/types/records.d.ts.map +1 -0
  197. package/dist/types/records.js +5 -0
  198. package/dist/types/records.js.map +1 -0
  199. package/dist/types/schema.d.ts +74 -0
  200. package/dist/types/schema.d.ts.map +1 -0
  201. package/dist/types/schema.js +5 -0
  202. package/dist/types/schema.js.map +1 -0
  203. package/dist/types/system.d.ts +161 -0
  204. package/dist/types/system.d.ts.map +1 -0
  205. package/dist/types/system.js +32 -0
  206. package/dist/types/system.js.map +1 -0
  207. package/dist/types/tokens.d.ts +39 -0
  208. package/dist/types/tokens.d.ts.map +1 -0
  209. package/dist/types/tokens.js +5 -0
  210. package/dist/types/tokens.js.map +1 -0
  211. package/dist/validate.d.ts +29 -70
  212. package/dist/validate.d.ts.map +1 -1
  213. package/dist/validate.js +65 -97
  214. package/dist/validate.js.map +1 -1
  215. package/dist/{attachment-download.d.ts → wire/attachment-download.d.ts} +0 -57
  216. package/dist/wire/attachment-download.d.ts.map +1 -0
  217. package/dist/{attachment-download.js → wire/attachment-download.js} +0 -61
  218. package/dist/wire/attachment-download.js.map +1 -0
  219. package/dist/{auth.d.ts → wire/auth.d.ts} +5 -8
  220. package/dist/wire/auth.d.ts.map +1 -0
  221. package/dist/{auth.js → wire/auth.js} +5 -8
  222. package/dist/wire/auth.js.map +1 -0
  223. package/dist/{wire-body.d.ts → wire/body.d.ts} +13 -5
  224. package/dist/wire/body.d.ts.map +1 -0
  225. package/dist/{wire-body.js → wire/body.js} +65 -7
  226. package/dist/wire/body.js.map +1 -0
  227. package/dist/{wire-entry.d.ts → wire/index.d.ts} +12 -12
  228. package/dist/wire/index.d.ts.map +1 -0
  229. package/dist/{wire-entry.js → wire/index.js} +13 -17
  230. package/dist/wire/index.js.map +1 -0
  231. package/dist/{wire-record.d.ts → wire/record.d.ts} +10 -22
  232. package/dist/wire/record.d.ts.map +1 -0
  233. package/dist/{wire-record.js → wire/record.js} +12 -24
  234. package/dist/wire/record.js.map +1 -0
  235. package/dist/{wire-request.d.ts → wire/request.d.ts} +20 -37
  236. package/dist/wire/request.d.ts.map +1 -0
  237. package/dist/{wire-request.js → wire/request.js} +79 -54
  238. package/dist/wire/request.js.map +1 -0
  239. package/package.json +7 -7
  240. package/dist/adapter-entry.d.ts.map +0 -1
  241. package/dist/adapter-entry.js.map +0 -1
  242. package/dist/attachment-download.d.ts.map +0 -1
  243. package/dist/attachment-download.js.map +0 -1
  244. package/dist/auth.d.ts.map +0 -1
  245. package/dist/auth.js.map +0 -1
  246. package/dist/changes.d.ts.map +0 -1
  247. package/dist/changes.js.map +0 -1
  248. package/dist/combine.d.ts.map +0 -1
  249. package/dist/combine.js.map +0 -1
  250. package/dist/did-entry.d.ts.map +0 -1
  251. package/dist/did-entry.js.map +0 -1
  252. package/dist/did.d.ts.map +0 -1
  253. package/dist/did.js.map +0 -1
  254. package/dist/identity-bindings.d.ts.map +0 -1
  255. package/dist/identity-bindings.js.map +0 -1
  256. package/dist/limits.d.ts.map +0 -1
  257. package/dist/limits.js.map +0 -1
  258. package/dist/record-id.d.ts +0 -70
  259. package/dist/record-id.d.ts.map +0 -1
  260. package/dist/record-id.js +0 -127
  261. package/dist/record-id.js.map +0 -1
  262. package/dist/scoped-stack.d.ts +0 -532
  263. package/dist/scoped-stack.d.ts.map +0 -1
  264. package/dist/scoped-stack.js +0 -1219
  265. package/dist/scoped-stack.js.map +0 -1
  266. package/dist/sort.d.ts.map +0 -1
  267. package/dist/sort.js.map +0 -1
  268. package/dist/stack-reads.d.ts.map +0 -1
  269. package/dist/stack-reads.js.map +0 -1
  270. package/dist/stack.d.ts +0 -971
  271. package/dist/stack.d.ts.map +0 -1
  272. package/dist/stack.js +0 -2012
  273. package/dist/stack.js.map +0 -1
  274. package/dist/types.d.ts +0 -1250
  275. package/dist/types.d.ts.map +0 -1
  276. package/dist/types.js +0 -49
  277. package/dist/types.js.map +0 -1
  278. package/dist/wire-body.d.ts.map +0 -1
  279. package/dist/wire-body.js.map +0 -1
  280. package/dist/wire-entry.d.ts.map +0 -1
  281. package/dist/wire-entry.js.map +0 -1
  282. package/dist/wire-record.d.ts.map +0 -1
  283. package/dist/wire-record.js.map +0 -1
  284. package/dist/wire-request.d.ts.map +0 -1
  285. package/dist/wire-request.js.map +0 -1
  286. /package/dist/{did.d.ts → did/did.d.ts} +0 -0
  287. /package/dist/{identity-bindings.d.ts → stack/identity-bindings.d.ts} +0 -0
@@ -0,0 +1,384 @@
1
+ /**
2
+ * Scope authority
3
+ * -------------------------------------------------------
4
+ * What one (principal, subject) pair may do, as questions with yes-or-no
5
+ * answers: may this request read the record, create this type, reshare,
6
+ * reach this file. ScopedStack turns the answers into refusals and
7
+ * forwards what passes to its Stack; nothing here throws a refusal or
8
+ * writes. See docs/spec/access-control.md § Delegation: principal and
9
+ * subject.
10
+ */
11
+ import { checkAccess, groupRoleFromAssociations, isGroupRecord, isOwnerActingAlone, } from '../access.js';
12
+ import { StackError, StackNotFoundError, StackPermissionError } from '../errors.js';
13
+ import { UNGRANTABLE_SYSTEM_TYPES, grantConveys, grantCoversGrantee, grantReach, } from '../grants.js';
14
+ import { filtersContent } from '../query-validation.js';
15
+ import { baseIdOf, fileRefFields } from '../schema.js';
16
+ import { claimedFamilies, familyStanding, INSTALL_APP_LABEL, linkedIds } from '../install.js';
17
+ import { findFirstMatch, loadGrantRecords, loadInstallRecords, queryAllPages, } from '../stack/reads.js';
18
+ import { SYSTEM_TYPES } from '../types/index.js';
19
+ export class ScopeAuthority {
20
+ stack;
21
+ principalId;
22
+ subjectId;
23
+ constructor(stack,
24
+ /** Whose grants bound what this request may do — see ScopedStack.principalId. */
25
+ principalId,
26
+ /** Whom this request acts for and attributes writes to — see ScopedStack.subjectId. */
27
+ subjectId) {
28
+ this.stack = stack;
29
+ this.principalId = principalId;
30
+ this.subjectId = subjectId;
31
+ }
32
+ resolveRecord = (id) => this.stack.get(id, { includeDeleted: true });
33
+ /** Every `_grant` Record — see loadGrantRecords(). */
34
+ loadGrants = () => loadGrantRecords((q) => this.stack.query(q));
35
+ /** Whether a delegated app is acting for someone other than itself. */
36
+ get delegated() {
37
+ return this.subjectId !== this.principalId;
38
+ }
39
+ /**
40
+ * Whether any grant could name this request — the one question every
41
+ * prefetch asks before scanning the `_grant` family, since an anonymous
42
+ * requester is reached by none. Both identities are read: `asEntity()`
43
+ * refuses an anonymous principal acting for a subject, so they are null
44
+ * together, and saying so costs nothing.
45
+ */
46
+ get identified() {
47
+ return this.principalId !== null || this.subjectId !== null;
48
+ }
49
+ /**
50
+ * Who this request is, for stamping onto whatever it mutates. Attribution
51
+ * follows record-level authorship: the subject is the actor, and the
52
+ * principal is named beside it only when the two differ.
53
+ * See docs/spec/data-model.md § Authorship and attribution.
54
+ */
55
+ get requester() {
56
+ if (this.subjectId === null)
57
+ return undefined;
58
+ return this.delegated && this.principalId !== null
59
+ ? { subjectId: this.subjectId, principalId: this.principalId }
60
+ : { subjectId: this.subjectId };
61
+ }
62
+ /**
63
+ * Whether unconditional owner authority applies — the owner acting as
64
+ * itself. The verbs resting on it are irreversible or disclose the sharing
65
+ * graph, so delegation never carries it, whichever side the owner is on.
66
+ * See docs/spec/access-control.md § Delegation: principal and subject.
67
+ */
68
+ get ownerActingAlone() {
69
+ return isOwnerActingAlone({ principalId: this.principalId, subjectId: this.subjectId }, this.stack.ownerEntityId);
70
+ }
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);
74
+ }
75
+ /**
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.
80
+ */
81
+ async hasGrant(typeId, actions, opts) {
82
+ const { grantee, record, prefetchedGrants, matchOwn = true, allowDefault = true, allowGroup = true, } = opts;
83
+ 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) {
106
+ const c = r.content;
107
+ const reach = grantReach(c);
108
+ if (!reach || reach.familyId !== familyId)
109
+ continue;
110
+ const covers = await grantCoversGrantee(c, grantee, {
111
+ allowDefault,
112
+ allowGroup,
113
+ groupRoles,
114
+ resolveRecord: this.resolveRecord,
115
+ });
116
+ if (!covers)
117
+ 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;
127
+ }
128
+ return false;
129
+ }
130
+ /**
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.
135
+ */
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);
142
+ }
143
+ /**
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().
148
+ */
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,
156
+ });
157
+ }
158
+ /**
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.
162
+ */
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
+ });
170
+ }
171
+ /**
172
+ * How to refuse a record this request addressed by ID: a permission error
173
+ * to a requester who can read it, the not-found answer to anyone else, so
174
+ * `message` only reaches someone holding the record already.
175
+ * See docs/spec/disclosure.md § Which refusal a Record answers with.
176
+ */
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))
184
+ return new StackPermissionError(message);
185
+ return new StackNotFoundError(`Record not found: "${record.id}"`);
186
+ }
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
+ /**
207
+ * `_group` records are managed, not merely written: only the owner or an
208
+ * `admin` roster holder may mutate them — ordinary write permissions and
209
+ * grants don't apply. Asked of both identities under delegation, like
210
+ * a reshare. See docs/spec/identity.md § Group.
211
+ */
212
+ isGroupManager(record) {
213
+ if (!this.managesGroup(this.principalId, record))
214
+ return false;
215
+ return !this.delegated || this.managesGroup(this.subjectId, record);
216
+ }
217
+ /** Whether one identity, on its own, manages `record` — see isGroupManager(). */
218
+ managesGroup(entityId, record) {
219
+ if (!entityId)
220
+ return false;
221
+ if (entityId === this.stack.ownerEntityId)
222
+ return true;
223
+ return groupRoleFromAssociations(record.associations, entityId) === 'admin';
224
+ }
225
+ /**
226
+ * Whether this request may reference `recordId` as a parent or target.
227
+ * Missing and unreadable are both false, so this probes nothing. The
228
+ * owner acting alone skips the lookup and leaves absence to `Stack`.
229
+ * See docs/spec/access-control.md § Reference-creation gating.
230
+ */
231
+ async canReadReferent(recordId) {
232
+ if (this.ownerActingAlone)
233
+ return true;
234
+ const record = await this.stack.get(recordId, { includeDeleted: true });
235
+ if (!record)
236
+ return false;
237
+ return this.canRead(record);
238
+ }
239
+ /**
240
+ * Whether this request can read some record referencing `fileId`, other
241
+ * than an `_attachment@1` record — otherwise one correct guess would
242
+ * unlock unlimited further metadata records for the file.
243
+ * See docs/spec/attachments.md § Creating `_attachment@1` records directly.
244
+ */
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),
249
+ // Reach, not enumeration: a record readable by ID conveys the file it
250
+ // 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));
253
+ return match !== undefined;
254
+ }
255
+ /**
256
+ * Whether this request may reference or download `fileId` — the dual of
257
+ * getAttachment()'s access rule. Nonexistent and inaccessible are
258
+ * indistinguishable (both false), so no confirmation oracle for guessed
259
+ * hashes. See docs/spec/access-control.md § Reference-creation gating.
260
+ */
261
+ async canAccessFile(fileId) {
262
+ if (this.ownerActingAlone)
263
+ return true;
264
+ // 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))
268
+ return true;
269
+ if (!this.subjectId)
270
+ return false;
271
+ // The remaining paths are authorship facts about the subject, so they
272
+ // decide *which* files match — they are not themselves a grant, and the
273
+ // principal still needs one of its own on the attachment type.
274
+ if (!(await this.principalAllows(`${SYSTEM_TYPES.ATTACHMENT}@1`, ['read-own', 'read-any']))) {
275
+ return false;
276
+ }
277
+ if (this.subjectId === this.stack.ownerEntityId)
278
+ return true;
279
+ // `includeUnlisted`, as hasReadableReference() above: withholding a
280
+ // record from enumeration decides nothing about what it conveys, and
281
+ // the uploader clause does not lapse. See docs/spec/unlisted.md.
282
+ return filtersContent(this.stack.capabilities)
283
+ ? (await this.stack.query({
284
+ filter: {
285
+ typeId: `${SYSTEM_TYPES.ATTACHMENT}@1`,
286
+ createdBy: { subjectId: this.subjectId },
287
+ content: { fileId },
288
+ includeUnlisted: true,
289
+ },
290
+ limit: 1,
291
+ })).records.length > 0
292
+ : (await queryAllPages((q) => this.stack.query(q), {
293
+ filter: {
294
+ typeId: `${SYSTEM_TYPES.ATTACHMENT}@1`,
295
+ createdBy: { subjectId: this.subjectId },
296
+ includeUnlisted: true,
297
+ },
298
+ })).some((r) => r.content.fileId === fileId);
299
+ }
300
+ /**
301
+ * Whether this request is an installed app, acting as itself, migrating
302
+ * `record` within families its one live install claims, to a version the
303
+ * owner approved, holding `update-any` on each directly.
304
+ * See docs/spec/apps.md § Migrating an installed app's types.
305
+ */
306
+ async installMayMigrate(record, toTypeId) {
307
+ const principal = this.principalId;
308
+ if (!principal || this.delegated)
309
+ return false;
310
+ const families = new Set([baseIdOf(record.typeId), baseIdOf(toTypeId)]);
311
+ const installs = await loadInstallRecords(this.stack);
312
+ let install;
313
+ for (const family of families) {
314
+ const claimants = installs.filter((r) => claimedFamilies(r.content).has(family));
315
+ if (claimants.length !== 1)
316
+ return false;
317
+ if (familyStanding(family, claimants[0].content.appId) !== 'own')
318
+ return false;
319
+ if (install && install.id !== claimants[0].id)
320
+ return false;
321
+ install = claimants[0];
322
+ }
323
+ if (!install || install.deletedAt)
324
+ return false;
325
+ if (!Array.isArray(install.content.defines) || !install.content.defines.includes(toTypeId)) {
326
+ return false;
327
+ }
328
+ let linked = false;
329
+ for (const cardId of linkedIds(install, INSTALL_APP_LABEL)) {
330
+ const card = await this.stack.get(cardId);
331
+ if (card && baseIdOf(card.typeId) === SYSTEM_TYPES.APP) {
332
+ if (card.content.did === principal)
333
+ linked = true;
334
+ }
335
+ }
336
+ if (!linked)
337
+ 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;
344
+ }
345
+ /** Names of the type's top-level file-ref fields — the content-reference half of referencesFileId matching. */
346
+ async fileRefFieldNames(typeId) {
347
+ const type = await this.stack.getType(typeId);
348
+ return type ? fileRefFields(type.schema) : [];
349
+ }
350
+ /**
351
+ * Whether this request may widen who reaches a record, at create time or
352
+ * after. A delegated app may not, unless the owner is its principal:
353
+ * widening access is what containment most needs to hold.
354
+ * See docs/spec/access-control.md § Delegation: principal and subject.
355
+ */
356
+ mayGrantAccess() {
357
+ return !this.delegated || this.principalId === this.stack.ownerEntityId;
358
+ }
359
+ /**
360
+ * Whether one identity, on its own, may decide who else reaches `record`
361
+ * — the owner-or-creator rule a reshare enforces, asked of one
362
+ * side at a time. See
363
+ * docs/spec/access-control.md § Delegation: principal and subject.
364
+ */
365
+ mayReshare(entityId, record) {
366
+ if (!entityId)
367
+ return false;
368
+ return entityId === this.stack.ownerEntityId || entityId === record.createdBy?.subjectId;
369
+ }
370
+ /**
371
+ * Whether this request may decide who else reaches `record`: management
372
+ * for a `_group`, so a demoted creator keeps no side door; otherwise the
373
+ * owner-or-author rule, asked of both sides of a delegation.
374
+ * See docs/spec/access-control.md § Record-level permissions.
375
+ */
376
+ canReshare(record) {
377
+ if (isGroupRecord(record))
378
+ return this.isGroupManager(record);
379
+ if (!this.mayReshare(this.principalId, record))
380
+ return false;
381
+ return !this.delegated || this.mayReshare(this.subjectId, record);
382
+ }
383
+ }
384
+ //# sourceMappingURL=authority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authority.js","sourceRoot":"","sources":["../../src/scoped-stack/authority.ts"],"names":[],"mappings":"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"}