kanidmd_lib/constants/
entries.rs

1//! Constant Entries for the IDM
2use std::fmt::Display;
3
4use crate::value::PartialValue;
5use crate::value::Value;
6use crate::valueset::{ValueSet, ValueSetIutf8};
7pub use kanidm_proto::attribute::Attribute;
8use kanidm_proto::constants::*;
9use kanidm_proto::scim_v1::JsonValue;
10use kanidm_proto::scim_v1::ScimFilter;
11
12//TODO: This would do well in the proto lib
13// together with all the other definitions.
14// That way`OperationError::MissingClass` can
15// Directly reference the entryclass rather
16// than relying on its string name
17#[derive(Copy, Clone, Debug)]
18pub enum EntryClass {
19    AccessControlCreate,
20    AccessControlDelete,
21    AccessControlModify,
22    AccessControlProfile,
23    AccessControlReceiverEntryManager,
24    AccessControlReceiverGroup,
25    AccessControlSearch,
26    AccessControlTargetScope,
27    Account,
28    AccountPolicy,
29    Application,
30    AttributeType,
31    Builtin,
32    Class,
33    ClassType,
34    ClientCertificate,
35    Conflict,
36    DomainInfo,
37    DynGroup,
38    ExtensibleObject,
39    Group,
40    KeyProvider,
41    KeyProviderInternal,
42    KeyObject,
43    KeyObjectHkdfS256,
44    KeyObjectJwtEs256,
45    KeyObjectJwtRs256,
46    KeyObjectJweA128GCM,
47    KeyObjectInternal,
48    MemberOf,
49    OAuth2ResourceServer,
50    OAuth2ResourceServerBasic,
51    OAuth2ResourceServerPublic,
52    OAuth2DeviceCodeSession,
53    Object,
54    OrgPerson,
55    OutboundMessage,
56    Person,
57    PosixAccount,
58    PosixGroup,
59    Recycled,
60    Service,
61    ServiceAccount,
62    SyncAccount,
63    SyncObject,
64    Tombstone,
65    User,
66    System,
67    SystemInfo,
68    SystemConfig,
69    #[cfg(any(test, debug_assertions))]
70    TestClass,
71}
72
73impl From<EntryClass> for ScimFilter {
74    fn from(ec: EntryClass) -> Self {
75        ScimFilter::Equal(Attribute::Class.into(), ec.into())
76    }
77}
78
79impl From<EntryClass> for &'static str {
80    fn from(val: EntryClass) -> Self {
81        match val {
82            EntryClass::AccessControlCreate => ACCESS_CONTROL_CREATE,
83            EntryClass::AccessControlDelete => ACCESS_CONTROL_DELETE,
84            EntryClass::AccessControlModify => ACCESS_CONTROL_MODIFY,
85            EntryClass::AccessControlProfile => ACCESS_CONTROL_PROFILE,
86            EntryClass::AccessControlReceiverEntryManager => ACCESS_CONTROL_RECEIVER_ENTRY_MANAGER,
87            EntryClass::AccessControlReceiverGroup => ACCESS_CONTROL_RECEIVER_GROUP,
88            EntryClass::AccessControlSearch => ACCESS_CONTROL_SEARCH,
89            EntryClass::AccessControlTargetScope => ACCESS_CONTROL_TARGET_SCOPE,
90            EntryClass::Account => ENTRYCLASS_ACCOUNT,
91            EntryClass::AccountPolicy => ENTRYCLASS_ACCOUNT_POLICY,
92            EntryClass::Application => ENTRYCLASS_APPLICATION,
93            EntryClass::AttributeType => ENTRYCLASS_ATTRIBUTE_TYPE,
94            EntryClass::Builtin => ENTRYCLASS_BUILTIN,
95            EntryClass::Class => ENTRYCLASS_CLASS,
96            EntryClass::ClassType => ENTRYCLASS_CLASS_TYPE,
97            EntryClass::ClientCertificate => ENTRYCLASS_CLIENT_CERTIFICATE,
98            EntryClass::Conflict => ENTRYCLASS_CONFLICT,
99            EntryClass::DomainInfo => ENTRYCLASS_DOMAIN_INFO,
100            EntryClass::DynGroup => ENTRYCLASS_DYN_GROUP,
101            EntryClass::ExtensibleObject => ENTRYCLASS_EXTENSIBLE_OBJECT,
102            EntryClass::Group => ENTRYCLASS_GROUP,
103            EntryClass::KeyProvider => ENTRYCLASS_KEY_PROVIDER,
104            EntryClass::KeyProviderInternal => ENTRYCLASS_KEY_PROVIDER_INTERNAL,
105            EntryClass::KeyObject => ENTRYCLASS_KEY_OBJECT,
106            EntryClass::KeyObjectHkdfS256 => ENTRYCLASS_KEY_OBJECT_HKDF_S256,
107            EntryClass::KeyObjectJwtEs256 => ENTRYCLASS_KEY_OBJECT_JWT_ES256,
108            EntryClass::KeyObjectJwtRs256 => ENTRYCLASS_KEY_OBJECT_JWT_RS256,
109            EntryClass::KeyObjectJweA128GCM => ENTRYCLASS_KEY_OBJECT_JWE_A128GCM,
110            EntryClass::KeyObjectInternal => ENTRYCLASS_KEY_OBJECT_INTERNAL,
111            EntryClass::MemberOf => ENTRYCLASS_MEMBER_OF,
112            EntryClass::OAuth2DeviceCodeSession => OAUTH2_DEVICE_CODE_SESSION,
113            EntryClass::OAuth2ResourceServer => OAUTH2_RESOURCE_SERVER,
114            EntryClass::OAuth2ResourceServerBasic => OAUTH2_RESOURCE_SERVER_BASIC,
115            EntryClass::OAuth2ResourceServerPublic => OAUTH2_RESOURCE_SERVER_PUBLIC,
116            EntryClass::Object => ENTRYCLASS_OBJECT,
117            EntryClass::OrgPerson => ENTRYCLASS_ORG_PERSON,
118            EntryClass::OutboundMessage => ENTRYCLASS_OUTBOUND_MESSAGE,
119            EntryClass::Person => ENTRYCLASS_PERSON,
120            EntryClass::PosixAccount => ENTRYCLASS_POSIX_ACCOUNT,
121            EntryClass::PosixGroup => ENTRYCLASS_POSIX_GROUP,
122            EntryClass::Recycled => ENTRYCLASS_RECYCLED,
123            EntryClass::Service => ENTRYCLASS_SERVICE,
124            EntryClass::ServiceAccount => ENTRYCLASS_SERVICE_ACCOUNT,
125            EntryClass::SyncAccount => ENTRYCLASS_SYNC_ACCOUNT,
126            EntryClass::SyncObject => ENTRYCLASS_SYNC_OBJECT,
127            EntryClass::System => ENTRYCLASS_SYSTEM,
128            EntryClass::SystemConfig => ENTRYCLASS_SYSTEM_CONFIG,
129            EntryClass::SystemInfo => ENTRYCLASS_SYSTEM_INFO,
130            EntryClass::Tombstone => ENTRYCLASS_TOMBSTONE,
131            #[cfg(any(test, debug_assertions))]
132            EntryClass::TestClass => TEST_ENTRYCLASS_TEST_CLASS,
133            EntryClass::User => ENTRYCLASS_USER,
134        }
135    }
136}
137
138impl From<EntryClass> for JsonValue {
139    fn from(value: EntryClass) -> Self {
140        Self::String(value.as_ref().to_string())
141    }
142}
143
144impl AsRef<str> for EntryClass {
145    fn as_ref(&self) -> &str {
146        self.into()
147    }
148}
149
150impl From<&EntryClass> for &'static str {
151    fn from(value: &EntryClass) -> Self {
152        (*value).into()
153    }
154}
155
156impl From<EntryClass> for String {
157    fn from(val: EntryClass) -> Self {
158        let s: &'static str = val.into();
159        s.to_string()
160    }
161}
162
163impl From<EntryClass> for Value {
164    fn from(val: EntryClass) -> Self {
165        Value::new_iutf8(val.into())
166    }
167}
168
169impl From<EntryClass> for PartialValue {
170    fn from(val: EntryClass) -> Self {
171        PartialValue::new_iutf8(val.into())
172    }
173}
174
175impl From<EntryClass> for crate::prelude::AttrString {
176    fn from(val: EntryClass) -> Self {
177        crate::prelude::AttrString::from(val.to_string())
178    }
179}
180
181impl Display for EntryClass {
182    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> std::fmt::Result {
183        let s: String = (*self).into();
184        write!(f, "{s}")
185    }
186}
187
188impl EntryClass {
189    pub fn to_value(self) -> Value {
190        let s: &'static str = self.into();
191        Value::new_iutf8(s)
192    }
193
194    pub fn to_valueset(self) -> ValueSet {
195        let s: &'static str = self.into();
196        ValueSetIutf8::new(s)
197    }
198
199    pub fn to_partialvalue(self) -> PartialValue {
200        let s: &'static str = self.into();
201        PartialValue::new_iutf8(s)
202    }
203
204    /// Return a filter that'll match this class
205    pub fn as_f_eq(&self) -> crate::filter::FC {
206        crate::filter::f_eq(Attribute::Class, self.to_partialvalue())
207    }
208}
209
210// ============ TEST DATA ============
211#[cfg(test)]
212use crate::entry::{Entry, EntryInit, EntryInitNew, EntryNew};
213
214#[cfg(test)]
215lazy_static! {
216    pub static ref E_TESTPERSON_1: EntryInitNew = entry_init!(
217        (Attribute::Class, EntryClass::Object.to_value()),
218        (Attribute::Class, EntryClass::Account.to_value()),
219        (Attribute::Class, EntryClass::Person.to_value()),
220        (Attribute::Name, Value::new_iname("testperson1")),
221        (Attribute::DisplayName, Value::new_utf8s("Test Person 1")),
222        (
223            Attribute::Uuid,
224            Value::Uuid(super::uuids::UUID_TESTPERSON_1)
225        )
226    );
227    pub static ref E_TESTPERSON_2: EntryInitNew = entry_init!(
228        (Attribute::Class, EntryClass::Object.to_value()),
229        (Attribute::Class, EntryClass::Account.to_value()),
230        (Attribute::Class, EntryClass::Person.to_value()),
231        (Attribute::Name, Value::new_iname("testperson2")),
232        (Attribute::DisplayName, Value::new_utf8s("Test Person 2")),
233        (
234            Attribute::Uuid,
235            Value::Uuid(super::uuids::UUID_TESTPERSON_2)
236        )
237    );
238}