use crate::cookie::SameSite;
use std::time::Duration;
#[derive(Debug, Clone)]
pub struct SessionConfig {
pub cookie_name: String,
pub ttl: Duration,
pub http_only: bool,
pub secure: bool,
pub same_site: SameSite,
pub path: String,
}
impl Default for SessionConfig {
fn default() -> Self {
Self {
cookie_name: "ultimo_sid".to_string(),
ttl: Duration::from_secs(60 * 60 * 24),
http_only: true,
secure: true,
same_site: SameSite::Lax,
path: "/".to_string(),
}
}
}
impl SessionConfig {
pub fn cookie_name(mut self, n: impl Into<String>) -> Self {
self.cookie_name = n.into();
self
}
pub fn ttl(mut self, ttl: Duration) -> Self {
self.ttl = ttl;
self
}
pub fn secure(mut self, v: bool) -> Self {
self.secure = v;
self
}
pub fn same_site(mut self, v: SameSite) -> Self {
self.same_site = v;
self
}
pub fn validated(self) -> Self {
if self.same_site == SameSite::None && !self.secure {
panic!("SessionConfig: SameSite=None requires secure=true");
}
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn secure_defaults() {
let c = SessionConfig::default();
assert!(c.http_only && c.secure);
assert_eq!(c.same_site, SameSite::Lax);
}
#[test]
#[should_panic(expected = "SameSite=None requires secure")]
fn samesite_none_requires_secure() {
SessionConfig::default()
.same_site(SameSite::None)
.secure(false)
.validated();
}
}