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