1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//! Tenant scoping and resource ownership helpers.
use crateResourceRef;
use crateSubject;
/// Returns `true` if the subject owns the resource (actor_id == owner_id).
///
/// # Examples
///
/// ```
/// use secure_authz::ownership::is_owner;
/// use secure_authz::testkit::test_subject;
/// use secure_authz::resource::ResourceRef;
///
/// let subject = test_subject("alice", &[]);
/// let resource = ResourceRef::new("doc").with_owner("alice");
/// assert!(is_owner(&subject, &resource));
/// ```
/// Returns `true` if the subject and resource share the same tenant,
/// or the resource has no tenant constraint.
///
/// Cross-tenant access is blocked regardless of policy rules.
///
/// # Examples
///
/// ```
/// use secure_authz::ownership::is_same_tenant;
/// use secure_authz::testkit::test_subject;
/// use secure_authz::resource::ResourceRef;
///
/// let mut subject = test_subject("alice", &[]);
/// subject.tenant_id = Some("acme".into());
/// let resource = ResourceRef::new("doc").with_tenant("acme");
/// assert!(is_same_tenant(&subject, &resource));
/// ```