@xemahq/contracts 0.76.0 → 0.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/.source-stamp.json +2 -2
- package/dist/authorization-module/index.d.ts +2 -0
- package/dist/authorization-module/index.d.ts.map +1 -1
- package/dist/authorization-module/index.js +2 -0
- package/dist/authorization-module/index.js.map +1 -1
- package/dist/authorization-module/lib/authorization-composition-error.d.ts +11 -0
- package/dist/authorization-module/lib/authorization-composition-error.d.ts.map +1 -1
- package/dist/authorization-module/lib/authorization-composition-error.js +16 -1
- package/dist/authorization-module/lib/authorization-composition-error.js.map +1 -1
- package/dist/authorization-module/lib/authorization-interface-requirements.d.ts +5 -1
- package/dist/authorization-module/lib/authorization-interface-requirements.d.ts.map +1 -1
- package/dist/authorization-module/lib/authorization-interface-requirements.js +1 -0
- package/dist/authorization-module/lib/authorization-interface-requirements.js.map +1 -1
- package/dist/authorization-module/lib/authorization-module-contribution.d.ts +24 -0
- package/dist/authorization-module/lib/authorization-module-contribution.d.ts.map +1 -1
- package/dist/authorization-module/lib/authorization-module-contribution.js +1 -0
- package/dist/authorization-module/lib/authorization-module-contribution.js.map +1 -1
- package/dist/authorization-module/lib/authorization-module-envelope.d.ts +11 -0
- package/dist/authorization-module/lib/authorization-module-envelope.d.ts.map +1 -1
- package/dist/authorization-module/lib/authorization-module-envelope.js +4 -0
- package/dist/authorization-module/lib/authorization-module-envelope.js.map +1 -1
- package/dist/authorization-module/lib/delegation-origination.d.ts +26 -0
- package/dist/authorization-module/lib/delegation-origination.d.ts.map +1 -0
- package/dist/authorization-module/lib/delegation-origination.js +43 -0
- package/dist/authorization-module/lib/delegation-origination.js.map +1 -0
- package/dist/authorization-module/lib/delegation-wildcard-ceiling.d.ts +6 -0
- package/dist/authorization-module/lib/delegation-wildcard-ceiling.d.ts.map +1 -0
- package/dist/authorization-module/lib/delegation-wildcard-ceiling.js +17 -0
- package/dist/authorization-module/lib/delegation-wildcard-ceiling.js.map +1 -0
- package/dist/authorization-module/lib/platform-authorization-modules.d.ts.map +1 -1
- package/dist/authorization-module/lib/platform-authorization-modules.js +10 -11
- package/dist/authorization-module/lib/platform-authorization-modules.js.map +1 -1
- package/dist/authorization-module/platform/xema_core.fga +76 -45
- package/dist/authorization-module/platform/xema_core.fga.yaml +522 -97
- package/dist/authorization-module/platform/xema_sharing.fga +48 -33
- package/dist/authorization-module/platform/xema_sharing.fga.yaml +555 -2
- package/dist/authorization-module/server/authorization-interface-conformance.d.ts +1 -0
- package/dist/authorization-module/server/authorization-interface-conformance.d.ts.map +1 -1
- package/dist/authorization-module/server/authorization-interface-conformance.js +13 -1
- package/dist/authorization-module/server/authorization-interface-conformance.js.map +1 -1
- package/dist/authorization-module/server/compose-authorization-base.d.ts +2 -0
- package/dist/authorization-module/server/compose-authorization-base.d.ts.map +1 -1
- package/dist/authorization-module/server/compose-authorization-base.js +15 -2
- package/dist/authorization-module/server/compose-authorization-base.js.map +1 -1
- package/dist/authorization-module/server/delegation-origination-conformance.d.ts +15 -0
- package/dist/authorization-module/server/delegation-origination-conformance.d.ts.map +1 -0
- package/dist/authorization-module/server/delegation-origination-conformance.js +92 -0
- package/dist/authorization-module/server/delegation-origination-conformance.js.map +1 -0
- package/dist/authorization-module/server/userset-subject-types.d.ts +3 -0
- package/dist/authorization-module/server/userset-subject-types.d.ts.map +1 -0
- package/dist/authorization-module/server/userset-subject-types.js +65 -0
- package/dist/authorization-module/server/userset-subject-types.js.map +1 -0
- package/dist/authzen/index.d.ts +1 -0
- package/dist/authzen/index.d.ts.map +1 -1
- package/dist/authzen/index.js +1 -0
- package/dist/authzen/index.js.map +1 -1
- package/dist/authzen/lib/durable-delegation-model.d.ts +33 -11
- package/dist/authzen/lib/durable-delegation-model.d.ts.map +1 -1
- package/dist/authzen/lib/durable-delegation-model.js +54 -16
- package/dist/authzen/lib/durable-delegation-model.js.map +1 -1
- package/dist/authzen/lib/xema-membership.d.ts +6 -0
- package/dist/authzen/lib/xema-membership.d.ts.map +1 -0
- package/dist/authzen/lib/xema-membership.js +16 -0
- package/dist/authzen/lib/xema-membership.js.map +1 -0
- package/dist/biome-dependency/lib/peer-seam-table.d.ts +1 -0
- package/dist/biome-dependency/lib/peer-seam-table.d.ts.map +1 -1
- package/dist/biome-dependency/lib/peer-seam-table.js +2 -1
- package/dist/biome-dependency/lib/peer-seam-table.js.map +1 -1
- package/dist/deployment/lib/resolved-deployment.d.ts +29 -4
- package/dist/deployment/lib/resolved-deployment.d.ts.map +1 -1
- package/dist/deployment/lib/resolved-deployment.js +57 -17
- package/dist/deployment/lib/resolved-deployment.js.map +1 -1
- package/dist/distribution/index.d.ts +5 -1
- package/dist/distribution/index.d.ts.map +1 -1
- package/dist/distribution/index.js +6 -0
- package/dist/distribution/index.js.map +1 -1
- package/dist/distribution/lib/authorization-lock.d.ts +16 -0
- package/dist/distribution/lib/authorization-lock.d.ts.map +1 -0
- package/dist/distribution/lib/authorization-lock.js +34 -0
- package/dist/distribution/lib/authorization-lock.js.map +1 -0
- package/dist/distribution/lib/customer-edition-definition.d.ts +10 -1
- package/dist/distribution/lib/customer-edition-definition.d.ts.map +1 -1
- package/dist/distribution/lib/customer-edition-definition.js +53 -2
- package/dist/distribution/lib/customer-edition-definition.js.map +1 -1
- package/dist/distribution/lib/delivered-biome.d.ts +2 -2
- package/dist/distribution/lib/delivered-biome.d.ts.map +1 -1
- package/dist/distribution/lib/delivered-biome.js.map +1 -1
- package/dist/distribution/lib/distribution-lock.d.ts +2 -1
- package/dist/distribution/lib/distribution-lock.d.ts.map +1 -1
- package/dist/distribution/lib/distribution-lock.js +24 -0
- package/dist/distribution/lib/distribution-lock.js.map +1 -1
- package/dist/distribution/lib/image-producer-evidence.d.ts +86 -14
- package/dist/distribution/lib/image-producer-evidence.d.ts.map +1 -1
- package/dist/distribution/lib/image-producer-evidence.js +72 -12
- package/dist/distribution/lib/image-producer-evidence.js.map +1 -1
- package/dist/distribution/lib/kernel-contract-authority.d.ts +1 -0
- package/dist/distribution/lib/kernel-contract-authority.d.ts.map +1 -1
- package/dist/distribution/lib/kernel-contract-authority.js +6 -2
- package/dist/distribution/lib/kernel-contract-authority.js.map +1 -1
- package/dist/distribution/lib/kernel-contract-source-paths.d.ts +1 -1
- package/dist/distribution/lib/kernel-contract-source-paths.d.ts.map +1 -1
- package/dist/distribution/lib/kernel-contract-source-paths.js +9 -0
- package/dist/distribution/lib/kernel-contract-source-paths.js.map +1 -1
- package/dist/distribution/lib/nexus-endpoint-specs.d.ts +2 -2
- package/dist/distribution/lib/nexus-endpoint-specs.d.ts.map +1 -1
- package/dist/distribution/lib/nexus-endpoint-specs.js.map +1 -1
- package/dist/distribution/lib/resolve-unsplit-deployment.d.ts +16 -0
- package/dist/distribution/lib/resolve-unsplit-deployment.d.ts.map +1 -0
- package/dist/distribution/lib/resolve-unsplit-deployment.js +48 -0
- package/dist/distribution/lib/resolve-unsplit-deployment.js.map +1 -0
- package/dist/distribution/lib/runtime-image-source-index.d.ts +18 -1
- package/dist/distribution/lib/runtime-image-source-index.d.ts.map +1 -1
- package/dist/distribution/lib/runtime-image-source-index.js +38 -2
- package/dist/distribution/lib/runtime-image-source-index.js.map +1 -1
- package/dist/distribution/lib/verified-resolved-deployment.d.ts +12 -2
- package/dist/distribution/lib/verified-resolved-deployment.d.ts.map +1 -1
- package/dist/distribution/lib/verify-delivered-locks.d.ts +41 -0
- package/dist/distribution/lib/verify-delivered-locks.d.ts.map +1 -0
- package/dist/distribution/lib/verify-delivered-locks.js +76 -0
- package/dist/distribution/lib/verify-delivered-locks.js.map +1 -0
- package/dist/distribution/lib/verify-resolved-deployment.d.ts +27 -7
- package/dist/distribution/lib/verify-resolved-deployment.d.ts.map +1 -1
- package/dist/distribution/lib/verify-resolved-deployment.js +61 -4
- package/dist/distribution/lib/verify-resolved-deployment.js.map +1 -1
- package/dist/distribution/server/index.d.ts +8 -0
- package/dist/distribution/server/index.d.ts.map +1 -0
- package/dist/distribution/server/index.js +34 -0
- package/dist/distribution/server/index.js.map +1 -0
- package/dist/edition-protocol/edition-contract.schema.json +1 -1
- package/dist/edition-protocol/edition-protocol.json +1 -1
- package/dist/edition-protocol/lib/edition-protocol.d.ts +2 -1
- package/dist/edition-protocol/lib/edition-protocol.d.ts.map +1 -1
- package/dist/edition-protocol/lib/edition-protocol.js +4 -2
- package/dist/edition-protocol/lib/edition-protocol.js.map +1 -1
- package/dist/redis-key/index.d.ts +1 -0
- package/dist/redis-key/index.d.ts.map +1 -1
- package/dist/redis-key/index.js +1 -0
- package/dist/redis-key/index.js.map +1 -1
- package/dist/redis-key/lib/deployment-acl-policy.d.ts.map +1 -1
- package/dist/redis-key/lib/deployment-acl-policy.js +1 -0
- package/dist/redis-key/lib/deployment-acl-policy.js.map +1 -1
- package/dist/redis-key/lib/erasure-request.d.ts +6 -0
- package/dist/redis-key/lib/erasure-request.d.ts.map +1 -0
- package/dist/redis-key/lib/erasure-request.js +75 -0
- package/dist/redis-key/lib/erasure-request.js.map +1 -0
- package/dist/redis-key/lib/lease-acl-policy.d.ts.map +1 -1
- package/dist/redis-key/lib/lease-acl-policy.js +2 -0
- package/dist/redis-key/lib/lease-acl-policy.js.map +1 -1
- package/dist/resolved-deployment-fixture/lib/resolved-deployment-fixture.d.ts +4 -1
- package/dist/resolved-deployment-fixture/lib/resolved-deployment-fixture.d.ts.map +1 -1
- package/dist/resolved-deployment-fixture/lib/resolved-deployment-fixture.js +80 -1
- package/dist/resolved-deployment-fixture/lib/resolved-deployment-fixture.js.map +1 -1
- package/dist/service-registry/lib/on-behalf-descriptor.d.ts.map +1 -1
- package/dist/service-registry/lib/on-behalf-descriptor.js.map +1 -1
- package/dist/service-registry/lib/service-descriptor.d.ts +6 -0
- package/dist/service-registry/lib/service-descriptor.d.ts.map +1 -1
- package/dist/service-registry/lib/service-descriptor.js +16 -1
- package/dist/service-registry/lib/service-descriptor.js.map +1 -1
- package/package.json +5 -2
|
@@ -8,10 +8,18 @@ tuples:
|
|
|
8
8
|
- user: org:org1
|
|
9
9
|
relation: parent
|
|
10
10
|
object: project:org1|p1
|
|
11
|
+
# bob and pat hold MEMBERSHIPS; the project grants bind to the membership
|
|
12
|
+
# instance (`membership#holder`), never to the user.
|
|
11
13
|
- user: user:bob
|
|
14
|
+
relation: holder
|
|
15
|
+
object: membership:org1|mbob
|
|
16
|
+
- user: user:pat
|
|
17
|
+
relation: holder
|
|
18
|
+
object: membership:org1|mpat
|
|
19
|
+
- user: membership:org1|mbob#holder
|
|
12
20
|
relation: viewer
|
|
13
21
|
object: project:org1|p1
|
|
14
|
-
- user:
|
|
22
|
+
- user: membership:org1|mpat#holder
|
|
15
23
|
relation: editor
|
|
16
24
|
object: project:org1|p1
|
|
17
25
|
- user: user:dave
|
|
@@ -35,22 +43,33 @@ tuples:
|
|
|
35
43
|
relation: parent
|
|
36
44
|
object: xema_artifact:org1|a2
|
|
37
45
|
- user: user:carol
|
|
46
|
+
relation: holder
|
|
47
|
+
object: membership:org1|mcarol
|
|
48
|
+
# An org-scoped OWNER is a membership instance, never a user.
|
|
49
|
+
- user: membership:org1|mcarol#holder
|
|
38
50
|
relation: owner
|
|
39
51
|
object: xema_artifact:org1|a2
|
|
40
52
|
- user: project:org1|p1
|
|
41
53
|
relation: parent
|
|
42
54
|
object: xema_session:org1|s1
|
|
43
55
|
- user: user:erin
|
|
56
|
+
relation: holder
|
|
57
|
+
object: membership:org1|merin
|
|
58
|
+
- user: membership:org1|merin#holder
|
|
44
59
|
relation: participant
|
|
45
60
|
object: xema_session:org1|s1
|
|
46
61
|
- user: xema_session:org1|s1
|
|
47
62
|
relation: parent
|
|
48
63
|
object: xema_artifact:org1|a3
|
|
49
|
-
# An ORG-OWNED session: owner is the organization,
|
|
50
|
-
# (containment only), with no
|
|
64
|
+
# An ORG-OWNED session: owner is the organization, its owning space is the
|
|
65
|
+
# org (`owner_org`), ANCHORED to the project (containment only), with no
|
|
66
|
+
# parent and no participant.
|
|
51
67
|
- user: organization:org1
|
|
52
68
|
relation: owner
|
|
53
69
|
object: xema_session:org1|s2
|
|
70
|
+
- user: org:org1
|
|
71
|
+
relation: owner_org
|
|
72
|
+
object: xema_session:org1|s2
|
|
54
73
|
- user: project:org1|p1
|
|
55
74
|
relation: anchor
|
|
56
75
|
object: xema_session:org1|s2
|
|
@@ -137,13 +156,22 @@ tests:
|
|
|
137
156
|
assertions:
|
|
138
157
|
can_read: true
|
|
139
158
|
can_write: false
|
|
140
|
-
- name: an org-owned session
|
|
159
|
+
- name: an org-owned session is managed by its owning org's admins and no one else; nobody acts in it
|
|
141
160
|
check:
|
|
142
161
|
- user: user:root
|
|
143
162
|
object: xema_session:org1|s2
|
|
144
163
|
assertions:
|
|
145
|
-
can_read:
|
|
146
|
-
can_write:
|
|
164
|
+
can_read: true
|
|
165
|
+
can_write: true
|
|
166
|
+
xema_write: true
|
|
167
|
+
xema_admin: true
|
|
168
|
+
can_act: false
|
|
169
|
+
# the org OWNER is an org admin by the model
|
|
170
|
+
- user: user:own
|
|
171
|
+
object: xema_session:org1|s2
|
|
172
|
+
assertions:
|
|
173
|
+
xema_admin: true
|
|
174
|
+
can_act: false
|
|
147
175
|
- user: user:bob
|
|
148
176
|
object: xema_session:org1|s2
|
|
149
177
|
assertions:
|
|
@@ -152,11 +180,12 @@ tests:
|
|
|
152
180
|
object: xema_session:org1|s2
|
|
153
181
|
assertions:
|
|
154
182
|
can_read: false
|
|
183
|
+
# management reaches the session's artifacts through their parent
|
|
155
184
|
- user: user:root
|
|
156
185
|
object: xema_artifact:org1|a4
|
|
157
186
|
assertions:
|
|
158
|
-
can_read:
|
|
159
|
-
can_delete:
|
|
187
|
+
can_read: true
|
|
188
|
+
can_delete: true
|
|
160
189
|
- user: user:bob
|
|
161
190
|
object: xema_artifact:org1|a4
|
|
162
191
|
assertions:
|
|
@@ -169,12 +198,18 @@ tests:
|
|
|
169
198
|
relation: parent
|
|
170
199
|
object: xema_session:org1|s5
|
|
171
200
|
- user: user:olga
|
|
201
|
+
relation: holder
|
|
202
|
+
object: membership:org1|molga
|
|
203
|
+
- user: membership:org1|molga#holder
|
|
172
204
|
relation: owner
|
|
173
205
|
object: xema_session:org1|s5
|
|
174
206
|
- user: user:ed
|
|
207
|
+
relation: holder
|
|
208
|
+
object: membership:org1|med
|
|
209
|
+
- user: membership:org1|med#holder
|
|
175
210
|
relation: editor
|
|
176
211
|
object: xema_session:org1|s5
|
|
177
|
-
- user:
|
|
212
|
+
- user: membership:org1|merin#holder
|
|
178
213
|
relation: participant
|
|
179
214
|
object: xema_session:org1|s5
|
|
180
215
|
check:
|
|
@@ -240,6 +275,9 @@ tests:
|
|
|
240
275
|
- name: a session without a parent tuple grants parent readers, parent writers and org admins nothing
|
|
241
276
|
tuples:
|
|
242
277
|
- user: user:olga
|
|
278
|
+
relation: holder
|
|
279
|
+
object: membership:org1|molga
|
|
280
|
+
- user: membership:org1|molga#holder
|
|
243
281
|
relation: owner
|
|
244
282
|
object: xema_session:org1|s6
|
|
245
283
|
check:
|
|
@@ -273,6 +311,126 @@ tests:
|
|
|
273
311
|
can_read: true
|
|
274
312
|
can_act: true
|
|
275
313
|
can_write: true
|
|
314
|
+
# Owner rule 10-09: authority follows the OWNING SPACE. An org-owned
|
|
315
|
+
# session keeps its org admins' management after the human who launched or
|
|
316
|
+
# edited it leaves; a user-owned session gives org admins nothing implicit.
|
|
317
|
+
- name: org-owned session management survives the departure of its human editor; the departed editor gets nothing
|
|
318
|
+
tuples:
|
|
319
|
+
- user: organization:org1
|
|
320
|
+
relation: owner
|
|
321
|
+
object: xema_session:org1|so1
|
|
322
|
+
- user: org:org1
|
|
323
|
+
relation: owner_org
|
|
324
|
+
object: xema_session:org1|so1
|
|
325
|
+
# kim was the invited editor; she LEFT, so her holder tuple is gone
|
|
326
|
+
- user: membership:org1|mkim#holder
|
|
327
|
+
relation: editor
|
|
328
|
+
object: xema_session:org1|so1
|
|
329
|
+
check:
|
|
330
|
+
- user: user:root
|
|
331
|
+
object: xema_session:org1|so1
|
|
332
|
+
assertions:
|
|
333
|
+
can_read: true
|
|
334
|
+
can_write: true
|
|
335
|
+
xema_write: true
|
|
336
|
+
xema_admin: true
|
|
337
|
+
can_act: false
|
|
338
|
+
- user: user:kim
|
|
339
|
+
object: xema_session:org1|so1
|
|
340
|
+
assertions:
|
|
341
|
+
can_read: false
|
|
342
|
+
can_act: false
|
|
343
|
+
xema_admin: false
|
|
344
|
+
- user: user:dave
|
|
345
|
+
object: xema_session:org1|so1
|
|
346
|
+
assertions:
|
|
347
|
+
can_read: false
|
|
348
|
+
xema_admin: false
|
|
349
|
+
- name: a user-owned session gives the org admin no management, before or after its owner leaves, and no act
|
|
350
|
+
tuples:
|
|
351
|
+
# olga owned it and LEFT: the owner tuple is inert, and nothing moves to the org
|
|
352
|
+
- user: membership:org1|molga2#holder
|
|
353
|
+
relation: owner
|
|
354
|
+
object: xema_session:org1|su1
|
|
355
|
+
check:
|
|
356
|
+
- user: user:root
|
|
357
|
+
object: xema_session:org1|su1
|
|
358
|
+
assertions:
|
|
359
|
+
can_read: false
|
|
360
|
+
can_write: false
|
|
361
|
+
xema_write: false
|
|
362
|
+
xema_admin: false
|
|
363
|
+
can_act: false
|
|
364
|
+
- user: user:own
|
|
365
|
+
object: xema_session:org1|su1
|
|
366
|
+
assertions:
|
|
367
|
+
xema_admin: false
|
|
368
|
+
can_act: false
|
|
369
|
+
- user: user:olga
|
|
370
|
+
object: xema_session:org1|su1
|
|
371
|
+
assertions:
|
|
372
|
+
can_read: false
|
|
373
|
+
xema_admin: false
|
|
374
|
+
# A PERSONAL session (owning space = the user): owner is the bare `user`,
|
|
375
|
+
# never a membership instance, so it survives the user leaving an org. No
|
|
376
|
+
# writer emits one yet: it is ready for a future user-tier session scope.
|
|
377
|
+
- name: personal session owner 1 a personal session's user owner reads, writes, administers and acts
|
|
378
|
+
tuples:
|
|
379
|
+
- user: user:pia
|
|
380
|
+
relation: holder
|
|
381
|
+
object: membership:org1|mpia1
|
|
382
|
+
- user: user:pia
|
|
383
|
+
relation: owner
|
|
384
|
+
object: xema_session:org1|sp1
|
|
385
|
+
check:
|
|
386
|
+
- user: user:pia
|
|
387
|
+
object: xema_session:org1|sp1
|
|
388
|
+
assertions:
|
|
389
|
+
can_read: true
|
|
390
|
+
can_write: true
|
|
391
|
+
xema_write: true
|
|
392
|
+
xema_admin: true
|
|
393
|
+
can_act: true
|
|
394
|
+
# a personal session gives the org admin nothing implicit
|
|
395
|
+
- user: user:root
|
|
396
|
+
object: xema_session:org1|sp1
|
|
397
|
+
assertions:
|
|
398
|
+
can_read: false
|
|
399
|
+
xema_admin: false
|
|
400
|
+
can_act: false
|
|
401
|
+
- name: personal session owner 2 the user owner survives leaving the org (no holder tuple)
|
|
402
|
+
tuples:
|
|
403
|
+
- user: user:pia
|
|
404
|
+
relation: owner
|
|
405
|
+
object: xema_session:org1|sp1
|
|
406
|
+
check:
|
|
407
|
+
- user: user:pia
|
|
408
|
+
object: xema_session:org1|sp1
|
|
409
|
+
assertions:
|
|
410
|
+
can_read: true
|
|
411
|
+
can_write: true
|
|
412
|
+
xema_admin: true
|
|
413
|
+
can_act: true
|
|
414
|
+
- name: personal session owner 3 an org-scoped (membership) owner beside it goes inert on leave
|
|
415
|
+
tuples:
|
|
416
|
+
- user: user:pia
|
|
417
|
+
relation: owner
|
|
418
|
+
object: xema_session:org1|sp1
|
|
419
|
+
- user: membership:org1|mpia1#holder
|
|
420
|
+
relation: owner
|
|
421
|
+
object: xema_session:org1|so9
|
|
422
|
+
check:
|
|
423
|
+
- user: user:pia
|
|
424
|
+
object: xema_session:org1|sp1
|
|
425
|
+
assertions:
|
|
426
|
+
can_act: true
|
|
427
|
+
xema_admin: true
|
|
428
|
+
- user: user:pia
|
|
429
|
+
object: xema_session:org1|so9
|
|
430
|
+
assertions:
|
|
431
|
+
can_read: false
|
|
432
|
+
xema_admin: false
|
|
433
|
+
can_act: false
|
|
276
434
|
# ── Durable delegation: may_delegate_for defaults ──────────────────────
|
|
277
435
|
# `user#is_self` is NEVER stored: the PDP supplies it per decision as a
|
|
278
436
|
# CONTEXTUAL tuple for the asking principal (`buildSelfContextualTuples`).
|
|
@@ -341,81 +499,6 @@ tests:
|
|
|
341
499
|
object: org:org2
|
|
342
500
|
assertions:
|
|
343
501
|
may_delegate_for: false
|
|
344
|
-
# ── Durable delegation: integration facts ─────────────────────────────
|
|
345
|
-
- name: an integration is configured by its configurers and its org's admin, and states its active, holder and bound-scope facts
|
|
346
|
-
tuples:
|
|
347
|
-
- user: org:org1
|
|
348
|
-
relation: parent
|
|
349
|
-
object: xema_integration:org1|i1
|
|
350
|
-
- user: org:org1
|
|
351
|
-
relation: active
|
|
352
|
-
object: xema_integration:org1|i1
|
|
353
|
-
- user: service:connector-sync
|
|
354
|
-
relation: holder
|
|
355
|
-
object: xema_integration:org1|i1
|
|
356
|
-
- user: xema_scope:repo-42
|
|
357
|
-
relation: bound_scope
|
|
358
|
-
object: xema_integration:org1|i1
|
|
359
|
-
- user: user:cora
|
|
360
|
-
relation: configurer
|
|
361
|
-
object: xema_integration:org1|i1
|
|
362
|
-
- user: org:org1
|
|
363
|
-
relation: parent
|
|
364
|
-
object: team:ops
|
|
365
|
-
- user: user:tess
|
|
366
|
-
relation: direct_member
|
|
367
|
-
object: team:ops
|
|
368
|
-
- user: team:ops#member
|
|
369
|
-
relation: configurer
|
|
370
|
-
object: xema_integration:org1|i1
|
|
371
|
-
- user: org:org1
|
|
372
|
-
relation: parent
|
|
373
|
-
object: xema_integration:org1|i2
|
|
374
|
-
check:
|
|
375
|
-
- user: user:cora
|
|
376
|
-
object: xema_integration:org1|i1
|
|
377
|
-
assertions:
|
|
378
|
-
configure: true
|
|
379
|
-
- user: user:tess
|
|
380
|
-
object: xema_integration:org1|i1
|
|
381
|
-
assertions:
|
|
382
|
-
configure: true
|
|
383
|
-
- user: user:root
|
|
384
|
-
object: xema_integration:org1|i1
|
|
385
|
-
assertions:
|
|
386
|
-
configure: true
|
|
387
|
-
- user: user:dave
|
|
388
|
-
object: xema_integration:org1|i1
|
|
389
|
-
assertions:
|
|
390
|
-
configure: false
|
|
391
|
-
- user: user:cora
|
|
392
|
-
object: xema_integration:org1|i2
|
|
393
|
-
assertions:
|
|
394
|
-
configure: false
|
|
395
|
-
- user: org:org1
|
|
396
|
-
object: xema_integration:org1|i1
|
|
397
|
-
assertions:
|
|
398
|
-
active: true
|
|
399
|
-
- user: org:org1
|
|
400
|
-
object: xema_integration:org1|i2
|
|
401
|
-
assertions:
|
|
402
|
-
active: false
|
|
403
|
-
- user: service:connector-sync
|
|
404
|
-
object: xema_integration:org1|i1
|
|
405
|
-
assertions:
|
|
406
|
-
holder: true
|
|
407
|
-
- user: service:mailops
|
|
408
|
-
object: xema_integration:org1|i1
|
|
409
|
-
assertions:
|
|
410
|
-
holder: false
|
|
411
|
-
- user: xema_scope:repo-42
|
|
412
|
-
object: xema_integration:org1|i1
|
|
413
|
-
assertions:
|
|
414
|
-
bound_scope: true
|
|
415
|
-
- user: xema_scope:repo-43
|
|
416
|
-
object: xema_integration:org1|i1
|
|
417
|
-
assertions:
|
|
418
|
-
bound_scope: false
|
|
419
502
|
- name: an org admin administers the org, and is not its owner
|
|
420
503
|
check:
|
|
421
504
|
- user: user:root
|
|
@@ -463,21 +546,363 @@ tests:
|
|
|
463
546
|
assertions:
|
|
464
547
|
admin: false
|
|
465
548
|
xema_read: false
|
|
466
|
-
- name:
|
|
549
|
+
- name: project 1 an active membership with a share is allowed
|
|
467
550
|
tuples:
|
|
468
|
-
- user:
|
|
469
|
-
relation:
|
|
470
|
-
object:
|
|
551
|
+
- user: user:ann
|
|
552
|
+
relation: holder
|
|
553
|
+
object: membership:org1|mann1
|
|
554
|
+
- user: membership:org1|mann1#holder
|
|
555
|
+
relation: viewer
|
|
556
|
+
object: project:org1|m1
|
|
471
557
|
check:
|
|
472
|
-
- user: user:
|
|
473
|
-
object:
|
|
558
|
+
- user: user:ann
|
|
559
|
+
object: project:org1|m1
|
|
474
560
|
assertions:
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
561
|
+
xema_read: true
|
|
562
|
+
- name: project 2 leave deletes the holder tuple — the share yields no access
|
|
563
|
+
tuples:
|
|
564
|
+
- user: membership:org1|mann1#holder
|
|
565
|
+
relation: viewer
|
|
566
|
+
object: project:org1|m2
|
|
567
|
+
check:
|
|
568
|
+
- user: user:ann
|
|
569
|
+
object: project:org1|m2
|
|
478
570
|
assertions:
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
571
|
+
xema_read: false
|
|
572
|
+
- name: project 3 rejoin is a new membership — the share on the old one stays refused
|
|
573
|
+
tuples:
|
|
574
|
+
- user: user:ann
|
|
575
|
+
relation: holder
|
|
576
|
+
object: membership:org1|mann2
|
|
577
|
+
- user: membership:org1|mann1#holder
|
|
578
|
+
relation: viewer
|
|
579
|
+
object: project:org1|m3
|
|
580
|
+
check:
|
|
581
|
+
- user: user:ann
|
|
582
|
+
object: project:org1|m3
|
|
482
583
|
assertions:
|
|
483
|
-
|
|
584
|
+
xema_read: false
|
|
585
|
+
- name: project 4 a new share to the new membership is allowed
|
|
586
|
+
tuples:
|
|
587
|
+
- user: user:ann
|
|
588
|
+
relation: holder
|
|
589
|
+
object: membership:org1|mann2
|
|
590
|
+
- user: membership:org1|mann1#holder
|
|
591
|
+
relation: viewer
|
|
592
|
+
object: project:org1|m4
|
|
593
|
+
- user: membership:org1|mann2#holder
|
|
594
|
+
relation: viewer
|
|
595
|
+
object: project:org1|m4
|
|
596
|
+
check:
|
|
597
|
+
- user: user:ann
|
|
598
|
+
object: project:org1|m4
|
|
599
|
+
assertions:
|
|
600
|
+
xema_read: true
|
|
601
|
+
- name: project 5 a demotion keeps the holder tuple — the share survives (no org admin tuple needed)
|
|
602
|
+
tuples:
|
|
603
|
+
- user: user:ann
|
|
604
|
+
relation: holder
|
|
605
|
+
object: membership:org1|mann1
|
|
606
|
+
- user: membership:org1|mann1#holder
|
|
607
|
+
relation: viewer
|
|
608
|
+
object: project:org1|m5
|
|
609
|
+
check:
|
|
610
|
+
- user: user:ann
|
|
611
|
+
object: project:org1|m5
|
|
612
|
+
assertions:
|
|
613
|
+
xema_read: true
|
|
614
|
+
- name: project 6 a revoked share is refused
|
|
615
|
+
tuples:
|
|
616
|
+
- user: user:ann
|
|
617
|
+
relation: holder
|
|
618
|
+
object: membership:org1|mann1
|
|
619
|
+
check:
|
|
620
|
+
- user: user:ann
|
|
621
|
+
object: project:org1|m6
|
|
622
|
+
assertions:
|
|
623
|
+
xema_read: false
|
|
624
|
+
- name: project owner 1 an active membership owner is allowed
|
|
625
|
+
tuples:
|
|
626
|
+
- user: user:ann
|
|
627
|
+
relation: holder
|
|
628
|
+
object: membership:org1|mown1
|
|
629
|
+
- user: membership:org1|mown1#holder
|
|
630
|
+
relation: owner
|
|
631
|
+
object: project:org1|o1
|
|
632
|
+
check:
|
|
633
|
+
- user: user:ann
|
|
634
|
+
object: project:org1|o1
|
|
635
|
+
assertions:
|
|
636
|
+
xema_admin: true
|
|
637
|
+
xema_write: true
|
|
638
|
+
- name: project owner 2 leave deletes the holder tuple — the owner tuple is inert
|
|
639
|
+
tuples:
|
|
640
|
+
- user: membership:org1|mown1#holder
|
|
641
|
+
relation: owner
|
|
642
|
+
object: project:org1|o1
|
|
643
|
+
check:
|
|
644
|
+
- user: user:ann
|
|
645
|
+
object: project:org1|o1
|
|
646
|
+
assertions:
|
|
647
|
+
xema_admin: false
|
|
648
|
+
xema_write: false
|
|
649
|
+
- name: project owner 3 rejoin is a new membership — the owner on the old one stays refused
|
|
650
|
+
tuples:
|
|
651
|
+
- user: user:ann
|
|
652
|
+
relation: holder
|
|
653
|
+
object: membership:org1|mown2
|
|
654
|
+
- user: membership:org1|mown1#holder
|
|
655
|
+
relation: owner
|
|
656
|
+
object: project:org1|o1
|
|
657
|
+
check:
|
|
658
|
+
- user: user:ann
|
|
659
|
+
object: project:org1|o1
|
|
660
|
+
assertions:
|
|
661
|
+
xema_admin: false
|
|
662
|
+
xema_write: false
|
|
663
|
+
- name: project owner 4 a demotion keeps the holder tuple — the owner survives (no org admin tuple needed)
|
|
664
|
+
tuples:
|
|
665
|
+
- user: user:ann
|
|
666
|
+
relation: holder
|
|
667
|
+
object: membership:org1|mown1
|
|
668
|
+
- user: membership:org1|mown1#holder
|
|
669
|
+
relation: owner
|
|
670
|
+
object: project:org1|o1
|
|
671
|
+
check:
|
|
672
|
+
- user: user:ann
|
|
673
|
+
object: project:org1|o1
|
|
674
|
+
assertions:
|
|
675
|
+
xema_admin: true
|
|
676
|
+
xema_write: true
|
|
677
|
+
- name: session owner 1 an active membership owner is allowed
|
|
678
|
+
tuples:
|
|
679
|
+
- user: user:ann
|
|
680
|
+
relation: holder
|
|
681
|
+
object: membership:org1|mown1
|
|
682
|
+
- user: membership:org1|mown1#holder
|
|
683
|
+
relation: owner
|
|
684
|
+
object: xema_session:org1|o2
|
|
685
|
+
check:
|
|
686
|
+
- user: user:ann
|
|
687
|
+
object: xema_session:org1|o2
|
|
688
|
+
assertions:
|
|
689
|
+
xema_admin: true
|
|
690
|
+
xema_write: true
|
|
691
|
+
can_act: true
|
|
692
|
+
- name: session owner 2 leave deletes the holder tuple — the owner tuple is inert
|
|
693
|
+
tuples:
|
|
694
|
+
- user: membership:org1|mown1#holder
|
|
695
|
+
relation: owner
|
|
696
|
+
object: xema_session:org1|o2
|
|
697
|
+
check:
|
|
698
|
+
- user: user:ann
|
|
699
|
+
object: xema_session:org1|o2
|
|
700
|
+
assertions:
|
|
701
|
+
xema_admin: false
|
|
702
|
+
xema_write: false
|
|
703
|
+
can_act: false
|
|
704
|
+
- name: session owner 3 rejoin is a new membership — the owner on the old one stays refused
|
|
705
|
+
tuples:
|
|
706
|
+
- user: user:ann
|
|
707
|
+
relation: holder
|
|
708
|
+
object: membership:org1|mown2
|
|
709
|
+
- user: membership:org1|mown1#holder
|
|
710
|
+
relation: owner
|
|
711
|
+
object: xema_session:org1|o2
|
|
712
|
+
check:
|
|
713
|
+
- user: user:ann
|
|
714
|
+
object: xema_session:org1|o2
|
|
715
|
+
assertions:
|
|
716
|
+
xema_admin: false
|
|
717
|
+
xema_write: false
|
|
718
|
+
can_act: false
|
|
719
|
+
- name: session owner 4 a demotion keeps the holder tuple — the owner survives (no org admin tuple needed)
|
|
720
|
+
tuples:
|
|
721
|
+
- user: user:ann
|
|
722
|
+
relation: holder
|
|
723
|
+
object: membership:org1|mown1
|
|
724
|
+
- user: membership:org1|mown1#holder
|
|
725
|
+
relation: owner
|
|
726
|
+
object: xema_session:org1|o2
|
|
727
|
+
check:
|
|
728
|
+
- user: user:ann
|
|
729
|
+
object: xema_session:org1|o2
|
|
730
|
+
assertions:
|
|
731
|
+
xema_admin: true
|
|
732
|
+
xema_write: true
|
|
733
|
+
can_act: true
|
|
734
|
+
- name: artifact owner 1 an active membership owner is allowed
|
|
735
|
+
tuples:
|
|
736
|
+
- user: user:ann
|
|
737
|
+
relation: holder
|
|
738
|
+
object: membership:org1|mown1
|
|
739
|
+
- user: membership:org1|mown1#holder
|
|
740
|
+
relation: owner
|
|
741
|
+
object: xema_artifact:org1|o3
|
|
742
|
+
check:
|
|
743
|
+
- user: user:ann
|
|
744
|
+
object: xema_artifact:org1|o3
|
|
745
|
+
assertions:
|
|
746
|
+
can_read: true
|
|
747
|
+
can_write: true
|
|
748
|
+
can_delete: true
|
|
749
|
+
- name: artifact owner 2 leave deletes the holder tuple — the owner tuple is inert
|
|
750
|
+
tuples:
|
|
751
|
+
- user: membership:org1|mown1#holder
|
|
752
|
+
relation: owner
|
|
753
|
+
object: xema_artifact:org1|o3
|
|
754
|
+
check:
|
|
755
|
+
- user: user:ann
|
|
756
|
+
object: xema_artifact:org1|o3
|
|
757
|
+
assertions:
|
|
758
|
+
can_read: false
|
|
759
|
+
can_write: false
|
|
760
|
+
can_delete: false
|
|
761
|
+
- name: artifact owner 3 rejoin is a new membership — the owner on the old one stays refused
|
|
762
|
+
tuples:
|
|
763
|
+
- user: user:ann
|
|
764
|
+
relation: holder
|
|
765
|
+
object: membership:org1|mown2
|
|
766
|
+
- user: membership:org1|mown1#holder
|
|
767
|
+
relation: owner
|
|
768
|
+
object: xema_artifact:org1|o3
|
|
769
|
+
check:
|
|
770
|
+
- user: user:ann
|
|
771
|
+
object: xema_artifact:org1|o3
|
|
772
|
+
assertions:
|
|
773
|
+
can_read: false
|
|
774
|
+
can_write: false
|
|
775
|
+
can_delete: false
|
|
776
|
+
- name: artifact owner 4 a demotion keeps the holder tuple — the owner survives (no org admin tuple needed)
|
|
777
|
+
tuples:
|
|
778
|
+
- user: user:ann
|
|
779
|
+
relation: holder
|
|
780
|
+
object: membership:org1|mown1
|
|
781
|
+
- user: membership:org1|mown1#holder
|
|
782
|
+
relation: owner
|
|
783
|
+
object: xema_artifact:org1|o3
|
|
784
|
+
check:
|
|
785
|
+
- user: user:ann
|
|
786
|
+
object: xema_artifact:org1|o3
|
|
787
|
+
assertions:
|
|
788
|
+
can_read: true
|
|
789
|
+
can_write: true
|
|
790
|
+
can_delete: true
|
|
791
|
+
- name: session participant 1 an active membership participant is allowed
|
|
792
|
+
tuples:
|
|
793
|
+
- user: user:ann
|
|
794
|
+
relation: holder
|
|
795
|
+
object: membership:org1|mgr1
|
|
796
|
+
- user: membership:org1|mgr1#holder
|
|
797
|
+
relation: participant
|
|
798
|
+
object: xema_session:org1|p1
|
|
799
|
+
check:
|
|
800
|
+
- user: user:ann
|
|
801
|
+
object: xema_session:org1|p1
|
|
802
|
+
assertions:
|
|
803
|
+
xema_read: true
|
|
804
|
+
can_read: true
|
|
805
|
+
can_act: false
|
|
806
|
+
xema_write: false
|
|
807
|
+
- name: session participant 2 leave deletes the holder tuple — the grant is inert
|
|
808
|
+
tuples:
|
|
809
|
+
- user: membership:org1|mgr1#holder
|
|
810
|
+
relation: participant
|
|
811
|
+
object: xema_session:org1|p1
|
|
812
|
+
check:
|
|
813
|
+
- user: user:ann
|
|
814
|
+
object: xema_session:org1|p1
|
|
815
|
+
assertions:
|
|
816
|
+
xema_read: false
|
|
817
|
+
can_read: false
|
|
818
|
+
can_act: false
|
|
819
|
+
xema_write: false
|
|
820
|
+
- name: session participant 3 rejoin is a new membership — the grant on the old one stays refused
|
|
821
|
+
tuples:
|
|
822
|
+
- user: user:ann
|
|
823
|
+
relation: holder
|
|
824
|
+
object: membership:org1|mgr2
|
|
825
|
+
- user: membership:org1|mgr1#holder
|
|
826
|
+
relation: participant
|
|
827
|
+
object: xema_session:org1|p1
|
|
828
|
+
check:
|
|
829
|
+
- user: user:ann
|
|
830
|
+
object: xema_session:org1|p1
|
|
831
|
+
assertions:
|
|
832
|
+
xema_read: false
|
|
833
|
+
can_read: false
|
|
834
|
+
can_act: false
|
|
835
|
+
xema_write: false
|
|
836
|
+
- name: session participant 4 a demotion keeps the holder tuple — the grant survives (no org admin tuple needed)
|
|
837
|
+
tuples:
|
|
838
|
+
- user: user:ann
|
|
839
|
+
relation: holder
|
|
840
|
+
object: membership:org1|mgr1
|
|
841
|
+
- user: membership:org1|mgr1#holder
|
|
842
|
+
relation: participant
|
|
843
|
+
object: xema_session:org1|p1
|
|
844
|
+
check:
|
|
845
|
+
- user: user:ann
|
|
846
|
+
object: xema_session:org1|p1
|
|
847
|
+
assertions:
|
|
848
|
+
xema_read: true
|
|
849
|
+
can_read: true
|
|
850
|
+
can_act: false
|
|
851
|
+
xema_write: false
|
|
852
|
+
- name: session editor 1 an active membership editor is allowed
|
|
853
|
+
tuples:
|
|
854
|
+
- user: user:ann
|
|
855
|
+
relation: holder
|
|
856
|
+
object: membership:org1|mgr1
|
|
857
|
+
- user: membership:org1|mgr1#holder
|
|
858
|
+
relation: editor
|
|
859
|
+
object: xema_session:org1|e1
|
|
860
|
+
check:
|
|
861
|
+
- user: user:ann
|
|
862
|
+
object: xema_session:org1|e1
|
|
863
|
+
assertions:
|
|
864
|
+
xema_read: true
|
|
865
|
+
can_act: true
|
|
866
|
+
xema_write: false
|
|
867
|
+
- name: session editor 2 leave deletes the holder tuple — the grant is inert
|
|
868
|
+
tuples:
|
|
869
|
+
- user: membership:org1|mgr1#holder
|
|
870
|
+
relation: editor
|
|
871
|
+
object: xema_session:org1|e1
|
|
872
|
+
check:
|
|
873
|
+
- user: user:ann
|
|
874
|
+
object: xema_session:org1|e1
|
|
875
|
+
assertions:
|
|
876
|
+
xema_read: false
|
|
877
|
+
can_act: false
|
|
878
|
+
xema_write: false
|
|
879
|
+
- name: session editor 3 rejoin is a new membership — the grant on the old one stays refused
|
|
880
|
+
tuples:
|
|
881
|
+
- user: user:ann
|
|
882
|
+
relation: holder
|
|
883
|
+
object: membership:org1|mgr2
|
|
884
|
+
- user: membership:org1|mgr1#holder
|
|
885
|
+
relation: editor
|
|
886
|
+
object: xema_session:org1|e1
|
|
887
|
+
check:
|
|
888
|
+
- user: user:ann
|
|
889
|
+
object: xema_session:org1|e1
|
|
890
|
+
assertions:
|
|
891
|
+
xema_read: false
|
|
892
|
+
can_act: false
|
|
893
|
+
xema_write: false
|
|
894
|
+
- name: session editor 4 a demotion keeps the holder tuple — the grant survives (no org admin tuple needed)
|
|
895
|
+
tuples:
|
|
896
|
+
- user: user:ann
|
|
897
|
+
relation: holder
|
|
898
|
+
object: membership:org1|mgr1
|
|
899
|
+
- user: membership:org1|mgr1#holder
|
|
900
|
+
relation: editor
|
|
901
|
+
object: xema_session:org1|e1
|
|
902
|
+
check:
|
|
903
|
+
- user: user:ann
|
|
904
|
+
object: xema_session:org1|e1
|
|
905
|
+
assertions:
|
|
906
|
+
xema_read: true
|
|
907
|
+
can_act: true
|
|
908
|
+
xema_write: false
|