saml-rs 0.3.0

Pure-Rust SAML 2.0 Service Provider and Identity Provider support.
Documentation
use crate::error::SamlError;

pub(crate) fn validate_crypto_xml_prefix(name: &str, prefix: &str) -> Result<(), SamlError> {
    if prefix.is_empty() {
        return Err(SamlError::Invalid(format!(
            "{name} XML prefix cannot be empty"
        )));
    }
    if matches!(prefix.to_ascii_lowercase().as_str(), "xml" | "xmlns") {
        return Err(SamlError::Invalid(format!("{name} XML prefix is reserved")));
    }

    let mut chars = prefix.chars();
    let first = chars
        .next()
        .ok_or_else(|| SamlError::Invalid(format!("{name} XML prefix cannot be empty")))?;
    if !first.is_ascii_alphabetic() && first != '_' {
        return Err(invalid_prefix(name));
    }
    if chars.any(|ch| !matches!(ch, 'A'..='Z' | 'a'..='z' | '0'..='9' | '_' | '-' | '.')) {
        return Err(invalid_prefix(name));
    }
    Ok(())
}

fn invalid_prefix(name: &str) -> SamlError {
    SamlError::Invalid(format!("{name} XML prefix contains an invalid character"))
}