diff --git a/packages/axum-http-tracker-server/src/server.rs b/packages/axum-http-tracker-server/src/server.rs index 610f70020..eea00c142 100644 --- a/packages/axum-http-tracker-server/src/server.rs +++ b/packages/axum-http-tracker-server/src/server.rs @@ -68,7 +68,7 @@ impl Launcher { tracing::info!(target: HTTP_TRACKER_LOG_TARGET, "Starting on: {protocol}://{address}"); - let app = router(http_tracker_container, address); + let app = router(http_tracker_container, service_binding.clone()); let running = Box::pin(async { match tls { diff --git a/packages/axum-http-tracker-server/src/v1/handlers/announce.rs b/packages/axum-http-tracker-server/src/v1/handlers/announce.rs index 53fd38997..296cefcd5 100644 --- a/packages/axum-http-tracker-server/src/v1/handlers/announce.rs +++ b/packages/axum-http-tracker-server/src/v1/handlers/announce.rs @@ -2,7 +2,6 @@ //! //! The handlers perform the authentication and authorization of the request, //! and resolve the client IP address. -use std::net::SocketAddr; use std::sync::Arc; use axum::extract::State; @@ -14,6 +13,7 @@ use bittorrent_http_tracker_protocol::v1::services::peer_ip_resolver::ClientIpSo use bittorrent_tracker_core::authentication::Key; use hyper::StatusCode; use torrust_tracker_primitives::core::AnnounceData; +use torrust_tracker_primitives::service_binding::ServiceBinding; use crate::v1::extractors::announce_request::ExtractRequest; use crate::v1::extractors::authentication_key::Extract as ExtractKey; @@ -23,7 +23,7 @@ use crate::v1::extractors::client_ip_sources::Extract as ExtractClientIpSources; /// authentication (no PATH `key` parameter required). #[allow(clippy::unused_async)] pub async fn handle_without_key( - State(state): State<(Arc, SocketAddr)>, + State(state): State<(Arc, ServiceBinding)>, ExtractRequest(announce_request): ExtractRequest, ExtractClientIpSources(client_ip_sources): ExtractClientIpSources, ) -> Response { @@ -36,7 +36,7 @@ pub async fn handle_without_key( /// authentication (PATH `key` parameter required). #[allow(clippy::unused_async)] pub async fn handle_with_key( - State(state): State<(Arc, SocketAddr)>, + State(state): State<(Arc, ServiceBinding)>, ExtractRequest(announce_request): ExtractRequest, ExtractClientIpSources(client_ip_sources): ExtractClientIpSources, ExtractKey(key): ExtractKey, @@ -54,14 +54,14 @@ async fn handle( announce_service: &Arc, announce_request: &Announce, client_ip_sources: &ClientIpSources, - server_socket_addr: &SocketAddr, + server_service_binding: &ServiceBinding, maybe_key: Option, ) -> Response { let announce_data = match handle_announce( announce_service, announce_request, client_ip_sources, - server_socket_addr, + server_service_binding, maybe_key, ) .await @@ -81,11 +81,11 @@ async fn handle_announce( announce_service: &Arc, announce_request: &Announce, client_ip_sources: &ClientIpSources, - server_socket_addr: &SocketAddr, + server_service_binding: &ServiceBinding, maybe_key: Option, ) -> Result { announce_service - .handle_announce(announce_request, client_ip_sources, server_socket_addr, maybe_key) + .handle_announce(announce_request, client_ip_sources, server_service_binding, maybe_key) .await } @@ -212,6 +212,7 @@ mod tests { use bittorrent_http_tracker_protocol::v1::responses; use bittorrent_tracker_core::authentication; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use super::{initialize_private_tracker, sample_announce_request, sample_client_ip_sources}; use crate::v1::handlers::announce::handle_announce; @@ -222,6 +223,7 @@ mod tests { let http_core_tracker_services = initialize_private_tracker(); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let maybe_key = None; @@ -229,7 +231,7 @@ mod tests { &http_core_tracker_services.announce_service, &sample_announce_request(), &sample_client_ip_sources(), - &server_socket_addr, + &server_service_binding, maybe_key, ) .await @@ -252,6 +254,7 @@ mod tests { let unregistered_key = authentication::Key::from_str("YZSl4lMZupRuOpSRC3krIKR5BPB14nrJ").unwrap(); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let maybe_key = Some(unregistered_key); @@ -259,7 +262,7 @@ mod tests { &http_core_tracker_services.announce_service, &sample_announce_request(), &sample_client_ip_sources(), - &server_socket_addr, + &server_service_binding, maybe_key, ) .await @@ -281,6 +284,7 @@ mod tests { use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use bittorrent_http_tracker_protocol::v1::responses; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use super::{initialize_listed_tracker, sample_announce_request, sample_client_ip_sources}; use crate::v1::handlers::announce::handle_announce; @@ -293,12 +297,13 @@ mod tests { let announce_request = sample_announce_request(); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let response = handle_announce( &http_core_tracker_services.announce_service, &announce_request, &sample_client_ip_sources(), - &server_socket_addr, + &server_service_binding, None, ) .await @@ -324,6 +329,7 @@ mod tests { use bittorrent_http_tracker_protocol::v1::responses; use bittorrent_http_tracker_protocol::v1::services::peer_ip_resolver::ClientIpSources; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use super::{initialize_tracker_on_reverse_proxy, sample_announce_request}; use crate::v1::handlers::announce::handle_announce; @@ -339,12 +345,13 @@ mod tests { }; let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let response = handle_announce( &http_core_tracker_services.announce_service, &sample_announce_request(), &client_ip_sources, - &server_socket_addr, + &server_service_binding, None, ) .await @@ -367,6 +374,7 @@ mod tests { use bittorrent_http_tracker_protocol::v1::responses; use bittorrent_http_tracker_protocol::v1::services::peer_ip_resolver::ClientIpSources; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use super::{initialize_tracker_not_on_reverse_proxy, sample_announce_request}; use crate::v1::handlers::announce::handle_announce; @@ -382,12 +390,13 @@ mod tests { }; let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let response = handle_announce( &http_core_tracker_services.announce_service, &sample_announce_request(), &client_ip_sources, - &server_socket_addr, + &server_service_binding, None, ) .await diff --git a/packages/axum-http-tracker-server/src/v1/handlers/scrape.rs b/packages/axum-http-tracker-server/src/v1/handlers/scrape.rs index e9544c983..e5d94a072 100644 --- a/packages/axum-http-tracker-server/src/v1/handlers/scrape.rs +++ b/packages/axum-http-tracker-server/src/v1/handlers/scrape.rs @@ -2,7 +2,6 @@ //! //! The handlers perform the authentication and authorization of the request, //! and resolve the client IP address. -use std::net::SocketAddr; use std::sync::Arc; use axum::extract::State; @@ -14,6 +13,7 @@ use bittorrent_http_tracker_protocol::v1::services::peer_ip_resolver::ClientIpSo use bittorrent_tracker_core::authentication::Key; use hyper::StatusCode; use torrust_tracker_primitives::core::ScrapeData; +use torrust_tracker_primitives::service_binding::ServiceBinding; use crate::v1::extractors::authentication_key::Extract as ExtractKey; use crate::v1::extractors::client_ip_sources::Extract as ExtractClientIpSources; @@ -23,7 +23,7 @@ use crate::v1::extractors::scrape_request::ExtractRequest; /// to run in `public` mode. #[allow(clippy::unused_async)] pub async fn handle_without_key( - State(state): State<(Arc, SocketAddr)>, + State(state): State<(Arc, ServiceBinding)>, ExtractRequest(scrape_request): ExtractRequest, ExtractClientIpSources(client_ip_sources): ExtractClientIpSources, ) -> Response { @@ -38,7 +38,7 @@ pub async fn handle_without_key( /// In this case, the authentication `key` parameter is required. #[allow(clippy::unused_async)] pub async fn handle_with_key( - State(state): State<(Arc, SocketAddr)>, + State(state): State<(Arc, ServiceBinding)>, ExtractRequest(scrape_request): ExtractRequest, ExtractClientIpSources(client_ip_sources): ExtractClientIpSources, ExtractKey(key): ExtractKey, @@ -52,11 +52,11 @@ async fn handle( scrape_service: &Arc, scrape_request: &Scrape, client_ip_sources: &ClientIpSources, - server_socket_addr: &SocketAddr, + server_service_binding: &ServiceBinding, maybe_key: Option, ) -> Response { let scrape_data = match scrape_service - .handle_scrape(scrape_request, client_ip_sources, server_socket_addr, maybe_key) + .handle_scrape(scrape_request, client_ip_sources, server_service_binding, maybe_key) .await { Ok(scrape_data) => scrape_data, @@ -173,12 +173,14 @@ mod tests { use bittorrent_http_tracker_core::services::scrape::ScrapeService; use bittorrent_tracker_core::authentication; use torrust_tracker_primitives::core::ScrapeData; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use super::{initialize_private_tracker, sample_client_ip_sources, sample_scrape_request}; #[tokio::test] async fn it_should_return_zeroed_swarm_metadata_when_the_authentication_key_is_missing() { let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let (core_tracker_services, core_http_tracker_services) = initialize_private_tracker(); @@ -193,7 +195,12 @@ mod tests { ); let scrape_data = scrape_service - .handle_scrape(&scrape_request, &sample_client_ip_sources(), &server_socket_addr, maybe_key) + .handle_scrape( + &scrape_request, + &sample_client_ip_sources(), + &server_service_binding, + maybe_key, + ) .await .unwrap(); @@ -205,6 +212,7 @@ mod tests { #[tokio::test] async fn it_should_return_zeroed_swarm_metadata_when_the_authentication_key_is_invalid() { let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let (core_tracker_services, core_http_tracker_services) = initialize_private_tracker(); @@ -220,7 +228,12 @@ mod tests { ); let scrape_data = scrape_service - .handle_scrape(&scrape_request, &sample_client_ip_sources(), &server_socket_addr, maybe_key) + .handle_scrape( + &scrape_request, + &sample_client_ip_sources(), + &server_service_binding, + maybe_key, + ) .await .unwrap(); @@ -236,6 +249,7 @@ mod tests { use bittorrent_http_tracker_core::services::scrape::ScrapeService; use torrust_tracker_primitives::core::ScrapeData; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use super::{initialize_listed_tracker, sample_client_ip_sources, sample_scrape_request}; @@ -246,6 +260,7 @@ mod tests { let scrape_request = sample_scrape_request(); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let scrape_service = ScrapeService::new( core_tracker_services.core_config.clone(), @@ -255,7 +270,7 @@ mod tests { ); let scrape_data = scrape_service - .handle_scrape(&scrape_request, &sample_client_ip_sources(), &server_socket_addr, None) + .handle_scrape(&scrape_request, &sample_client_ip_sources(), &server_service_binding, None) .await .unwrap(); @@ -272,6 +287,7 @@ mod tests { use bittorrent_http_tracker_core::services::scrape::ScrapeService; use bittorrent_http_tracker_protocol::v1::responses; use bittorrent_http_tracker_protocol::v1::services::peer_ip_resolver::ClientIpSources; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use super::{initialize_tracker_on_reverse_proxy, sample_scrape_request}; use crate::v1::handlers::scrape::tests::assert_error_response; @@ -286,6 +302,7 @@ mod tests { }; let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let scrape_service = ScrapeService::new( core_tracker_services.core_config.clone(), @@ -295,7 +312,7 @@ mod tests { ); let response = scrape_service - .handle_scrape(&sample_scrape_request(), &client_ip_sources, &server_socket_addr, None) + .handle_scrape(&sample_scrape_request(), &client_ip_sources, &server_service_binding, None) .await .unwrap_err(); @@ -317,6 +334,7 @@ mod tests { use bittorrent_http_tracker_core::services::scrape::ScrapeService; use bittorrent_http_tracker_protocol::v1::responses; use bittorrent_http_tracker_protocol::v1::services::peer_ip_resolver::ClientIpSources; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use super::{initialize_tracker_not_on_reverse_proxy, sample_scrape_request}; use crate::v1::handlers::scrape::tests::assert_error_response; @@ -331,6 +349,7 @@ mod tests { }; let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let scrape_service = ScrapeService::new( core_tracker_services.core_config.clone(), @@ -340,7 +359,7 @@ mod tests { ); let response = scrape_service - .handle_scrape(&sample_scrape_request(), &client_ip_sources, &server_socket_addr, None) + .handle_scrape(&sample_scrape_request(), &client_ip_sources, &server_service_binding, None) .await .unwrap_err(); diff --git a/packages/axum-http-tracker-server/src/v1/routes.rs b/packages/axum-http-tracker-server/src/v1/routes.rs index d5907887e..3fe467a0d 100644 --- a/packages/axum-http-tracker-server/src/v1/routes.rs +++ b/packages/axum-http-tracker-server/src/v1/routes.rs @@ -1,5 +1,4 @@ //! HTTP server routes for version `v1`. -use std::net::SocketAddr; use std::sync::Arc; use std::time::Duration; @@ -13,6 +12,7 @@ use bittorrent_http_tracker_core::container::HttpTrackerCoreContainer; use hyper::{Request, StatusCode}; use torrust_server_lib::logging::Latency; use torrust_tracker_configuration::DEFAULT_TIMEOUT; +use torrust_tracker_primitives::service_binding::ServiceBinding; use tower::timeout::TimeoutLayer; use tower::ServiceBuilder; use tower_http::classify::ServerErrorsFailureClass; @@ -30,28 +30,38 @@ use crate::HTTP_TRACKER_LOG_TARGET; /// /// > **NOTICE**: it's added a layer to get the client IP from the connection /// > info. The tracker could use the connection info to get the client IP. -#[instrument(skip(http_tracker_container, server_socket_addr))] -pub fn router(http_tracker_container: Arc, server_socket_addr: SocketAddr) -> Router { +#[instrument(skip(http_tracker_container, server_service_binding))] +pub fn router(http_tracker_container: Arc, server_service_binding: ServiceBinding) -> Router { + let server_socket_addr = server_service_binding.bind_address(); + Router::new() // Health check .route("/health_check", get(health_check::handler)) // Announce request .route( "/announce", - get(announce::handle_without_key).with_state((http_tracker_container.announce_service.clone(), server_socket_addr)), + get(announce::handle_without_key).with_state(( + http_tracker_container.announce_service.clone(), + server_service_binding.clone(), + )), ) .route( "/announce/{key}", - get(announce::handle_with_key).with_state((http_tracker_container.announce_service.clone(), server_socket_addr)), + get(announce::handle_with_key).with_state(( + http_tracker_container.announce_service.clone(), + server_service_binding.clone(), + )), ) // Scrape request .route( "/scrape", - get(scrape::handle_without_key).with_state((http_tracker_container.scrape_service.clone(), server_socket_addr)), + get(scrape::handle_without_key) + .with_state((http_tracker_container.scrape_service.clone(), server_service_binding.clone())), ) .route( "/scrape/{key}", - get(scrape::handle_with_key).with_state((http_tracker_container.scrape_service.clone(), server_socket_addr)), + get(scrape::handle_with_key) + .with_state((http_tracker_container.scrape_service.clone(), server_service_binding.clone())), ) // Add extension to get the client IP from the connection info .layer(SecureClientIpSource::ConnectInfo.into_extension()) diff --git a/packages/http-tracker-core/benches/helpers/sync.rs b/packages/http-tracker-core/benches/helpers/sync.rs index 9d41c2459..e0f022108 100644 --- a/packages/http-tracker-core/benches/helpers/sync.rs +++ b/packages/http-tracker-core/benches/helpers/sync.rs @@ -2,6 +2,7 @@ use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::time::{Duration, Instant}; use bittorrent_http_tracker_core::services::announce::AnnounceService; +use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use crate::helpers::util::{initialize_core_tracker_services, sample_announce_request_for_peer, sample_peer}; @@ -22,12 +23,13 @@ pub async fn return_announce_data_once(samples: u64) -> Duration { ); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let start = Instant::now(); for _ in 0..samples { let _announce_data = announce_service - .handle_announce(&announce_request, &client_ip_sources, &server_socket_addr, None) + .handle_announce(&announce_request, &client_ip_sources, &server_service_binding, None) .await .unwrap(); } diff --git a/packages/http-tracker-core/src/event/mod.rs b/packages/http-tracker-core/src/event/mod.rs index 3db258238..7caf8a596 100644 --- a/packages/http-tracker-core/src/event/mod.rs +++ b/packages/http-tracker-core/src/event/mod.rs @@ -1,5 +1,7 @@ use std::net::{IpAddr, SocketAddr}; +use torrust_tracker_primitives::service_binding::ServiceBinding; + pub mod sender; /// A HTTP core event. @@ -17,14 +19,14 @@ pub struct ConnectionContext { impl ConnectionContext { #[must_use] - pub fn new(client_ip_addr: IpAddr, opt_client_port: Option, server_socket_addr: SocketAddr) -> Self { + pub fn new(client_ip_addr: IpAddr, opt_client_port: Option, server_service_binding: ServiceBinding) -> Self { Self { client: ClientConnectionContext { ip_addr: client_ip_addr, port: opt_client_port, }, server: ServerConnectionContext { - socket_addr: server_socket_addr, + service_binding: server_service_binding, }, } } @@ -41,7 +43,7 @@ impl ConnectionContext { #[must_use] pub fn server_socket_addr(&self) -> SocketAddr { - self.server.socket_addr + self.server.service_binding.bind_address() } } @@ -55,5 +57,5 @@ pub struct ClientConnectionContext { #[derive(Debug, PartialEq, Eq, Clone)] pub struct ServerConnectionContext { - socket_addr: SocketAddr, + service_binding: ServiceBinding, } diff --git a/packages/http-tracker-core/src/services/announce.rs b/packages/http-tracker-core/src/services/announce.rs index f8d2e0b11..c249cb4db 100644 --- a/packages/http-tracker-core/src/services/announce.rs +++ b/packages/http-tracker-core/src/services/announce.rs @@ -7,7 +7,7 @@ //! //! It also sends an [`http_tracker_core::event::Event`] //! because events are specific for the HTTP tracker. -use std::net::{IpAddr, SocketAddr}; +use std::net::IpAddr; use std::panic::Location; use std::sync::Arc; @@ -21,6 +21,7 @@ use bittorrent_tracker_core::error::{AnnounceError, TrackerCoreError, WhitelistE use bittorrent_tracker_core::whitelist; use torrust_tracker_configuration::Core; use torrust_tracker_primitives::core::AnnounceData; +use torrust_tracker_primitives::service_binding::ServiceBinding; use crate::event; use crate::event::Event; @@ -69,7 +70,7 @@ impl AnnounceService { &self, announce_request: &Announce, client_ip_sources: &ClientIpSources, - server_socket_addr: &SocketAddr, + server_service_binding: &ServiceBinding, maybe_key: Option, ) -> Result { self.authenticate(maybe_key).await?; @@ -87,7 +88,7 @@ impl AnnounceService { .announce(&announce_request.info_hash, &mut peer, &remote_client_ip, &peers_wanted) .await?; - self.send_event(remote_client_ip, opt_remote_client_port, *server_socket_addr) + self.send_event(remote_client_ip, opt_remote_client_port, server_service_binding.clone()) .await; Ok(announce_data) @@ -138,11 +139,11 @@ impl AnnounceService { } } - async fn send_event(&self, peer_ip: IpAddr, opt_peer_ip_port: Option, server_socket_addr: SocketAddr) { + async fn send_event(&self, peer_ip: IpAddr, opt_peer_ip_port: Option, server_service_binding: ServiceBinding) { if let Some(http_stats_event_sender) = self.opt_http_stats_event_sender.as_deref() { http_stats_event_sender .send_event(Event::TcpAnnounce { - connection: event::ConnectionContext::new(peer_ip, opt_peer_ip_port, server_socket_addr), + connection: event::ConnectionContext::new(peer_ip, opt_peer_ip_port, server_service_binding), }) .await; } @@ -338,6 +339,7 @@ mod tests { use torrust_tracker_configuration::Configuration; use torrust_tracker_primitives::core::AnnounceData; use torrust_tracker_primitives::peer; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use torrust_tracker_primitives::swarm_metadata::SwarmMetadata; use torrust_tracker_test_helpers::configuration; @@ -359,6 +361,7 @@ mod tests { let (announce_request, client_ip_sources) = sample_announce_request_for_peer(peer); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let announce_service = AnnounceService::new( core_tracker_services.core_config.clone(), @@ -369,7 +372,7 @@ mod tests { ); let announce_data = announce_service - .handle_announce(&announce_request, &client_ip_sources, &server_socket_addr, None) + .handle_announce(&announce_request, &client_ip_sources, &server_service_binding, None) .await .unwrap(); @@ -389,12 +392,17 @@ mod tests { #[tokio::test] async fn it_should_send_the_tcp_4_announce_event_when_the_peer_uses_ipv4() { let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let mut http_stats_event_sender_mock = MockHttpStatsEventSender::new(); http_stats_event_sender_mock .expect_send_event() .with(eq(Event::TcpAnnounce { - connection: ConnectionContext::new(IpAddr::V4(Ipv4Addr::new(126, 0, 0, 1)), Some(8080), server_socket_addr), + connection: ConnectionContext::new( + IpAddr::V4(Ipv4Addr::new(126, 0, 0, 1)), + Some(8080), + server_service_binding.clone(), + ), })) .times(1) .returning(|_| Box::pin(future::ready(Some(Ok(1))))); @@ -418,7 +426,7 @@ mod tests { ); let _announce_data = announce_service - .handle_announce(&announce_request, &client_ip_sources, &server_socket_addr, None) + .handle_announce(&announce_request, &client_ip_sources, &server_service_binding, None) .await .unwrap(); } @@ -444,13 +452,18 @@ mod tests { // Tracker changes the peer IP to the tracker external IP when the peer is using the loopback IP. let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); // Assert that the event sent is a TCP4 event let mut http_stats_event_sender_mock = MockHttpStatsEventSender::new(); http_stats_event_sender_mock .expect_send_event() .with(eq(Event::TcpAnnounce { - connection: ConnectionContext::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), Some(8080), server_socket_addr), + connection: ConnectionContext::new( + IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), + Some(8080), + server_service_binding.clone(), + ), })) .times(1) .returning(|_| Box::pin(future::ready(Some(Ok(1))))); @@ -475,7 +488,7 @@ mod tests { ); let _announce_data = announce_service - .handle_announce(&announce_request, &client_ip_sources, &server_socket_addr, None) + .handle_announce(&announce_request, &client_ip_sources, &server_service_binding, None) .await .unwrap(); } @@ -484,6 +497,7 @@ mod tests { async fn it_should_send_the_tcp_6_announce_event_when_the_peer_uses_ipv6_even_if_the_tracker_changes_the_peer_ip_to_ipv4() { let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let mut http_stats_event_sender_mock = MockHttpStatsEventSender::new(); http_stats_event_sender_mock @@ -492,7 +506,7 @@ mod tests { connection: ConnectionContext::new( IpAddr::V6(Ipv6Addr::new(0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969)), Some(8080), - server_socket_addr, + server_service_binding, ), })) .times(1) @@ -516,9 +530,10 @@ mod tests { ); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let _announce_data = announce_service - .handle_announce(&announce_request, &client_ip_sources, &server_socket_addr, None) + .handle_announce(&announce_request, &client_ip_sources, &server_service_binding, None) .await .unwrap(); } diff --git a/packages/http-tracker-core/src/services/scrape.rs b/packages/http-tracker-core/src/services/scrape.rs index c9b3182f8..baa406e63 100644 --- a/packages/http-tracker-core/src/services/scrape.rs +++ b/packages/http-tracker-core/src/services/scrape.rs @@ -7,7 +7,7 @@ //! //! It also sends an [`http_tracker_core::statistics::event::Event`] //! because events are specific for the HTTP tracker. -use std::net::{IpAddr, SocketAddr}; +use std::net::IpAddr; use std::sync::Arc; use bittorrent_http_tracker_protocol::v1::requests::scrape::Scrape; @@ -18,6 +18,7 @@ use bittorrent_tracker_core::error::{ScrapeError, TrackerCoreError, WhitelistErr use bittorrent_tracker_core::scrape_handler::ScrapeHandler; use torrust_tracker_configuration::Core; use torrust_tracker_primitives::core::ScrapeData; +use torrust_tracker_primitives::service_binding::ServiceBinding; use crate::event; use crate::event::{ConnectionContext, Event}; @@ -71,7 +72,7 @@ impl ScrapeService { &self, scrape_request: &Scrape, client_ip_sources: &ClientIpSources, - server_socket_addr: &SocketAddr, + server_service_binding: &ServiceBinding, maybe_key: Option, ) -> Result { let scrape_data = if self.authentication_is_required() && !self.is_authenticated(maybe_key).await { @@ -82,7 +83,8 @@ impl ScrapeService { let (remote_client_ip, opt_client_port) = self.resolve_remote_client_ip(client_ip_sources)?; - self.send_event(remote_client_ip, opt_client_port, *server_socket_addr).await; + self.send_event(remote_client_ip, opt_client_port, server_service_binding.clone()) + .await; Ok(scrape_data) } @@ -117,11 +119,16 @@ impl ScrapeService { Ok((ip, port)) } - async fn send_event(&self, original_peer_ip: IpAddr, opt_original_peer_port: Option, server_socket_addr: SocketAddr) { + async fn send_event( + &self, + original_peer_ip: IpAddr, + opt_original_peer_port: Option, + server_service_binding: ServiceBinding, + ) { if let Some(http_stats_event_sender) = self.opt_http_stats_event_sender.as_deref() { http_stats_event_sender .send_event(Event::TcpScrape { - connection: ConnectionContext::new(original_peer_ip, opt_original_peer_port, server_socket_addr), + connection: ConnectionContext::new(original_peer_ip, opt_original_peer_port, server_service_binding), }) .await; } @@ -269,6 +276,7 @@ mod tests { use bittorrent_tracker_core::announce_handler::PeersWanted; use mockall::predicate::eq; use torrust_tracker_primitives::core::ScrapeData; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use torrust_tracker_primitives::swarm_metadata::SwarmMetadata; use torrust_tracker_test_helpers::configuration; @@ -312,6 +320,7 @@ mod tests { }; let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let scrape_service = Arc::new(ScrapeService::new( core_config.clone(), @@ -321,7 +330,7 @@ mod tests { )); let scrape_data = scrape_service - .handle_scrape(&scrape_request, &client_ip_sources, &server_socket_addr, None) + .handle_scrape(&scrape_request, &client_ip_sources, &server_service_binding, None) .await .unwrap(); @@ -349,7 +358,8 @@ mod tests { connection: ConnectionContext::new( IpAddr::V4(Ipv4Addr::new(126, 0, 0, 1)), Some(8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070), + ServiceBinding::new(Protocol::HTTP, SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070)) + .unwrap(), ), })) .times(1) @@ -371,6 +381,7 @@ mod tests { }; let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let scrape_service = Arc::new(ScrapeService::new( Arc::new(config.core), @@ -380,7 +391,7 @@ mod tests { )); scrape_service - .handle_scrape(&scrape_request, &client_ip_sources, &server_socket_addr, None) + .handle_scrape(&scrape_request, &client_ip_sources, &server_service_binding, None) .await .unwrap(); } @@ -388,6 +399,7 @@ mod tests { #[tokio::test] async fn it_should_send_the_tcp_6_scrape_event_when_the_peer_uses_ipv6() { let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let config = configuration::ephemeral(); @@ -398,7 +410,7 @@ mod tests { connection: ConnectionContext::new( IpAddr::V6(Ipv6Addr::new(0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969)), Some(8080), - server_socket_addr, + server_service_binding, ), })) .times(1) @@ -420,6 +432,7 @@ mod tests { }; let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let scrape_service = Arc::new(ScrapeService::new( Arc::new(config.core), @@ -429,7 +442,7 @@ mod tests { )); scrape_service - .handle_scrape(&scrape_request, &client_ip_sources, &server_socket_addr, None) + .handle_scrape(&scrape_request, &client_ip_sources, &server_service_binding, None) .await .unwrap(); } @@ -446,6 +459,7 @@ mod tests { use bittorrent_tracker_core::announce_handler::PeersWanted; use mockall::predicate::eq; use torrust_tracker_primitives::core::ScrapeData; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use torrust_tracker_test_helpers::configuration; use crate::event::{ConnectionContext, Event}; @@ -488,6 +502,7 @@ mod tests { }; let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let scrape_service = Arc::new(ScrapeService::new( Arc::new(config.core), @@ -497,7 +512,7 @@ mod tests { )); let scrape_data = scrape_service - .handle_scrape(&scrape_request, &client_ip_sources, &server_socket_addr, None) + .handle_scrape(&scrape_request, &client_ip_sources, &server_service_binding, None) .await .unwrap(); @@ -519,7 +534,8 @@ mod tests { connection: ConnectionContext::new( IpAddr::V4(Ipv4Addr::new(126, 0, 0, 1)), Some(8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070), + ServiceBinding::new(Protocol::HTTP, SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070)) + .unwrap(), ), })) .times(1) @@ -539,6 +555,7 @@ mod tests { }; let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let scrape_service = Arc::new(ScrapeService::new( Arc::new(config.core), @@ -548,7 +565,7 @@ mod tests { )); scrape_service - .handle_scrape(&scrape_request, &client_ip_sources, &server_socket_addr, None) + .handle_scrape(&scrape_request, &client_ip_sources, &server_service_binding, None) .await .unwrap(); } @@ -556,6 +573,7 @@ mod tests { #[tokio::test] async fn it_should_send_the_tcp_6_scrape_event_when_the_peer_uses_ipv6() { let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let config = configuration::ephemeral(); @@ -568,7 +586,7 @@ mod tests { connection: ConnectionContext::new( IpAddr::V6(Ipv6Addr::new(0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969)), Some(8080), - server_socket_addr, + server_service_binding, ), })) .times(1) @@ -588,6 +606,7 @@ mod tests { }; let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070); + let server_service_binding = ServiceBinding::new(Protocol::HTTP, server_socket_addr).unwrap(); let scrape_service = Arc::new(ScrapeService::new( Arc::new(config.core), @@ -597,7 +616,7 @@ mod tests { )); scrape_service - .handle_scrape(&scrape_request, &client_ip_sources, &server_socket_addr, None) + .handle_scrape(&scrape_request, &client_ip_sources, &server_service_binding, None) .await .unwrap(); } diff --git a/packages/http-tracker-core/src/statistics/event/handler.rs b/packages/http-tracker-core/src/statistics/event/handler.rs index 700e39476..0df1c41d3 100644 --- a/packages/http-tracker-core/src/statistics/event/handler.rs +++ b/packages/http-tracker-core/src/statistics/event/handler.rs @@ -34,6 +34,8 @@ pub async fn handle_event(event: Event, stats_repository: &Repository) { mod tests { use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; + use crate::event::{ConnectionContext, Event}; use crate::statistics::event::handler::handle_event; use crate::statistics::repository::Repository; @@ -47,7 +49,7 @@ mod tests { connection: ConnectionContext::new( IpAddr::V4(Ipv4Addr::new(127, 0, 0, 2)), Some(8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070), + ServiceBinding::new(Protocol::HTTP, SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070)).unwrap(), ), }, &stats_repository, @@ -68,7 +70,7 @@ mod tests { connection: ConnectionContext::new( IpAddr::V4(Ipv4Addr::new(127, 0, 0, 2)), Some(8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070), + ServiceBinding::new(Protocol::HTTP, SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070)).unwrap(), ), }, &stats_repository, @@ -89,7 +91,7 @@ mod tests { connection: ConnectionContext::new( IpAddr::V6(Ipv6Addr::new(0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969)), Some(8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070), + ServiceBinding::new(Protocol::HTTP, SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070)).unwrap(), ), }, &stats_repository, @@ -110,7 +112,7 @@ mod tests { connection: ConnectionContext::new( IpAddr::V6(Ipv6Addr::new(0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969, 0x6969)), Some(8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070), + ServiceBinding::new(Protocol::HTTP, SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 7070)).unwrap(), ), }, &stats_repository, diff --git a/packages/udp-tracker-core/benches/helpers/sync.rs b/packages/udp-tracker-core/benches/helpers/sync.rs index ca459c640..b61204586 100644 --- a/packages/udp-tracker-core/benches/helpers/sync.rs +++ b/packages/udp-tracker-core/benches/helpers/sync.rs @@ -4,6 +4,7 @@ use std::time::{Duration, Instant}; use bittorrent_udp_tracker_core::services::connect::ConnectService; use bittorrent_udp_tracker_core::statistics; +use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use crate::helpers::utils::{sample_ipv4_remote_addr, sample_issue_time}; @@ -11,6 +12,7 @@ use crate::helpers::utils::{sample_ipv4_remote_addr, sample_issue_time}; pub async fn connect_once(samples: u64) -> Duration { let client_socket_addr = sample_ipv4_remote_addr(); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let (udp_core_stats_event_sender, _udp_core_stats_repository) = statistics::setup::factory(false); let udp_core_stats_event_sender = Arc::new(udp_core_stats_event_sender); @@ -18,7 +20,7 @@ pub async fn connect_once(samples: u64) -> Duration { let start = Instant::now(); for _ in 0..samples { - let _response = connect_service.handle_connect(client_socket_addr, server_socket_addr, sample_issue_time()); + let _response = connect_service.handle_connect(client_socket_addr, server_service_binding.clone(), sample_issue_time()); } start.elapsed() diff --git a/packages/udp-tracker-core/src/event/mod.rs b/packages/udp-tracker-core/src/event/mod.rs index 04b3170e2..e25f557e2 100644 --- a/packages/udp-tracker-core/src/event/mod.rs +++ b/packages/udp-tracker-core/src/event/mod.rs @@ -1,5 +1,7 @@ use std::net::SocketAddr; +use torrust_tracker_primitives::service_binding::ServiceBinding; + pub mod sender; /// A UDP core event. @@ -13,15 +15,15 @@ pub enum Event { #[derive(Debug, PartialEq, Eq, Clone)] pub struct ConnectionContext { pub client_socket_addr: SocketAddr, - pub server_socket_addr: SocketAddr, + pub server_service_binding: ServiceBinding, } impl ConnectionContext { #[must_use] - pub fn new(client_socket_addr: SocketAddr, server_socket_addr: SocketAddr) -> Self { + pub fn new(client_socket_addr: SocketAddr, server_service_binding: ServiceBinding) -> Self { Self { client_socket_addr, - server_socket_addr, + server_service_binding, } } @@ -32,6 +34,6 @@ impl ConnectionContext { #[must_use] pub fn server_socket_addr(&self) -> SocketAddr { - self.server_socket_addr + self.server_service_binding.bind_address() } } diff --git a/packages/udp-tracker-core/src/services/announce.rs b/packages/udp-tracker-core/src/services/announce.rs index d99618316..0a9bf6b82 100644 --- a/packages/udp-tracker-core/src/services/announce.rs +++ b/packages/udp-tracker-core/src/services/announce.rs @@ -18,6 +18,7 @@ use bittorrent_tracker_core::error::{AnnounceError, WhitelistError}; use bittorrent_tracker_core::whitelist; use bittorrent_udp_tracker_protocol::peer_builder; use torrust_tracker_primitives::core::AnnounceData; +use torrust_tracker_primitives::service_binding::ServiceBinding; use crate::connection_cookie::{check, gen_remote_fingerprint, ConnectionCookieError}; use crate::event::{self, ConnectionContext, Event}; @@ -58,7 +59,7 @@ impl AnnounceService { pub async fn handle_announce( &self, client_socket_addr: SocketAddr, - server_socket_addr: SocketAddr, + server_service_binding: ServiceBinding, request: &AnnounceRequest, cookie_valid_range: Range, ) -> Result { @@ -79,7 +80,7 @@ impl AnnounceService { .announce(&info_hash, &mut peer, &remote_client_ip, &peers_wanted) .await?; - self.send_event(client_socket_addr, server_socket_addr).await; + self.send_event(client_socket_addr, server_service_binding).await; Ok(announce_data) } @@ -100,11 +101,11 @@ impl AnnounceService { self.whitelist_authorization.authorize(info_hash).await } - async fn send_event(&self, client_socket_addr: SocketAddr, server_socket_addr: SocketAddr) { + async fn send_event(&self, client_socket_addr: SocketAddr, server_service_binding: ServiceBinding) { if let Some(udp_stats_event_sender) = self.opt_udp_core_stats_event_sender.as_deref() { udp_stats_event_sender .send_event(Event::UdpAnnounce { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding), }) .await; } diff --git a/packages/udp-tracker-core/src/services/connect.rs b/packages/udp-tracker-core/src/services/connect.rs index e543fbb1e..92bcd299f 100644 --- a/packages/udp-tracker-core/src/services/connect.rs +++ b/packages/udp-tracker-core/src/services/connect.rs @@ -5,6 +5,7 @@ use std::net::SocketAddr; use std::sync::Arc; use aquatic_udp_protocol::ConnectionId; +use torrust_tracker_primitives::service_binding::ServiceBinding; use crate::connection_cookie::{gen_remote_fingerprint, make}; use crate::event::{self, ConnectionContext, Event}; @@ -33,7 +34,7 @@ impl ConnectService { pub async fn handle_connect( &self, client_socket_addr: SocketAddr, - server_socket_addr: SocketAddr, + server_service_binding: ServiceBinding, cookie_issue_time: f64, ) -> ConnectionId { let connection_id = @@ -42,7 +43,7 @@ impl ConnectService { if let Some(udp_stats_event_sender) = self.opt_udp_core_stats_event_sender.as_deref() { udp_stats_event_sender .send_event(Event::UdpConnect { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding), }) .await; } @@ -61,6 +62,7 @@ mod tests { use std::sync::Arc; use mockall::predicate::eq; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use crate::connection_cookie::make; use crate::event::{ConnectionContext, Event}; @@ -74,6 +76,7 @@ mod tests { #[tokio::test] async fn a_connect_response_should_contain_the_same_transaction_id_as_the_connect_request() { let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let (udp_core_stats_event_sender, _udp_core_stats_repository) = statistics::setup::factory(false); let udp_core_stats_event_sender = Arc::new(udp_core_stats_event_sender); @@ -81,7 +84,7 @@ mod tests { let connect_service = Arc::new(ConnectService::new(udp_core_stats_event_sender)); let response = connect_service - .handle_connect(sample_ipv4_remote_addr(), server_socket_addr, sample_issue_time()) + .handle_connect(sample_ipv4_remote_addr(), server_service_binding, sample_issue_time()) .await; assert_eq!( @@ -93,6 +96,7 @@ mod tests { #[tokio::test] async fn a_connect_response_should_contain_a_new_connection_id() { let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let (udp_core_stats_event_sender, _udp_core_stats_repository) = statistics::setup::factory(false); let udp_core_stats_event_sender = Arc::new(udp_core_stats_event_sender); @@ -100,7 +104,7 @@ mod tests { let connect_service = Arc::new(ConnectService::new(udp_core_stats_event_sender)); let response = connect_service - .handle_connect(sample_ipv4_remote_addr(), server_socket_addr, sample_issue_time()) + .handle_connect(sample_ipv4_remote_addr(), server_service_binding, sample_issue_time()) .await; assert_eq!( @@ -113,6 +117,7 @@ mod tests { async fn a_connect_response_should_contain_a_new_connection_id_ipv6() { let client_socket_addr = sample_ipv6_remote_addr(); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let (udp_core_stats_event_sender, _udp_core_stats_repository) = statistics::setup::factory(false); let udp_core_stats_event_sender = Arc::new(udp_core_stats_event_sender); @@ -120,7 +125,7 @@ mod tests { let connect_service = Arc::new(ConnectService::new(udp_core_stats_event_sender)); let response = connect_service - .handle_connect(client_socket_addr, server_socket_addr, sample_issue_time()) + .handle_connect(client_socket_addr, server_service_binding, sample_issue_time()) .await; assert_eq!( @@ -133,12 +138,13 @@ mod tests { async fn it_should_send_the_upd4_connect_event_when_a_client_tries_to_connect_using_a_ip4_socket_address() { let client_socket_addr = sample_ipv4_socket_address(); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let mut udp_stats_event_sender_mock = MockUdpCoreStatsEventSender::new(); udp_stats_event_sender_mock .expect_send_event() .with(eq(Event::UdpConnect { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding.clone()), })) .times(1) .returning(|_| Box::pin(future::ready(Some(Ok(1))))); @@ -148,7 +154,7 @@ mod tests { let connect_service = Arc::new(ConnectService::new(opt_udp_stats_event_sender)); connect_service - .handle_connect(client_socket_addr, server_socket_addr, sample_issue_time()) + .handle_connect(client_socket_addr, server_service_binding, sample_issue_time()) .await; } @@ -156,12 +162,13 @@ mod tests { async fn it_should_send_the_upd6_connect_event_when_a_client_tries_to_connect_using_a_ip6_socket_address() { let client_socket_addr = sample_ipv6_remote_addr(); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let mut udp_stats_event_sender_mock = MockUdpCoreStatsEventSender::new(); udp_stats_event_sender_mock .expect_send_event() .with(eq(Event::UdpConnect { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding.clone()), })) .times(1) .returning(|_| Box::pin(future::ready(Some(Ok(1))))); @@ -171,7 +178,7 @@ mod tests { let connect_service = Arc::new(ConnectService::new(opt_udp_stats_event_sender)); connect_service - .handle_connect(client_socket_addr, server_socket_addr, sample_issue_time()) + .handle_connect(client_socket_addr, server_service_binding, sample_issue_time()) .await; } } diff --git a/packages/udp-tracker-core/src/services/scrape.rs b/packages/udp-tracker-core/src/services/scrape.rs index 3b6898311..6ee64111c 100644 --- a/packages/udp-tracker-core/src/services/scrape.rs +++ b/packages/udp-tracker-core/src/services/scrape.rs @@ -16,6 +16,7 @@ use bittorrent_primitives::info_hash::InfoHash; use bittorrent_tracker_core::error::{ScrapeError, WhitelistError}; use bittorrent_tracker_core::scrape_handler::ScrapeHandler; use torrust_tracker_primitives::core::ScrapeData; +use torrust_tracker_primitives::service_binding::ServiceBinding; use crate::connection_cookie::{check, gen_remote_fingerprint, ConnectionCookieError}; use crate::event::{self, ConnectionContext, Event}; @@ -50,7 +51,7 @@ impl ScrapeService { pub async fn handle_scrape( &self, client_socket_addr: SocketAddr, - server_socket_addr: SocketAddr, + server_service_binding: ServiceBinding, request: &ScrapeRequest, cookie_valid_range: Range, ) -> Result { @@ -61,7 +62,7 @@ impl ScrapeService { .scrape(&Self::convert_from_aquatic(&request.info_hashes)) .await?; - self.send_event(client_socket_addr, server_socket_addr).await; + self.send_event(client_socket_addr, server_service_binding).await; Ok(scrape_data) } @@ -82,11 +83,11 @@ impl ScrapeService { aquatic_infohashes.iter().map(|&x| x.into()).collect() } - async fn send_event(&self, client_socket_addr: SocketAddr, server_socket_addr: SocketAddr) { + async fn send_event(&self, client_socket_addr: SocketAddr, server_service_binding: ServiceBinding) { if let Some(udp_stats_event_sender) = self.opt_udp_stats_event_sender.as_deref() { udp_stats_event_sender .send_event(Event::UdpScrape { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding), }) .await; } diff --git a/packages/udp-tracker-core/src/statistics/event/handler.rs b/packages/udp-tracker-core/src/statistics/event/handler.rs index a9ac0dade..3968ca4e7 100644 --- a/packages/udp-tracker-core/src/statistics/event/handler.rs +++ b/packages/udp-tracker-core/src/statistics/event/handler.rs @@ -39,6 +39,8 @@ pub async fn handle_event(event: Event, stats_repository: &Repository) { mod tests { use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; + use crate::event::{ConnectionContext, Event}; use crate::statistics::event::handler::handle_event; use crate::statistics::repository::Repository; @@ -51,7 +53,11 @@ mod tests { Event::UdpConnect { context: ConnectionContext::new( SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ) + .unwrap(), ), }, &stats_repository, @@ -71,7 +77,11 @@ mod tests { Event::UdpAnnounce { context: ConnectionContext::new( SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ) + .unwrap(), ), }, &stats_repository, @@ -91,7 +101,11 @@ mod tests { Event::UdpScrape { context: ConnectionContext::new( SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ) + .unwrap(), ), }, &stats_repository, @@ -111,7 +125,11 @@ mod tests { Event::UdpConnect { context: ConnectionContext::new( SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969), + ) + .unwrap(), ), }, &stats_repository, @@ -131,7 +149,11 @@ mod tests { Event::UdpAnnounce { context: ConnectionContext::new( SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969), + ) + .unwrap(), ), }, &stats_repository, @@ -151,7 +173,11 @@ mod tests { Event::UdpScrape { context: ConnectionContext::new( SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969), + ) + .unwrap(), ), }, &stats_repository, diff --git a/packages/udp-tracker-server/src/event/mod.rs b/packages/udp-tracker-server/src/event/mod.rs index 0adf29c8b..68f07cfd6 100644 --- a/packages/udp-tracker-server/src/event/mod.rs +++ b/packages/udp-tracker-server/src/event/mod.rs @@ -1,6 +1,8 @@ use std::net::SocketAddr; use std::time::Duration; +use torrust_tracker_primitives::service_binding::ServiceBinding; + pub mod sender; /// A UDP server event. @@ -52,15 +54,15 @@ pub enum UdpResponseKind { #[derive(Debug, PartialEq, Eq, Clone)] pub struct ConnectionContext { client_socket_addr: SocketAddr, - server_socket_addr: SocketAddr, + server_service_binding: ServiceBinding, } impl ConnectionContext { #[must_use] - pub fn new(client_socket_addr: SocketAddr, server_socket_addr: SocketAddr) -> Self { + pub fn new(client_socket_addr: SocketAddr, server_service_binding: ServiceBinding) -> Self { Self { client_socket_addr, - server_socket_addr, + server_service_binding, } } @@ -71,6 +73,6 @@ impl ConnectionContext { #[must_use] pub fn server_socket_addr(&self) -> SocketAddr { - self.server_socket_addr + self.server_service_binding.bind_address() } } diff --git a/packages/udp-tracker-server/src/handlers/announce.rs b/packages/udp-tracker-server/src/handlers/announce.rs index 5df46125d..1cf0f0b7d 100644 --- a/packages/udp-tracker-server/src/handlers/announce.rs +++ b/packages/udp-tracker-server/src/handlers/announce.rs @@ -11,6 +11,7 @@ use bittorrent_primitives::info_hash::InfoHash; use bittorrent_udp_tracker_core::services::announce::AnnounceService; use torrust_tracker_configuration::Core; use torrust_tracker_primitives::core::AnnounceData; +use torrust_tracker_primitives::service_binding::ServiceBinding; use tracing::{instrument, Level}; use zerocopy::network_endian::I32; @@ -26,7 +27,7 @@ use crate::event::{self, ConnectionContext, Event, UdpRequestKind}; pub async fn handle_announce( announce_service: &Arc, client_socket_addr: SocketAddr, - server_socket_addr: SocketAddr, + server_service_binding: ServiceBinding, request: &AnnounceRequest, core_config: &Arc, opt_udp_server_stats_event_sender: &Arc>>, @@ -42,14 +43,14 @@ pub async fn handle_announce( if let Some(udp_server_stats_event_sender) = opt_udp_server_stats_event_sender.as_deref() { udp_server_stats_event_sender .send_event(Event::UdpRequestAccepted { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding.clone()), kind: UdpRequestKind::Announce, }) .await; } let announce_data = announce_service - .handle_announce(client_socket_addr, server_socket_addr, request, cookie_valid_range) + .handle_announce(client_socket_addr, server_service_binding, request, cookie_valid_range) .await .map_err(|e| (e.into(), request.transaction_id, UdpRequestKind::Announce))?; @@ -205,6 +206,7 @@ mod tests { use bittorrent_tracker_core::torrent::repository::in_memory::InMemoryTorrentRepository; use bittorrent_udp_tracker_core::connection_cookie::{gen_remote_fingerprint, make}; use mockall::predicate::eq; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use crate::event::{self, ConnectionContext, Event, UdpRequestKind}; use crate::handlers::announce::tests::announce_request::AnnounceRequestBuilder; @@ -228,6 +230,7 @@ mod tests { let client_socket_addr = SocketAddr::new(IpAddr::V4(client_ip), client_port); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let request = AnnounceRequestBuilder::default() .with_connection_id(make(gen_remote_fingerprint(&client_socket_addr), sample_issue_time()).unwrap()) @@ -240,7 +243,7 @@ mod tests { handle_announce( &core_udp_tracker_services.announce_service, client_socket_addr, - server_socket_addr, + server_service_binding, &request, &core_tracker_services.core_config, &server_udp_tracker_services.udp_server_stats_event_sender, @@ -269,6 +272,7 @@ mod tests { let client_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(126, 0, 0, 1)), 8080); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let request = AnnounceRequestBuilder::default() .with_connection_id(make(gen_remote_fingerprint(&client_socket_addr), sample_issue_time()).unwrap()) @@ -277,7 +281,7 @@ mod tests { let response = handle_announce( &core_udp_tracker_services.announce_service, client_socket_addr, - server_socket_addr, + server_service_binding, &request, &core_tracker_services.core_config, &server_udp_tracker_services.udp_server_stats_event_sender, @@ -320,6 +324,7 @@ mod tests { let client_socket_addr = SocketAddr::new(IpAddr::V4(remote_client_ip), remote_client_port); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let request = AnnounceRequestBuilder::default() .with_connection_id(make(gen_remote_fingerprint(&client_socket_addr), sample_issue_time()).unwrap()) @@ -332,7 +337,7 @@ mod tests { handle_announce( &core_udp_tracker_services.announce_service, client_socket_addr, - server_socket_addr, + server_service_binding, &request, &core_tracker_services.core_config, &server_udp_tracker_services.udp_server_stats_event_sender, @@ -378,6 +383,7 @@ mod tests { let client_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(126, 0, 0, 1)), 8080); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let request = AnnounceRequestBuilder::default() .with_connection_id(make(gen_remote_fingerprint(&client_socket_addr), sample_issue_time()).unwrap()) @@ -386,7 +392,7 @@ mod tests { handle_announce( &core_udp_tracker_services.announce_service, client_socket_addr, - server_socket_addr, + server_service_binding, &request, &core_tracker_services.core_config, &udp_server_stats_event_sender, @@ -419,12 +425,13 @@ mod tests { async fn should_send_the_upd4_announce_event() { let client_socket_addr = sample_ipv4_socket_address(); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let mut udp_server_stats_event_sender_mock = MockUdpServerStatsEventSender::new(); udp_server_stats_event_sender_mock .expect_send_event() .with(eq(Event::UdpRequestAccepted { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding.clone()), kind: UdpRequestKind::Announce, })) .times(1) @@ -438,7 +445,7 @@ mod tests { handle_announce( &core_udp_tracker_services.announce_service, client_socket_addr, - server_socket_addr, + server_service_binding, &AnnounceRequestBuilder::default().into(), &core_tracker_services.core_config, &udp_server_stats_event_sender, @@ -454,6 +461,7 @@ mod tests { use aquatic_udp_protocol::{InfoHash as AquaticInfoHash, PeerId as AquaticPeerId}; use bittorrent_udp_tracker_core::connection_cookie::{gen_remote_fingerprint, make}; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use crate::handlers::announce::tests::announce_request::AnnounceRequestBuilder; use crate::handlers::handle_announce; @@ -474,6 +482,7 @@ mod tests { let client_socket_addr = SocketAddr::new(IpAddr::V4(client_ip), client_port); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let request = AnnounceRequestBuilder::default() .with_connection_id(make(gen_remote_fingerprint(&client_socket_addr), sample_issue_time()).unwrap()) @@ -486,7 +495,7 @@ mod tests { handle_announce( &core_udp_tracker_services.announce_service, client_socket_addr, - server_socket_addr, + server_service_binding, &request, &core_tracker_services.core_config, &server_udp_tracker_services.udp_server_stats_event_sender, @@ -529,6 +538,7 @@ mod tests { use bittorrent_udp_tracker_core::services::announce::AnnounceService; use mockall::predicate::eq; use torrust_tracker_configuration::Core; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use crate::event::{self, ConnectionContext, Event, UdpRequestKind}; use crate::handlers::announce::tests::announce_request::AnnounceRequestBuilder; @@ -552,6 +562,7 @@ mod tests { let client_socket_addr = SocketAddr::new(IpAddr::V6(client_ip_v6), client_port); let server_socket_addr = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let request = AnnounceRequestBuilder::default() .with_connection_id(make(gen_remote_fingerprint(&client_socket_addr), sample_issue_time()).unwrap()) @@ -564,7 +575,7 @@ mod tests { handle_announce( &core_udp_tracker_services.announce_service, client_socket_addr, - server_socket_addr, + server_service_binding, &request, &core_tracker_services.core_config, &server_udp_tracker_services.udp_server_stats_event_sender, @@ -596,6 +607,7 @@ mod tests { let client_socket_addr = SocketAddr::new(IpAddr::V6(client_ip_v6), 8080); let server_socket_addr = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let request = AnnounceRequestBuilder::default() .with_connection_id(make(gen_remote_fingerprint(&client_socket_addr), sample_issue_time()).unwrap()) @@ -604,7 +616,7 @@ mod tests { let response = handle_announce( &core_udp_tracker_services.announce_service, client_socket_addr, - server_socket_addr, + server_service_binding, &request, &core_tracker_services.core_config, &server_udp_tracker_services.udp_server_stats_event_sender, @@ -647,6 +659,7 @@ mod tests { let client_socket_addr = SocketAddr::new(IpAddr::V6(remote_client_ip), remote_client_port); let server_socket_addr = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let request = AnnounceRequestBuilder::default() .with_connection_id(make(gen_remote_fingerprint(&client_socket_addr), sample_issue_time()).unwrap()) @@ -659,7 +672,7 @@ mod tests { handle_announce( &core_udp_tracker_services.announce_service, client_socket_addr, - server_socket_addr, + server_service_binding, &request, &core_tracker_services.core_config, &server_udp_tracker_service.udp_server_stats_event_sender, @@ -710,6 +723,7 @@ mod tests { let client_socket_addr = SocketAddr::new(IpAddr::V6(client_ip_v6), client_port); let server_socket_addr = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let request = AnnounceRequestBuilder::default() .with_connection_id(make(gen_remote_fingerprint(&client_socket_addr), sample_issue_time()).unwrap()) @@ -724,7 +738,7 @@ mod tests { handle_announce( &announce_service, client_socket_addr, - server_socket_addr, + server_service_binding, &request, &core_config, &udp_server_stats_event_sender, @@ -761,12 +775,13 @@ mod tests { async fn should_send_the_upd6_announce_event() { let client_socket_addr = sample_ipv6_remote_addr(); let server_socket_addr = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let mut udp_server_stats_event_sender_mock = MockUdpServerStatsEventSender::new(); udp_server_stats_event_sender_mock .expect_send_event() .with(eq(Event::UdpRequestAccepted { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding.clone()), kind: UdpRequestKind::Announce, })) .times(1) @@ -784,7 +799,7 @@ mod tests { handle_announce( &core_udp_tracker_services.announce_service, client_socket_addr, - server_socket_addr, + server_service_binding, &announce_request, &core_tracker_services.core_config, &udp_server_stats_event_sender, @@ -810,6 +825,7 @@ mod tests { use bittorrent_udp_tracker_core::services::announce::AnnounceService; use bittorrent_udp_tracker_core::{self, event as core_event}; use mockall::predicate::eq; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use crate::event::{self, ConnectionContext, Event, UdpRequestKind}; use crate::handlers::announce::tests::announce_request::AnnounceRequestBuilder; @@ -834,7 +850,12 @@ mod tests { let peer_id = AquaticPeerId([255u8; 20]); let client_socket_addr = SocketAddr::new(IpAddr::V6(client_ip_v6), client_port); - let server_socket_addr = config.udp_trackers.clone().unwrap()[0].bind_address; + let mut server_socket_addr = config.udp_trackers.clone().unwrap()[0].bind_address; + if server_socket_addr.port() == 0 { + // Port 0 cannot be use in service binding + server_socket_addr.set_port(6969); + } + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let database = initialize_database(&config.core); let in_memory_whitelist = Arc::new(InMemoryWhitelist::default()); @@ -847,7 +868,7 @@ mod tests { udp_core_stats_event_sender_mock .expect_send_event() .with(eq(core_event::Event::UdpAnnounce { - context: core_event::ConnectionContext::new(client_socket_addr, server_socket_addr), + context: core_event::ConnectionContext::new(client_socket_addr, server_service_binding.clone()), })) .times(1) .returning(|_| Box::pin(future::ready(Some(Ok(1))))); @@ -858,7 +879,7 @@ mod tests { udp_server_stats_event_sender_mock .expect_send_event() .with(eq(Event::UdpRequestAccepted { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding.clone()), kind: UdpRequestKind::Announce, })) .times(1) @@ -892,7 +913,7 @@ mod tests { handle_announce( &announce_service, client_socket_addr, - server_socket_addr, + server_service_binding, &request, &core_config, &udp_server_stats_event_sender, diff --git a/packages/udp-tracker-server/src/handlers/connect.rs b/packages/udp-tracker-server/src/handlers/connect.rs index a0fbaead3..88f0b7f3a 100644 --- a/packages/udp-tracker-server/src/handlers/connect.rs +++ b/packages/udp-tracker-server/src/handlers/connect.rs @@ -4,6 +4,7 @@ use std::sync::Arc; use aquatic_udp_protocol::{ConnectRequest, ConnectResponse, ConnectionId, Response}; use bittorrent_udp_tracker_core::services::connect::ConnectService; +use torrust_tracker_primitives::service_binding::ServiceBinding; use tracing::{instrument, Level}; use crate::event::{self, ConnectionContext, Event, UdpRequestKind}; @@ -12,7 +13,7 @@ use crate::event::{self, ConnectionContext, Event, UdpRequestKind}; #[instrument(fields(transaction_id), skip(connect_service, opt_udp_server_stats_event_sender), ret(level = Level::TRACE))] pub async fn handle_connect( client_socket_addr: SocketAddr, - server_socket_addr: SocketAddr, + server_service_binding: ServiceBinding, request: &ConnectRequest, connect_service: &Arc, opt_udp_server_stats_event_sender: &Arc>>, @@ -24,14 +25,14 @@ pub async fn handle_connect( if let Some(udp_server_stats_event_sender) = opt_udp_server_stats_event_sender.as_deref() { udp_server_stats_event_sender .send_event(Event::UdpRequestAccepted { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding.clone()), kind: UdpRequestKind::Connect, }) .await; } let connection_id = connect_service - .handle_connect(client_socket_addr, server_socket_addr, cookie_issue_time) + .handle_connect(client_socket_addr, server_service_binding, cookie_issue_time) .await; build_response(*request, connection_id) @@ -60,6 +61,7 @@ mod tests { use bittorrent_udp_tracker_core::event as core_event; use bittorrent_udp_tracker_core::services::connect::ConnectService; use mockall::predicate::eq; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use crate::event::{self, ConnectionContext, Event, UdpRequestKind}; use crate::handlers::handle_connect; @@ -77,6 +79,7 @@ mod tests { #[tokio::test] async fn a_connect_response_should_contain_the_same_transaction_id_as_the_connect_request() { let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let (udp_core_stats_event_sender, _udp_core_stats_repository) = bittorrent_udp_tracker_core::statistics::setup::factory(false); @@ -93,7 +96,7 @@ mod tests { let response = handle_connect( sample_ipv4_remote_addr(), - server_socket_addr, + server_service_binding, &request, &connect_service, &udp_server_stats_event_sender, @@ -113,6 +116,7 @@ mod tests { #[tokio::test] async fn a_connect_response_should_contain_a_new_connection_id() { let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let (udp_core_stats_event_sender, _udp_core_stats_repository) = bittorrent_udp_tracker_core::statistics::setup::factory(false); @@ -129,7 +133,7 @@ mod tests { let response = handle_connect( sample_ipv4_remote_addr(), - server_socket_addr, + server_service_binding, &request, &connect_service, &udp_server_stats_event_sender, @@ -149,6 +153,7 @@ mod tests { #[tokio::test] async fn a_connect_response_should_contain_a_new_connection_id_ipv6() { let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let (udp_core_stats_event_sender, _udp_core_stats_repository) = bittorrent_udp_tracker_core::statistics::setup::factory(false); @@ -165,7 +170,7 @@ mod tests { let response = handle_connect( sample_ipv6_remote_addr(), - server_socket_addr, + server_service_binding, &request, &connect_service, &udp_server_stats_event_sender, @@ -186,12 +191,13 @@ mod tests { async fn it_should_send_the_upd4_connect_event_when_a_client_tries_to_connect_using_a_ip4_socket_address() { let client_socket_addr = sample_ipv4_socket_address(); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let mut udp_core_stats_event_sender_mock = MockUdpCoreStatsEventSender::new(); udp_core_stats_event_sender_mock .expect_send_event() .with(eq(core_event::Event::UdpConnect { - context: core_event::ConnectionContext::new(client_socket_addr, server_socket_addr), + context: core_event::ConnectionContext::new(client_socket_addr, server_service_binding.clone()), })) .times(1) .returning(|_| Box::pin(future::ready(Some(Ok(1))))); @@ -202,7 +208,7 @@ mod tests { udp_server_stats_event_sender_mock .expect_send_event() .with(eq(Event::UdpRequestAccepted { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding.clone()), kind: UdpRequestKind::Connect, })) .times(1) @@ -214,7 +220,7 @@ mod tests { handle_connect( client_socket_addr, - server_socket_addr, + server_service_binding, &sample_connect_request(), &connect_service, &udp_server_stats_event_sender, @@ -227,12 +233,13 @@ mod tests { async fn it_should_send_the_upd6_connect_event_when_a_client_tries_to_connect_using_a_ip6_socket_address() { let client_socket_addr = sample_ipv6_remote_addr(); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let mut udp_core_stats_event_sender_mock = MockUdpCoreStatsEventSender::new(); udp_core_stats_event_sender_mock .expect_send_event() .with(eq(core_event::Event::UdpConnect { - context: core_event::ConnectionContext::new(client_socket_addr, server_socket_addr), + context: core_event::ConnectionContext::new(client_socket_addr, server_service_binding.clone()), })) .times(1) .returning(|_| Box::pin(future::ready(Some(Ok(1))))); @@ -243,7 +250,7 @@ mod tests { udp_server_stats_event_sender_mock .expect_send_event() .with(eq(Event::UdpRequestAccepted { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding.clone()), kind: UdpRequestKind::Connect, })) .times(1) @@ -255,7 +262,7 @@ mod tests { handle_connect( client_socket_addr, - server_socket_addr, + server_service_binding, &sample_connect_request(), &connect_service, &udp_server_stats_event_sender, diff --git a/packages/udp-tracker-server/src/handlers/error.rs b/packages/udp-tracker-server/src/handlers/error.rs index 70c33b5ba..6a1bce51c 100644 --- a/packages/udp-tracker-server/src/handlers/error.rs +++ b/packages/udp-tracker-server/src/handlers/error.rs @@ -6,6 +6,7 @@ use std::sync::Arc; use aquatic_udp_protocol::{ErrorResponse, RequestParseError, Response, TransactionId}; use bittorrent_udp_tracker_core::connection_cookie::{check, gen_remote_fingerprint}; use bittorrent_udp_tracker_core::{self, UDP_TRACKER_LOG_TARGET}; +use torrust_tracker_primitives::service_binding::ServiceBinding; use tracing::{instrument, Level}; use uuid::Uuid; use zerocopy::network_endian::I32; @@ -18,7 +19,7 @@ use crate::event::{self, ConnectionContext, Event, UdpRequestKind}; pub async fn handle_error( req_kind: Option, client_socket_addr: SocketAddr, - server_socket_addr: SocketAddr, + server_service_binding: ServiceBinding, request_id: Uuid, opt_udp_server_stats_event_sender: &Arc>>, cookie_valid_range: Range, @@ -27,6 +28,8 @@ pub async fn handle_error( ) -> Response { tracing::trace!("handle error"); + let server_socket_addr = server_service_binding.bind_address(); + match transaction_id { Some(transaction_id) => { let transaction_id = transaction_id.0.to_string(); @@ -60,7 +63,7 @@ pub async fn handle_error( if let Some(udp_server_stats_event_sender) = opt_udp_server_stats_event_sender.as_deref() { udp_server_stats_event_sender .send_event(Event::UdpError { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding), }) .await; } diff --git a/packages/udp-tracker-server/src/handlers/mod.rs b/packages/udp-tracker-server/src/handlers/mod.rs index 34ac374fa..f8ca9d8ea 100644 --- a/packages/udp-tracker-server/src/handlers/mod.rs +++ b/packages/udp-tracker-server/src/handlers/mod.rs @@ -18,6 +18,7 @@ use connect::handle_connect; use error::handle_error; use scrape::handle_scrape; use torrust_tracker_clock::clock::Time; +use torrust_tracker_primitives::service_binding::ServiceBinding; use tracing::{instrument, Level}; use uuid::Uuid; @@ -59,7 +60,7 @@ pub(crate) async fn handle_packet( udp_request: RawRequest, udp_tracker_core_container: Arc, udp_tracker_server_container: Arc, - server_socket_addr: SocketAddr, + server_service_binding: ServiceBinding, cookie_time_values: CookieTimeValues, ) -> (Response, Option) { let request_id = Uuid::new_v4(); @@ -74,7 +75,7 @@ pub(crate) async fn handle_packet( Ok(request) => match handle_request( request, udp_request.from, - server_socket_addr, + server_service_binding.clone(), udp_tracker_core_container.clone(), udp_tracker_server_container.clone(), cookie_time_values.clone(), @@ -95,7 +96,7 @@ pub(crate) async fn handle_packet( let response = handle_error( Some(req_kind.clone()), udp_request.from, - server_socket_addr, + server_service_binding, request_id, &udp_tracker_server_container.udp_server_stats_event_sender, cookie_time_values.valid_range.clone(), @@ -111,7 +112,7 @@ pub(crate) async fn handle_packet( let response = handle_error( None, udp_request.from, - server_socket_addr, + server_service_binding, request_id, &udp_tracker_server_container.udp_server_stats_event_sender, cookie_time_values.valid_range.clone(), @@ -138,7 +139,7 @@ pub(crate) async fn handle_packet( #[instrument(skip( request, client_socket_addr, - server_socket_addr, + server_service_binding, udp_tracker_core_container, udp_tracker_server_container, cookie_time_values @@ -146,7 +147,7 @@ pub(crate) async fn handle_packet( pub async fn handle_request( request: Request, client_socket_addr: SocketAddr, - server_socket_addr: SocketAddr, + server_service_binding: ServiceBinding, udp_tracker_core_container: Arc, udp_tracker_server_container: Arc, cookie_time_values: CookieTimeValues, @@ -157,7 +158,7 @@ pub async fn handle_request( Request::Connect(connect_request) => Ok(( handle_connect( client_socket_addr, - server_socket_addr, + server_service_binding, &connect_request, &udp_tracker_core_container.connect_service, &udp_tracker_server_container.udp_server_stats_event_sender, @@ -170,7 +171,7 @@ pub async fn handle_request( match handle_announce( &udp_tracker_core_container.announce_service, client_socket_addr, - server_socket_addr, + server_service_binding, &announce_request, &udp_tracker_core_container.tracker_core_container.core_config, &udp_tracker_server_container.udp_server_stats_event_sender, @@ -186,7 +187,7 @@ pub async fn handle_request( match handle_scrape( &udp_tracker_core_container.scrape_service, client_socket_addr, - server_socket_addr, + server_service_binding, &scrape_request, &udp_tracker_server_container.udp_server_stats_event_sender, cookie_time_values.valid_range, diff --git a/packages/udp-tracker-server/src/handlers/scrape.rs b/packages/udp-tracker-server/src/handlers/scrape.rs index ac0faef61..35b5ee65c 100644 --- a/packages/udp-tracker-server/src/handlers/scrape.rs +++ b/packages/udp-tracker-server/src/handlers/scrape.rs @@ -9,6 +9,7 @@ use aquatic_udp_protocol::{ use bittorrent_udp_tracker_core::services::scrape::ScrapeService; use bittorrent_udp_tracker_core::{self}; use torrust_tracker_primitives::core::ScrapeData; +use torrust_tracker_primitives::service_binding::ServiceBinding; use tracing::{instrument, Level}; use zerocopy::network_endian::I32; @@ -24,7 +25,7 @@ use crate::event::{self, ConnectionContext, Event, UdpRequestKind}; pub async fn handle_scrape( scrape_service: &Arc, client_socket_addr: SocketAddr, - server_socket_addr: SocketAddr, + server_service_binding: ServiceBinding, request: &ScrapeRequest, opt_udp_server_stats_event_sender: &Arc>>, cookie_valid_range: Range, @@ -38,14 +39,14 @@ pub async fn handle_scrape( if let Some(udp_server_stats_event_sender) = opt_udp_server_stats_event_sender.as_deref() { udp_server_stats_event_sender .send_event(Event::UdpRequestAccepted { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding.clone()), kind: UdpRequestKind::Scrape, }) .await; } let scrape_data = scrape_service - .handle_scrape(client_socket_addr, server_socket_addr, request, cookie_valid_range) + .handle_scrape(client_socket_addr, server_service_binding, request, cookie_valid_range) .await .map_err(|e| (e.into(), request.transaction_id, UdpRequestKind::Scrape))?; @@ -91,6 +92,7 @@ mod tests { }; use bittorrent_tracker_core::torrent::repository::in_memory::InMemoryTorrentRepository; use bittorrent_udp_tracker_core::connection_cookie::{gen_remote_fingerprint, make}; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use crate::handlers::handle_scrape; use crate::handlers::tests::{ @@ -113,6 +115,7 @@ mod tests { let client_socket_addr = sample_ipv4_remote_addr(); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let info_hash = InfoHash([0u8; 20]); let info_hashes = vec![info_hash]; @@ -126,7 +129,7 @@ mod tests { let response = handle_scrape( &core_udp_tracker_services.scrape_service, client_socket_addr, - server_socket_addr, + server_service_binding, &request, &server_udp_tracker_services.udp_server_stats_event_sender, sample_cookie_valid_range(), @@ -180,6 +183,7 @@ mod tests { let client_socket_addr = sample_ipv4_remote_addr(); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let info_hash = InfoHash([0u8; 20]); @@ -195,7 +199,7 @@ mod tests { handle_scrape( &core_udp_tracker_services.scrape_service, client_socket_addr, - server_socket_addr, + server_service_binding, &request, &udp_server_stats_event_sender, sample_cookie_valid_range(), @@ -240,6 +244,7 @@ mod tests { use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use aquatic_udp_protocol::{InfoHash, NumberOfDownloads, NumberOfPeers, TorrentScrapeStatistics}; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use crate::handlers::handle_scrape; use crate::handlers::scrape::tests::scrape_request::{ @@ -256,6 +261,7 @@ mod tests { let client_socket_addr = sample_ipv4_remote_addr(); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let info_hash = InfoHash([0u8; 20]); @@ -274,7 +280,7 @@ mod tests { handle_scrape( &core_udp_tracker_services.scrape_service, client_socket_addr, - server_socket_addr, + server_service_binding, &request, &server_udp_tracker_services.udp_server_stats_event_sender, sample_cookie_valid_range(), @@ -300,6 +306,7 @@ mod tests { let client_socket_addr = sample_ipv4_remote_addr(); let server_socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let info_hash = InfoHash([0u8; 20]); @@ -316,7 +323,7 @@ mod tests { handle_scrape( &core_udp_tracker_services.scrape_service, client_socket_addr, - server_socket_addr, + server_service_binding, &request, &server_udp_tracker_services.udp_server_stats_event_sender, sample_cookie_valid_range(), @@ -349,6 +356,7 @@ mod tests { use std::sync::Arc; use mockall::predicate::eq; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use super::sample_scrape_request; use crate::event; @@ -363,12 +371,13 @@ mod tests { async fn should_send_the_upd4_scrape_event() { let client_socket_addr = sample_ipv4_remote_addr(); let server_socket_addr = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let mut udp_server_stats_event_sender_mock = MockUdpServerStatsEventSender::new(); udp_server_stats_event_sender_mock .expect_send_event() .with(eq(Event::UdpRequestAccepted { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding.clone()), kind: UdpRequestKind::Scrape, })) .times(1) @@ -382,7 +391,7 @@ mod tests { handle_scrape( &core_udp_tracker_services.scrape_service, client_socket_addr, - server_socket_addr, + server_service_binding, &sample_scrape_request(&client_socket_addr), &udp_server_stats_event_sender, sample_cookie_valid_range(), @@ -398,6 +407,7 @@ mod tests { use std::sync::Arc; use mockall::predicate::eq; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use super::sample_scrape_request; use crate::event::{self, ConnectionContext, Event, UdpRequestKind}; @@ -411,12 +421,13 @@ mod tests { async fn should_send_the_upd6_scrape_event() { let client_socket_addr = sample_ipv6_remote_addr(); let server_socket_addr = SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969); + let server_service_binding = ServiceBinding::new(Protocol::UDP, server_socket_addr).unwrap(); let mut udp_server_stats_event_sender_mock = MockUdpServerStatsEventSender::new(); udp_server_stats_event_sender_mock .expect_send_event() .with(eq(Event::UdpRequestAccepted { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding.clone()), kind: UdpRequestKind::Scrape, })) .times(1) @@ -430,7 +441,7 @@ mod tests { handle_scrape( &core_udp_tracker_services.scrape_service, client_socket_addr, - server_socket_addr, + server_service_binding, &sample_scrape_request(&client_socket_addr), &udp_server_stats_event_sender, sample_cookie_valid_range(), diff --git a/packages/udp-tracker-server/src/server/launcher.rs b/packages/udp-tracker-server/src/server/launcher.rs index fd689a96f..5de41066f 100644 --- a/packages/udp-tracker-server/src/server/launcher.rs +++ b/packages/udp-tracker-server/src/server/launcher.rs @@ -13,7 +13,7 @@ use tokio::time::interval; use torrust_server_lib::logging::STARTED_ON; use torrust_server_lib::registar::ServiceHealthCheckJob; use torrust_server_lib::signals::{shutdown_signal_with_message, Halted, Started}; -use torrust_tracker_primitives::service_binding::ServiceBinding; +use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use tracing::instrument; use super::request_buffer::ActiveRequests; @@ -138,7 +138,10 @@ impl Launcher { let server_socket_addr = receiver.bound_socket_address(); - let local_addr = format!("udp://{server_socket_addr}"); + let server_service_binding = + ServiceBinding::new(Protocol::UDP, server_socket_addr).expect("Bound socket to service binding should not fail"); + + let local_addr = server_service_binding.clone().to_string(); let cookie_lifetime = cookie_lifetime.as_secs_f64(); @@ -156,6 +159,9 @@ impl Launcher { }); loop { + let server_service_binding = + ServiceBinding::new(Protocol::UDP, server_socket_addr).expect("Bound socket to service binding should not fail"); + if let Some(req) = { tracing::trace!(target: UDP_TRACKER_LOG_TARGET, local_addr, "Udp::run_udp_server (wait for request)"); receiver.next().await @@ -180,7 +186,7 @@ impl Launcher { { udp_server_stats_event_sender .send_event(Event::UdpRequestReceived { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding.clone()), }) .await; } @@ -193,7 +199,7 @@ impl Launcher { { udp_server_stats_event_sender .send_event(Event::UdpRequestBanned { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding.clone()), }) .await; } @@ -235,7 +241,7 @@ impl Launcher { { udp_server_stats_event_sender .send_event(Event::UdpRequestAborted { - context: ConnectionContext::new(client_socket_addr, server_socket_addr), + context: ConnectionContext::new(client_socket_addr, server_service_binding), }) .await; } diff --git a/packages/udp-tracker-server/src/server/processor.rs b/packages/udp-tracker-server/src/server/processor.rs index 02e084356..5e98b0361 100644 --- a/packages/udp-tracker-server/src/server/processor.rs +++ b/packages/udp-tracker-server/src/server/processor.rs @@ -7,6 +7,7 @@ use aquatic_udp_protocol::Response; use bittorrent_udp_tracker_core::container::UdpTrackerCoreContainer; use bittorrent_udp_tracker_core::{self}; use tokio::time::Instant; +use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; use tracing::{instrument, Level}; use super::bound_socket::BoundSocket; @@ -20,20 +21,29 @@ pub struct Processor { udp_tracker_core_container: Arc, udp_tracker_server_container: Arc, cookie_lifetime: f64, + server_service_binding: ServiceBinding, } impl Processor { + /// # Panics + /// + /// It will panic if a bound socket address port is 0. It should never + /// happen. pub fn new( socket: Arc, udp_tracker_core_container: Arc, udp_tracker_server_container: Arc, cookie_lifetime: f64, ) -> Self { + let server_service_binding = + ServiceBinding::new(Protocol::UDP, socket.address()).expect("Bound socket port should't be 0"); + Self { socket, udp_tracker_core_container, udp_tracker_server_container, cookie_lifetime, + server_service_binding, } } @@ -47,7 +57,7 @@ impl Processor { request, self.udp_tracker_core_container.clone(), self.udp_tracker_server_container.clone(), - self.socket.address(), + self.server_service_binding.clone(), CookieTimeValues::new(self.cookie_lifetime), ) .await; @@ -109,7 +119,7 @@ impl Processor { { udp_server_stats_event_sender .send_event(Event::UdpResponseSent { - context: ConnectionContext::new(client_socket_addr, self.socket.address()), + context: ConnectionContext::new(client_socket_addr, self.server_service_binding), kind: udp_response_kind, req_processing_time, }) diff --git a/packages/udp-tracker-server/src/statistics/event/handler.rs b/packages/udp-tracker-server/src/statistics/event/handler.rs index f65a1e567..b06c8d725 100644 --- a/packages/udp-tracker-server/src/statistics/event/handler.rs +++ b/packages/udp-tracker-server/src/statistics/event/handler.rs @@ -100,6 +100,8 @@ pub async fn handle_event(event: Event, stats_repository: &Repository) { mod tests { use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; + use torrust_tracker_primitives::service_binding::{Protocol, ServiceBinding}; + use crate::event::{ConnectionContext, Event, UdpRequestKind}; use crate::statistics::event::handler::handle_event; use crate::statistics::repository::Repository; @@ -112,7 +114,11 @@ mod tests { Event::UdpRequestAborted { context: ConnectionContext::new( SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ) + .unwrap(), ), }, &stats_repository, @@ -132,7 +138,11 @@ mod tests { Event::UdpRequestBanned { context: ConnectionContext::new( SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ) + .unwrap(), ), }, &stats_repository, @@ -152,7 +162,11 @@ mod tests { Event::UdpRequestReceived { context: ConnectionContext::new( SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ) + .unwrap(), ), }, &stats_repository, @@ -172,7 +186,11 @@ mod tests { Event::UdpRequestAborted { context: ConnectionContext::new( SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ) + .unwrap(), ), }, &stats_repository, @@ -189,7 +207,11 @@ mod tests { Event::UdpRequestBanned { context: ConnectionContext::new( SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ) + .unwrap(), ), }, &stats_repository, @@ -207,7 +229,11 @@ mod tests { Event::UdpRequestAccepted { context: ConnectionContext::new( SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ) + .unwrap(), ), kind: crate::event::UdpRequestKind::Connect, }, @@ -228,7 +254,11 @@ mod tests { Event::UdpRequestAccepted { context: ConnectionContext::new( SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ) + .unwrap(), ), kind: crate::event::UdpRequestKind::Announce, }, @@ -249,7 +279,11 @@ mod tests { Event::UdpRequestAccepted { context: ConnectionContext::new( SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ) + .unwrap(), ), kind: crate::event::UdpRequestKind::Scrape, }, @@ -270,7 +304,11 @@ mod tests { Event::UdpResponseSent { context: ConnectionContext::new( SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ) + .unwrap(), ), kind: crate::event::UdpResponseKind::Ok { req_kind: UdpRequestKind::Announce, @@ -294,7 +332,11 @@ mod tests { Event::UdpError { context: ConnectionContext::new( SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V4(Ipv4Addr::new(203, 0, 113, 196)), 6969), + ) + .unwrap(), ), }, &stats_repository, @@ -314,7 +356,11 @@ mod tests { Event::UdpRequestAccepted { context: ConnectionContext::new( SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969), + ) + .unwrap(), ), kind: crate::event::UdpRequestKind::Connect, }, @@ -335,7 +381,11 @@ mod tests { Event::UdpRequestAccepted { context: ConnectionContext::new( SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969), + ) + .unwrap(), ), kind: crate::event::UdpRequestKind::Announce, }, @@ -356,7 +406,11 @@ mod tests { Event::UdpRequestAccepted { context: ConnectionContext::new( SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969), + ) + .unwrap(), ), kind: crate::event::UdpRequestKind::Scrape, }, @@ -377,7 +431,11 @@ mod tests { Event::UdpResponseSent { context: ConnectionContext::new( SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969), + ) + .unwrap(), ), kind: crate::event::UdpResponseKind::Ok { req_kind: UdpRequestKind::Announce, @@ -400,7 +458,11 @@ mod tests { Event::UdpError { context: ConnectionContext::new( SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 195)), 8080), - SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969), + ServiceBinding::new( + Protocol::UDP, + SocketAddr::new(IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 203, 0, 113, 196)), 6969), + ) + .unwrap(), ), }, &stats_repository,