securitydept-token-set-context 0.2.0-beta.4

Token Set Context of SecurityDept, a layered authentication and authorization toolkit built as reusable Rust crates.
Documentation
use securitydept_utils::error::{ErrorPresentation, ToErrorPresentation, UserRecovery};
use snafu::Snafu;

use super::config::BearerPropagationPolicy;

#[derive(Debug, Snafu)]
pub enum TokenPropagatorError {
    #[snafu(display("token propagator is misconfigured: {message}"))]
    PropagatorConfig { message: String },
    #[snafu(display(
        "token propagation policy `{policy:?}` cannot attach an authorization header directly"
    ))]
    UnsupportedDirectAuthorization { policy: BearerPropagationPolicy },
    #[snafu(display("authorization header value is invalid: {source}"))]
    InvalidHeaderValue {
        source: http::header::InvalidHeaderValue,
    },
    #[snafu(display("propagation directive is invalid: {message}"))]
    InvalidPropagationDirective { message: String },
    #[snafu(display("propagation target uses unsupported scheme `{scheme}`"))]
    UnsupportedTargetScheme { scheme: String },
    #[snafu(display("propagation target `{target}` is incomplete"))]
    IncompleteTarget { target: String },
    #[snafu(display("propagation target for node `{node_id}` requires a node target resolver"))]
    NodeTargetResolverRequired { node_id: String },
    #[snafu(display("propagation target for node `{node_id}` could not be resolved"))]
    NodeTargetUnresolved { node_id: String },
    #[snafu(display("propagation target host `{host}` is invalid"))]
    InvalidTargetHost { host: String },
    #[snafu(display("propagation target `{target}` is not allowed"))]
    DestinationNotAllowed { target: String },
    #[snafu(display(
        "propagation target host `{host}` is a sensitive IP literal and is not allowed"
    ))]
    SensitiveIpLiteralDenied { host: String },
    #[snafu(display("propagation CIDR `{cidr}` is invalid"))]
    InvalidCidr { cidr: String },
    #[snafu(display("propagated token issuer `{issuer}` is not allowed"))]
    TokenIssuerNotAllowed { issuer: String },
    #[snafu(display(
        "propagated token facts are unavailable; resource_token_principal is required for \
         validation"
    ))]
    TokenFactsUnavailable,
    #[snafu(display("propagated token is missing an allowed audience"))]
    TokenAudienceNotAllowed,
    #[snafu(display("propagated token is missing required scope `{scope}`"))]
    TokenScopeMissing { scope: String },
    #[snafu(display("propagated token azp `{azp}` is not allowed"))]
    TokenAzpNotAllowed { azp: String },
}

impl ToErrorPresentation for TokenPropagatorError {
    fn to_error_presentation(&self) -> ErrorPresentation {
        ErrorPresentation::new(
            "propagation_context_invalid",
            format!("The propagation header is invalid: {self}"),
            UserRecovery::Retry,
        )
    }
}

pub type TokenPropagatorResult<T> = Result<T, TokenPropagatorError>;