use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(default)]
pub struct AuthConfig {
pub enable: bool,
pub database_path: PathBuf,
pub durability: bool,
pub superadmin: String,
pub api_key: ApiKeyConfig,
pub lockout: LockoutConfig,
pub rate_limit: RateLimitConfig,
pub session: SessionConfig,
}
impl Default for AuthConfig {
fn default() -> Self {
Self {
enable: false,
database_path: PathBuf::from("auth"),
durability: false,
superadmin: String::default(),
api_key: ApiKeyConfig::default(),
lockout: LockoutConfig::default(),
rate_limit: RateLimitConfig::default(),
session: SessionConfig::default(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(default)]
pub struct ApiKeyConfig {
pub default_ttl_seconds: i64,
pub max_keys_per_user: u32,
pub prefix: String,
}
impl Default for ApiKeyConfig {
fn default() -> Self {
Self {
default_ttl_seconds: 2592000,
max_keys_per_user: 10,
prefix: "ave_node_".to_string(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(default)]
pub struct LockoutConfig {
pub max_attempts: u32,
pub duration_seconds: i64,
}
impl Default for LockoutConfig {
fn default() -> Self {
Self {
max_attempts: 10,
duration_seconds: 300,
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(default)]
pub struct RateLimitConfig {
pub enable: bool,
pub window_seconds: i64,
pub max_requests: u32,
pub limit_by_key: bool,
pub limit_by_ip: bool,
pub cleanup_interval_seconds: i64,
#[serde(default)]
pub sensitive_endpoints: Vec<EndpointRateLimit>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct EndpointRateLimit {
pub endpoint: String,
pub max_requests: u32,
pub window_seconds: Option<i64>,
}
impl Default for RateLimitConfig {
fn default() -> Self {
Self {
enable: true,
window_seconds: 60,
max_requests: 100,
limit_by_key: true,
limit_by_ip: true,
cleanup_interval_seconds: 3600,
sensitive_endpoints: vec![
EndpointRateLimit {
endpoint: "/login".to_string(),
max_requests: 10,
window_seconds: None, },
EndpointRateLimit {
endpoint: "/change-password".to_string(),
max_requests: 5,
window_seconds: None,
},
EndpointRateLimit {
endpoint: "/admin/users".to_string(),
max_requests: 20,
window_seconds: None,
},
],
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(default)]
pub struct SessionConfig {
pub audit_enable: bool,
pub audit_retention_days: u32,
pub audit_max_entries: u32,
}
impl Default for SessionConfig {
fn default() -> Self {
Self {
audit_enable: true,
audit_retention_days: 90,
audit_max_entries: 1_000_000,
}
}
}