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 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 pub fn as_f_eq(&self) -> crate::filter::FC {
214 crate::filter::f_eq(Attribute::Class, self.to_partialvalue())
215 }
216}
217
218#[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}