use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum SessionMode { Manual, #[default] OptIn, Persistent, } #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum SameSite { Strict, #[default] Lax, None, } #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(default)] pub struct SessionConfig { pub mode: Option, pub cookie_name: Option, pub cookie_domain: Option, pub cookie_path: Option, pub cookie_http_only: Option, pub cookie_secure: Option, pub cookie_same_site: Option, pub cookie_max_age_secs: Option, pub cookie_prefix_host: Option, pub cookie_encode_ip_and_user_agent: Option, pub lifespan_secs: Option, pub max_lifespan_secs: Option, pub memory_lifespan_secs: Option, pub table_name: Option, pub key: Option, pub database_key: Option, pub always_save: Option, pub db_update_interval_secs: Option, pub purge_database_update_secs: Option, pub enable_bloom_filter: Option, } impl SessionConfig { pub fn is_valid(&self) -> Result<(), String> { if self.cookie_same_site == Some(SameSite::None) && self.cookie_secure != Some(true) { return Err( "session.cookie_same_site = \"none\" requires session.cookie_secure = true" .to_string(), ); } if self.cookie_prefix_host == Some(true) && (self.cookie_secure != Some(true) || self.cookie_path.as_deref() != Some("/")) { return Err( "session.cookie_prefix_host requires cookie_secure = true and cookie_path = \"/\"" .to_string(), ); } Ok(()) } }