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    AssertionNonce,
31    AttributeType,
32    Builtin,
33    Class,
34    ClassType,
35    ClientCertificate,
36    Conflict,
37    DomainInfo,
38    DynGroup,
39    ExtensibleObject,
40    Feature,
41    Group,
42    KeyProvider,
43    KeyProviderInternal,
44    KeyObject,
45    KeyObjectHkdfS256,
46    KeyObjectJwtEs256,
47    KeyObjectJwtHs256,
48    KeyObjectJwtRs256,
49    KeyObjectJweA128GCM,
50    KeyObjectInternal,
51    MemberOf,
52    Memorial,
53    OAuth2Account,
54    OAuth2DeviceCodeSession,
55    OAuth2ResourceServer,
56    OAuth2ResourceServerBasic,
57    OAuth2ResourceServerPublic,
58    OAuth2Client,
59    Object,
60    OrgPerson,
61    OutboundMessage,
62    Person,
63    PosixAccount,
64    PosixGroup,
65    Recycled,
66    Service,
67    ServiceAccount,
68    SyncAccount,
69    SyncObject,
70    Tombstone,
71    User,
72    System,
73    SystemInfo,
74    SystemConfig,
75    #[cfg(any(test, debug_assertions))]
76    TestClass,
77}
78
79impl From<EntryClass> for ScimFilter {
80    fn from(ec: EntryClass) -> Self {
81        ScimFilter::Equal(Attribute::Class.into(), ec.into())
82    }
83}
84
85impl From<EntryClass> for &'static str {
86    fn from(val: EntryClass) -> Self {
87        match val {
88            EntryClass::AccessControlCreate => ACCESS_CONTROL_CREATE,
89            EntryClass::AccessControlDelete => ACCESS_CONTROL_DELETE,
90            EntryClass::AccessControlModify => ACCESS_CONTROL_MODIFY,
91            EntryClass::AccessControlProfile => ACCESS_CONTROL_PROFILE,
92            EntryClass::AccessControlReceiverEntryManager => ACCESS_CONTROL_RECEIVER_ENTRY_MANAGER,
93            EntryClass::AccessControlReceiverGroup => ACCESS_CONTROL_RECEIVER_GROUP,
94            EntryClass::AccessControlSearch => ACCESS_CONTROL_SEARCH,
95            EntryClass::AccessControlTargetScope => ACCESS_CONTROL_TARGET_SCOPE,
96            EntryClass::Account => ENTRYCLASS_ACCOUNT,
97            EntryClass::AccountPolicy => ENTRYCLASS_ACCOUNT_POLICY,
98            EntryClass::Application => ENTRYCLASS_APPLICATION,
99            EntryClass::AssertionNonce => ENTRYCLASS_ASSERTION_NONCE,
100            EntryClass::AttributeType => ENTRYCLASS_ATTRIBUTE_TYPE,
101            EntryClass::Builtin => ENTRYCLASS_BUILTIN,
102            EntryClass::Class => ENTRYCLASS_CLASS,
103            EntryClass::ClassType => ENTRYCLASS_CLASS_TYPE,
104            EntryClass::ClientCertificate => ENTRYCLASS_CLIENT_CERTIFICATE,
105            EntryClass::Conflict => ENTRYCLASS_CONFLICT,
106            EntryClass::DomainInfo => ENTRYCLASS_DOMAIN_INFO,
107            EntryClass::DynGroup => ENTRYCLASS_DYN_GROUP,
108            EntryClass::ExtensibleObject => ENTRYCLASS_EXTENSIBLE_OBJECT,
109            EntryClass::Feature => ENTRYCLASS_FEATURE,
110            EntryClass::Group => ENTRYCLASS_GROUP,
111            EntryClass::KeyProvider => ENTRYCLASS_KEY_PROVIDER,
112            EntryClass::KeyProviderInternal => ENTRYCLASS_KEY_PROVIDER_INTERNAL,
113            EntryClass::KeyObject => ENTRYCLASS_KEY_OBJECT,
114            EntryClass::KeyObjectHkdfS256 => ENTRYCLASS_KEY_OBJECT_HKDF_S256,
115            EntryClass::KeyObjectJwtEs256 => ENTRYCLASS_KEY_OBJECT_JWT_ES256,
116            EntryClass::KeyObjectJwtHs256 => ENTRYCLASS_KEY_OBJECT_JWT_HS256,
117            EntryClass::KeyObjectJwtRs256 => ENTRYCLASS_KEY_OBJECT_JWT_RS256,
118            EntryClass::KeyObjectJweA128GCM => ENTRYCLASS_KEY_OBJECT_JWE_A128GCM,
119            EntryClass::KeyObjectInternal => ENTRYCLASS_KEY_OBJECT_INTERNAL,
120            EntryClass::MemberOf => ENTRYCLASS_MEMBER_OF,
121            EntryClass::Memorial => ENTRYCLASS_MEMORIAL,
122            EntryClass::OAuth2Account => ENTRYCLASS_OAUTH2_ACCOUNT,
123            EntryClass::OAuth2Client => ENTRYCLASS_OAUTH2_CLIENT,
124            EntryClass::OAuth2DeviceCodeSession => OAUTH2_DEVICE_CODE_SESSION,
125            EntryClass::OAuth2ResourceServer => OAUTH2_RESOURCE_SERVER,
126            EntryClass::OAuth2ResourceServerBasic => OAUTH2_RESOURCE_SERVER_BASIC,
127            EntryClass::OAuth2ResourceServerPublic => OAUTH2_RESOURCE_SERVER_PUBLIC,
128            EntryClass::Object => ENTRYCLASS_OBJECT,
129            EntryClass::OrgPerson => ENTRYCLASS_ORG_PERSON,
130            EntryClass::OutboundMessage => ENTRYCLASS_OUTBOUND_MESSAGE,
131            EntryClass::Person => ENTRYCLASS_PERSON,
132            EntryClass::PosixAccount => ENTRYCLASS_POSIX_ACCOUNT,
133            EntryClass::PosixGroup => ENTRYCLASS_POSIX_GROUP,
134            EntryClass::Recycled => ENTRYCLASS_RECYCLED,
135            EntryClass::Service => ENTRYCLASS_SERVICE,
136            EntryClass::ServiceAccount => ENTRYCLASS_SERVICE_ACCOUNT,
137            EntryClass::SyncAccount => ENTRYCLASS_SYNC_ACCOUNT,
138            EntryClass::SyncObject => ENTRYCLASS_SYNC_OBJECT,
139            EntryClass::System => ENTRYCLASS_SYSTEM,
140            EntryClass::SystemConfig => ENTRYCLASS_SYSTEM_CONFIG,
141            EntryClass::SystemInfo => ENTRYCLASS_SYSTEM_INFO,
142            EntryClass::Tombstone => ENTRYCLASS_TOMBSTONE,
143            #[cfg(any(test, debug_assertions))]
144            EntryClass::TestClass => TEST_ENTRYCLASS_TEST_CLASS,
145            EntryClass::User => ENTRYCLASS_USER,
146        }
147    }
148}
149
150impl From<EntryClass> for JsonValue {
151    fn from(value: EntryClass) -> Self {
152        Self::String(value.as_ref().to_string())
153    }
154}
155
156impl AsRef<str> for EntryClass {
157    fn as_ref(&self) -> &str {
158        self.into()
159    }
160}
161
162impl From<&EntryClass> for &'static str {
163    fn from(value: &EntryClass) -> Self {
164        (*value).into()
165    }
166}
167
168impl From<EntryClass> for String {
169    fn from(val: EntryClass) -> Self {
170        let s: &'static str = val.into();
171        s.to_string()
172    }
173}
174
175impl From<EntryClass> for Value {
176    fn from(val: EntryClass) -> Self {
177        Value::new_iutf8(val.into())
178    }
179}
180
181impl From<EntryClass> for PartialValue {
182    fn from(val: EntryClass) -> Self {
183        PartialValue::new_iutf8(val.into())
184    }
185}
186
187impl From<EntryClass> for crate::prelude::AttrString {
188    fn from(val: EntryClass) -> Self {
189        crate::prelude::AttrString::from(val.to_string())
190    }
191}
192
193impl Display for EntryClass {
194    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> std::fmt::Result {
195        let s: String = (*self).into();
196        write!(f, "{s}")
197    }
198}
199
200impl EntryClass {
201    pub fn to_value(self) -> Value {
202        let s: &'static str = self.into();
203        Value::new_iutf8(s)
204    }
205
206    pub fn to_valueset(self) -> ValueSet {
207        let s: &'static str = self.into();
208        ValueSetIutf8::new(s)
209    }
210
211    pub fn to_partialvalue(self) -> PartialValue {
212        let s: &'static str = self.into();
213        PartialValue::new_iutf8(s)
214    }
215
216    /// Return a filter that'll match this class
217    pub fn as_f_eq(&self) -> crate::filter::FC {
218        crate::filter::f_eq(Attribute::Class, self.to_partialvalue())
219    }
220}
221
222// ============ TEST DATA ============
223#[cfg(test)]
224use crate::entry::{entry_init_fn, EntryInitNew};
225#[cfg(test)]
226use std::sync::LazyLock;
227
228#[cfg(test)]
229pub static E_TESTPERSON_1: LazyLock<EntryInitNew> = LazyLock::new(|| {
230    entry_init_fn([
231        (Attribute::Class, EntryClass::Object.to_value()),
232        (Attribute::Class, EntryClass::Account.to_value()),
233        (Attribute::Class, EntryClass::Person.to_value()),
234        (Attribute::Name, Value::new_iname("testperson1")),
235        (Attribute::DisplayName, Value::new_utf8s("Test Person 1")),
236        (
237            Attribute::Uuid,
238            Value::Uuid(super::uuids::UUID_TESTPERSON_1),
239        ),
240    ])
241});
242#[cfg(test)]
243pub static E_TESTPERSON_2: LazyLock<EntryInitNew> = LazyLock::new(|| {
244    entry_init_fn([
245        (Attribute::Class, EntryClass::Object.to_value()),
246        (Attribute::Class, EntryClass::Account.to_value()),
247        (Attribute::Class, EntryClass::Person.to_value()),
248        (Attribute::Name, Value::new_iname("testperson2")),
249        (Attribute::DisplayName, Value::new_utf8s("Test Person 2")),
250        (
251            Attribute::Uuid,
252            Value::Uuid(super::uuids::UUID_TESTPERSON_2),
253        ),
254    ])
255});