fedimovies/fedimovies-config/src/config.rs

222 lines
5.8 KiB
Rust
Raw Normal View History

use std::path::PathBuf;
2021-04-09 00:22:17 +00:00
2023-04-24 15:35:32 +00:00
use log::Level as LogLevel;
use rsa::RsaPrivateKey;
use serde::Deserialize;
use url::Url;
2021-04-09 00:22:17 +00:00
2023-04-25 13:49:35 +00:00
use fedimovies_utils::urls::normalize_url;
2021-04-09 00:22:17 +00:00
2022-08-09 21:21:17 +00:00
use super::environment::Environment;
use super::federation::FederationConfig;
use super::limits::Limits;
use super::registration::RegistrationConfig;
use super::retention::RetentionConfig;
2023-04-08 23:34:07 +00:00
use super::REEF_VERSION;
2021-04-09 00:22:17 +00:00
2023-04-24 15:35:32 +00:00
fn default_log_level() -> LogLevel {
LogLevel::Info
}
2023-04-24 15:35:32 +00:00
fn default_login_message() -> String {
"What?!".to_string()
}
2021-04-09 00:22:17 +00:00
#[derive(Clone, Deserialize)]
pub struct Config {
2023-01-25 00:21:40 +00:00
// Properties auto-populated from the environment
#[serde(skip)]
2021-04-09 00:22:17 +00:00
pub environment: Environment,
#[serde(skip)]
pub config_path: String,
2021-04-09 00:22:17 +00:00
// Core settings
pub database_url: String,
#[serde(default)]
pub tls_ca_file: Option<PathBuf>,
2021-04-09 00:22:17 +00:00
pub storage_dir: PathBuf,
pub web_client_dir: Option<PathBuf>,
2021-04-09 00:22:17 +00:00
pub http_host: String,
pub http_port: u32,
#[serde(default)]
pub http_cors_allowlist: Vec<String>,
#[serde(default = "default_log_level")]
pub log_level: LogLevel,
// Domain name or <IP address>:<port>
// URI scheme is optional
instance_uri: String,
2021-04-09 00:22:17 +00:00
pub instance_title: String,
pub instance_short_description: String,
pub instance_description: String,
2023-04-25 11:19:04 +00:00
#[serde(default)]
pub tmdb_api_key: Option<String>,
#[serde(default)]
pub movie_user_password: Option<String>,
#[serde(skip)]
pub(super) instance_rsa_key: Option<RsaPrivateKey>,
2021-04-09 00:22:17 +00:00
pub(super) registrations_open: Option<bool>, // deprecated
2021-04-09 00:22:17 +00:00
#[serde(default)]
pub registration: RegistrationConfig,
2021-04-09 00:22:17 +00:00
// EIP-4361 login message
2022-05-11 21:10:48 +00:00
#[serde(default = "default_login_message")]
2021-04-09 00:22:17 +00:00
pub login_message: String,
pub(super) post_character_limit: Option<usize>, // deprecated
2022-02-08 21:04:28 +00:00
#[serde(default)]
pub limits: Limits,
#[serde(default)]
pub retention: RetentionConfig,
pub(super) proxy_url: Option<String>,
#[serde(default)]
pub federation: FederationConfig,
2022-02-23 23:31:56 +00:00
#[serde(default)]
pub blocked_instances: Vec<String>,
// IPFS
2021-04-09 00:22:17 +00:00
pub ipfs_api_url: Option<String>,
pub ipfs_gateway_url: Option<String>,
}
impl Config {
pub(super) fn try_instance_url(&self) -> Result<Url, url::ParseError> {
normalize_url(&self.instance_uri)
}
pub fn instance(&self) -> Instance {
Instance {
_url: self.try_instance_url().unwrap(),
actor_key: self.instance_rsa_key.clone().unwrap(),
proxy_url: self.federation.proxy_url.clone(),
onion_proxy_url: self.federation.onion_proxy_url.clone(),
i2p_proxy_url: self.federation.i2p_proxy_url.clone(),
// Private instance doesn't send activities and sign requests
2023-04-25 11:19:04 +00:00
is_private: !self.federation.enabled,
// || matches!(self.environment, Environment::Development),
fetcher_timeout: self.federation.fetcher_timeout,
deliverer_timeout: self.federation.deliverer_timeout,
}
2021-04-09 00:22:17 +00:00
}
pub fn instance_url(&self) -> String {
self.instance().url()
2021-04-09 00:22:17 +00:00
}
pub fn media_dir(&self) -> PathBuf {
self.storage_dir.join("media")
}
}
2022-07-13 21:38:01 +00:00
#[derive(Clone)]
pub struct Instance {
_url: Url,
// Instance actor
pub actor_key: RsaPrivateKey,
2022-10-19 18:39:47 +00:00
// Proxy for outgoing requests
pub proxy_url: Option<String>,
pub onion_proxy_url: Option<String>,
pub i2p_proxy_url: Option<String>,
// Private instance won't send signed HTTP requests
pub is_private: bool,
pub fetcher_timeout: u64,
pub deliverer_timeout: u64,
}
impl Instance {
pub fn url(&self) -> String {
self._url.origin().ascii_serialization()
}
pub fn hostname(&self) -> String {
self._url.host_str().unwrap().to_string()
}
2021-11-18 00:51:56 +00:00
pub fn agent(&self) -> String {
format!(
2023-04-08 23:34:07 +00:00
"Reef {version}; {instance_url}",
2023-04-24 15:35:32 +00:00
version = REEF_VERSION,
instance_url = self.url(),
)
}
}
#[cfg(feature = "test-utils")]
2023-01-12 21:38:36 +00:00
impl Instance {
pub fn for_test(url: &str) -> Self {
2023-04-25 13:49:35 +00:00
use fedimovies_utils::crypto_rsa::generate_weak_rsa_key;
2023-01-12 21:38:36 +00:00
Self {
_url: Url::parse(url).unwrap(),
actor_key: generate_weak_rsa_key().unwrap(),
proxy_url: None,
onion_proxy_url: None,
i2p_proxy_url: None,
2023-01-12 21:38:36 +00:00
is_private: true,
fetcher_timeout: 0,
deliverer_timeout: 0,
2023-01-12 21:38:36 +00:00
}
}
}
#[cfg(test)]
mod tests {
use super::*;
2023-04-25 13:49:35 +00:00
use fedimovies_utils::crypto_rsa::generate_weak_rsa_key;
#[test]
fn test_instance_url_https_dns() {
let instance_url = Url::parse("https://example.com/").unwrap();
let instance_rsa_key = generate_weak_rsa_key().unwrap();
let instance = Instance {
_url: instance_url,
actor_key: instance_rsa_key,
2022-10-19 18:39:47 +00:00
proxy_url: None,
onion_proxy_url: None,
i2p_proxy_url: None,
is_private: true,
fetcher_timeout: 0,
deliverer_timeout: 0,
};
assert_eq!(instance.url(), "https://example.com");
assert_eq!(instance.hostname(), "example.com");
assert_eq!(
instance.agent(),
2023-04-08 23:34:07 +00:00
format!("Mitra {}; https://example.com", REEF_VERSION),
);
}
#[test]
fn test_instance_url_http_ipv4() {
let instance_url = Url::parse("http://1.2.3.4:3777/").unwrap();
let instance_rsa_key = generate_weak_rsa_key().unwrap();
let instance = Instance {
_url: instance_url,
actor_key: instance_rsa_key,
2022-10-19 18:39:47 +00:00
proxy_url: None,
onion_proxy_url: None,
i2p_proxy_url: None,
is_private: true,
fetcher_timeout: 0,
deliverer_timeout: 0,
};
assert_eq!(instance.url(), "http://1.2.3.4:3777");
assert_eq!(instance.hostname(), "1.2.3.4");
}
}