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 CU0007AccountEmailNotFound,
178 CU0008AccountMissingEmail,
179 CU0009AccountEmailNotFound,
180 CU0010AccountRecoveryDisabled,
181
182 VS0001IncomingReplSshPublicKey,
184 VS0002CertificatePublicKeyDigest,
185 VS0003CertificateDerDecode,
186 VS0004CertificatePublicKeyDigest,
187 VS0005CertificatePublicKeyDigest,
188 VL0001ValueSshPublicKeyString,
190
191 LD0001AnonymousNotAllowed,
193
194 DB0001MismatchedRestoreVersion,
196 DB0002MismatchedRestoreVersion,
197 DB0003FilterResolveCacheBuild,
198 DB0004DatabaseTooOld,
199
200 SC0001IncomingSshPublicKey,
202 SC0002ReferenceSyntaxInvalid,
203 SC0003MailSyntaxInvalid,
204 SC0004UuidSyntaxInvalid,
205 SC0005BoolSyntaxInvalid,
206 SC0006Uint32SyntaxInvalid,
207 SC0007UrlSyntaxInvalid,
208 SC0008SyntaxTypeSyntaxInvalid,
209 SC0009IndexTypeSyntaxInvalid,
210 SC0010DateTimeSyntaxInvalid,
211 SC0011AddressSyntaxInvalid,
212 SC0012CertificateSyntaxInvalid,
213 SC0013CertificateInvalidDer,
214 SC0014CertificateInvalidDigest,
215 SC0015CredentialTypeSyntaxInvalid,
216 SC0016InameSyntaxInvalid,
217 SC0017Iutf8SyntaxInvalid,
218 SC0018NsUniqueIdSyntaxInvalid,
219 SC0019Oauth2ScopeSyntaxInvalid,
220 SC0020Oauth2ScopeMapSyntaxInvalid,
221 SC0021Oauth2ScopeMapMissingGroupIdentifier,
222 SC0022Oauth2ClaimMapSyntaxInvalid,
223 SC0023Oauth2ClaimMapMissingGroupIdentifier,
224 SC0024SshPublicKeySyntaxInvalid,
225 SC0025UiHintSyntaxInvalid,
226 SC0026Utf8SyntaxInvalid,
227 SC0027ClassSetInvalid,
228 SC0028CreatedUuidsInvalid,
229 SC0029PaginationOutOfBounds,
230 SC0030Sha256SyntaxInvalid,
231 SC0031Int64SyntaxInvalid,
232 SC0032Uint64SyntaxInvalid,
233 SC0033AssertionContainsDuplicateUuids,
234 MG0001InvalidReMigrationLevel,
236 MG0002RaiseDomainLevelExceedsMaximum,
237 MG0003ServerPhaseInvalidForMigration,
238 MG0004DomainLevelInDevelopment,
239 MG0005GidConstraintsNotMet,
240 MG0006SKConstraintsNotMet,
241 MG0007Oauth2StrictConstraintsNotMet,
242 MG0008SkipUpgradeAttempted,
243 MG0009InvalidTargetLevelForBootstrap,
244 MG0010DowngradeNotAllowed,
245 KP0001KeyProviderNotLoaded,
247 KP0002KeyProviderInvalidClass,
248 KP0003KeyProviderInvalidType,
249 KP0004KeyProviderMissingAttributeName,
250 KP0005KeyProviderDuplicate,
251 KP0006KeyObjectJwtEs256Generation,
252 KP0007KeyProviderDefaultNotAvailable,
253 KP0008KeyObjectMissingUuid,
254 KP0009KeyObjectPrivateToDer,
255 KP0010KeyObjectSignerToVerifier,
256 KP0011KeyObjectMissingClass,
257 KP0012KeyObjectMissingProvider,
258 KP0012KeyProviderNotLoaded,
259 KP0013KeyObjectJwsEs256DerInvalid,
260 KP0014KeyObjectSignerToVerifier,
261 KP0015KeyObjectJwsEs256DerInvalid,
262 KP0016KeyObjectJwsEs256DerInvalid,
263 KP0017KeyProviderNoSuchKey,
264 KP0018KeyProviderNoSuchKey,
265 KP0019KeyProviderUnsupportedAlgorithm,
266 KP0020KeyObjectNoActiveSigningKeys,
267 KP0021KeyObjectJwsEs256Signature,
268 KP0022KeyObjectJwsNotAssociated,
269 KP0023KeyObjectJwsKeyRevoked,
270 KP0024KeyObjectJwsInvalid,
271 KP0025KeyProviderNotAvailable,
272 KP0026KeyObjectNoSuchKey,
273 KP0027KeyObjectPublicToDer,
274 KP0028KeyObjectImportJwsEs256DerInvalid,
275 KP0029KeyObjectSignerToVerifier,
276 KP0030KeyObjectPublicToDer,
277 KP0031KeyObjectNotFound,
278 KP0032KeyProviderNoSuchKey,
279 KP0033KeyProviderNoSuchKey,
280 KP0034KeyProviderUnsupportedAlgorithm,
281 KP0035KeyObjectJweA128GCMGeneration,
282 KP0036KeyObjectPrivateToBytes,
283 KP0037KeyObjectImportJweA128GCMInvalid,
284 KP0038KeyObjectImportJweA128GCMInvalid,
285 KP0039KeyObjectJweNotAssociated,
286 KP0040KeyObjectJweInvalid,
287 KP0041KeyObjectJweRevoked,
288 KP0042KeyObjectNoActiveEncryptionKeys,
289 KP0043KeyObjectJweA128GCMEncryption,
290 KP0044KeyObjectJwsPublicJwk,
291
292 KP0045KeyObjectImportJwsRs256DerInvalid,
293 KP0046KeyObjectSignerToVerifier,
294 KP0047KeyObjectPublicToDer,
295 KP0048KeyObjectJwtRs256Generation,
296 KP0049KeyObjectSignerToVerifier,
297 KP0050KeyObjectPrivateToDer,
298 KP0051KeyObjectPublicToDer,
299 KP0052KeyObjectJwsRs256DerInvalid,
300 KP0053KeyObjectSignerToVerifier,
301 KP0054KeyObjectJwsRs256DerInvalid,
302 KP0055KeyObjectJwsRs256DerInvalid,
303 KP0056KeyObjectJwsRs256Signature,
304 KP0057KeyObjectJwsNotAssociated,
305 KP0058KeyObjectJwsInvalid,
306 KP0059KeyObjectJwsKeyRevoked,
307 KP0060KeyObjectJwsPublicJwk,
308 KP0061KeyObjectNoActiveSigningKeys,
309 KP0062KeyProviderNoSuchKey,
310
311 KP0063KeyObjectJwsHs256DerInvalid,
312 KP0064KeyObjectSignerToVerifier,
313 KP0065KeyObjectJwtHs256Generation,
314 KP0066KeyObjectJwsHs256DerInvalid,
315 KP0067KeyObjectSignerToVerifier,
316 KP0068KeyObjectJwsHs256DerInvalid,
317 KP0069KeyObjectNoActiveSigningKeys,
318 KP0070KeyObjectJwsHs256Signature,
319 KP0071KeyObjectPrivateToDer,
320
321 KP0072KeyObjectHs256Invalid,
322 KP0073KeyObjectHs256Invalid,
323 KP0074KeyObjectNoActiveSigningKeys,
324 KP0075KeyObjectHmacInvalidLength,
325 KP0076KeyObjectHkdfOutputLengthInvalid,
326 KP0077KeyProviderNoSuchKey,
327 KP0078KeyObjectNotFound,
328 KP0079KeyObjectNotFound,
329
330 KP0080KeyProviderNoSuchKey,
331
332 PL0001GidOverlapsSystemRange,
334
335 UI0001ChallengeSerialisation,
337 UI0002InvalidState,
338 UI0003InvalidOauth2Resume,
339 UI0004MemberAlreadyExists,
340
341 KU001InitWhileSessionActive,
343 KU002ContinueWhileSessionInActive,
344 KU003PamAuthFailed,
345 KU004PamInitFailed,
346 KU005ErrorCheckingAccount,
347 KU006OnlyRootAllowed,
348}
349
350impl PartialEq for OperationError {
351 fn eq(&self, other: &Self) -> bool {
352 std::mem::discriminant(self) == std::mem::discriminant(other)
356 }
357}
358
359impl Display for OperationError {
360 fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
361 let mut output = format!("{self:?}")
362 .split("::")
363 .last()
364 .unwrap_or("")
365 .to_string();
366
367 if let Some(msg) = self.message() {
368 output += &format!(" - {msg}");
369 };
370 f.write_str(&output)
371 }
372}
373
374impl OperationError {
375 pub fn message(&self) -> Option<String> {
377 match self {
378 Self::SessionExpired => None,
379 Self::EmptyRequest => None,
380 Self::Backend => None,
381 Self::NoMatchingEntries => None,
382 Self::NoMatchingAttributes => None,
383 Self::UniqueConstraintViolation => Some("A unique constraint was violated resulting in multiple conflicting results.".into()),
384 Self::CorruptedEntry(_) => None,
385 Self::CorruptedIndex(_) => None,
386 Self::ConsistencyError(_) => None,
387 Self::SchemaViolation(_) => None,
388 Self::Plugin(_) => None,
389 Self::FilterGeneration => None,
390 Self::FilterParseError => None,
391 Self::FilterUuidResolution => None,
392 Self::InvalidAttributeName(_) => None,
393 Self::InvalidAttribute(_) => None,
394 Self::InvalidLabel => Some("The submitted label for this item is invalid.".into()),
395 Self::DuplicateLabel => Some("The submitted label for this item is already in use.".into()),
396 Self::DuplicateKey => Some("The submitted key already exists.".into()),
397 Self::InvalidDbState => None,
398 Self::InvalidCacheState => None,
399 Self::InvalidValueState => None,
400 Self::InvalidEntryId => None,
401 Self::InvalidRequestState => None,
402 Self::InvalidSyncState => None,
403 Self::InvalidState => None,
404 Self::InvalidEntryState => None,
405 Self::InvalidUuid => None,
406 Self::InvalidReplChangeId => None,
407 Self::InvalidAcpState(_) => None,
408 Self::InvalidSchemaState(_) => None,
409 Self::InvalidAccountState(val) => Some(format!("Invalid account state: {val}")),
410 Self::MissingClass(val) => Some(format!("Missing class: {val}")),
411 Self::MissingAttribute(val) => Some(format!("Missing attribute: {val}")),
412 Self::AttributeUniqueness(attrs) => Some(format!("The value of some attributes is not unique. {attrs:?}")),
413 Self::MissingEntries => None,
414 Self::ModifyAssertionFailed => None,
415 Self::BackendEngine => None,
416 Self::SqliteError => None,
417 Self::FsError => None,
418 Self::SerdeJsonError => None,
419 Self::SerdeCborError => None,
420 Self::AccessDenied => None,
421 Self::NotAuthenticated => None,
422 Self::NotAuthorised => None,
423 Self::InvalidAuthState(_) => None,
424 Self::InvalidSessionState => None,
425 Self::SystemProtectedObject => None,
426 Self::SystemProtectedAttribute => None,
427 Self::PasswordQuality(_) => None,
428 Self::CryptographyError => None,
429 Self::ResourceLimit => None,
430 Self::QueueDisconnected => None,
431 Self::Webauthn => None,
432 Self::Wait(_) => None,
433 Self::CannotStartMFADuringOngoingMFASession => Some("Cannot start a new MFA authentication flow when there already is one active.".into()),
434 Self::ReplReplayFailure => None,
435 Self::ReplEntryNotChanged => None,
436 Self::ReplInvalidRUVState => None,
437 Self::ReplDomainLevelUnsatisfiable => None,
438 Self::ReplDomainUuidMismatch => None,
439 Self::ReplServerUuidSplitDataState => None,
440 Self::TransactionAlreadyCommitted => None,
441 Self::ValueDenyName => None,
442 Self::DatabaseLockAcquisitionTimeout => Some("Unable to acquire a database lock - the current server may be too busy. Try again later.".into()),
443 Self::ReferenceLoop => Some("The change you have made would introduce an invalid reference loop. Unable to proceed.".into()),
444 Self::SessionMayNotReauth => Some("The current session is not able to re-authenticate to elevate privileges to read-write.".into()),
445
446 Self::AU0001InvalidState => Some("Invalid authentication session state for request".into()),
447 Self::AU0002JwsSerialisation => Some("JWS serialisation failed".into()),
448 Self::AU0003JwsSignature => Some("JWS signature failed".into()),
449 Self::AU0004UserAuthTokenInvalid => Some("User auth token was unable to be generated".into()),
450 Self::AU0005DelayedProcessFailure => Some("Delaying processing failure, unable to proceed".into()),
451 Self::AU0006CredentialMayNotReauthenticate => Some("Credential may not reauthenticate".into()),
452 Self::AU0007UserAuthTokenInvalid => Some("User auth token was unable to be generated".into()),
453 Self::AU0008ClientAuthInfoPrevalidation => Some("Client Authentication Info prevalidation did not occur when expected".into()),
454
455 Self::CU0001WebauthnAttestationNotTrusted => None,
456 Self::CU0002WebauthnRegistrationError => None,
457 Self::CU0003WebauthnUserNotVerified => Some("User Verification bit not set while registering credential, you may need to configure a PIN on this device.".into()),
458
459 Self::CU0004SessionInconsistent => Some("The session is unable to be committed due to unresolved warnings.".into()),
460 Self::CU0005IntentTokenConflict => Some("The intent token used to create this session has been reused in another browser/tab and may not proceed.".into()),
461 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()),
462 Self::CU0007AccountEmailNotFound |
463 Self::CU0009AccountEmailNotFound
464 => Some("The target email for a credential update intent token send request is not registered to the account.".into()),
465 Self::CU0008AccountMissingEmail => Some("The account has no email addresses and may not have a credential update intent token sent to it.".into()),
466 Self::CU0010AccountRecoveryDisabled => Some("The account recovery feature is disabled. See `kanidm system domain set-allow-account-recovery`".into()),
467
468 Self::DB0001MismatchedRestoreVersion => None,
469 Self::DB0002MismatchedRestoreVersion => None,
470 Self::DB0003FilterResolveCacheBuild => None,
471 Self::DB0004DatabaseTooOld => Some("The database is too old to be migrated.".into()),
472 Self::KG001TaskTimeout => Some("Task timed out".into()),
473 Self::KG002TaskCommFailure => Some("Inter-Task communication failure".into()),
474 Self::KG003CacheClearFailed => Some("Failed to clear cache".into()),
475 Self::KG004UnknownFeatureUuid => None,
476 Self::KG005HowDidYouEvenManageThis => Some("You have damaged the fabric of space time and managed to perform an impossible action.".into()),
477 Self::KG006DatastructureCorruption => None,
478 Self::KP0001KeyProviderNotLoaded => None,
479 Self::KP0002KeyProviderInvalidClass => None,
480 Self::KP0003KeyProviderInvalidType => None,
481 Self::KP0004KeyProviderMissingAttributeName => None,
482 Self::KP0005KeyProviderDuplicate => None,
483 Self::KP0006KeyObjectJwtEs256Generation => None,
484 Self::KP0007KeyProviderDefaultNotAvailable => None,
485 Self::KP0008KeyObjectMissingUuid => None,
486 Self::KP0009KeyObjectPrivateToDer => None,
487 Self::KP0010KeyObjectSignerToVerifier => None,
488 Self::KP0011KeyObjectMissingClass => None,
489 Self::KP0012KeyObjectMissingProvider => None,
490 Self::KP0012KeyProviderNotLoaded => None,
491 Self::KP0013KeyObjectJwsEs256DerInvalid => None,
492 Self::KP0014KeyObjectSignerToVerifier => None,
493 Self::KP0015KeyObjectJwsEs256DerInvalid => None,
494 Self::KP0016KeyObjectJwsEs256DerInvalid => None,
495 Self::KP0017KeyProviderNoSuchKey => None,
496 Self::KP0018KeyProviderNoSuchKey => None,
497 Self::KP0019KeyProviderUnsupportedAlgorithm => None,
498 Self::KP0020KeyObjectNoActiveSigningKeys => None,
499 Self::KP0021KeyObjectJwsEs256Signature => None,
500 Self::KP0022KeyObjectJwsNotAssociated => None,
501 Self::KP0023KeyObjectJwsKeyRevoked => None,
502 Self::KP0024KeyObjectJwsInvalid => None,
503 Self::KP0025KeyProviderNotAvailable => None,
504 Self::KP0026KeyObjectNoSuchKey => None,
505 Self::KP0027KeyObjectPublicToDer => None,
506 Self::KP0028KeyObjectImportJwsEs256DerInvalid => None,
507 Self::KP0029KeyObjectSignerToVerifier => None,
508 Self::KP0030KeyObjectPublicToDer => None,
509 Self::KP0031KeyObjectNotFound => None,
510 Self::KP0032KeyProviderNoSuchKey => None,
511 Self::KP0033KeyProviderNoSuchKey => None,
512 Self::KP0034KeyProviderUnsupportedAlgorithm => None,
513 Self::KP0035KeyObjectJweA128GCMGeneration => None,
514 Self::KP0036KeyObjectPrivateToBytes => None,
515 Self::KP0037KeyObjectImportJweA128GCMInvalid => None,
516 Self::KP0038KeyObjectImportJweA128GCMInvalid => None,
517 Self::KP0039KeyObjectJweNotAssociated => None,
518 Self::KP0040KeyObjectJweInvalid => None,
519 Self::KP0041KeyObjectJweRevoked => None,
520 Self::KP0042KeyObjectNoActiveEncryptionKeys => None,
521 Self::KP0043KeyObjectJweA128GCMEncryption => None,
522 Self::KP0044KeyObjectJwsPublicJwk => None,
523
524 Self::KP0045KeyObjectImportJwsRs256DerInvalid => None,
525 Self::KP0046KeyObjectSignerToVerifier => None,
526 Self::KP0047KeyObjectPublicToDer => None,
527 Self::KP0048KeyObjectJwtRs256Generation => None,
528 Self::KP0049KeyObjectSignerToVerifier => None,
529 Self::KP0050KeyObjectPrivateToDer => None,
530 Self::KP0051KeyObjectPublicToDer => None,
531 Self::KP0052KeyObjectJwsRs256DerInvalid => None,
532 Self::KP0053KeyObjectSignerToVerifier => None,
533 Self::KP0054KeyObjectJwsRs256DerInvalid => None,
534 Self::KP0055KeyObjectJwsRs256DerInvalid => None,
535 Self::KP0056KeyObjectJwsRs256Signature => None,
536 Self::KP0057KeyObjectJwsNotAssociated => None,
537 Self::KP0058KeyObjectJwsInvalid => None,
538 Self::KP0059KeyObjectJwsKeyRevoked => None,
539 Self::KP0060KeyObjectJwsPublicJwk => None,
540 Self::KP0061KeyObjectNoActiveSigningKeys => None,
541 Self::KP0062KeyProviderNoSuchKey => None,
542 Self::KP0063KeyObjectJwsHs256DerInvalid => None,
543 Self::KP0064KeyObjectSignerToVerifier => None,
544 Self::KP0065KeyObjectJwtHs256Generation => None,
545 Self::KP0066KeyObjectJwsHs256DerInvalid => None,
546 Self::KP0067KeyObjectSignerToVerifier => None,
547 Self::KP0068KeyObjectJwsHs256DerInvalid => None,
548 Self::KP0069KeyObjectNoActiveSigningKeys => None,
549 Self::KP0070KeyObjectJwsHs256Signature => None,
550 Self::KP0071KeyObjectPrivateToDer => None,
551 Self::KP0072KeyObjectHs256Invalid => None,
552 Self::KP0073KeyObjectHs256Invalid => None,
553 Self::KP0074KeyObjectNoActiveSigningKeys => None,
554 Self::KP0075KeyObjectHmacInvalidLength => None,
555 Self::KP0076KeyObjectHkdfOutputLengthInvalid => None,
556 Self::KP0077KeyProviderNoSuchKey => None,
557 Self::KP0078KeyObjectNotFound => None,
558 Self::KP0079KeyObjectNotFound => None,
559 Self::KP0080KeyProviderNoSuchKey => None,
560
561 Self::KU001InitWhileSessionActive => Some("The session was active when the init function was called.".into()),
562 Self::KU002ContinueWhileSessionInActive => Some("Attempted to continue auth session while current session is inactive".into()),
563 Self::KU003PamAuthFailed => Some("Failed PAM account authentication step".into()),
564 Self::KU004PamInitFailed => Some("Failed to initialise PAM authentication".into()),
565 Self::KU005ErrorCheckingAccount => Some("Error checking account".into()),
566 Self::KU006OnlyRootAllowed => Some("Only root is allowed to perform this operation".into()),
567 Self::LD0001AnonymousNotAllowed => Some("Anonymous is not allowed to access LDAP with this method.".into()),
568 Self::MG0001InvalidReMigrationLevel => None,
569 Self::MG0002RaiseDomainLevelExceedsMaximum => None,
570 Self::MG0003ServerPhaseInvalidForMigration => None,
571 Self::MG0004DomainLevelInDevelopment => None,
572 Self::MG0005GidConstraintsNotMet => None,
573 Self::MG0006SKConstraintsNotMet => Some("Migration Constraints Not Met - Security Keys should not be present.".into()),
574 Self::MG0007Oauth2StrictConstraintsNotMet => Some("Migration Constraints Not Met - All OAuth2 clients must have strict-redirect-uri mode enabled.".into()),
575 Self::MG0008SkipUpgradeAttempted => Some("Skip Upgrade Attempted.".into()),
576 Self::MG0009InvalidTargetLevelForBootstrap => Some("The request target domain level was not valid for bootstrapping a new server instance".into()),
577 Self::MG0010DowngradeNotAllowed => Some("Downgrade Attempted".into()),
578 Self::PL0001GidOverlapsSystemRange => None,
579 Self::SC0001IncomingSshPublicKey => None,
580 Self::SC0002ReferenceSyntaxInvalid => Some("A SCIM Reference Set contained invalid syntax and can not be processed.".into()),
581 Self::SC0003MailSyntaxInvalid => Some("A SCIM Mail Address contained invalid syntax".into()),
582 Self::SC0004UuidSyntaxInvalid => Some("A SCIM Uuid contained invalid syntax".into()),
583 Self::SC0005BoolSyntaxInvalid => Some("A SCIM boolean contained invalid syntax".into()),
584 Self::SC0006Uint32SyntaxInvalid => Some("A SCIM Uint32 contained invalid syntax".into()),
585 Self::SC0007UrlSyntaxInvalid => Some("A SCIM Url contained invalid syntax".into()),
586 Self::SC0008SyntaxTypeSyntaxInvalid => Some("A SCIM SyntaxType contained invalid syntax".into()),
587 Self::SC0009IndexTypeSyntaxInvalid => Some("A SCIM IndexType contained invalid syntax".into()),
588 Self::SC0010DateTimeSyntaxInvalid => Some("A SCIM DateTime contained invalid syntax".into()),
589
590 Self::SC0011AddressSyntaxInvalid => Some("A SCIM Address contained invalid syntax".into()),
591 Self::SC0012CertificateSyntaxInvalid => Some("A SCIM Certificate contained invalid binary data".into()),
592 Self::SC0013CertificateInvalidDer => Some("A SCIM Certificate did not contain valid DER".into()),
593 Self::SC0014CertificateInvalidDigest => Some("A SCIM Certificate was unable to be digested".into()),
594 Self::SC0015CredentialTypeSyntaxInvalid => Some("A SCIM CredentialType contained invalid syntax".into()),
595 Self::SC0016InameSyntaxInvalid => Some("A SCIM Iname string contained invalid syntax".into()),
596 Self::SC0017Iutf8SyntaxInvalid => Some("A SCIM Iutf8 string contained invalid syntax".into()),
597 Self::SC0018NsUniqueIdSyntaxInvalid => Some("A SCIM NsUniqueID contained invalid syntax".into()),
598 Self::SC0019Oauth2ScopeSyntaxInvalid => Some("A SCIM Oauth2 Scope contained invalid syntax".into()),
599 Self::SC0020Oauth2ScopeMapSyntaxInvalid => Some("A SCIM Oauth2 Scope Map contained invalid syntax".into()),
600 Self::SC0021Oauth2ScopeMapMissingGroupIdentifier => Some("A SCIM Oauth2 Scope Map was missing a group name or uuid".into()),
601 Self::SC0022Oauth2ClaimMapSyntaxInvalid => Some("A SCIM Oauth2 Claim Map contained invalid syntax".into()),
602 Self::SC0023Oauth2ClaimMapMissingGroupIdentifier => Some("A SCIM Claim Map was missing a group name or uuid".into()),
603 Self::SC0024SshPublicKeySyntaxInvalid => Some("A SCIM Ssh Public Key contained invalid syntax".into()),
604 Self::SC0025UiHintSyntaxInvalid => Some("A SCIM UiHint contained invalid syntax".into()),
605 Self::SC0026Utf8SyntaxInvalid => Some("A SCIM Utf8 String Scope Map contained invalid syntax".into()),
606 Self::SC0027ClassSetInvalid => Some("The internal set of class templates used in this create operation was invalid. THIS IS A BUG.".into()),
607 Self::SC0028CreatedUuidsInvalid => Some("The internal create query did not return the set of created UUIDs. THIS IS A BUG".into()),
608 Self::SC0029PaginationOutOfBounds => Some("The requested range for pagination was out of bounds of the result set".into()),
609 Self::SC0030Sha256SyntaxInvalid => Some("A SCIM SHA256 hex string was invalid.".into()),
610 Self::SC0031Int64SyntaxInvalid => Some("A SCIM Int64 contained invalid syntax".into()),
611 Self::SC0032Uint64SyntaxInvalid => Some("A SCIM Uint64 contained invalid syntax".into()),
612 Self::SC0033AssertionContainsDuplicateUuids => Some("SCIM assertion contains duplicate entry ids, unable to proceed.".into()),
613 Self::UI0001ChallengeSerialisation => Some("The WebAuthn challenge was unable to be serialised.".into()),
614 Self::UI0002InvalidState => Some("The credential update process returned an invalid state transition.".into()),
615 Self::UI0003InvalidOauth2Resume => Some("The server attempted to resume OAuth2, but no OAuth2 session is in progress.".into()),
616 Self::UI0004MemberAlreadyExists => Some("The target is already a member.".into()),
617 Self::VL0001ValueSshPublicKeyString => None,
618 Self::VS0001IncomingReplSshPublicKey => None,
619 Self::VS0002CertificatePublicKeyDigest |
620 Self::VS0003CertificateDerDecode => Some("Decoding the stored certificate from DER failed.".into()),
621 Self::VS0004CertificatePublicKeyDigest |
622 Self::VS0005CertificatePublicKeyDigest => Some("The certificates public key is unable to be digested.".into()),
623
624 }
625 }
626}
627
628#[test]
629fn test_operationerror_as_nice_string() {
630 assert_eq!(
631 OperationError::CU0001WebauthnAttestationNotTrusted.to_string(),
632 "CU0001WebauthnAttestationNotTrusted".to_string()
633 );
634 assert_eq!(
635 OperationError::CU0003WebauthnUserNotVerified.to_string(),
636 "CU0003WebauthnUserNotVerified - User Verification bit not set while registering credential, you may need to configure a PIN on this device.".to_string()
637 );
638 assert_eq!(
639 OperationError::SessionExpired.to_string(),
640 "SessionExpired".to_string()
641 );
642 assert_eq!(
643 OperationError::CorruptedEntry(12345).to_string(),
644 "CorruptedEntry(12345)".to_string()
645 );
646}