use std::env;
use std::sync::LazyLock;
pub static SESSION_COOKIE_NAME: LazyLock<String> = LazyLock::new(|| {
std::env::var("SESSION_COOKIE_NAME")
.ok()
.unwrap_or("__Host-SessionId".to_string())
});
pub static SESSION_COOKIE_MAX_AGE: LazyLock<u64> =
LazyLock::new(|| match std::env::var("SESSION_COOKIE_MAX_AGE") {
Ok(val) => val
.parse()
.unwrap_or_else(|e| panic!("SESSION_COOKIE_MAX_AGE='{val}' is not a valid u64: {e}")),
Err(_) => 600,
});
pub static SESSION_COOKIE_DOMAIN: LazyLock<Option<String>> =
LazyLock::new(|| std::env::var("SESSION_COOKIE_DOMAIN").ok());
#[derive(Debug, Clone, PartialEq)]
pub enum SessionConflictPolicy {
Allow,
Replace,
Reject,
}
pub static SESSION_CONFLICT_POLICY: LazyLock<SessionConflictPolicy> =
LazyLock::new(|| match env::var("SESSION_CONFLICT_POLICY") {
Err(_) => SessionConflictPolicy::Allow,
Ok(val) => match val.to_lowercase().as_str() {
"allow" => SessionConflictPolicy::Allow,
"replace" => SessionConflictPolicy::Replace,
"reject" => SessionConflictPolicy::Reject,
_ => panic!(
"SESSION_CONFLICT_POLICY='{val}' is invalid. Valid values: allow, replace, reject"
),
},
});
pub(super) const USER_SESSIONS_MAPPING_TTL: u64 = 86400 * 30;
pub(super) static AUTH_SERVER_SECRET: LazyLock<Vec<u8>> =
LazyLock::new(|| match env::var("AUTH_SERVER_SECRET") {
Ok(secret) => secret.into_bytes(),
Err(_) => {
use ring::rand::SecureRandom;
let rng = ring::rand::SystemRandom::new();
let mut secret = vec![0u8; 32];
rng.fill(&mut secret)
.expect("Failed to generate random AUTH_SERVER_SECRET");
tracing::info!("AUTH_SERVER_SECRET not set, using random key (single-process only)");
secret
}
});
#[cfg(test)]
mod tests;