diff --git a/clients/native/src/commands/mod.rs b/clients/native/src/commands/mod.rs index fedb57960e..b2edf8d826 100644 --- a/clients/native/src/commands/mod.rs +++ b/clients/native/src/commands/mod.rs @@ -137,7 +137,7 @@ fn try_upgrade_v1_1_19_config(id: &str) -> Result { // or maybe it was an even older file. in either way. just ignore it and carry on with our day return Ok(false); }; - info!("It seems the client is using <= v1.1.20 config template."); + info!("It seems the client is using <= v1.1.19 config template."); info!("It is going to get updated to the current specification."); let updated: Config = old_config.into(); diff --git a/clients/socks5/src/commands/init.rs b/clients/socks5/src/commands/init.rs index 5b44bafdac..c57cd2e376 100644 --- a/clients/socks5/src/commands/init.rs +++ b/clients/socks5/src/commands/init.rs @@ -1,7 +1,7 @@ // Copyright 2021-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::commands::try_upgrade_v1_1_13_config; +use crate::commands::try_upgrade_config; use crate::config::{ default_config_directory, default_config_filepath, default_data_directory, Config, }; @@ -138,7 +138,7 @@ pub(crate) async fn execute(args: &Init) -> Result<(), Socks5ClientError> { let already_init = if default_config_filepath(id).exists() { // in case we're using old config, try to upgrade it // (if we're using the current version, it's a no-op) - try_upgrade_v1_1_13_config(id)?; + try_upgrade_config(id)?; eprintln!("SOCKS5 client \"{id}\" was already initialised before"); true } else { diff --git a/clients/socks5/src/commands/mod.rs b/clients/socks5/src/commands/mod.rs index d5f577a89c..acf39e37e1 100644 --- a/clients/socks5/src/commands/mod.rs +++ b/clients/socks5/src/commands/mod.rs @@ -2,11 +2,13 @@ // SPDX-License-Identifier: Apache-2.0 use crate::config::old_config_v1_1_13::OldConfigV1_1_13; +use crate::config::old_config_v1_1_19::ConfigV1_1_19; use crate::config::{BaseClientConfig, Config}; +use crate::error::Socks5ClientError; use clap::CommandFactory; use clap::{Parser, Subcommand}; use lazy_static::lazy_static; -use log::info; +use log::{error, info}; use nym_bin_common::build_information::BinaryBuildInformation; use nym_bin_common::completions::{fig_generate, ArgShell}; use nym_config::OptionalSet; @@ -114,19 +116,67 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config { ) } -fn try_upgrade_v1_1_13_config(id: &str) -> std::io::Result<()> { - todo!() - // // explicitly load it as v1.1.13 (which is incompatible with the current, i.e. 1.1.14+) - // let Ok(old_config) = OldConfigV1_1_13::load_from_file(id) else { - // // if we failed to load it, there might have been nothing to upgrade - // // or maybe it was an even older file. in either way. just ignore it and carry on with our day - // return Ok(()); - // }; - // info!("It seems the client is using <= v1.1.13 config template."); - // info!("It is going to get updated to the current specification."); - // - // let updated: Config = old_config.into(); - // updated.save_to_file(None) +fn try_upgrade_v1_1_13_config(id: &str) -> Result { + use nym_config::legacy_helpers::nym_config::MigrationNymConfig; + + // explicitly load it as v1.1.13 (which is incompatible with the next step, i.e. 1.1.19) + let Ok(old_config) = OldConfigV1_1_13::load_from_file(id) else { + // if we failed to load it, there might have been nothing to upgrade + // or maybe it was an even older file. in either way. just ignore it and carry on with our day + return Ok(false); + }; + info!("It seems the client is using <= v1.1.13 config template."); + info!("It is going to get updated to the current specification."); + + let updated_step1: ConfigV1_1_19 = old_config.into(); + let updated: Config = updated_step1.into(); + + updated.save_to_default_location()?; + Ok(true) +} + +fn try_upgrade_v1_1_19_config(id: &str) -> Result { + use nym_config::legacy_helpers::nym_config::MigrationNymConfig; + + // explicitly load it as v1.1.19 (which is incompatible with the current one, i.e. +1.1.20) + let Ok(old_config) = ConfigV1_1_19::load_from_file(id) else { + // if we failed to load it, there might have been nothing to upgrade + // or maybe it was an even older file. in either way. just ignore it and carry on with our day + return Ok(false); + }; + info!("It seems the client is using <= v1.1.19 config template."); + info!("It is going to get updated to the current specification."); + + let updated: Config = old_config.into(); + updated.save_to_default_location()?; + Ok(true) +} + +fn try_upgrade_config(id: &str) -> Result<(), Socks5ClientError> { + let upgraded = try_upgrade_v1_1_13_config(id)?; + if !upgraded { + try_upgrade_v1_1_19_config(id)?; + } + + Ok(()) +} + +fn try_load_current_config(id: &str) -> Result { + try_upgrade_config(id)?; + + let config = match Config::read_from_default_path(id) { + Ok(cfg) => cfg, + Err(err) => { + error!("Failed to load config for {id}. Are you sure you have run `init` before? (Error was: {err})"); + return Err(Socks5ClientError::FailedToLoadConfig(id.to_string())); + } + }; + + if !config.validate() { + return Err(Socks5ClientError::ConfigValidationFailure); + } + + Ok(config) } #[cfg(test)] diff --git a/clients/socks5/src/commands/run.rs b/clients/socks5/src/commands/run.rs index 121cabd206..a6bc88344b 100644 --- a/clients/socks5/src/commands/run.rs +++ b/clients/socks5/src/commands/run.rs @@ -1,7 +1,7 @@ // Copyright 2021-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::commands::try_upgrade_v1_1_13_config; +use crate::commands::try_load_current_config; use crate::config::Config; use crate::{ commands::{override_config, OverrideConfig}, @@ -21,10 +21,6 @@ pub(crate) struct Run { #[clap(long)] id: String, - /// Custom path to the nym-mixnet-client configuration file - #[clap(long)] - config: Option, - /// Specifies whether this client is going to use an anonymous sender tag for communication with the service provider. /// While this is going to hide its actual address information, it will make the actual communication /// slower and consume nearly double the bandwidth as it will require sending reply SURBs. @@ -97,8 +93,7 @@ fn version_check(cfg: &Config) -> bool { true } else { warn!( - "The mixnode binary has different version than what is specified in config file! {} and {}", - binary_version, config_version + "The socks5-client binary has different version than what is specified in config file! {binary_version} and {config_version}", ); if is_minor_version_compatible(binary_version, config_version) { info!("but they are still semver compatible. However, consider running the `upgrade` command"); @@ -111,28 +106,10 @@ fn version_check(cfg: &Config) -> bool { } pub(crate) async fn execute(args: &Run) -> Result<(), Box> { - let id = &args.id; + eprintln!("Starting client {}...", args.id); - // in case we're using old config, try to upgrade it - // (if we're using the current version, it's a no-op) - try_upgrade_v1_1_13_config(id)?; - - let mut config = match Config::read_from_default_path(id) { - Ok(cfg) => cfg, - Err(err) => { - error!("Failed to load config for {}. Are you sure you have run `init` before? (Error was: {err})", id); - return Err(Box::new(Socks5ClientError::FailedToLoadConfig( - id.to_string(), - ))); - } - }; - - if !config.validate() { - return Err(Box::new(Socks5ClientError::ConfigValidationFailure)); - } - - let override_config_fields = OverrideConfig::from(args.clone()); - config = override_config(config, override_config_fields); + let mut config = try_load_current_config(&args.id)?; + config = override_config(config, OverrideConfig::from(args.clone())); if !version_check(&config) { error!("failed the local version check"); diff --git a/clients/socks5/src/commands/upgrade.rs b/clients/socks5/src/commands/upgrade.rs index 6c13e34db8..00ffb9252b 100644 --- a/clients/socks5/src/commands/upgrade.rs +++ b/clients/socks5/src/commands/upgrade.rs @@ -1,44 +1,14 @@ // Copyright 2021-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use crate::commands::try_load_current_config; use crate::config::Config; use clap::Args; use nym_bin_common::version_checker::Version; -use std::{fmt::Display, process}; - -#[allow(dead_code)] -fn fail_upgrade(from_version: D1, to_version: D2) -> ! { - print_failed_upgrade(from_version, to_version); - process::exit(1) -} - -fn print_start_upgrade(from: D1, to: D2) { - println!("\n==================\nTrying to upgrade client from {from} to {to} ..."); -} - -fn print_failed_upgrade(from: D1, to: D2) { - eprintln!("Upgrade from {from} to {to} failed!\n==================\n"); -} - -fn print_successful_upgrade(from: D1, to: D2) { - println!("Upgrade from {from} to {to} was successful!\n==================\n"); -} - -fn outdated_upgrade(config_version: &Version, package_version: &Version) -> ! { - eprintln!( - "Cannot perform upgrade from {config_version} to {package_version}. Your version is too old to perform the upgrade.!" - ); - process::exit(1) -} - -fn unsupported_upgrade(current_version: &Version, config_version: &Version) -> ! { - eprintln!("Cannot perform upgrade from {config_version} to {current_version}. Please let the developers know about this issue if you expected it to work!"); - process::exit(1) -} +use std::process; fn unimplemented_upgrade(current_version: &Version, config_version: &Version) -> ! { eprintln!("Cannot perform upgrade from {config_version} to {current_version} as it hasn't been implemented yet"); - todo!(); process::exit(1) } @@ -57,8 +27,7 @@ fn parse_config_version(config: &Config) -> Version { if version.is_prerelease() || !version.build.is_empty() { eprintln!( - "Trying to upgrade from a non-released version {}. This is not supported!", - version + "Trying to upgrade from a non-released version {version}. This is not supported!" ); process::exit(1) } @@ -73,35 +42,21 @@ fn parse_package_version() -> Version { // however, we are not using them ourselves at the moment and hence it should be fine. // if we change our mind, we could easily tweak this code if version.is_prerelease() || !version.build.is_empty() { - eprintln!( - "Trying to upgrade to a non-released version {}. This is not supported!", - version - ); + eprintln!("Trying to upgrade to a non-released version {version}. This is not supported!"); process::exit(1) } version } -fn do_upgrade(mut config: Config, args: &Upgrade, package_version: &Version) { - loop { - let config_version = parse_config_version(&config); - - if &config_version == package_version { - println!("You're using the most recent version!"); - return; - } - - config = match config_version.major { - 0 => outdated_upgrade(&config_version, package_version), - 1 => match config_version.minor { - n if n <= 13 => outdated_upgrade(&config_version, package_version), - n if n > 13 && n < 19 => unimplemented_upgrade(&config_version, package_version), - _ => unsupported_upgrade(&config_version, package_version), - }, - _ => unsupported_upgrade(&config_version, package_version), - } +fn do_upgrade(config: Config, _args: &Upgrade, package_version: &Version) { + let config_version = parse_config_version(&config); + if &config_version == package_version { + println!("You're using the most recent version!"); + return; } + + unimplemented_upgrade(package_version, &config_version) } pub(crate) fn execute(args: &Upgrade) { @@ -109,7 +64,7 @@ pub(crate) fn execute(args: &Upgrade) { let id = &args.id; - let existing_config = Config::read_from_default_path(id).unwrap_or_else(|err| { + let existing_config = try_load_current_config(id).unwrap_or_else(|err| { eprintln!("failed to load existing config file! - {err}"); process::exit(1) }); @@ -119,6 +74,5 @@ pub(crate) fn execute(args: &Upgrade) { process::exit(1); } - // here be upgrade path to 0.9.X and beyond based on version number from config do_upgrade(existing_config, args, &package_version) } diff --git a/clients/socks5/src/config/mod.rs b/clients/socks5/src/config/mod.rs index 0b956c4543..7b24ed765e 100644 --- a/clients/socks5/src/config/mod.rs +++ b/clients/socks5/src/config/mod.rs @@ -7,7 +7,7 @@ use nym_bin_common::logging::LoggingSettings; pub use nym_client_core::config::Config as BaseClientConfig; use nym_config::{ must_get_home, read_config_from_toml_file, save_formatted_config_to_file, NymConfigTemplate, - OptionalSet, DEFAULT_CONFIG_DIR, DEFAULT_CONFIG_FILENAME, DEFAULT_DATA_DIR, NYM_DIR, + DEFAULT_CONFIG_DIR, DEFAULT_CONFIG_FILENAME, DEFAULT_DATA_DIR, NYM_DIR, }; pub use nym_socks5_client_core::config::Config as CoreConfig; use serde::{Deserialize, Serialize}; @@ -17,6 +17,7 @@ use std::path::{Path, PathBuf}; use std::str::FromStr; pub mod old_config_v1_1_13; +pub mod old_config_v1_1_19; mod persistence; mod template; @@ -51,7 +52,6 @@ pub fn default_data_directory>(id: P) -> PathBuf { #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] #[serde(deny_unknown_fields)] pub struct Config { - #[serde(flatten)] pub core: CoreConfig, pub storage_paths: SocksClientPaths, @@ -132,6 +132,7 @@ impl Config { self } + #[allow(unused)] pub fn with_optional_base_env(mut self, f: F, val: Option, env_var: &str) -> Self where F: Fn(BaseClientConfig, T) -> BaseClientConfig, @@ -158,45 +159,4 @@ impl Config { .with_optional_base_custom_env(f, val, env_var, parser); self } - - pub fn with_core(mut self, f: F, val: T) -> Self - where - F: Fn(CoreConfig, T) -> CoreConfig, - { - self.core = f(self.core, val); - self - } - - pub fn with_optional_core(mut self, f: F, val: Option) -> Self - where - F: Fn(CoreConfig, T) -> CoreConfig, - { - self.core = self.core.with_optional(f, val); - self - } - - pub fn with_optional_core_env(mut self, f: F, val: Option, env_var: &str) -> Self - where - F: Fn(CoreConfig, T) -> CoreConfig, - T: FromStr, - ::Err: Debug, - { - self.core = self.core.with_optional_env(f, val, env_var); - self - } - - pub fn with_optional_core_custom_env( - mut self, - f: F, - val: Option, - env_var: &str, - parser: G, - ) -> Self - where - F: Fn(CoreConfig, T) -> CoreConfig, - G: Fn(&str) -> T, - { - self.core = self.core.with_optional_custom_env(f, val, env_var, parser); - self - } } diff --git a/clients/socks5/src/config/old_config_v1_1_13.rs b/clients/socks5/src/config/old_config_v1_1_13.rs index ffe9c2a907..2c157448e2 100644 --- a/clients/socks5/src/config/old_config_v1_1_13.rs +++ b/clients/socks5/src/config/old_config_v1_1_13.rs @@ -1,61 +1,38 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::config::Config; +use crate::config::old_config_v1_1_19::{ConfigV1_1_19, Socks5V1_1_19}; use nym_client_core::config::old_config_v1_1_13::OldConfigV1_1_13 as OldBaseConfigV1_1_13; +use nym_config::legacy_helpers::nym_config::MigrationNymConfig; +use nym_config::must_get_home; use serde::{Deserialize, Serialize}; use std::path::PathBuf; -#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)] +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] #[serde(deny_unknown_fields)] pub struct OldConfigV1_1_13 { #[serde(flatten)] - base: OldBaseConfigV1_1_13, - // socks5: Socks5, + pub base: OldBaseConfigV1_1_13, + + pub socks5: Socks5V1_1_19, } -// impl NymConfig for OldConfigV1_1_13 { -// fn template() -> &'static str { -// // not intended to be used -// unimplemented!() -// } -// -// fn default_root_directory() -> PathBuf { -// #[cfg(not(target_os = "android"))] -// let base_dir = dirs::home_dir().expect("Failed to evaluate $HOME value"); -// #[cfg(target_os = "android")] -// let base_dir = PathBuf::from("/tmp"); -// -// base_dir.join(".nym").join("socks5-clients") -// } -// -// fn try_default_root_directory() -> Option { -// dirs::home_dir().map(|path| path.join(".nym").join("socks5-clients")) -// } -// -// fn root_directory(&self) -> PathBuf { -// self.base.client.nym_root_directory.clone() -// } -// -// fn config_directory(&self) -> PathBuf { -// self.root_directory() -// .join(&self.base.client.id) -// .join("config") -// } -// -// fn data_directory(&self) -> PathBuf { -// self.root_directory() -// .join(&self.base.client.id) -// .join("data") -// } -// } -// -impl From for Config { - fn from(value: OldConfigV1_1_13) -> Self { - todo!() - // Config { - // base: value.base.into(), - // socks5: value.socks5, - // } +impl MigrationNymConfig for OldConfigV1_1_13 { + fn default_root_directory() -> PathBuf { + #[cfg(not(any(target_os = "android", target_os = "ios")))] + let base_dir = must_get_home(); + #[cfg(any(target_os = "android", target_os = "ios"))] + let base_dir = PathBuf::from("/tmp"); + + base_dir.join(".nym").join("socks5-clients") + } +} + +impl From for ConfigV1_1_19 { + fn from(value: OldConfigV1_1_13) -> Self { + ConfigV1_1_19 { + base: value.base.into(), + socks5: value.socks5, + } } } diff --git a/clients/socks5/src/config/old_config_v1_1_19.rs b/clients/socks5/src/config/old_config_v1_1_19.rs new file mode 100644 index 0000000000..d7766b1b18 --- /dev/null +++ b/clients/socks5/src/config/old_config_v1_1_19.rs @@ -0,0 +1,135 @@ +// Copyright 2021-2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::config::persistence::SocksClientPaths; +use crate::config::{BaseClientConfig, Config, CoreConfig}; +use nym_bin_common::logging::LoggingSettings; +use nym_client_core::config::disk_persistence::keys_paths::ClientKeysPaths; +use nym_client_core::config::disk_persistence::CommonClientPaths; +use nym_client_core::config::old_config_v1_1_19::ConfigV1_1_19 as BaseConfigV1_1_19; +use nym_client_core::config::Client; +use nym_config::legacy_helpers::nym_config::MigrationNymConfig; +use nym_config::must_get_home; +use nym_socks5_client_core::config::{ + ProviderInterfaceVersion, Socks5, Socks5Debug, Socks5ProtocolVersion, +}; +use serde::{Deserialize, Serialize}; +use std::fmt::Debug; +use std::path::PathBuf; + +const DEFAULT_CONNECTION_START_SURBS: u32 = 20; +const DEFAULT_PER_REQUEST_SURBS: u32 = 3; + +#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct ConfigV1_1_19 { + #[serde(flatten)] + pub base: BaseConfigV1_1_19, + + pub socks5: Socks5V1_1_19, +} + +impl From for Config { + fn from(value: ConfigV1_1_19) -> Self { + Config { + core: CoreConfig { + base: BaseClientConfig { + client: Client { + version: value.base.client.version, + id: value.base.client.id, + disabled_credentials_mode: value.base.client.disabled_credentials_mode, + nyxd_urls: value.base.client.nyxd_urls, + nym_api_urls: value.base.client.nym_api_urls, + gateway_endpoint: value.base.client.gateway_endpoint.into(), + }, + debug: value.base.debug.into(), + }, + socks5: value.socks5.into(), + }, + storage_paths: SocksClientPaths { + common_paths: CommonClientPaths { + keys: ClientKeysPaths { + private_identity_key_file: value.base.client.private_identity_key_file, + public_identity_key_file: value.base.client.public_identity_key_file, + private_encryption_key_file: value.base.client.private_encryption_key_file, + public_encryption_key_file: value.base.client.public_encryption_key_file, + gateway_shared_key_file: value.base.client.gateway_shared_key_file, + ack_key_file: value.base.client.ack_key_file, + }, + credentials_database: value.base.client.database_path, + reply_surb_database: value.base.client.reply_surb_database_path, + }, + }, + logging: LoggingSettings::default(), + } + } +} + +impl MigrationNymConfig for ConfigV1_1_19 { + fn default_root_directory() -> PathBuf { + #[cfg(not(any(target_os = "android", target_os = "ios")))] + let base_dir = must_get_home(); + #[cfg(any(target_os = "android", target_os = "ios"))] + let base_dir = PathBuf::from("/tmp"); + + base_dir.join(".nym").join("socks5-clients") + } +} + +#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct Socks5V1_1_19 { + pub listening_port: u16, + + pub provider_mix_address: String, + + #[serde(default = "ProviderInterfaceVersion::new_legacy")] + pub provider_interface_version: ProviderInterfaceVersion, + + #[serde(default = "Socks5ProtocolVersion::new_legacy")] + pub socks5_protocol_version: Socks5ProtocolVersion, + + #[serde(default)] + pub send_anonymously: bool, + + #[serde(default)] + pub socks5_debug: Socks5DebugV1_1_19, +} + +impl From for Socks5 { + fn from(value: Socks5V1_1_19) -> Self { + Socks5 { + listening_port: value.listening_port, + provider_mix_address: value.provider_mix_address, + provider_interface_version: value.provider_interface_version, + socks5_protocol_version: value.socks5_protocol_version, + send_anonymously: value.send_anonymously, + socks5_debug: value.socks5_debug.into(), + } + } +} + +#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)] +#[serde(deny_unknown_fields)] +pub struct Socks5DebugV1_1_19 { + connection_start_surbs: u32, + per_request_surbs: u32, +} + +impl From for Socks5Debug { + fn from(value: Socks5DebugV1_1_19) -> Self { + Socks5Debug { + connection_start_surbs: value.connection_start_surbs, + per_request_surbs: value.per_request_surbs, + } + } +} + +impl Default for Socks5DebugV1_1_19 { + fn default() -> Self { + Socks5DebugV1_1_19 { + connection_start_surbs: DEFAULT_CONNECTION_START_SURBS, + per_request_surbs: DEFAULT_PER_REQUEST_SURBS, + } + } +} diff --git a/clients/socks5/src/config/template.rs b/clients/socks5/src/config/template.rs index e6d81335ee..fd4aec5f52 100644 --- a/clients/socks5/src/config/template.rs +++ b/clients/socks5/src/config/template.rs @@ -11,91 +11,87 @@ pub(crate) const CONFIG_TEMPLATE: &str = r#" ##### main base client config options ##### -[client] +[core.client] # Version of the client for which this configuration was created. -version = '{{ client.version }}' +version = '{{ core.client.version }}' # Human readable ID of this particular client. -id = '{{ client.id }}' +id = '{{ core.client.id }}' # Indicates whether this client is running in a disabled credentials mode, thus attempting # to claim bandwidth without presenting bandwidth credentials. -disabled_credentials_mode = {{ client.disabled_credentials_mode }} +disabled_credentials_mode = {{ core.client.disabled_credentials_mode }} # Addresses to nyxd validators via which the client can communicate with the chain. nyxd_urls = [ - {{#each client.nyxd_urls }} + {{#each core.client.nyxd_urls }} '{{this}}', {{/each}} ] # Addresses to APIs running on validator from which the client gets the view of the network. nym_api_urls = [ - {{#each client.nym_api_urls }} + {{#each core.client.nym_api_urls }} '{{this}}', {{/each}} ] +[storage_paths] + # Path to file containing private identity key. -private_identity_key_file = '{{ client.private_identity_key_file }}' +keys.private_identity_key_file = '{{ storage_paths.keys.private_identity_key_file }}' # Path to file containing public identity key. -public_identity_key_file = '{{ client.public_identity_key_file }}' +keys.public_identity_key_file = '{{ storage_paths.keys.public_identity_key_file }}' # Path to file containing private encryption key. -private_encryption_key_file = '{{ client.private_encryption_key_file }}' +keys.private_encryption_key_file = '{{ storage_paths.keys.private_encryption_key_file }}' # Path to file containing public encryption key. -public_encryption_key_file = '{{ client.public_encryption_key_file }}' - -# Path to the database containing bandwidth credentials -database_path = '{{ client.database_path }}' - -# Path to the persistent store for received reply surbs, unused encryption keys and used sender tags. -reply_surb_database_path = '{{ client.reply_surb_database_path }}' - -##### additional client config options ##### +keys.public_encryption_key_file = '{{ storage_paths.keys.public_encryption_key_file }}' # A gateway specific, optional, base58 stringified shared key used for # communication with particular gateway. -gateway_shared_key_file = '{{ client.gateway_shared_key_file }}' +keys.gateway_shared_key_file = '{{ storage_paths.keys.gateway_shared_key_file }}' # Path to file containing key used for encrypting and decrypting the content of an # acknowledgement so that nobody besides the client knows which packet it refers to. -ack_key_file = '{{ client.ack_key_file }}' +keys.ack_key_file = '{{ storage_paths.keys.ack_key_file }}' -##### advanced configuration options ##### +# Path to the database containing bandwidth credentials +credentials_database = '{{ storage_paths.credentials_database }}' -# Absolute path to the home Nym Clients directory. -nym_root_directory = '{{ client.nym_root_directory }}' +# Path to the persistent store for received reply surbs, unused encryption keys and used sender tags. +reply_surb_database = '{{ storage_paths.reply_surb_database }}' -[client.gateway_endpoint] +# DEPRECATED +[core.client.gateway_endpoint] # ID of the gateway from which the client should be fetching messages. -gateway_id = '{{ client.gateway_endpoint.gateway_id }}' +gateway_id = '{{ core.client.gateway_endpoint.gateway_id }}' # Address of the gateway owner to which the client should send messages. -gateway_owner = '{{ client.gateway_endpoint.gateway_owner }}' +gateway_owner = '{{ core.client.gateway_endpoint.gateway_owner }}' # Address of the gateway listener to which all client requests should be sent. -gateway_listener = '{{ client.gateway_endpoint.gateway_listener }}' +gateway_listener = '{{ core.client.gateway_endpoint.gateway_listener }}' ##### socket config options ##### -[socks5] +[core.socks5] # The mix address of the provider to which all requests are going to be sent. -provider_mix_address = '{{ socks5.provider_mix_address }}' +provider_mix_address = '{{ core.socks5.provider_mix_address }}' # The port on which the client will be listening for incoming requests -listening_port = {{ socks5.listening_port }} +listening_port = {{ core.socks5.listening_port }} # Specifies whether this client is going to use an anonymous sender tag for communication with the service provider. # While this is going to hide its actual address information, it will make the actual communication # slower and consume nearly double the bandwidth as it will require sending reply SURBs. # # Note that some service providers might not support this. -send_anonymously = {{ socks5.send_anonymously }} +send_anonymously = {{ core.socks5.send_anonymously }} ##### logging configuration options ##### @@ -108,19 +104,19 @@ send_anonymously = {{ socks5.send_anonymously }} # The following options should not be modified unless you know EXACTLY what you are doing # as if set incorrectly, they may impact your anonymity. -# [socks5.socks5_debug] +# [core.socks5.socks5_debug] -[debug] +[core.debug] -[debug.traffic] -average_packet_delay = '{{ debug.traffic.average_packet_delay }}' -message_sending_average_delay = '{{ debug.traffic.message_sending_average_delay }}' +[core.debug.traffic] +average_packet_delay = '{{ core.debug.traffic.average_packet_delay }}' +message_sending_average_delay = '{{ core.debug.traffic.message_sending_average_delay }}' -[debug.acknowledgements] -average_ack_delay = '{{ debug.acknowledgements.average_ack_delay }}' +[core.debug.acknowledgements] +average_ack_delay = '{{ core.debug.acknowledgements.average_ack_delay }}' -[debug.cover_traffic] -loop_cover_traffic_average_delay = '{{ debug.cover_traffic.loop_cover_traffic_average_delay }}' +[core.debug.cover_traffic] +loop_cover_traffic_average_delay = '{{ core.debug.cover_traffic.loop_cover_traffic_average_delay }}' "#; diff --git a/common/socks5-client-core/src/config/mod.rs b/common/socks5-client-core/src/config/mod.rs index 6d6694b676..cb639a036a 100644 --- a/common/socks5-client-core/src/config/mod.rs +++ b/common/socks5-client-core/src/config/mod.rs @@ -4,14 +4,15 @@ pub use nym_client_core::config::Config as BaseClientConfig; use nym_config::defaults::DEFAULT_SOCKS5_LISTENING_PORT; use nym_config::OptionalSet; -use nym_service_providers_common::interface::ProviderInterfaceVersion; -use nym_socks5_requests::Socks5ProtocolVersion; use nym_sphinx::addressing::clients::Recipient; use serde::{Deserialize, Serialize}; use std::fmt::Debug; use std::str::FromStr; -pub mod old_config_v1_1_13; +pub use nym_service_providers_common::interface::ProviderInterfaceVersion; +pub use nym_socks5_requests::Socks5ProtocolVersion; + +// pub mod old_config_v1_1_13; const DEFAULT_CONNECTION_START_SURBS: u32 = 20; const DEFAULT_PER_REQUEST_SURBS: u32 = 3; diff --git a/common/socks5-client-core/src/config/old_config_v1_1_13.rs b/common/socks5-client-core/src/config/old_config_v1_1_13.rs index 624157edd8..095b4b21d0 100644 --- a/common/socks5-client-core/src/config/old_config_v1_1_13.rs +++ b/common/socks5-client-core/src/config/old_config_v1_1_13.rs @@ -6,57 +6,57 @@ use nym_client_core::config::old_config_v1_1_13::OldConfigV1_1_13 as OldBaseConf use serde::{Deserialize, Serialize}; use std::path::PathBuf; -#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] -#[serde(deny_unknown_fields)] -pub struct OldConfigV1_1_13 { - #[serde(flatten)] - base: OldBaseConfigV1_1_13, - - socks5: Socks5, -} - +// #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] +// #[serde(deny_unknown_fields)] +// pub struct OldConfigV1_1_13 { +// #[serde(flatten)] +// base: OldBaseConfigV1_1_13, // -// impl NymConfig for OldConfigV1_1_13 { -// fn template() -> &'static str { -// // not intended to be used -// unimplemented!() -// } +// socks5: Socks5, +// } // -// fn default_root_directory() -> PathBuf { -// #[cfg(not(target_os = "android"))] -// let base_dir = dirs::home_dir().expect("Failed to evaluate $HOME value"); -// #[cfg(target_os = "android")] -// let base_dir = PathBuf::from("/tmp"); +// // +// // impl NymConfig for OldConfigV1_1_13 { +// // fn template() -> &'static str { +// // // not intended to be used +// // unimplemented!() +// // } +// // +// // fn default_root_directory() -> PathBuf { +// // #[cfg(not(target_os = "android"))] +// // let base_dir = dirs::home_dir().expect("Failed to evaluate $HOME value"); +// // #[cfg(target_os = "android")] +// // let base_dir = PathBuf::from("/tmp"); +// // +// // base_dir.join(".nym").join("socks5-clients") +// // } +// // +// // fn try_default_root_directory() -> Option { +// // dirs::home_dir().map(|path| path.join(".nym").join("socks5-clients")) +// // } +// // +// // fn root_directory(&self) -> PathBuf { +// // self.base.client.nym_root_directory.clone() +// // } +// // +// // fn config_directory(&self) -> PathBuf { +// // self.root_directory() +// // .join(&self.base.client.id) +// // .join("config") +// // } +// // +// // fn data_directory(&self) -> PathBuf { +// // self.root_directory() +// // .join(&self.base.client.id) +// // .join("data") +// // } +// // } // -// base_dir.join(".nym").join("socks5-clients") -// } -// -// fn try_default_root_directory() -> Option { -// dirs::home_dir().map(|path| path.join(".nym").join("socks5-clients")) -// } -// -// fn root_directory(&self) -> PathBuf { -// self.base.client.nym_root_directory.clone() -// } -// -// fn config_directory(&self) -> PathBuf { -// self.root_directory() -// .join(&self.base.client.id) -// .join("config") -// } -// -// fn data_directory(&self) -> PathBuf { -// self.root_directory() -// .join(&self.base.client.id) -// .join("data") +// impl From for Config { +// fn from(value: OldConfigV1_1_13) -> Self { +// Config { +// base: value.base.into(), +// socks5: value.socks5, +// } // } // } - -impl From for Config { - fn from(value: OldConfigV1_1_13) -> Self { - Config { - base: value.base.into(), - socks5: value.socks5, - } - } -} diff --git a/common/socks5-client-core/src/lib.rs b/common/socks5-client-core/src/lib.rs index 47d1570510..7d8b2382ea 100644 --- a/common/socks5-client-core/src/lib.rs +++ b/common/socks5-client-core/src/lib.rs @@ -1,7 +1,7 @@ // Copyright 2021-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::config::{Config, Socks5}; +use crate::config::Config; use crate::error::Socks5ClientCoreError; use crate::socks::{ authentication::{AuthenticationMethods, Authenticator, User},