From 11c3971d9e68a02e367b17e076dc09485ffef7e4 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Fri, 8 Mar 2024 16:49:00 +0100 Subject: [PATCH] Add basic nodeinfo --- src/backend/mod.rs | 2 ++ src/backend/nodeinfo.rs | 66 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 src/backend/nodeinfo.rs diff --git a/src/backend/mod.rs b/src/backend/mod.rs index d19ef5b..862ded0 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -50,6 +50,7 @@ pub mod config; pub mod database; pub mod error; pub mod federation; +mod nodeinfo; mod utils; const MIGRATIONS: EmbeddedMigrations = embed_migrations!("migrations"); @@ -92,6 +93,7 @@ pub async fn start(config: IbisConfig) -> MyResult<()> { .nest("", asset_routes()?) .nest(FEDERATION_ROUTES_PREFIX, federation_routes()) .nest("/api/v1", api_routes()) + .nest("", nodeinfo::config()) .layer(FederationMiddleware::new(config)) .layer(CorsLayer::permissive()); diff --git a/src/backend/nodeinfo.rs b/src/backend/nodeinfo.rs new file mode 100644 index 0000000..5e9c7b0 --- /dev/null +++ b/src/backend/nodeinfo.rs @@ -0,0 +1,66 @@ +use crate::{ + backend::{database::IbisData, error::MyResult}, + common::utils::http_protocol_str, +}; +use activitypub_federation::config::Data; +use axum::{routing::get, Json, Router}; +use serde::{Deserialize, Serialize}; +use url::Url; + +pub fn config() -> Router { + Router::new() + .route("/nodeinfo/2.0.json", get(node_info)) + .route("/.well-known/nodeinfo", get(node_info_well_known)) +} + +async fn node_info_well_known(data: Data) -> MyResult> { + Ok(Json(NodeInfoWellKnown { + links: vec![NodeInfoWellKnownLinks { + rel: Url::parse("http://nodeinfo.diaspora.software/ns/schema/2.0")?, + href: Url::parse(&format!( + "{}://{}/nodeinfo/2.0.json", + http_protocol_str(), + data.domain() + ))?, + }], + })) +} + +async fn node_info(data: Data) -> MyResult> { + Ok(Json(NodeInfo { + version: "2.0".to_string(), + software: NodeInfoSoftware { + name: "ibis".to_string(), + version: env!("CARGO_PKG_VERSION").to_string(), + }, + protocols: vec!["activitypub".to_string()], + open_registrations: data.config.registration_open, + })) +} + +#[derive(Serialize, Deserialize, Debug)] +struct NodeInfoWellKnown { + pub links: Vec, +} + +#[derive(Serialize, Deserialize, Debug)] +struct NodeInfoWellKnownLinks { + pub rel: Url, + pub href: Url, +} + +#[derive(Serialize, Deserialize, Debug, Default)] +#[serde(rename_all = "camelCase", default)] +pub struct NodeInfo { + pub version: String, + pub software: NodeInfoSoftware, + pub protocols: Vec, + pub open_registrations: bool, +} + +#[derive(Serialize, Deserialize, Debug, Default)] +#[serde(default)] +pub struct NodeInfoSoftware { + pub name: String, + pub version: String, +}