diff --git a/src/request_handler.rs b/src/request_handler.rs index bf1aab3..ef56a9d 100644 --- a/src/request_handler.rs +++ b/src/request_handler.rs @@ -2,6 +2,6 @@ use tokio::net::UdpSocket; use crate::request::Request; -pub trait RequestHandler: Sync { +pub trait RequestHandler: Sync + Send { fn handle_radius_request(&self, conn: &UdpSocket, request: &Request); } diff --git a/src/secret_provider.rs b/src/secret_provider.rs index 8ff87c8..79f3861 100644 --- a/src/secret_provider.rs +++ b/src/secret_provider.rs @@ -8,6 +8,6 @@ pub enum SecretProviderError { FailedFetching(String) } -pub trait SecretProvider: Sync { +pub trait SecretProvider: Sync + Send { fn fetch_secret(&self, remote_addr: SocketAddr) -> Result, SecretProviderError>; } diff --git a/src/server.rs b/src/server.rs index bfd22bf..e847eb5 100644 --- a/src/server.rs +++ b/src/server.rs @@ -11,22 +11,22 @@ use crate::request::Request; use crate::request_handler::RequestHandler; use crate::secret_provider::SecretProvider; -pub struct Server { +pub struct Server { address: String, buf_size: u8, skip_authenticity_validation: bool, - request_handler: &'static T, - secret_provider: &'static U, + request_handler_arc: Arc, + secret_provider_arc: Arc, } impl Server { - pub fn new(host: &str, port: u16, buf_size: u8, skip_authenticity_validation: bool, request_handler: &'static T, secret_provider: &'static U) -> Self { + pub fn new(host: &str, port: u16, buf_size: u8, skip_authenticity_validation: bool, request_handler: T, secret_provider: U) -> Self { Self { address: format!("{}:{}", host, port), buf_size, skip_authenticity_validation, - request_handler, - secret_provider, + request_handler_arc: Arc::new(request_handler), + secret_provider_arc: Arc::new(secret_provider), } } @@ -38,6 +38,8 @@ impl Server { loop { let conn = conn_arc.clone(); + let request_handler = self.request_handler_arc.clone(); + let secret_provider = self.secret_provider_arc.clone(); tokio::select! { received = conn.recv_from(&mut buf) => { @@ -62,8 +64,8 @@ impl Server { local_addr, remote_addr, undergoing_requests_lock, - self.request_handler, - self.secret_provider, + request_handler, + secret_provider, self.skip_authenticity_validation, ).await; }); @@ -78,8 +80,8 @@ impl Server { local_addr: SocketAddr, remote_addr: SocketAddr, undergoing_requests_lock: Arc>>, - request_handler: &T, - secret_provider: &U, + request_handler: Arc, + secret_provider: Arc, skip_authenticity_validation: bool, ) { let secret: Vec = match secret_provider.fetch_secret(remote_addr) {