1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
use regex::Regex;
use serde::Deserialize;
use std::net::{IpAddr, Ipv4Addr};

#[derive(Debug, Deserialize, Clone, SmartDefault)]
#[serde(default)]
pub struct Settings {
  #[serde(default)]
  pub database: DatabaseConfig,
  #[default(Some(RateLimitConfig::default()))]
  pub rate_limit: Option<RateLimitConfig>,
  #[default(FederationConfig::default())]
  pub federation: FederationConfig,
  #[default(CaptchaConfig::default())]
  pub captcha: CaptchaConfig,
  #[default(None)]
  pub email: Option<EmailConfig>,
  #[default(None)]
  pub setup: Option<SetupConfig>,
  #[default("unset")]
  pub hostname: String,
  #[default(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)))]
  pub bind: IpAddr,
  #[default(8536)]
  pub port: u16,
  #[default(true)]
  pub tls_enabled: bool,
  #[default(None)]
  pub pictrs_url: Option<String>,
  #[default(None)]
  pub additional_slurs: Option<String>,
  #[default(20)]
  pub actor_name_max_length: usize,
  #[default(None)]
  #[serde(skip)]
  pub webfinger_community_regex: Option<Regex>,
  #[default(None)]
  #[serde(skip)]
  pub webfinger_username_regex: Option<Regex>,
}

#[derive(Debug, Deserialize, Clone, SmartDefault)]
#[serde(default)]
pub struct CaptchaConfig {
  #[default(false)]
  pub enabled: bool,
  #[default("medium")]
  pub difficulty: String,
}

#[derive(Debug, Deserialize, Clone, SmartDefault)]
#[serde(default)]
pub struct DatabaseConfig {
  #[default("lemmy")]
  pub(super) user: String,
  #[default("password")]
  pub password: String,
  #[default("localhost")]
  pub host: String,
  #[default(5432)]
  pub(super) port: i32,
  #[default("lemmy")]
  pub(super) database: String,
  #[default(5)]
  pub pool_size: u32,
}

#[derive(Debug, Deserialize, Clone)]
pub struct EmailConfig {
  pub smtp_server: String,
  pub smtp_login: Option<String>,
  pub smtp_password: Option<String>,
  pub smtp_from_address: String,
  pub use_tls: bool,
}

#[derive(Debug, Deserialize, Clone, SmartDefault)]
#[serde(default)]
pub struct FederationConfig {
  #[default(false)]
  pub enabled: bool,
  #[default(None)]
  pub allowed_instances: Option<Vec<String>>,
  #[default(None)]
  pub blocked_instances: Option<Vec<String>>,
  #[default(true)]
  pub strict_allowlist: bool,
}

#[derive(Debug, Deserialize, Clone, SmartDefault)]
#[serde(default)]
pub struct RateLimitConfig {
  #[default(180)]
  pub message: i32,
  #[default(60)]
  pub message_per_second: i32,
  #[default(6)]
  pub post: i32,
  #[default(600)]
  pub post_per_second: i32,
  #[default(3)]
  pub register: i32,
  #[default(3600)]
  pub register_per_second: i32,
  #[default(6)]
  pub image: i32,
  #[default(3600)]
  pub image_per_second: i32,
}

#[derive(Debug, Deserialize, Clone, SmartDefault)]
pub struct SetupConfig {
  pub admin_username: String,
  pub admin_password: String,
  pub site_name: String,
  #[default(None)]
  pub admin_email: Option<String>,
  #[default(None)]
  pub sidebar: Option<String>,
  #[default(None)]
  pub description: Option<String>,
  #[default(None)]
  pub icon: Option<String>,
  #[default(None)]
  pub banner: Option<String>,
  #[default(None)]
  pub enable_downvotes: Option<bool>,
  #[default(None)]
  pub open_registration: Option<bool>,
  #[default(None)]
  pub enable_nsfw: Option<bool>,
  #[default(None)]
  pub community_creation_admin_only: Option<bool>,
}