971c37c
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<SessionMode>,
pub cookie_name: Option<String>,
pub cookie_domain: Option<String>,
pub cookie_path: Option<String>,
pub cookie_http_only: Option<bool>,
pub cookie_secure: Option<bool>,
pub cookie_same_site: Option<SameSite>,
pub cookie_max_age_secs: Option<i64>,
pub cookie_prefix_host: Option<bool>,
pub cookie_encode_ip_and_user_agent: Option<bool>,
pub lifespan_secs: Option<i64>,
pub max_lifespan_secs: Option<i64>,
pub memory_lifespan_secs: Option<i64>,
pub table_name: Option<String>,
pub key: Option<String>,
pub database_key: Option<String>,
pub always_save: Option<bool>,
pub db_update_interval_secs: Option<i64>,
pub purge_database_update_secs: Option<i64>,
pub enable_bloom_filter: Option<bool>,
}
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(())
}
}