From 932e66e14533ea15f3acff526b852e8ecafb938b Mon Sep 17 00:00:00 2001 From: Jose Celano Date: Fri, 17 May 2024 15:44:08 +0100 Subject: [PATCH 1/3] feat: [#870] add privacy methods to the TrackerMode The tracker mode can be: - Public (Non-whitelisted) - Listed (Whitelisted) - Private (Non-whitelisted) - PrivateListed (Whitelisted) They should have been two different flags (in my opinion): - Visibility: public or private - Whitelisted: true or false So we would have the same four convinations: - Not whitelisted: - Public - Private - Whitelisted - Public - Private That's a pending refactor. For this commits, the goal is just to align this enum with what we added to the Index so we can use this enum in the Index via the primmitives crate. --- packages/primitives/src/lib.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/primitives/src/lib.rs b/packages/primitives/src/lib.rs index 47a837a9..aa3af27e 100644 --- a/packages/primitives/src/lib.rs +++ b/packages/primitives/src/lib.rs @@ -85,3 +85,21 @@ pub enum TrackerMode { #[serde(rename = "private_listed")] PrivateListed, } + +impl Default for TrackerMode { + fn default() -> Self { + Self::Public + } +} + +impl TrackerMode { + #[must_use] + pub fn is_open(&self) -> bool { + matches!(self, TrackerMode::Public | TrackerMode::Listed) + } + + #[must_use] + pub fn is_close(&self) -> bool { + !self.is_open() + } +} From 74d8f7918bd6c25c8dea8d208659ec6a3199bead Mon Sep 17 00:00:00 2001 From: Jose Celano Date: Fri, 17 May 2024 16:05:39 +0100 Subject: [PATCH 2/3] feat: [#870] remove Copy trait from TrackerMode --- packages/primitives/src/lib.rs | 2 +- src/core/mod.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/primitives/src/lib.rs b/packages/primitives/src/lib.rs index aa3af27e..eccd220f 100644 --- a/packages/primitives/src/lib.rs +++ b/packages/primitives/src/lib.rs @@ -67,7 +67,7 @@ pub type PersistentTorrents = BTreeMap; /// /// Refer to [Torrust Tracker Configuration](https://docs.rs/torrust-tracker-configuration) /// to know how to configure the tracker to run in each mode. -#[derive(Serialize, Deserialize, Copy, Clone, PartialEq, Eq, Debug)] +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] pub enum TrackerMode { /// Will track every new info hash and serve every peer. #[serde(rename = "public")] diff --git a/src/core/mod.rs b/src/core/mod.rs index 18a6028f..2b61e303 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -547,7 +547,7 @@ impl Tracker { ) -> Result { let database = Arc::new(databases::driver::build(&config.db_driver, &config.db_path)?); - let mode = config.mode; + let mode = config.mode.clone(); Ok(Tracker { //config, From 0c9da2f48b04e149991f5cc9a86b25ee8d2ceb43 Mon Sep 17 00:00:00 2001 From: Jose Celano Date: Fri, 17 May 2024 16:19:20 +0100 Subject: [PATCH 3/3] feat: [#870] implement traits Dispaly and FromStr for TrackerMode --- packages/primitives/src/lib.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/packages/primitives/src/lib.rs b/packages/primitives/src/lib.rs index eccd220f..454635e8 100644 --- a/packages/primitives/src/lib.rs +++ b/packages/primitives/src/lib.rs @@ -5,6 +5,8 @@ //! by the tracker server crate, but also by other crates in the Torrust //! ecosystem. use std::collections::BTreeMap; +use std::fmt; +use std::str::FromStr; use std::time::Duration; use info_hash::InfoHash; @@ -92,6 +94,32 @@ impl Default for TrackerMode { } } +impl fmt::Display for TrackerMode { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let display_str = match self { + TrackerMode::Public => "public", + TrackerMode::Listed => "listed", + TrackerMode::Private => "private", + TrackerMode::PrivateListed => "private_listed", + }; + write!(f, "{display_str}") + } +} + +impl FromStr for TrackerMode { + type Err = String; + + fn from_str(s: &str) -> Result { + match s.to_lowercase().as_str() { + "public" => Ok(TrackerMode::Public), + "listed" => Ok(TrackerMode::Listed), + "private" => Ok(TrackerMode::Private), + "private_listed" => Ok(TrackerMode::PrivateListed), + _ => Err(format!("Unknown tracker mode: {s}")), + } + } +} + impl TrackerMode { #[must_use] pub fn is_open(&self) -> bool {