@@ -246,6 +246,41 @@ user_allow(roles) := num if {
246
246
num:= number (allow)
247
247
}
248
248
249
+ # -------------------
250
+ # Organization Member Owner Rules
251
+ # -------------------
252
+
253
+ # 'org_member_owner' combines org membership and ownership requirements.
254
+ # These rules only apply if:
255
+ # 1. The user is a member of the organization the resource belongs to
256
+ # 2. The user is the owner of the resource
257
+ default org_member_owner:= 0
258
+ org_member_owner:= org_member_owner_allow (input.subject.roles)
259
+
260
+ default scope_org_member_owner:= 0
261
+ scope_org_member_owner:= org_member_owner_allow ([input.subject.scope])
262
+
263
+ org_member_owner_allow (roles):= num if {
264
+ # Must be the owner of the object
265
+ input.object.owner!= " "
266
+ input.subject.id= input.object.owner
267
+
268
+ # Must be a member of the organization
269
+ input.object.org_owner!= " "
270
+ input.object.org_owner in org_members
271
+
272
+ allow:= {is_allowed|
273
+ # Iterate over all org_member_owner permissions in all roles
274
+ perm:= roles[_].org_member_owner[_]
275
+ perm.action in [input.action," *" ]
276
+ perm.resource_type in [input.object.type," *" ]
277
+
278
+ # is_allowed is either 'true' or 'false' if a matching permission exists.
279
+ is_allowed:= bool_flip (perm.negate)
280
+ }
281
+ num:= number (allow)
282
+ }
283
+
249
284
# Scope allow_list is a list of resource (Type, ID) tuples explicitly allowed by the scope.
250
285
# If the list contains `(*,*)`, then all resources are allowed.
251
286
scope_allow_list if {
@@ -304,6 +339,15 @@ role_allow if {
304
339
user= 1
305
340
}
306
341
342
+ role_allow if {
343
+ not site= - 1
344
+ not org= - 1
345
+ not user= - 1
346
+
347
+ # Organization member owner permissions require both ownership and org membership
348
+ org_member_owner= 1
349
+ }
350
+
307
351
# -------------------
308
352
# Scope-Specific Rules
309
353
# -------------------
@@ -330,6 +374,16 @@ scope_allow if {
330
374
scope_user= 1
331
375
}
332
376
377
+ scope_allow if {
378
+ scope_allow_list
379
+ not scope_site= - 1
380
+ not scope_org= - 1
381
+ not scope_user= - 1
382
+
383
+ # Organization member owner permissions require both ownership and org membership
384
+ scope_org_member_owner= 1
385
+ }
386
+
333
387
# -------------------
334
388
# ACL-Specific Rules
335
389
# Access Control List