use snafu::Snafu;
use crate::{grant::core::form::OAuth2FormError, token::id_token::IdTokenValidationError};
#[derive(Debug, Snafu)]
#[snafu(visibility(pub(super)))]
pub enum StartError<
AuthErr: crate::core::Error + 'static,
HttpErr: crate::core::Error + 'static,
HttpRespErr: crate::core::Error + 'static,
DPoPErr: crate::core::Error + 'static,
JarErr: crate::core::Error + 'static,
> {
#[snafu(display("Encoding of the request parameters failed"))]
EncodeUrlEncoded {
source: serde_html_form::ser::Error,
},
#[snafu(display("Failed to make PAR request"))]
ParRequest {
source: OAuth2FormError<HttpErr, HttpRespErr, DPoPErr>,
},
#[snafu(display("Failed to create JAR (JWT-secured authorization request)"))]
Jar {
source: JarErr,
},
#[snafu(display("Failed to get client authentication parameters"))]
ClientAuth {
source: AuthErr,
},
}
#[derive(Debug, Snafu)]
#[snafu(visibility(pub(super)))]
pub enum CompleteError<GrantErr: crate::core::Error + 'static> {
#[snafu(display("Failed to make token call"))]
Grant {
source: GrantErr,
},
#[snafu(display("Issuer mismatch: original = {}, callback = {}", original, callback))]
IssuerMismatch {
original: String,
callback: String,
},
#[snafu(display("State mismatch: original = {}, callback = {}", original, callback))]
StateMismatch {
original: String,
callback: String,
},
#[snafu(display(
"Authorization server claims to support issuer identification but no issuer returned."
))]
MissingIssuer,
#[snafu(display(
"ID token received but grant has no JWS verifier configured; \
call `.jws_verifier_factory(...)` on the builder to enable ID token validation"
))]
IdTokenVerifierNotConfigured,
#[snafu(display(
"ID token received but grant has no issuer configured; provide an issuer via server metadata or builder"
))]
IdTokenIssuerNotConfigured,
#[snafu(display("ID token validation failed"))]
IdTokenValidation {
source: IdTokenValidationError,
},
}
impl<
AuthErr: crate::core::Error + 'static,
HttpErr: crate::core::Error + 'static,
HttpRespErr: crate::core::Error + 'static,
DPoPErr: crate::core::Error + 'static,
JarErr: crate::core::Error + 'static,
> crate::core::Error for StartError<AuthErr, HttpErr, HttpRespErr, DPoPErr, JarErr>
{
fn is_retryable(&self) -> bool {
match self {
StartError::EncodeUrlEncoded { .. } => false,
StartError::ParRequest { source } => source.is_retryable(),
StartError::Jar { source } => source.is_retryable(),
StartError::ClientAuth { source } => source.is_retryable(),
}
}
}
#[derive(Debug, Snafu)]
#[snafu(visibility(pub(super)))]
pub enum BuildError {
#[snafu(display(
"jws_verifier_factory was set but no JWS verifier platform is configured; \
enable the `default-jws-verifier-platform` feature or call \
`.jws_verifier_platform(...)` on the builder"
))]
MissingJwsVerifierPlatform,
}
impl crate::core::Error for BuildError {
fn is_retryable(&self) -> bool {
false
}
}
impl<GrantErr: crate::core::Error + 'static> crate::core::Error for CompleteError<GrantErr> {
fn is_retryable(&self) -> bool {
match self {
CompleteError::Grant { source } => source.is_retryable(),
CompleteError::IssuerMismatch { .. }
| CompleteError::StateMismatch { .. }
| CompleteError::MissingIssuer
| CompleteError::IdTokenVerifierNotConfigured
| CompleteError::IdTokenIssuerNotConfigured
| CompleteError::IdTokenValidation { .. } => false,
}
}
}