1use super::credupdate::PasswordFeedback;
2use crate::attribute::Attribute;
3use serde::{Deserialize, Serialize};
4use std::fmt::{Display, Formatter};
5use utoipa::ToSchema;
6use uuid::Uuid;
7
8#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, ToSchema)]
10#[serde(rename_all = "lowercase")]
11pub enum SchemaError {
12 NotImplemented,
13 NoClassFound,
14 InvalidClass(Vec<String>),
15 MissingMustAttribute(Vec<Attribute>),
16 InvalidAttribute(String),
17 InvalidAttributeSyntax(String),
18 AttributeNotValidForClass(String),
19 SupplementsNotSatisfied(Vec<String>),
20 ExcludesNotSatisfied(Vec<String>),
21 EmptyFilter,
22 Corrupted,
23 PhantomAttribute(String),
24}
25
26#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, ToSchema)]
27#[serde(rename_all = "lowercase")]
28pub enum PluginError {
29 Base(String),
30 ReferentialIntegrity(String),
31 CredImport(String),
32 Oauth2Secrets,
33}
34
35#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, ToSchema)]
36#[serde(rename_all = "lowercase")]
37pub enum ConsistencyError {
38 Unknown,
39 SchemaClassMissingAttribute(String, String),
41 SchemaClassPhantomAttribute(String, String),
42 SchemaUuidNotUnique(Uuid),
43 QueryServerSearchFailure,
44 EntryUuidCorrupt(u64),
45 UuidIndexCorrupt(String),
46 UuidNotUnique(String),
47 RefintNotUpheld(u64),
48 MemberOfInvalid(u64),
49 InvalidAttributeType(String),
50 DuplicateUniqueAttribute,
51 InvalidSpn(u64),
52 SqliteIntegrityFailure,
53 BackendAllIdsSync,
54 BackendIndexSync,
55 ChangelogDesynchronised(u64),
56 ChangeStateDesynchronised(u64),
57 RuvInconsistent(String),
58 DeniedName(Uuid),
59 KeyProviderUuidMissing { key_object: Uuid },
60 KeyProviderNoKeys { key_object: Uuid },
61 KeyProviderNotFound { key_object: Uuid, provider: Uuid },
62}
63
64#[derive(Serialize, Deserialize, Debug, ToSchema)]
65#[serde(rename_all = "lowercase")]
66pub enum OperationError {
67 SessionExpired,
70 DuplicateKey,
71 DuplicateLabel,
72 EmptyRequest,
73 Backend,
74 NoMatchingEntries,
75 NoMatchingAttributes,
76 UniqueConstraintViolation,
77 CorruptedEntry(u64),
78 CorruptedIndex(String),
79 ConsistencyError(Vec<ConsistencyError>),
80 SchemaViolation(SchemaError),
81 Plugin(PluginError),
82 FilterGeneration,
83 FilterParseError,
84 FilterUuidResolution,
85 InvalidAttributeName(String),
86 InvalidAttribute(String),
87 InvalidLabel,
88 InvalidDbState,
89 InvalidCacheState,
90 InvalidValueState,
91 InvalidEntryId,
92 InvalidRequestState,
93 InvalidSyncState,
94 InvalidState,
95 InvalidEntryState,
96 InvalidUuid,
97 InvalidReplChangeId,
98 InvalidAcpState(String),
99 InvalidSchemaState(String),
100 InvalidAccountState(String),
101 MissingClass(String),
105 MissingAttribute(Attribute),
106 AttributeUniqueness(Vec<Attribute>),
107 MissingEntries,
108 ModifyAssertionFailed,
109 BackendEngine,
110 SqliteError, FsError,
112 SerdeJsonError,
113 SerdeCborError,
114 AccessDenied,
115 NotAuthenticated,
116 NotAuthorised,
117 InvalidAuthState(String),
118 InvalidSessionState,
119 SystemProtectedObject,
120 SystemProtectedAttribute,
121 PasswordQuality(Vec<PasswordFeedback>),
122 CryptographyError,
123 ResourceLimit,
124 QueueDisconnected,
125 Webauthn,
126 #[serde(with = "time::serde::timestamp")]
127 Wait(time::OffsetDateTime),
128 ReplReplayFailure,
129 ReplEntryNotChanged,
130 ReplInvalidRUVState,
131 ReplDomainLevelUnsatisfiable,
132 ReplDomainUuidMismatch,
133 ReplServerUuidSplitDataState,
134 TransactionAlreadyCommitted,
135 CannotStartMFADuringOngoingMFASession,
136 ValueDenyName,
139 DatabaseLockAcquisitionTimeout,
142 ReferenceLoop,
144 SessionMayNotReauth,
146
147 AU0001InvalidState,
149 AU0002JwsSerialisation,
150 AU0003JwsSignature,
151 AU0004UserAuthTokenInvalid,
152 AU0005DelayedProcessFailure,
153 AU0006CredentialMayNotReauthenticate,
154 AU0007UserAuthTokenInvalid,
155 AU0008ClientAuthInfoPrevalidation,
156
157 KG001TaskTimeout,
159 KG002TaskCommFailure,
160 KG003CacheClearFailed,
161 KG004UnknownFeatureUuid,
162 KG005HowDidYouEvenManageThis,
163 KG006DatastructureCorruption,
164
165 CU0001WebauthnAttestationNotTrusted,
167 CU0002WebauthnRegistrationError,
168 CU0003WebauthnUserNotVerified,
169
170 CU0004SessionInconsistent,
173 CU0005IntentTokenConflict,
175 CU0006IntentTokenInvalidated,
177
178 VS0001IncomingReplSshPublicKey,
180 VS0002CertificatePublicKeyDigest,
181 VS0003CertificateDerDecode,
182 VS0004CertificatePublicKeyDigest,
183 VS0005CertificatePublicKeyDigest,
184 VL0001ValueSshPublicKeyString,
186
187 LD0001AnonymousNotAllowed,
189
190 DB0001MismatchedRestoreVersion,
192 DB0002MismatchedRestoreVersion,
193 DB0003FilterResolveCacheBuild,
194 DB0004DatabaseTooOld,
195
196 SC0001IncomingSshPublicKey,
198 SC0002ReferenceSyntaxInvalid,
199 SC0003MailSyntaxInvalid,
200 SC0004UuidSyntaxInvalid,
201 SC0005BoolSyntaxInvalid,
202 SC0006Uint32SyntaxInvalid,
203 SC0007UrlSyntaxInvalid,
204 SC0008SyntaxTypeSyntaxInvalid,
205 SC0009IndexTypeSyntaxInvalid,
206 SC0010DateTimeSyntaxInvalid,
207 SC0011AddressSyntaxInvalid,
208 SC0012CertificateSyntaxInvalid,
209 SC0013CertificateInvalidDer,
210 SC0014CertificateInvalidDigest,
211 SC0015CredentialTypeSyntaxInvalid,
212 SC0016InameSyntaxInvalid,
213 SC0017Iutf8SyntaxInvalid,
214 SC0018NsUniqueIdSyntaxInvalid,
215 SC0019Oauth2ScopeSyntaxInvalid,
216 SC0020Oauth2ScopeMapSyntaxInvalid,
217 SC0021Oauth2ScopeMapMissingGroupIdentifier,
218 SC0022Oauth2ClaimMapSyntaxInvalid,
219 SC0023Oauth2ClaimMapMissingGroupIdentifier,
220 SC0024SshPublicKeySyntaxInvalid,
221 SC0025UiHintSyntaxInvalid,
222 SC0026Utf8SyntaxInvalid,
223 SC0027ClassSetInvalid,
224 SC0028CreatedUuidsInvalid,
225 SC0029PaginationOutOfBounds,
226 SC0030Sha256SyntaxInvalid,
227 SC0031Int64SyntaxInvalid,
228 SC0032Uint64SyntaxInvalid,
229 SC0033AssertionContainsDuplicateUuids,
230 MG0001InvalidReMigrationLevel,
232 MG0002RaiseDomainLevelExceedsMaximum,
233 MG0003ServerPhaseInvalidForMigration,
234 MG0004DomainLevelInDevelopment,
235 MG0005GidConstraintsNotMet,
236 MG0006SKConstraintsNotMet,
237 MG0007Oauth2StrictConstraintsNotMet,
238 MG0008SkipUpgradeAttempted,
239 MG0009InvalidTargetLevelForBootstrap,
240 MG0010DowngradeNotAllowed,
241 KP0001KeyProviderNotLoaded,
243 KP0002KeyProviderInvalidClass,
244 KP0003KeyProviderInvalidType,
245 KP0004KeyProviderMissingAttributeName,
246 KP0005KeyProviderDuplicate,
247 KP0006KeyObjectJwtEs256Generation,
248 KP0007KeyProviderDefaultNotAvailable,
249 KP0008KeyObjectMissingUuid,
250 KP0009KeyObjectPrivateToDer,
251 KP0010KeyObjectSignerToVerifier,
252 KP0011KeyObjectMissingClass,
253 KP0012KeyObjectMissingProvider,
254 KP0012KeyProviderNotLoaded,
255 KP0013KeyObjectJwsEs256DerInvalid,
256 KP0014KeyObjectSignerToVerifier,
257 KP0015KeyObjectJwsEs256DerInvalid,
258 KP0016KeyObjectJwsEs256DerInvalid,
259 KP0017KeyProviderNoSuchKey,
260 KP0018KeyProviderNoSuchKey,
261 KP0019KeyProviderUnsupportedAlgorithm,
262 KP0020KeyObjectNoActiveSigningKeys,
263 KP0021KeyObjectJwsEs256Signature,
264 KP0022KeyObjectJwsNotAssociated,
265 KP0023KeyObjectJwsKeyRevoked,
266 KP0024KeyObjectJwsInvalid,
267 KP0025KeyProviderNotAvailable,
268 KP0026KeyObjectNoSuchKey,
269 KP0027KeyObjectPublicToDer,
270 KP0028KeyObjectImportJwsEs256DerInvalid,
271 KP0029KeyObjectSignerToVerifier,
272 KP0030KeyObjectPublicToDer,
273 KP0031KeyObjectNotFound,
274 KP0032KeyProviderNoSuchKey,
275 KP0033KeyProviderNoSuchKey,
276 KP0034KeyProviderUnsupportedAlgorithm,
277 KP0035KeyObjectJweA128GCMGeneration,
278 KP0036KeyObjectPrivateToBytes,
279 KP0037KeyObjectImportJweA128GCMInvalid,
280 KP0038KeyObjectImportJweA128GCMInvalid,
281 KP0039KeyObjectJweNotAssociated,
282 KP0040KeyObjectJweInvalid,
283 KP0041KeyObjectJweRevoked,
284 KP0042KeyObjectNoActiveEncryptionKeys,
285 KP0043KeyObjectJweA128GCMEncryption,
286 KP0044KeyObjectJwsPublicJwk,
287
288 KP0045KeyObjectImportJwsRs256DerInvalid,
289 KP0046KeyObjectSignerToVerifier,
290 KP0047KeyObjectPublicToDer,
291 KP0048KeyObjectJwtRs256Generation,
292 KP0049KeyObjectSignerToVerifier,
293 KP0050KeyObjectPrivateToDer,
294 KP0051KeyObjectPublicToDer,
295 KP0052KeyObjectJwsRs256DerInvalid,
296 KP0053KeyObjectSignerToVerifier,
297 KP0054KeyObjectJwsRs256DerInvalid,
298 KP0055KeyObjectJwsRs256DerInvalid,
299 KP0056KeyObjectJwsRs256Signature,
300 KP0057KeyObjectJwsNotAssociated,
301 KP0058KeyObjectJwsInvalid,
302 KP0059KeyObjectJwsKeyRevoked,
303 KP0060KeyObjectJwsPublicJwk,
304 KP0061KeyObjectNoActiveSigningKeys,
305 KP0062KeyProviderNoSuchKey,
306
307 KP0063KeyObjectJwsHs256DerInvalid,
308 KP0064KeyObjectSignerToVerifier,
309 KP0065KeyObjectJwtHs256Generation,
310 KP0066KeyObjectJwsHs256DerInvalid,
311 KP0067KeyObjectSignerToVerifier,
312 KP0068KeyObjectJwsHs256DerInvalid,
313 KP0069KeyObjectNoActiveSigningKeys,
314 KP0070KeyObjectJwsHs256Signature,
315 KP0071KeyObjectPrivateToDer,
316
317 KP0072KeyObjectHs256Invalid,
318 KP0073KeyObjectHs256Invalid,
319 KP0074KeyObjectNoActiveSigningKeys,
320 KP0075KeyObjectHmacInvalidLength,
321 KP0076KeyObjectHkdfOutputLengthInvalid,
322 KP0077KeyProviderNoSuchKey,
323 KP0078KeyObjectNotFound,
324 KP0079KeyObjectNotFound,
325
326 KP0080KeyProviderNoSuchKey,
327
328 PL0001GidOverlapsSystemRange,
330
331 UI0001ChallengeSerialisation,
333 UI0002InvalidState,
334 UI0003InvalidOauth2Resume,
335 UI0004MemberAlreadyExists,
336
337 KU001InitWhileSessionActive,
339 KU002ContinueWhileSessionInActive,
340 KU003PamAuthFailed,
341 KU004PamInitFailed,
342 KU005ErrorCheckingAccount,
343 KU006OnlyRootAllowed,
344}
345
346impl PartialEq for OperationError {
347 fn eq(&self, other: &Self) -> bool {
348 std::mem::discriminant(self) == std::mem::discriminant(other)
352 }
353}
354
355impl Display for OperationError {
356 fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
357 let mut output = format!("{self:?}")
358 .split("::")
359 .last()
360 .unwrap_or("")
361 .to_string();
362
363 if let Some(msg) = self.message() {
364 output += &format!(" - {msg}");
365 };
366 f.write_str(&output)
367 }
368}
369
370impl OperationError {
371 pub fn message(&self) -> Option<String> {
373 match self {
374 Self::SessionExpired => None,
375 Self::EmptyRequest => None,
376 Self::Backend => None,
377 Self::NoMatchingEntries => None,
378 Self::NoMatchingAttributes => None,
379 Self::UniqueConstraintViolation => Some("A unique constraint was violated resulting in multiple conflicting results.".into()),
380 Self::CorruptedEntry(_) => None,
381 Self::CorruptedIndex(_) => None,
382 Self::ConsistencyError(_) => None,
383 Self::SchemaViolation(_) => None,
384 Self::Plugin(_) => None,
385 Self::FilterGeneration => None,
386 Self::FilterParseError => None,
387 Self::FilterUuidResolution => None,
388 Self::InvalidAttributeName(_) => None,
389 Self::InvalidAttribute(_) => None,
390 Self::InvalidLabel => Some("The submitted label for this item is invalid.".into()),
391 Self::DuplicateLabel => Some("The submitted label for this item is already in use.".into()),
392 Self::DuplicateKey => Some("The submitted key already exists.".into()),
393 Self::InvalidDbState => None,
394 Self::InvalidCacheState => None,
395 Self::InvalidValueState => None,
396 Self::InvalidEntryId => None,
397 Self::InvalidRequestState => None,
398 Self::InvalidSyncState => None,
399 Self::InvalidState => None,
400 Self::InvalidEntryState => None,
401 Self::InvalidUuid => None,
402 Self::InvalidReplChangeId => None,
403 Self::InvalidAcpState(_) => None,
404 Self::InvalidSchemaState(_) => None,
405 Self::InvalidAccountState(val) => Some(format!("Invalid account state: {val}")),
406 Self::MissingClass(val) => Some(format!("Missing class: {val}")),
407 Self::MissingAttribute(val) => Some(format!("Missing attribute: {val}")),
408 Self::AttributeUniqueness(attrs) => Some(format!("The value of some attributes is not unique. {attrs:?}")),
409 Self::MissingEntries => None,
410 Self::ModifyAssertionFailed => None,
411 Self::BackendEngine => None,
412 Self::SqliteError => None,
413 Self::FsError => None,
414 Self::SerdeJsonError => None,
415 Self::SerdeCborError => None,
416 Self::AccessDenied => None,
417 Self::NotAuthenticated => None,
418 Self::NotAuthorised => None,
419 Self::InvalidAuthState(_) => None,
420 Self::InvalidSessionState => None,
421 Self::SystemProtectedObject => None,
422 Self::SystemProtectedAttribute => None,
423 Self::PasswordQuality(_) => None,
424 Self::CryptographyError => None,
425 Self::ResourceLimit => None,
426 Self::QueueDisconnected => None,
427 Self::Webauthn => None,
428 Self::Wait(_) => None,
429 Self::CannotStartMFADuringOngoingMFASession => Some("Cannot start a new MFA authentication flow when there already is one active.".into()),
430 Self::ReplReplayFailure => None,
431 Self::ReplEntryNotChanged => None,
432 Self::ReplInvalidRUVState => None,
433 Self::ReplDomainLevelUnsatisfiable => None,
434 Self::ReplDomainUuidMismatch => None,
435 Self::ReplServerUuidSplitDataState => None,
436 Self::TransactionAlreadyCommitted => None,
437 Self::ValueDenyName => None,
438 Self::DatabaseLockAcquisitionTimeout => Some("Unable to acquire a database lock - the current server may be too busy. Try again later.".into()),
439 Self::ReferenceLoop => Some("The change you have made would introduce an invalid reference loop. Unable to proceed.".into()),
440 Self::SessionMayNotReauth => Some("The current session is not able to re-authenticate to elevate privileges to read-write.".into()),
441
442 Self::AU0001InvalidState => Some("Invalid authentication session state for request".into()),
443 Self::AU0002JwsSerialisation => Some("JWS serialisation failed".into()),
444 Self::AU0003JwsSignature => Some("JWS signature failed".into()),
445 Self::AU0004UserAuthTokenInvalid => Some("User auth token was unable to be generated".into()),
446 Self::AU0005DelayedProcessFailure => Some("Delaying processing failure, unable to proceed".into()),
447 Self::AU0006CredentialMayNotReauthenticate => Some("Credential may not reauthenticate".into()),
448 Self::AU0007UserAuthTokenInvalid => Some("User auth token was unable to be generated".into()),
449 Self::AU0008ClientAuthInfoPrevalidation => Some("Client Authentication Info prevalidation did not occur when expected".into()),
450
451 Self::CU0001WebauthnAttestationNotTrusted => None,
452 Self::CU0002WebauthnRegistrationError => None,
453 Self::CU0003WebauthnUserNotVerified => Some("User Verification bit not set while registering credential, you may need to configure a PIN on this device.".into()),
454
455 Self::CU0004SessionInconsistent => Some("The session is unable to be committed due to unresolved warnings.".into()),
456 Self::CU0005IntentTokenConflict => Some("The intent token used to create this session has been reused in another browser/tab and may not proceed.".into()),
457 Self::CU0006IntentTokenInvalidated => Some("The intent token has been invalidated/revoked before the commit could be accepted. Has it been used in another browser or tab?".into()),
458
459 Self::DB0001MismatchedRestoreVersion => None,
460 Self::DB0002MismatchedRestoreVersion => None,
461 Self::DB0003FilterResolveCacheBuild => None,
462 Self::DB0004DatabaseTooOld => Some("The database is too old to be migrated.".into()),
463 Self::KG001TaskTimeout => Some("Task timed out".into()),
464 Self::KG002TaskCommFailure => Some("Inter-Task communication failure".into()),
465 Self::KG003CacheClearFailed => Some("Failed to clear cache".into()),
466 Self::KG004UnknownFeatureUuid => None,
467 Self::KG005HowDidYouEvenManageThis => Some("You have damaged the fabric of space time and managed to perform an impossible action.".into()),
468 Self::KG006DatastructureCorruption => None,
469 Self::KP0001KeyProviderNotLoaded => None,
470 Self::KP0002KeyProviderInvalidClass => None,
471 Self::KP0003KeyProviderInvalidType => None,
472 Self::KP0004KeyProviderMissingAttributeName => None,
473 Self::KP0005KeyProviderDuplicate => None,
474 Self::KP0006KeyObjectJwtEs256Generation => None,
475 Self::KP0007KeyProviderDefaultNotAvailable => None,
476 Self::KP0008KeyObjectMissingUuid => None,
477 Self::KP0009KeyObjectPrivateToDer => None,
478 Self::KP0010KeyObjectSignerToVerifier => None,
479 Self::KP0011KeyObjectMissingClass => None,
480 Self::KP0012KeyObjectMissingProvider => None,
481 Self::KP0012KeyProviderNotLoaded => None,
482 Self::KP0013KeyObjectJwsEs256DerInvalid => None,
483 Self::KP0014KeyObjectSignerToVerifier => None,
484 Self::KP0015KeyObjectJwsEs256DerInvalid => None,
485 Self::KP0016KeyObjectJwsEs256DerInvalid => None,
486 Self::KP0017KeyProviderNoSuchKey => None,
487 Self::KP0018KeyProviderNoSuchKey => None,
488 Self::KP0019KeyProviderUnsupportedAlgorithm => None,
489 Self::KP0020KeyObjectNoActiveSigningKeys => None,
490 Self::KP0021KeyObjectJwsEs256Signature => None,
491 Self::KP0022KeyObjectJwsNotAssociated => None,
492 Self::KP0023KeyObjectJwsKeyRevoked => None,
493 Self::KP0024KeyObjectJwsInvalid => None,
494 Self::KP0025KeyProviderNotAvailable => None,
495 Self::KP0026KeyObjectNoSuchKey => None,
496 Self::KP0027KeyObjectPublicToDer => None,
497 Self::KP0028KeyObjectImportJwsEs256DerInvalid => None,
498 Self::KP0029KeyObjectSignerToVerifier => None,
499 Self::KP0030KeyObjectPublicToDer => None,
500 Self::KP0031KeyObjectNotFound => None,
501 Self::KP0032KeyProviderNoSuchKey => None,
502 Self::KP0033KeyProviderNoSuchKey => None,
503 Self::KP0034KeyProviderUnsupportedAlgorithm => None,
504 Self::KP0035KeyObjectJweA128GCMGeneration => None,
505 Self::KP0036KeyObjectPrivateToBytes => None,
506 Self::KP0037KeyObjectImportJweA128GCMInvalid => None,
507 Self::KP0038KeyObjectImportJweA128GCMInvalid => None,
508 Self::KP0039KeyObjectJweNotAssociated => None,
509 Self::KP0040KeyObjectJweInvalid => None,
510 Self::KP0041KeyObjectJweRevoked => None,
511 Self::KP0042KeyObjectNoActiveEncryptionKeys => None,
512 Self::KP0043KeyObjectJweA128GCMEncryption => None,
513 Self::KP0044KeyObjectJwsPublicJwk => None,
514
515 Self::KP0045KeyObjectImportJwsRs256DerInvalid => None,
516 Self::KP0046KeyObjectSignerToVerifier => None,
517 Self::KP0047KeyObjectPublicToDer => None,
518 Self::KP0048KeyObjectJwtRs256Generation => None,
519 Self::KP0049KeyObjectSignerToVerifier => None,
520 Self::KP0050KeyObjectPrivateToDer => None,
521 Self::KP0051KeyObjectPublicToDer => None,
522 Self::KP0052KeyObjectJwsRs256DerInvalid => None,
523 Self::KP0053KeyObjectSignerToVerifier => None,
524 Self::KP0054KeyObjectJwsRs256DerInvalid => None,
525 Self::KP0055KeyObjectJwsRs256DerInvalid => None,
526 Self::KP0056KeyObjectJwsRs256Signature => None,
527 Self::KP0057KeyObjectJwsNotAssociated => None,
528 Self::KP0058KeyObjectJwsInvalid => None,
529 Self::KP0059KeyObjectJwsKeyRevoked => None,
530 Self::KP0060KeyObjectJwsPublicJwk => None,
531 Self::KP0061KeyObjectNoActiveSigningKeys => None,
532 Self::KP0062KeyProviderNoSuchKey => None,
533 Self::KP0063KeyObjectJwsHs256DerInvalid => None,
534 Self::KP0064KeyObjectSignerToVerifier => None,
535 Self::KP0065KeyObjectJwtHs256Generation => None,
536 Self::KP0066KeyObjectJwsHs256DerInvalid => None,
537 Self::KP0067KeyObjectSignerToVerifier => None,
538 Self::KP0068KeyObjectJwsHs256DerInvalid => None,
539 Self::KP0069KeyObjectNoActiveSigningKeys => None,
540 Self::KP0070KeyObjectJwsHs256Signature => None,
541 Self::KP0071KeyObjectPrivateToDer => None,
542 Self::KP0072KeyObjectHs256Invalid => None,
543 Self::KP0073KeyObjectHs256Invalid => None,
544 Self::KP0074KeyObjectNoActiveSigningKeys => None,
545 Self::KP0075KeyObjectHmacInvalidLength => None,
546 Self::KP0076KeyObjectHkdfOutputLengthInvalid => None,
547 Self::KP0077KeyProviderNoSuchKey => None,
548 Self::KP0078KeyObjectNotFound => None,
549 Self::KP0079KeyObjectNotFound => None,
550 Self::KP0080KeyProviderNoSuchKey => None,
551
552 Self::KU001InitWhileSessionActive => Some("The session was active when the init function was called.".into()),
553 Self::KU002ContinueWhileSessionInActive => Some("Attempted to continue auth session while current session is inactive".into()),
554 Self::KU003PamAuthFailed => Some("Failed PAM account authentication step".into()),
555 Self::KU004PamInitFailed => Some("Failed to initialise PAM authentication".into()),
556 Self::KU005ErrorCheckingAccount => Some("Error checking account".into()),
557 Self::KU006OnlyRootAllowed => Some("Only root is allowed to perform this operation".into()),
558 Self::LD0001AnonymousNotAllowed => Some("Anonymous is not allowed to access LDAP with this method.".into()),
559 Self::MG0001InvalidReMigrationLevel => None,
560 Self::MG0002RaiseDomainLevelExceedsMaximum => None,
561 Self::MG0003ServerPhaseInvalidForMigration => None,
562 Self::MG0004DomainLevelInDevelopment => None,
563 Self::MG0005GidConstraintsNotMet => None,
564 Self::MG0006SKConstraintsNotMet => Some("Migration Constraints Not Met - Security Keys should not be present.".into()),
565 Self::MG0007Oauth2StrictConstraintsNotMet => Some("Migration Constraints Not Met - All OAuth2 clients must have strict-redirect-uri mode enabled.".into()),
566 Self::MG0008SkipUpgradeAttempted => Some("Skip Upgrade Attempted.".into()),
567 Self::MG0009InvalidTargetLevelForBootstrap => Some("The request target domain level was not valid for bootstrapping a new server instance".into()),
568 Self::MG0010DowngradeNotAllowed => Some("Downgrade Attempted".into()),
569 Self::PL0001GidOverlapsSystemRange => None,
570 Self::SC0001IncomingSshPublicKey => None,
571 Self::SC0002ReferenceSyntaxInvalid => Some("A SCIM Reference Set contained invalid syntax and can not be processed.".into()),
572 Self::SC0003MailSyntaxInvalid => Some("A SCIM Mail Address contained invalid syntax".into()),
573 Self::SC0004UuidSyntaxInvalid => Some("A SCIM Uuid contained invalid syntax".into()),
574 Self::SC0005BoolSyntaxInvalid => Some("A SCIM boolean contained invalid syntax".into()),
575 Self::SC0006Uint32SyntaxInvalid => Some("A SCIM Uint32 contained invalid syntax".into()),
576 Self::SC0007UrlSyntaxInvalid => Some("A SCIM Url contained invalid syntax".into()),
577 Self::SC0008SyntaxTypeSyntaxInvalid => Some("A SCIM SyntaxType contained invalid syntax".into()),
578 Self::SC0009IndexTypeSyntaxInvalid => Some("A SCIM IndexType contained invalid syntax".into()),
579 Self::SC0010DateTimeSyntaxInvalid => Some("A SCIM DateTime contained invalid syntax".into()),
580
581 Self::SC0011AddressSyntaxInvalid => Some("A SCIM Address contained invalid syntax".into()),
582 Self::SC0012CertificateSyntaxInvalid => Some("A SCIM Certificate contained invalid binary data".into()),
583 Self::SC0013CertificateInvalidDer => Some("A SCIM Certificate did not contain valid DER".into()),
584 Self::SC0014CertificateInvalidDigest => Some("A SCIM Certificate was unable to be digested".into()),
585 Self::SC0015CredentialTypeSyntaxInvalid => Some("A SCIM CredentialType contained invalid syntax".into()),
586 Self::SC0016InameSyntaxInvalid => Some("A SCIM Iname string contained invalid syntax".into()),
587 Self::SC0017Iutf8SyntaxInvalid => Some("A SCIM Iutf8 string contained invalid syntax".into()),
588 Self::SC0018NsUniqueIdSyntaxInvalid => Some("A SCIM NsUniqueID contained invalid syntax".into()),
589 Self::SC0019Oauth2ScopeSyntaxInvalid => Some("A SCIM Oauth2 Scope contained invalid syntax".into()),
590 Self::SC0020Oauth2ScopeMapSyntaxInvalid => Some("A SCIM Oauth2 Scope Map contained invalid syntax".into()),
591 Self::SC0021Oauth2ScopeMapMissingGroupIdentifier => Some("A SCIM Oauth2 Scope Map was missing a group name or uuid".into()),
592 Self::SC0022Oauth2ClaimMapSyntaxInvalid => Some("A SCIM Oauth2 Claim Map contained invalid syntax".into()),
593 Self::SC0023Oauth2ClaimMapMissingGroupIdentifier => Some("A SCIM Claim Map was missing a group name or uuid".into()),
594 Self::SC0024SshPublicKeySyntaxInvalid => Some("A SCIM Ssh Public Key contained invalid syntax".into()),
595 Self::SC0025UiHintSyntaxInvalid => Some("A SCIM UiHint contained invalid syntax".into()),
596 Self::SC0026Utf8SyntaxInvalid => Some("A SCIM Utf8 String Scope Map contained invalid syntax".into()),
597 Self::SC0027ClassSetInvalid => Some("The internal set of class templates used in this create operation was invalid. THIS IS A BUG.".into()),
598 Self::SC0028CreatedUuidsInvalid => Some("The internal create query did not return the set of created UUIDs. THIS IS A BUG".into()),
599 Self::SC0029PaginationOutOfBounds => Some("The requested range for pagination was out of bounds of the result set".into()),
600 Self::SC0030Sha256SyntaxInvalid => Some("A SCIM SHA256 hex string was invalid.".into()),
601 Self::SC0031Int64SyntaxInvalid => Some("A SCIM Int64 contained invalid syntax".into()),
602 Self::SC0032Uint64SyntaxInvalid => Some("A SCIM Uint64 contained invalid syntax".into()),
603 Self::SC0033AssertionContainsDuplicateUuids => Some("SCIM assertion contains duplicate entry ids, unable to proceed.".into()),
604 Self::UI0001ChallengeSerialisation => Some("The WebAuthn challenge was unable to be serialised.".into()),
605 Self::UI0002InvalidState => Some("The credential update process returned an invalid state transition.".into()),
606 Self::UI0003InvalidOauth2Resume => Some("The server attempted to resume OAuth2, but no OAuth2 session is in progress.".into()),
607 Self::UI0004MemberAlreadyExists => Some("The target is already a member.".into()),
608 Self::VL0001ValueSshPublicKeyString => None,
609 Self::VS0001IncomingReplSshPublicKey => None,
610 Self::VS0002CertificatePublicKeyDigest |
611 Self::VS0003CertificateDerDecode => Some("Decoding the stored certificate from DER failed.".into()),
612 Self::VS0004CertificatePublicKeyDigest |
613 Self::VS0005CertificatePublicKeyDigest => Some("The certificates public key is unable to be digested.".into()),
614
615 }
616 }
617}
618
619#[test]
620fn test_operationerror_as_nice_string() {
621 assert_eq!(
622 OperationError::CU0001WebauthnAttestationNotTrusted.to_string(),
623 "CU0001WebauthnAttestationNotTrusted".to_string()
624 );
625 assert_eq!(
626 OperationError::CU0003WebauthnUserNotVerified.to_string(),
627 "CU0003WebauthnUserNotVerified - User Verification bit not set while registering credential, you may need to configure a PIN on this device.".to_string()
628 );
629 assert_eq!(
630 OperationError::SessionExpired.to_string(),
631 "SessionExpired".to_string()
632 );
633 assert_eq!(
634 OperationError::CorruptedEntry(12345).to_string(),
635 "CorruptedEntry(12345)".to_string()
636 );
637}