@xemahq/contracts 0.77.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.
Files changed (128) hide show
  1. package/README.md +1 -1
  2. package/dist/.source-stamp.json +2 -2
  3. package/dist/authorization-module/index.d.ts +2 -0
  4. package/dist/authorization-module/index.d.ts.map +1 -1
  5. package/dist/authorization-module/index.js +2 -0
  6. package/dist/authorization-module/index.js.map +1 -1
  7. package/dist/authorization-module/lib/authorization-composition-error.d.ts +11 -0
  8. package/dist/authorization-module/lib/authorization-composition-error.d.ts.map +1 -1
  9. package/dist/authorization-module/lib/authorization-composition-error.js +16 -1
  10. package/dist/authorization-module/lib/authorization-composition-error.js.map +1 -1
  11. package/dist/authorization-module/lib/authorization-interface-requirements.d.ts +5 -1
  12. package/dist/authorization-module/lib/authorization-interface-requirements.d.ts.map +1 -1
  13. package/dist/authorization-module/lib/authorization-interface-requirements.js +1 -0
  14. package/dist/authorization-module/lib/authorization-interface-requirements.js.map +1 -1
  15. package/dist/authorization-module/lib/authorization-module-contribution.d.ts +24 -0
  16. package/dist/authorization-module/lib/authorization-module-contribution.d.ts.map +1 -1
  17. package/dist/authorization-module/lib/authorization-module-contribution.js +1 -0
  18. package/dist/authorization-module/lib/authorization-module-contribution.js.map +1 -1
  19. package/dist/authorization-module/lib/authorization-module-envelope.d.ts +11 -0
  20. package/dist/authorization-module/lib/authorization-module-envelope.d.ts.map +1 -1
  21. package/dist/authorization-module/lib/authorization-module-envelope.js +4 -0
  22. package/dist/authorization-module/lib/authorization-module-envelope.js.map +1 -1
  23. package/dist/authorization-module/lib/delegation-origination.d.ts +26 -0
  24. package/dist/authorization-module/lib/delegation-origination.d.ts.map +1 -0
  25. package/dist/authorization-module/lib/delegation-origination.js +43 -0
  26. package/dist/authorization-module/lib/delegation-origination.js.map +1 -0
  27. package/dist/authorization-module/lib/delegation-wildcard-ceiling.d.ts +6 -0
  28. package/dist/authorization-module/lib/delegation-wildcard-ceiling.d.ts.map +1 -0
  29. package/dist/authorization-module/lib/delegation-wildcard-ceiling.js +17 -0
  30. package/dist/authorization-module/lib/delegation-wildcard-ceiling.js.map +1 -0
  31. package/dist/authorization-module/lib/platform-authorization-modules.d.ts.map +1 -1
  32. package/dist/authorization-module/lib/platform-authorization-modules.js +10 -11
  33. package/dist/authorization-module/lib/platform-authorization-modules.js.map +1 -1
  34. package/dist/authorization-module/platform/xema_core.fga +76 -45
  35. package/dist/authorization-module/platform/xema_core.fga.yaml +522 -97
  36. package/dist/authorization-module/platform/xema_sharing.fga +48 -33
  37. package/dist/authorization-module/platform/xema_sharing.fga.yaml +555 -2
  38. package/dist/authorization-module/server/authorization-interface-conformance.d.ts +1 -0
  39. package/dist/authorization-module/server/authorization-interface-conformance.d.ts.map +1 -1
  40. package/dist/authorization-module/server/authorization-interface-conformance.js +13 -1
  41. package/dist/authorization-module/server/authorization-interface-conformance.js.map +1 -1
  42. package/dist/authorization-module/server/compose-authorization-base.d.ts +2 -0
  43. package/dist/authorization-module/server/compose-authorization-base.d.ts.map +1 -1
  44. package/dist/authorization-module/server/compose-authorization-base.js +15 -2
  45. package/dist/authorization-module/server/compose-authorization-base.js.map +1 -1
  46. package/dist/authorization-module/server/delegation-origination-conformance.d.ts +15 -0
  47. package/dist/authorization-module/server/delegation-origination-conformance.d.ts.map +1 -0
  48. package/dist/authorization-module/server/delegation-origination-conformance.js +92 -0
  49. package/dist/authorization-module/server/delegation-origination-conformance.js.map +1 -0
  50. package/dist/authorization-module/server/userset-subject-types.d.ts +3 -0
  51. package/dist/authorization-module/server/userset-subject-types.d.ts.map +1 -0
  52. package/dist/authorization-module/server/userset-subject-types.js +65 -0
  53. package/dist/authorization-module/server/userset-subject-types.js.map +1 -0
  54. package/dist/authzen/index.d.ts +1 -0
  55. package/dist/authzen/index.d.ts.map +1 -1
  56. package/dist/authzen/index.js +1 -0
  57. package/dist/authzen/index.js.map +1 -1
  58. package/dist/authzen/lib/durable-delegation-model.d.ts +33 -11
  59. package/dist/authzen/lib/durable-delegation-model.d.ts.map +1 -1
  60. package/dist/authzen/lib/durable-delegation-model.js +54 -16
  61. package/dist/authzen/lib/durable-delegation-model.js.map +1 -1
  62. package/dist/authzen/lib/xema-membership.d.ts +6 -0
  63. package/dist/authzen/lib/xema-membership.d.ts.map +1 -0
  64. package/dist/authzen/lib/xema-membership.js +16 -0
  65. package/dist/authzen/lib/xema-membership.js.map +1 -0
  66. package/dist/deployment/lib/resolved-deployment.d.ts +5 -2
  67. package/dist/deployment/lib/resolved-deployment.d.ts.map +1 -1
  68. package/dist/deployment/lib/resolved-deployment.js +6 -3
  69. package/dist/deployment/lib/resolved-deployment.js.map +1 -1
  70. package/dist/distribution/index.d.ts +2 -0
  71. package/dist/distribution/index.d.ts.map +1 -1
  72. package/dist/distribution/index.js +2 -0
  73. package/dist/distribution/index.js.map +1 -1
  74. package/dist/distribution/lib/authorization-lock.d.ts +16 -0
  75. package/dist/distribution/lib/authorization-lock.d.ts.map +1 -0
  76. package/dist/distribution/lib/authorization-lock.js +34 -0
  77. package/dist/distribution/lib/authorization-lock.js.map +1 -0
  78. package/dist/distribution/lib/customer-edition-definition.d.ts +10 -1
  79. package/dist/distribution/lib/customer-edition-definition.d.ts.map +1 -1
  80. package/dist/distribution/lib/customer-edition-definition.js +53 -2
  81. package/dist/distribution/lib/customer-edition-definition.js.map +1 -1
  82. package/dist/distribution/lib/distribution-lock.d.ts +2 -1
  83. package/dist/distribution/lib/distribution-lock.d.ts.map +1 -1
  84. package/dist/distribution/lib/distribution-lock.js +20 -0
  85. package/dist/distribution/lib/distribution-lock.js.map +1 -1
  86. package/dist/distribution/lib/image-producer-evidence.d.ts +86 -14
  87. package/dist/distribution/lib/image-producer-evidence.d.ts.map +1 -1
  88. package/dist/distribution/lib/image-producer-evidence.js +72 -12
  89. package/dist/distribution/lib/image-producer-evidence.js.map +1 -1
  90. package/dist/distribution/lib/kernel-contract-authority.d.ts +1 -0
  91. package/dist/distribution/lib/kernel-contract-authority.d.ts.map +1 -1
  92. package/dist/distribution/lib/kernel-contract-authority.js +6 -2
  93. package/dist/distribution/lib/kernel-contract-authority.js.map +1 -1
  94. package/dist/distribution/lib/kernel-contract-source-paths.d.ts +1 -1
  95. package/dist/distribution/lib/kernel-contract-source-paths.d.ts.map +1 -1
  96. package/dist/distribution/lib/kernel-contract-source-paths.js +8 -0
  97. package/dist/distribution/lib/kernel-contract-source-paths.js.map +1 -1
  98. package/dist/distribution/lib/resolve-unsplit-deployment.d.ts +2 -0
  99. package/dist/distribution/lib/resolve-unsplit-deployment.d.ts.map +1 -1
  100. package/dist/distribution/lib/resolve-unsplit-deployment.js +14 -0
  101. package/dist/distribution/lib/resolve-unsplit-deployment.js.map +1 -1
  102. package/dist/distribution/lib/runtime-image-source-index.d.ts +18 -1
  103. package/dist/distribution/lib/runtime-image-source-index.d.ts.map +1 -1
  104. package/dist/distribution/lib/runtime-image-source-index.js +38 -2
  105. package/dist/distribution/lib/runtime-image-source-index.js.map +1 -1
  106. package/dist/distribution/lib/verify-delivered-locks.d.ts +41 -0
  107. package/dist/distribution/lib/verify-delivered-locks.d.ts.map +1 -0
  108. package/dist/distribution/lib/verify-delivered-locks.js +76 -0
  109. package/dist/distribution/lib/verify-delivered-locks.js.map +1 -0
  110. package/dist/distribution/lib/verify-resolved-deployment.d.ts +1 -0
  111. package/dist/distribution/lib/verify-resolved-deployment.d.ts.map +1 -1
  112. package/dist/distribution/lib/verify-resolved-deployment.js +8 -0
  113. package/dist/distribution/lib/verify-resolved-deployment.js.map +1 -1
  114. package/dist/distribution/server/index.d.ts +8 -0
  115. package/dist/distribution/server/index.d.ts.map +1 -0
  116. package/dist/distribution/server/index.js +34 -0
  117. package/dist/distribution/server/index.js.map +1 -0
  118. package/dist/edition-protocol/edition-contract.schema.json +1 -1
  119. package/dist/edition-protocol/edition-protocol.json +1 -1
  120. package/dist/edition-protocol/lib/edition-protocol.d.ts +2 -1
  121. package/dist/edition-protocol/lib/edition-protocol.d.ts.map +1 -1
  122. package/dist/edition-protocol/lib/edition-protocol.js +4 -2
  123. package/dist/edition-protocol/lib/edition-protocol.js.map +1 -1
  124. package/dist/resolved-deployment-fixture/lib/resolved-deployment-fixture.d.ts +2 -0
  125. package/dist/resolved-deployment-fixture/lib/resolved-deployment-fixture.d.ts.map +1 -1
  126. package/dist/resolved-deployment-fixture/lib/resolved-deployment-fixture.js +66 -1
  127. package/dist/resolved-deployment-fixture/lib/resolved-deployment-fixture.js.map +1 -1
  128. 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: user:pat
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, ANCHORED to the project
50
- # (containment only), with no parent and no participant.
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 derives no human rights — not even the org admin's
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: false
146
- can_write: false
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: false
159
- can_delete: false
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: user:erin
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: integration configure is the configurer or the org administrators, never installation authority
549
+ - name: project 1 an active membership with a share is allowed
467
550
  tuples:
468
- - user: org:org1
469
- relation: parent
470
- object: xema_integration:org1|i9
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:ops
473
- object: xema_integration:org1|i9
558
+ - user: user:ann
559
+ object: project:org1|m1
474
560
  assertions:
475
- configure: false
476
- - user: user:own
477
- object: xema_integration:org1|i9
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
- configure: true
480
- - user: user:root
481
- object: xema_integration:org1|i9
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
- configure: true
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