1use 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#[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 pub fn as_f_eq(&self) -> crate::filter::FC {
218 crate::filter::f_eq(Attribute::Class, self.to_partialvalue())
219 }
220}
221
222#[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});