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