gatekeep_keepsake/
subject.rs1use gatekeep::Context;
2use keepsake::{KeepsakeError, SubjectRef};
3
4pub trait SubjectMapper: Send + Sync {
6 fn subject(&self, cx: &Context) -> Result<SubjectRef, KeepsakeError>;
12}
13
14#[derive(Clone, Copy, Debug, Default)]
21pub struct TenantScopedSubjectMapper;
22
23impl SubjectMapper for TenantScopedSubjectMapper {
24 fn subject(&self, cx: &Context) -> Result<SubjectRef, KeepsakeError> {
25 SubjectRef::new(
26 tenant_principal_kind(cx.tenant.as_str(), cx.principal.kind()),
27 cx.principal.id(),
28 )
29 }
30}
31
32#[derive(Clone, Copy, Debug, Default)]
35pub struct PrincipalSubjectMapper;
36
37impl SubjectMapper for PrincipalSubjectMapper {
38 fn subject(&self, cx: &Context) -> Result<SubjectRef, KeepsakeError> {
39 SubjectRef::new(cx.principal.kind(), cx.principal.id())
40 }
41}
42
43pub fn tenant_scoped_subject(cx: &Context) -> Result<SubjectRef, KeepsakeError> {
49 TenantScopedSubjectMapper.subject(cx)
50}
51
52pub fn principal_subject(cx: &Context) -> Result<SubjectRef, KeepsakeError> {
58 PrincipalSubjectMapper.subject(cx)
59}
60
61fn tenant_principal_kind(tenant: &str, principal_kind: &str) -> String {
62 format!(
63 "tenant:{}:{}principal:{}:{}",
64 tenant.len(),
65 tenant,
66 principal_kind.len(),
67 principal_kind
68 )
69}