From 786ff31ce5a43cb6a78e90e3ca6eef2f3759aa5a Mon Sep 17 00:00:00 2001 From: Simon Wicky Date: Tue, 30 Jan 2024 09:37:56 +0100 Subject: [PATCH] augment self described API with NoiseInformation field --- gateway/src/http/mod.rs | 2 ++ mixnode/src/node/http/mod.rs | 2 ++ .../src/api/v1/node/models.rs | 6 ++++ nym-node/nym-node-requests/src/lib.rs | 2 ++ nym-node/src/http/router/api/v1/node/mod.rs | 10 +++++++ .../router/api/v1/node/noise_information.rs | 30 +++++++++++++++++++ nym-node/src/http/router/mod.rs | 4 ++- 7 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 nym-node/src/http/router/api/v1/node/noise_information.rs diff --git a/gateway/src/http/mod.rs b/gateway/src/http/mod.rs index 7b63a522fb..a1f785fa0c 100644 --- a/gateway/src/http/mod.rs +++ b/gateway/src/http/mod.rs @@ -12,6 +12,7 @@ use nym_network_requester::RequestFilter; use nym_node::error::NymNodeError; use nym_node::http::api::api_requests; use nym_node::http::api::api_requests::v1::network_requester::exit_policy::models::UsedExitPolicy; +use nym_node::http::api::api_requests::v1::node::models::NoiseInformation; use nym_node::http::api::api_requests::SignedHostInformation; use nym_node::http::router::WireguardAppState; use nym_node::wireguard::types::GatewayClientRegistry; @@ -260,6 +261,7 @@ impl<'a> HttpApiBuilder<'a> { self.sphinx_keypair.public_key(), self.identity_keypair, )?, + NoiseInformation { supported: true }, //this field somes with Noise support, so we can hardcode it (to ultimately remove it once it's granted) ) .with_gateway(load_gateway_details(self.gateway_config)?) .with_landing_page_assets(self.gateway_config.http.landing_page_assets_path.as_ref()); diff --git a/mixnode/src/node/http/mod.rs b/mixnode/src/node/http/mod.rs index 5147664c70..893abe1986 100644 --- a/mixnode/src/node/http/mod.rs +++ b/mixnode/src/node/http/mod.rs @@ -11,6 +11,7 @@ use nym_bin_common::bin_info_owned; use nym_crypto::asymmetric::{encryption, identity}; use nym_node::error::NymNodeError; use nym_node::http::api::api_requests; +use nym_node::http::api::api_requests::v1::node::models::NoiseInformation; use nym_node::http::api::api_requests::SignedHostInformation; use nym_task::TaskClient; @@ -93,6 +94,7 @@ impl<'a> HttpApiBuilder<'a> { self.sphinx_keypair.public_key(), self.identity_keypair, )?, + NoiseInformation { supported: true }, //this field somes with Noise support, so we can hardcode it (to ultimately remove it once it's granted) ) .with_mixnode(load_mixnode_details(self.mixnode_config)?) .with_landing_page_assets(self.mixnode_config.http.landing_page_assets_path.as_ref()); diff --git a/nym-node/nym-node-requests/src/api/v1/node/models.rs b/nym-node/nym-node-requests/src/api/v1/node/models.rs index 3b79601a00..962bc108ec 100644 --- a/nym-node/nym-node-requests/src/api/v1/node/models.rs +++ b/nym-node/nym-node-requests/src/api/v1/node/models.rs @@ -42,3 +42,9 @@ pub struct HostKeys { /// Currently it corresponds to either mixnode's or gateway's key. pub x25519: String, } + +#[derive(Default, Serialize, Deserialize, Debug, Clone, JsonSchema)] +#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))] +pub struct NoiseInformation { + pub supported: bool, +} diff --git a/nym-node/nym-node-requests/src/lib.rs b/nym-node/nym-node-requests/src/lib.rs index 9bb345eca9..ed6aa75b60 100644 --- a/nym-node/nym-node-requests/src/lib.rs +++ b/nym-node/nym-node-requests/src/lib.rs @@ -28,6 +28,7 @@ pub mod routes { pub const ROLES: &str = "/roles"; pub const BUILD_INFO: &str = "/build-information"; pub const HOST_INFO: &str = "/host-information"; + pub const NOISE_INFO: &str = "/noise"; pub const HEALTH: &str = "/health"; pub const GATEWAY: &str = "/gateway"; @@ -45,6 +46,7 @@ pub mod routes { absolute_route!(mixnode_absolute, v1_absolute(), MIXNODE); absolute_route!(network_requester_absolute, v1_absolute(), NETWORK_REQUESTER); absolute_route!(ip_packet_router_absolute, v1_absolute(), IP_PACKET_ROUTER); + absolute_route!(noise_info_absolute, v1_absolute(), NOISE_INFO); absolute_route!(swagger_absolute, v1_absolute(), SWAGGER); pub mod gateway { diff --git a/nym-node/src/http/router/api/v1/node/mod.rs b/nym-node/src/http/router/api/v1/node/mod.rs index 620a446090..56e2df1723 100644 --- a/nym-node/src/http/router/api/v1/node/mod.rs +++ b/nym-node/src/http/router/api/v1/node/mod.rs @@ -3,6 +3,7 @@ use crate::http::api::v1::node::build_information::build_information; use crate::http::api::v1::node::host_information::host_information; +use crate::http::api::v1::node::noise_information::noise_information; use crate::http::api::v1::node::roles::roles; use axum::routing::get; use axum::Router; @@ -11,12 +12,14 @@ use nym_node_requests::routes::api::v1; pub mod build_information; pub mod host_information; +pub mod noise_information; pub mod roles; #[derive(Debug, Clone)] pub struct Config { pub build_information: models::BinaryBuildInformationOwned, pub host_information: models::SignedHostInformation, + pub noise_information: models::NoiseInformation, pub roles: models::NodeRoles, } @@ -43,4 +46,11 @@ pub(super) fn routes(config: Config) -> Router move |query| host_information(host_info, query) }), ) + .route( + v1::NOISE_INFO, + get({ + let noise_info = config.noise_information; + move |query| noise_information(noise_info, query) + }), + ) } diff --git a/nym-node/src/http/router/api/v1/node/noise_information.rs b/nym-node/src/http/router/api/v1/node/noise_information.rs new file mode 100644 index 0000000000..d5eb88b5e9 --- /dev/null +++ b/nym-node/src/http/router/api/v1/node/noise_information.rs @@ -0,0 +1,30 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use crate::http::api::{FormattedResponse, OutputParams}; +use axum::extract::Query; +use nym_node_requests::api::v1::node::models::NoiseInformation; + +/// Returns host information of this node. +#[utoipa::path( + get, + path = "/noise", + context_path = "/api/v1", + tag = "Node", + responses( + (status = 200, content( + ("application/json" = NoiseInformation), + ("application/yaml" = NoiseInformation) + )) + ), + params(OutputParams) +)] +pub(crate) async fn noise_information( + host_information: NoiseInformation, + Query(output): Query, +) -> NoiseInformationResponse { + let output = output.output.unwrap_or_default(); + output.to_response(host_information) +} + +pub type NoiseInformationResponse = FormattedResponse; diff --git a/nym-node/src/http/router/mod.rs b/nym-node/src/http/router/mod.rs index 71de3c3c8d..fd7949887b 100644 --- a/nym-node/src/http/router/mod.rs +++ b/nym-node/src/http/router/mod.rs @@ -12,7 +12,7 @@ use nym_node_requests::api::v1::ip_packet_router::models::IpPacketRouter; use nym_node_requests::api::v1::mixnode::models::Mixnode; use nym_node_requests::api::v1::network_requester::exit_policy::models::UsedExitPolicy; use nym_node_requests::api::v1::network_requester::models::NetworkRequester; -use nym_node_requests::api::v1::node::models; +use nym_node_requests::api::v1::node::models::{self, NoiseInformation}; use nym_node_requests::api::SignedHostInformation; use nym_node_requests::routes; use std::net::SocketAddr; @@ -33,6 +33,7 @@ impl Config { pub fn new( build_information: models::BinaryBuildInformationOwned, host_information: SignedHostInformation, + noise_information: NoiseInformation, ) -> Self { Config { landing: Default::default(), @@ -41,6 +42,7 @@ impl Config { node: api::v1::node::Config { build_information, host_information, + noise_information, roles: Default::default(), }, gateway: Default::default(),