diff --git a/nym-node/nym-node-requests/src/api/v1/gateway/models.rs b/nym-node/nym-node-requests/src/api/v1/gateway/models.rs index 24597847ca..3407290c9d 100644 --- a/nym-node/nym-node-requests/src/api/v1/gateway/models.rs +++ b/nym-node/nym-node-requests/src/api/v1/gateway/models.rs @@ -39,3 +39,9 @@ pub struct WebSockets { pub wss_port: Option, } + +#[derive(Serialize, Deserialize, Debug, Clone, JsonSchema)] +#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))] +pub struct Bridges { + pub client_params_path: String, +} diff --git a/nym-node/nym-node-requests/src/lib.rs b/nym-node/nym-node-requests/src/lib.rs index aed1648515..2b539f831e 100644 --- a/nym-node/nym-node-requests/src/lib.rs +++ b/nym-node/nym-node-requests/src/lib.rs @@ -41,6 +41,7 @@ pub mod routes { pub const GATEWAY: &str = "/gateway"; pub const MIXNODE: &str = "/mixnode"; pub const METRICS: &str = "/metrics"; + pub const BRIDGES: &str = "/bridges"; pub const NETWORK_REQUESTER: &str = "/network-requester"; pub const IP_PACKET_ROUTER: &str = "/ip-packet-router"; pub const AUTHENTICATOR: &str = "/authenticator"; diff --git a/nym-node/src/config/old_configs/old_config_v9.rs b/nym-node/src/config/old_configs/old_config_v9.rs index 94b9559844..a15e8c4bd2 100644 --- a/nym-node/src/config/old_configs/old_config_v9.rs +++ b/nym-node/src/config/old_configs/old_config_v9.rs @@ -1489,6 +1489,7 @@ pub async fn try_upgrade_config_v9>( clients_storage: old_cfg.gateway_tasks.storage_paths.clients_storage, stats_storage: old_cfg.gateway_tasks.storage_paths.stats_storage, cosmos_mnemonic: old_cfg.gateway_tasks.storage_paths.cosmos_mnemonic, + bridge_client_params: None, }, enforce_zk_nyms: old_cfg.gateway_tasks.enforce_zk_nyms, ws_bind_address: old_cfg.gateway_tasks.ws_bind_address, diff --git a/nym-node/src/config/persistence.rs b/nym-node/src/config/persistence.rs index 087bcd5b76..332fbf2c1d 100644 --- a/nym-node/src/config/persistence.rs +++ b/nym-node/src/config/persistence.rs @@ -146,6 +146,9 @@ pub struct GatewayTasksPaths { /// Path to file containing cosmos account mnemonic used for zk-nym redemption. pub cosmos_mnemonic: PathBuf, + + /// Path to file containing bridge client params to be served in the node self-described. + pub bridge_client_params: Option, } impl GatewayTasksPaths { @@ -154,6 +157,7 @@ impl GatewayTasksPaths { clients_storage: data_dir.as_ref().join(DEFAULT_CLIENTS_STORAGE_FILENAME), stats_storage: data_dir.as_ref().join(DEFAULT_STATS_STORAGE_FILENAME), cosmos_mnemonic: data_dir.as_ref().join(DEFAULT_MNEMONIC_FILENAME), + bridge_client_params: None, } } diff --git a/nym-node/src/node/http/router/api/v1/bridges.rs b/nym-node/src/node/http/router/api/v1/bridges.rs new file mode 100644 index 0000000000..d449f8ed13 --- /dev/null +++ b/nym-node/src/node/http/router/api/v1/bridges.rs @@ -0,0 +1,19 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use axum::Router; +use nym_node_requests::api::v1::gateway::models; +use tower_http::services::ServeFile; + +#[derive(Debug, Clone, Default)] +pub struct Config { + pub details: Option, +} + +pub(crate) fn routes(config: Config) -> Router { + if let Some(cfg) = config.details { + Router::new().route_service("/client-params", ServeFile::new(cfg.client_params_path)) + } else { + Router::new() + } +} diff --git a/nym-node/src/node/http/router/api/v1/mod.rs b/nym-node/src/node/http/router/api/v1/mod.rs index 8e0c3d5bf7..983c1a76f0 100644 --- a/nym-node/src/node/http/router/api/v1/mod.rs +++ b/nym-node/src/node/http/router/api/v1/mod.rs @@ -7,6 +7,7 @@ use axum::Router; use nym_node_requests::routes::api::v1; pub mod authenticator; +pub mod bridges; pub mod gateway; pub mod health; pub mod ip_packet_router; @@ -23,6 +24,7 @@ pub struct Config { pub metrics: metrics::Config, pub gateway: gateway::Config, pub mixnode: mixnode::Config, + pub bridges: bridges::Config, pub network_requester: network_requester::Config, pub ip_packet_router: ip_packet_router::Config, pub authenticator: authenticator::Config, @@ -33,6 +35,7 @@ pub(super) fn routes(config: Config) -> Router { .route(v1::HEALTH, get(health::root_health)) .route(v1::LOAD, get(load::root_load)) .nest(v1::METRICS, metrics::routes(config.metrics)) + .nest(v1::BRIDGES, bridges::routes(config.bridges)) .nest(v1::GATEWAY, gateway::routes(config.gateway)) .nest(v1::MIXNODE, mixnode::routes(config.mixnode)) .nest( diff --git a/nym-node/src/node/http/router/mod.rs b/nym-node/src/node/http/router/mod.rs index c296afcea9..0d0d326985 100644 --- a/nym-node/src/node/http/router/mod.rs +++ b/nym-node/src/node/http/router/mod.rs @@ -10,7 +10,7 @@ use axum::Router; use nym_bin_common::bin_info_owned; use nym_http_api_common::middleware::logging; use nym_node_requests::api::v1::authenticator::models::Authenticator; -use nym_node_requests::api::v1::gateway::models::Gateway; +use nym_node_requests::api::v1::gateway::models::{Bridges, Gateway}; 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; @@ -48,6 +48,7 @@ impl HttpServerConfig { metrics: Default::default(), gateway: Default::default(), mixnode: Default::default(), + bridges: Default::default(), network_requester: Default::default(), ip_packet_router: Default::default(), authenticator: Default::default(), @@ -121,6 +122,13 @@ impl HttpServerConfig { self.api.v1_config.metrics.bearer_token = bearer_token.map(|b| Arc::new(Zeroizing::new(b))); self } + + pub fn with_bridge_client_params_file(mut self, path: &Path) -> Self { + self.api.v1_config.bridges.details = Some(Bridges { + client_params_path: path.to_string_lossy().to_string(), + }); + self + } } pub struct NymNodeRouter { diff --git a/nym-node/src/node/mod.rs b/nym-node/src/node/mod.rs index 6ec9105482..545922dfbf 100644 --- a/nym-node/src/node/mod.rs +++ b/nym-node/src/node/mod.rs @@ -802,6 +802,10 @@ impl NymNode { config.api.v1_config.node.roles.ip_packet_router_enabled = true; } + if let Some(path) = &self.config.gateway_tasks.storage_paths.bridge_client_params { + config = config.with_bridge_client_params_file(path); + } + let x25519_versioned_noise_key = if self.config.mixnet.debug.unsafe_disable_noise { None } else {