use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionHandleConfig {
#[serde(default = "default_session_ttl_secs")]
pub ttl_secs: u64,
#[serde(default)]
pub fingerprint_mode: SessionFingerprintMode,
#[serde(default = "default_session_rate_limit_max")]
pub resolve_attempts_per_window: u32,
#[serde(default = "default_session_rate_limit_window_secs")]
pub rate_limit_window_secs: u64,
#[serde(default = "default_session_miss_spike_threshold")]
pub miss_spike_threshold: u32,
#[serde(default = "default_session_miss_spike_window_secs")]
pub miss_spike_window_secs: u64,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum SessionFingerprintMode {
Strict,
#[default]
Subnet,
Disabled,
}
impl From<SessionFingerprintMode> for crate::control::security::session_handle::FingerprintMode {
fn from(m: SessionFingerprintMode) -> Self {
use crate::control::security::session_handle::FingerprintMode as Core;
match m {
SessionFingerprintMode::Strict => Core::Strict,
SessionFingerprintMode::Subnet => Core::Subnet,
SessionFingerprintMode::Disabled => Core::Disabled,
}
}
}
impl Default for SessionHandleConfig {
fn default() -> Self {
Self {
ttl_secs: default_session_ttl_secs(),
fingerprint_mode: SessionFingerprintMode::default(),
resolve_attempts_per_window: default_session_rate_limit_max(),
rate_limit_window_secs: default_session_rate_limit_window_secs(),
miss_spike_threshold: default_session_miss_spike_threshold(),
miss_spike_window_secs: default_session_miss_spike_window_secs(),
}
}
}
fn default_session_ttl_secs() -> u64 {
3600
}
fn default_session_rate_limit_max() -> u32 {
20
}
fn default_session_rate_limit_window_secs() -> u64 {
60
}
fn default_session_miss_spike_threshold() -> u32 {
10
}
fn default_session_miss_spike_window_secs() -> u64 {
60
}