rustauth-plugins 0.2.0

Official RustAuth plugin modules.
Documentation
use rustauth_core::context::AuthContext;
use rustauth_core::cookies::{
    expire_cookie, parse_cookies, set_session_cookie, sign_cookie_value, verify_cookie_value,
    AuthCookie, Cookie, SessionCookieOptions,
};
use rustauth_core::error::RustAuthError;

pub fn cookie_header(request: &rustauth_core::api::ApiRequest) -> String {
    request
        .headers()
        .get(http::header::COOKIE)
        .and_then(|value| value.to_str().ok())
        .unwrap_or_default()
        .to_owned()
}

pub fn admin_session_cookie(context: &AuthContext) -> AuthCookie {
    AuthCookie {
        name: format!(
            "{}.admin_session",
            context
                .options
                .advanced
                .cookie_prefix
                .as_deref()
                .unwrap_or("better-auth")
        ),
        attributes: context.auth_cookies.session_token.attributes.clone(),
    }
}

pub fn set_admin_cookie(
    context: &AuthContext,
    session_token: &str,
    dont_remember_value: Option<&str>,
) -> Result<Cookie, RustAuthError> {
    let cookie = admin_session_cookie(context);
    Ok(Cookie {
        name: cookie.name,
        value: sign_cookie_value(
            &format!(
                "{}:{}",
                session_token,
                dont_remember_value.unwrap_or_default()
            ),
            &context.secret,
        )?,
        attributes: context.auth_cookies.session_token.attributes.clone(),
    })
}

pub fn read_admin_cookie(
    context: &AuthContext,
    cookie_header: &str,
) -> Result<Option<(String, Option<String>)>, RustAuthError> {
    let cookie = admin_session_cookie(context);
    let Some(value) = parse_cookies(cookie_header).get(&cookie.name).cloned() else {
        return Ok(None);
    };
    let Some(unsigned) = verify_cookie_value(&value, &context.secret)? else {
        return Ok(None);
    };
    let (token, dont_remember) = unsigned.split_once(':').unwrap_or((unsigned.as_str(), ""));
    Ok(Some((
        token.to_owned(),
        (!dont_remember.is_empty()).then(|| dont_remember.to_owned()),
    )))
}

pub fn read_dont_remember_cookie(
    context: &AuthContext,
    cookie_header: &str,
) -> Result<Option<String>, RustAuthError> {
    let Some(value) = parse_cookies(cookie_header)
        .get(&context.auth_cookies.dont_remember_token.name)
        .cloned()
    else {
        return Ok(None);
    };
    verify_cookie_value(&value, &context.secret)
}

pub fn session_cookie(context: &AuthContext, token: &str) -> Result<Vec<Cookie>, RustAuthError> {
    session_cookie_with_dont_remember(context, token, false)
}

pub fn session_cookie_with_dont_remember(
    context: &AuthContext,
    token: &str,
    dont_remember: bool,
) -> Result<Vec<Cookie>, RustAuthError> {
    set_session_cookie(
        &context.auth_cookies,
        &context.secret,
        token,
        SessionCookieOptions {
            dont_remember,
            ..SessionCookieOptions::default()
        },
    )
}

pub fn expire_admin_cookie(context: &AuthContext) -> Cookie {
    expire_cookie(&admin_session_cookie(context))
}