diff --git a/CHANGELOG.md b/CHANGELOG.md index d80f62c..b10e532 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Added `fep-e232` feature flag (disabled by default). - Added `account_index` parameter to Monero configuration. - Added `/api/v1/instance/peers` API endpoint. +- Added `federation.enabled` configuration parameter that can be used to disable federation. ### Changed diff --git a/contrib/mitra_config.yaml b/contrib/mitra_config.yaml index 20bd4bf..7b2f19a 100644 --- a/contrib/mitra_config.yaml +++ b/contrib/mitra_config.yaml @@ -47,6 +47,7 @@ retention: # Federation parameters #federation: +# enabled: true # # Proxy for outgoing requests # #proxy_url: 'socks5h://127.0.0.1:9050' # # Proxy for outgoing requests to .onion targets diff --git a/mitra-config/src/config.rs b/mitra-config/src/config.rs index 830a0b8..77b660a 100644 --- a/mitra-config/src/config.rs +++ b/mitra-config/src/config.rs @@ -73,7 +73,7 @@ pub struct Config { pub(super) proxy_url: Option, #[serde(default)] - pub(super) federation: FederationConfig, + pub federation: FederationConfig, #[serde(default)] pub blocked_instances: Vec, @@ -100,7 +100,10 @@ impl Config { actor_key: self.instance_rsa_key.clone().unwrap(), proxy_url: self.federation.proxy_url.clone(), onion_proxy_url: self.federation.onion_proxy_url.clone(), - is_private: matches!(self.environment, Environment::Development), + // Private instance doesn't send activities and sign requests + is_private: + !self.federation.enabled || + matches!(self.environment, Environment::Development), } } diff --git a/mitra-config/src/federation.rs b/mitra-config/src/federation.rs index a42dc73..dbc47c5 100644 --- a/mitra-config/src/federation.rs +++ b/mitra-config/src/federation.rs @@ -1,7 +1,21 @@ use serde::Deserialize; -#[derive(Clone, Default, Deserialize)] +fn default_federation_enabled() -> bool { true } + +#[derive(Clone, Deserialize)] pub struct FederationConfig { - pub proxy_url: Option, - pub onion_proxy_url: Option, + #[serde(default = "default_federation_enabled")] + pub enabled: bool, + pub(super) proxy_url: Option, + pub(super) onion_proxy_url: Option, +} + +impl Default for FederationConfig { + fn default() -> Self { + Self { + enabled: default_federation_enabled(), + proxy_url: None, + onion_proxy_url: None, + } + } } diff --git a/src/activitypub/fetcher/fetchers.rs b/src/activitypub/fetcher/fetchers.rs index e68fce2..437c3ab 100644 --- a/src/activitypub/fetcher/fetchers.rs +++ b/src/activitypub/fetcher/fetchers.rs @@ -75,7 +75,7 @@ fn build_request( ) -> RequestBuilder { let mut request_builder = client.request(method, url); if !instance.is_private { - // Public instance should set User-Agent header + // Public instances should set User-Agent header request_builder = request_builder .header(reqwest::header::USER_AGENT, instance.agent()); }; @@ -96,7 +96,7 @@ async fn send_request( request_builder = request_builder.query(query_params); }; if !instance.is_private { - // Only public instance can send signed request + // Only public instances can send signed requests let instance_actor_id = local_instance_actor_id(&instance.url()); let instance_actor_key_id = local_actor_key_id(&instance_actor_id); let headers = create_http_signature( diff --git a/src/activitypub/views.rs b/src/activitypub/views.rs index 391ed90..b5e6b4f 100644 --- a/src/activitypub/views.rs +++ b/src/activitypub/views.rs @@ -106,6 +106,9 @@ async fn inbox( request: HttpRequest, activity: web::Json, ) -> Result { + if !config.federation.enabled { + return Err(HttpError::PermissionError); + }; log::debug!("received activity: {}", activity); let activity_type = activity["type"].as_str().unwrap_or("Unknown"); log::info!("received in {}: {}", request.uri().path(), activity_type); @@ -304,8 +307,12 @@ async fn instance_actor_view( #[post("/inbox")] async fn instance_actor_inbox( + config: web::Data, activity: web::Json, ) -> Result { + if !config.federation.enabled { + return Err(HttpError::PermissionError); + }; log::info!( "received in instance inbox: {}", activity["type"].as_str().unwrap_or("Unknown"), diff --git a/src/nodeinfo/types.rs b/src/nodeinfo/types.rs index e70f100..c7fa4fc 100644 --- a/src/nodeinfo/types.rs +++ b/src/nodeinfo/types.rs @@ -68,11 +68,17 @@ pub struct Usage { pub local_posts: i64, } +#[derive(Serialize)] +struct FederationMetadata { + enabled: bool, +} + #[derive(Serialize)] #[serde(rename_all = "camelCase")] struct Metadata { node_name: String, node_description: String, + federation: FederationMetadata, } impl Metadata { @@ -80,6 +86,9 @@ impl Metadata { Self { node_name: config.instance_title.clone(), node_description: config.instance_short_description.clone(), + federation: FederationMetadata { + enabled: config.federation.enabled, + }, } } }