diff --git a/Cargo.lock b/Cargo.lock index 21988cff4c..d15c921fdd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4948,6 +4948,7 @@ dependencies = [ "nym-nonexhaustive-delayqueue", "nym-pemstore", "nym-sphinx", + "nym-sphinx-params", "nym-statistics-common", "nym-task", "nym-topology", @@ -4965,7 +4966,9 @@ dependencies = [ "tokio", "tokio-stream", "tokio-tungstenite", + "toml 0.8.19", "tungstenite 0.20.1", + "uneval", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -5991,7 +5994,7 @@ dependencies = [ [[package]] name = "nym-node" -version = "1.2.0" +version = "1.2.1" dependencies = [ "anyhow", "async-trait", @@ -10468,6 +10471,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "uneval" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63cc5d2fd8648d7e2be86098f60c9ece7045cc710b3c1e226910e2f37d11dc73" +dependencies = [ + "serde", + "thiserror", +] + [[package]] name = "unicase" version = "2.7.0" diff --git a/common/client-core/Cargo.toml b/common/client-core/Cargo.toml index f6536b9762..59ae75aa47 100644 --- a/common/client-core/Cargo.toml +++ b/common/client-core/Cargo.toml @@ -8,6 +8,13 @@ license.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[build-dependencies] +nym-client-core-config-types = { path = "./config-types", features = [ + "disk-persistence", +] } +toml.workspace = true +uneval = "0.2.4" + [dependencies] async-trait = { workspace = true } base64 = { workspace = true } @@ -43,6 +50,7 @@ nym-gateway-requests = { path = "../gateway-requests" } nym-metrics = { path = "../nym-metrics" } nym-nonexhaustive-delayqueue = { path = "../nonexhaustive-delayqueue" } nym-sphinx = { path = "../nymsphinx" } +nym-sphinx-params = { path = "../nymsphinx/params" } nym-statistics-common = { path = "../statistics" } nym-pemstore = { path = "../pemstore" } nym-topology = { path = "../topology", features = ["persistence"] } @@ -117,12 +125,15 @@ features = ["wasm-bindgen"] [dev-dependencies] tempfile = { workspace = true } +toml.workspace = true [features] -default = [] +default = ["enable-cfg"] cli = ["clap", "comfy-table"] fs-credentials-storage = ["nym-credential-storage/persistent-storage"] fs-surb-storage = ["nym-client-core-surb-storage/fs-surb-storage"] fs-gateways-storage = ["nym-client-core-gateways-storage/fs-gateways-storage"] wasm = ["nym-gateway-client/wasm"] metrics-server = [] + +enable-cfg = [] \ No newline at end of file diff --git a/common/client-core/build.rs b/common/client-core/build.rs new file mode 100644 index 0000000000..4fe3ab03ce --- /dev/null +++ b/common/client-core/build.rs @@ -0,0 +1,109 @@ +use nym_client_core_config_types::Config; + +use std::io::{BufWriter, Write}; + +fn main() { + write_conditional_default(); + + println!("cargo:rerun-if-changed=build.rs"); +} + +#[allow(unused)] +const DEFAULT_CONFIG_FILE_NAME: &str = "nymvpn-config.toml"; + +const CONFIG_INIT_FN_PREAMBLE: &[u8] = br#" +pub fn new_bootstrapped(id: S1, version: S2) -> Config +where + S1: Into, + S2: Into, +{ + use nym_sphinx_params::{PacketSize, PacketType}; + + + let mut cfg: Config = "#; + +const CONFIG_INIT_FN_EPILOGUE: &[u8] = br#"; + cfg.client.id = id.into(); + cfg.client.version = version.into(); + cfg +}"#; + +// #[cfg(feature = "enable-cfg")] +// const CUSTOM_BREAK: &[u8] = br#" +// #[cfg(feature="enable-cfg")] +// "#; + +// #[cfg(not(feature = "enable-cfg"))] +// const DEFAULT_BREAK: &[u8] = br#" +// #[cfg(not(feature="enable-cfg"))] +// "#; + +// const CONFIG_INIT_FN_PREAMBLE: &[u8] = br#" +// impl Default for BaseClientConfig { +// fn default() -> Self { +// use config_types::Keys; + +// Self("#; + +// const DEFAULT_CONFIG_EPILOGUE: &[u8] = br#" +// ) +// } +// }"#; + +// #[cfg(feature = "enable-cfg")] +// const CUSTOM_BREAK: &[u8] = br#" +// #[cfg(feature="enable-cfg")] +// "#; + +// #[cfg(not(feature = "enable-cfg"))] +// const DEFAULT_BREAK: &[u8] = br#" +// #[cfg(not(feature="enable-cfg"))] +// "#; + +fn write_conditional_default() { + // creating a string with the values from our default Config object + let mut array_string = BufWriter::new(Vec::new()); + array_string.write(CONFIG_INIT_FN_PREAMBLE).unwrap(); + + #[cfg(feature = "enable-cfg")] + write_custom_config(&mut array_string); + + #[cfg(not(feature = "enable-cfg"))] + { + let default_config = Config::new("", ""); + uneval::write(default_config, &mut array_string).unwrap(); + } + + array_string.write(CONFIG_INIT_FN_EPILOGUE).unwrap(); + + // write the string to a file. OUT_DIR environment variable is defined by cargo + let out_dir = std::env::var("OUT_DIR").unwrap(); + let dest_path = std::path::Path::new(&out_dir).join("default.rs"); + + let out_str = String::from_utf8(array_string.into_inner().unwrap()).unwrap(); + std::fs::write(&dest_path, out_str).unwrap(); +} + +#[cfg(feature = "enable-cfg")] +pub(crate) fn write_custom_config(out: impl Write) { + // allow the name of the file we draw hardcoded values from to be set by an + // environment variable at compile time. + let cfg_file_name = option_env!("NYMVPN_CONFIG_PATH").unwrap_or(DEFAULT_CONFIG_FILE_NAME); + + // set reasons to rebuild + println!("cargo:rerun-if-changed={cfg_file_name}"); + println!("cargo:rerun-if-env-changed=NYMVPN_CONFIG_PATH"); + + let path = std::path::PathBuf::from(cfg_file_name); + let cfg_file_path = if path.is_absolute() { + path + } else { + let workspace_path = std::env::var("CARGO_MANIFEST_DIR").unwrap(); + std::path::Path::new(&workspace_path).join(cfg_file_name) + }; + + let config_str: String = std::fs::read_to_string(cfg_file_path).unwrap(); + let config: Config = toml::from_str(&config_str).unwrap(); + + uneval::write(config, out).unwrap(); +} diff --git a/common/client-core/nymvpn-config.toml b/common/client-core/nymvpn-config.toml new file mode 100644 index 0000000000..45eb9458d2 --- /dev/null +++ b/common/client-core/nymvpn-config.toml @@ -0,0 +1,54 @@ + +[client] +version = "" +id = "" +disabled_credentials_mode = true +nyxd_urls = ["https://rpc.nymtech.net/"] +nym_api_urls = ["https://validator.nymtech.net/api/"] + +[debug.traffic] +average_packet_delay = "50ms" +message_sending_average_delay = "20ms" +disable_main_poisson_packet_distribution = false +deterministic_route_selection = false +primary_packet_size = "regular" +packet_type = "mix" + +[debug.cover_traffic] +loop_cover_traffic_average_delay = "200ms" +cover_traffic_primary_size_ratio = 0.7 +disable_loop_cover_traffic_stream = false + +[debug.gateway_connection] +gateway_response_timeout = "5m" + +[debug.acknowledgements] +average_ack_delay = "50ms" +ack_wait_multiplier = 1.5 +ack_wait_addition = "1s 500ms" + +[debug.topology] +topology_refresh_rate = "5m" +topology_resolution_timeout = "5s" +disable_refreshing = false +max_startup_gateway_waiting_period = "1h 10m" +topology_structure = "NymApi" +minimum_mixnode_performance = 50 +minimum_gateway_performance = 50 +use_extended_topology = false +ignore_egress_epoch_role = false + +[debug.reply_surbs] +minimum_reply_surb_storage_threshold = 10 +maximum_reply_surb_storage_threshold = 200 +minimum_reply_surb_request_size = 10 +maximum_reply_surb_request_size = 100 +maximum_allowed_reply_surb_request_size = 500 +maximum_reply_surb_rerequest_waiting_period = "10s" +maximum_reply_surb_drop_waiting_period = "5m" +maximum_reply_surb_age = "12h" +maximum_reply_key_age = "1day" + +[debug.stats_reporting] +enabled = true +reporting_interval = "5m" \ No newline at end of file diff --git a/common/client-core/src/config/mod.rs b/common/client-core/src/config/mod.rs index 69c30c69ae..e8c4b21496 100644 --- a/common/client-core/src/config/mod.rs +++ b/common/client-core/src/config/mod.rs @@ -7,3 +7,40 @@ pub use nym_client_core_config_types::old::{ old_config_v1_1_33, }; pub use nym_client_core_config_types::*; + + + +include!(concat!(env!("OUT_DIR"), "/default.rs")); + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn dump_default() { + let cfg = Config::new("",""); + println!("{}", toml::to_string(&cfg).unwrap()); + } + + #[test] + fn bootstrapped_config() { + #[cfg(not(feature = "enable-cfg"))] + { + let config = new_bootstrapped("id1", "v0.0.0"); + assert_eq!(config.client.id, "id1"); + assert_eq!(config.client.version, "v0.0.0"); + assert_eq!(config.client.disabled_credentials_mode, true); + + assert_eq!(config.debug.topology.use_extended_topology, false); + assert_eq!(config.debug.stats_reporting.enabled, true); + } + #[cfg(feature = "enable-cfg")] + { + let config = new_bootstrapped("id2", "v0.0.0-beta"); + assert_eq!(config.client.id, "id2"); + assert_eq!(config.client.version, "v0.0.0-beta"); + assert_eq!(config.client.disabled_credentials_mode, true); + } + } +} diff --git a/common/nymsphinx/params/src/packet_sizes.rs b/common/nymsphinx/params/src/packet_sizes.rs index 17d85a4efa..b68a40c275 100644 --- a/common/nymsphinx/params/src/packet_sizes.rs +++ b/common/nymsphinx/params/src/packet_sizes.rs @@ -59,30 +59,30 @@ pub enum InvalidPacketSize { pub enum PacketSize { // for example instant messaging use case #[default] - #[serde(rename = "regular")] + #[serde(alias = "regular")] RegularPacket = 1, // for sending SURB-ACKs - #[serde(rename = "ack")] + #[serde(alias = "ack")] AckPacket = 2, // for example for streaming fast and furious in uncompressed 10bit 4K HDR quality - #[serde(rename = "extended32")] + #[serde(alias = "extended32")] ExtendedPacket32 = 3, // for example for streaming fast and furious in heavily compressed lossy RealPlayer quality - #[serde(rename = "extended8")] + #[serde(alias = "extended8")] ExtendedPacket8 = 4, // for example for streaming fast and furious in compressed XviD quality - #[serde(rename = "extended16")] + #[serde(alias = "extended16")] ExtendedPacket16 = 5, - #[serde(rename = "outfox_regular")] + #[serde(alias = "outfox_regular")] OutfoxRegularPacket = 6, // for sending SURB-ACKs - #[serde(rename = "outfox_ack")] + #[serde(alias = "outfox_ack")] OutfoxAckPacket = 7, } diff --git a/common/nymsphinx/params/src/packet_types.rs b/common/nymsphinx/params/src/packet_types.rs index 9d85b0dbfd..30c3c8bc2b 100644 --- a/common/nymsphinx/params/src/packet_types.rs +++ b/common/nymsphinx/params/src/packet_types.rs @@ -23,17 +23,17 @@ pub enum PacketType { /// Represents 'normal' packet sent through the network that should be delayed by an appropriate /// value at each hop. #[default] - #[serde(rename = "mix")] + #[serde(alias = "mix")] #[serde(alias = "sphinx")] Mix = 0, /// Represents a packet that should be sent through the network as fast as possible. #[deprecated] - #[serde(rename = "unsupported-mix-vpn")] + #[serde(alias = "unsupported-mix-vpn")] Vpn = 1, /// Abusing this to add Outfox support - #[serde(rename = "outfox")] + #[serde(alias = "outfox")] Outfox = 2, }