use config::oauth::{OAuthConfig, SameSite}; pub fn read_cookie<'a>(cookie_header: &'a str, name: &str) -> Option<&'a str> { cookie_header.split(';').find_map(|pair| { let (key, value) = pair.split_once('=')?; if key.trim() == name { Some(value.trim()) } else { None } }) } pub fn session_cookie(config: &OAuthConfig, token: &str, max_age_secs: i64) -> String { build( &config.session_cookie, token, max_age_secs, &config.cookie_path, &config.cookie_domain, config.cookie_secure, config.cookie_same_site, ) } pub fn clear_session_cookie(config: &OAuthConfig) -> String { session_cookie(config, "", 0) } pub fn refresh_cookie(config: &OAuthConfig, token: &str) -> String { build( &config.refresh_cookie, token, config.refresh_cookie_max_age_secs, &format!("{}/api/v1/auth", config.cookie_path.trim_end_matches('/')), &config.cookie_domain, config.cookie_secure, SameSite::Strict, ) } pub fn clear_refresh_cookie(config: &OAuthConfig) -> String { refresh_cookie(config, "") } fn build( name: &str, value: &str, max_age_secs: i64, path: &str, domain: &str, secure: bool, same_site: SameSite, ) -> String { let mut cookie = format!("{name}={value}; Path={path}; Max-Age={max_age_secs}; HttpOnly"); if !domain.is_empty() { cookie.push_str("; Domain="); cookie.push_str(domain); } if secure { cookie.push_str("; Secure"); } cookie.push_str("; SameSite="); cookie.push_str(match same_site { SameSite::Strict => "Strict", SameSite::Lax => "Lax", SameSite::None => "None", }); cookie }