use time::Duration; use axum_extra::extract::cookie::Cookie; use axum_extra::extract::cookie::CookieJar; use axum_extra::extract::cookie::SameSite; use crate::config::AuthConfig; use crate::features::TempKey; pub(crate) fn temp_key_to_cookie(config: &AuthConfig, key: &TempKey) -> Cookie<'static> { let mut builder = Cookie::build((key.name.clone(), key.value.clone())) .http_only(key.http_only) .secure(key.secure) .max_age(Duration::seconds(key.ttl_seconds as i64)) .path(key.path.clone().unwrap_or_else(|| "/".to_string())) .same_site(parse_same_site(&key.same_site, &config.cookie_same_site)); if let Some(domain) = key.domain.clone().or_else(|| config.cookie_domain.clone()) { builder = builder.domain(domain); } builder.build() } fn parse_same_site(cookie_specific: &str, fallback: &str) -> SameSite { let raw = if cookie_specific.is_empty() { fallback } else { cookie_specific }; match raw.to_ascii_lowercase().as_str() { "strict" => SameSite::Strict, "lax" => SameSite::Lax, "none" => SameSite::None, _ => SameSite::Strict, } } pub(crate) fn read_cookie_value(jar: &CookieJar, name: &str) -> Option { jar.get(name).map(|c| c.value().to_string()) } pub(crate) fn remove_cookie(jar: CookieJar, name: &str) -> CookieJar { jar.remove(Cookie::from(name.to_string())) }