use serde::{Deserialize, Serialize};
const DEFAULT_TOR_SOCKS5_ADDR: &str = "127.0.0.1:9050";
const DEFAULT_TOR_CONTROL_ADDR: &str = "/run/tor/control";
const DEFAULT_TOR_COOKIE_PATH: &str = "/var/run/tor/control.authcookie";
const DEFAULT_TOR_CONNECT_TIMEOUT_MS: u64 = 120_000;
const DEFAULT_TOR_MTU: u16 = 1400;
const DEFAULT_TOR_MAX_INBOUND: usize = 64;
const DEFAULT_HOSTNAME_FILE: &str = "/var/lib/tor/fips_onion_service/hostname";
const DEFAULT_DIRECTORY_BIND_ADDR: &str = "127.0.0.1:8443";
const DEFAULT_TOR_ADVERTISED_PORT: u16 = 443;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct TorConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mode: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub socks5_addr: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub connect_timeout_ms: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mtu: Option<u16>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub control_addr: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub control_auth: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cookie_path: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_inbound_connections: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub directory_service: Option<DirectoryServiceConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub advertise_on_nostr: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub advertised_port: Option<u16>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct DirectoryServiceConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hostname_file: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bind_addr: Option<String>,
}
impl DirectoryServiceConfig {
pub fn hostname_file(&self) -> &str {
self.hostname_file
.as_deref()
.unwrap_or(DEFAULT_HOSTNAME_FILE)
}
pub fn bind_addr(&self) -> &str {
self.bind_addr
.as_deref()
.unwrap_or(DEFAULT_DIRECTORY_BIND_ADDR)
}
}
impl TorConfig {
pub fn mode(&self) -> &str {
self.mode.as_deref().unwrap_or("socks5")
}
pub fn socks5_addr(&self) -> &str {
self.socks5_addr
.as_deref()
.unwrap_or(DEFAULT_TOR_SOCKS5_ADDR)
}
pub fn control_addr(&self) -> &str {
self.control_addr
.as_deref()
.unwrap_or(DEFAULT_TOR_CONTROL_ADDR)
}
pub fn control_auth(&self) -> &str {
self.control_auth.as_deref().unwrap_or("cookie")
}
pub fn cookie_path(&self) -> &str {
self.cookie_path
.as_deref()
.unwrap_or(DEFAULT_TOR_COOKIE_PATH)
}
pub fn connect_timeout_ms(&self) -> u64 {
self.connect_timeout_ms
.unwrap_or(DEFAULT_TOR_CONNECT_TIMEOUT_MS)
}
pub fn mtu(&self) -> u16 {
self.mtu.unwrap_or(DEFAULT_TOR_MTU)
}
pub fn max_inbound_connections(&self) -> usize {
self.max_inbound_connections
.unwrap_or(DEFAULT_TOR_MAX_INBOUND)
}
pub fn advertise_on_nostr(&self) -> bool {
self.advertise_on_nostr.unwrap_or(false)
}
pub fn advertised_port(&self) -> u16 {
self.advertised_port.unwrap_or(DEFAULT_TOR_ADVERTISED_PORT)
}
}