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