From 493238605658c38277996e1e837e91496363c79e Mon Sep 17 00:00:00 2001 From: michel Date: Sun, 26 Oct 2025 01:57:22 +0200 Subject: [PATCH] fix: download directory handling --- src/client.rs | 125 ++++++++++++++++++++++++++------------------- src/peer/listen.rs | 22 +++++--- 2 files changed, 88 insertions(+), 59 deletions(-) diff --git a/src/client.rs b/src/client.rs index 80ac27e..1dab39f 100644 --- a/src/client.rs +++ b/src/client.rs @@ -56,6 +56,7 @@ impl Default for ClientContext { } impl ClientContext { + #[must_use] pub fn new() -> Self { Self { peers: HashMap::new(), @@ -304,10 +305,10 @@ impl Client { match download_peer.download_file( client_context_clone, Some(download.size as usize), - Some(format!("/tmp/{}", filename)), + Some(download.download_directory) ) { Ok((bytes, filename)) => { - info!("Successfully downloaded {} bytes to /tmp/{}", bytes, filename); + info!("Successfully downloaded {} bytes to {}", bytes, filename); } Err(e) => { error!( @@ -327,7 +328,7 @@ impl Client { token ); } - }; + } } ClientOperation::NewPeer(new_peer) => { if client_context @@ -384,63 +385,81 @@ impl Client { username, host, port, obfuscation_type, obfuscated_port ); - match client_context - .lock() - .unwrap() - .peers - .get(&username) + if let Some(_peer) = + client_context.lock().unwrap().peers.get(&username) { - Some(_peer) => { - // don't know if i should update? and or reconnect the peer - // debug!( - // "existing peer: {:?}, new peer details: - // username: {}, - // host: {}, - // port: {} - // obfuscation_type: {} - // obfuscated_port: {}", - // peer, - // username, - // host, - // port, - // obfuscation_type, - // obfuscated_port, - // ); - } - None => { - let peer = Peer::new( - username, - ConnectionType::P, - host, - port, - None, - 0, - obfuscation_type.try_into().unwrap(), - obfuscated_port.try_into().unwrap(), - ); - Self::connect_to_peer( - peer, - client_context.clone(), - own_username.clone(), - None, - ); - } + // don't know if i should update? and or reconnect the peer + // debug!( + // "existing peer: {:?}, new peer details: + // username: {}, + // host: {}, + // port: {} + // obfuscation_type: {} + // obfuscated_port: {}", + // peer, + // username, + // host, + // port, + // obfuscation_type, + // obfuscated_port, + // ); + } else { + let peer = Peer::new( + username, + ConnectionType::P, + host, + port, + None, + 0, + obfuscation_type.try_into().unwrap(), + obfuscated_port.try_into().unwrap(), + ); + Self::connect_to_peer( + peer, + client_context.clone(), + own_username.clone(), + None, + ); } } ClientOperation::UpdateDownloadTokens( transfer, username, ) => { - client_context.lock().unwrap().download_tokens.insert( - transfer.token, - Download { - username, - filename: transfer.filename, - token: transfer.token, - size: transfer.size, - download_directory: "~/Downloads/".to_string(), - }, - ); + let mut context = client_context.lock().unwrap(); + + let key_to_remove = context + .download_tokens + .iter() + .find_map(|(key, d)| { + if d.username == username + && d.filename == transfer.filename + { + Some((*key, d.clone())) + } else { + None + } + }); + + if let Some((key, download)) = key_to_remove { + trace!( + "[client] UpdateDownloadTokens found {key}, transfer: {:?}", + transfer + ); + + context.download_tokens.insert( + transfer.token, + Download { + username: username.clone(), + filename: transfer.filename, + token: transfer.token, + size: transfer.size, + download_directory: download + .download_directory, + }, + ); + context.download_tokens.remove(&key); + } } } } diff --git a/src/peer/listen.rs b/src/peer/listen.rs index 8c22ffe..e6aa222 100644 --- a/src/peer/listen.rs +++ b/src/peer/listen.rs @@ -1,7 +1,9 @@ +use std::io::Write; use std::sync::mpsc::Sender; use std::{io, net::TcpListener}; use crate::client::ClientOperation; +use crate::message::server::MessageFactory; use crate::message::MessageReader; use crate::{debug, error, info, trace, warn, FileSearchResult}; @@ -13,11 +15,11 @@ impl Listen { info!("starting listener on port {port}"); let listener = TcpListener::bind(format!("0.0.0.0:{port}")).unwrap(); for stream in listener.incoming() { - let mut read_stream = stream.unwrap(); + let mut stream = stream.unwrap(); let mut buffered_reader = MessageReader::new(); loop { - match buffered_reader.read_from_socket(&mut read_stream) { + match buffered_reader.read_from_socket(&mut stream) { Ok(()) => {} Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => { continue @@ -32,7 +34,6 @@ impl Listen { } } - // Extract all available messages from buffer loop { match buffered_reader.extract_message() { Ok(Some(mut message)) => { @@ -46,8 +47,17 @@ impl Listen { match message_code { 0 => { - // let token = message.read_string(); - // debug!("[listener] received Pierce Firewall, token: {}", token); + let token = message.read_int32(); + debug!("[listener] received Pierce Firewall, token: {}", token); + stream + .write_all( + &MessageFactory::build_pierce_firewall_message( + token, + ) + .get_data(), + ) + .unwrap(); + stream.flush().unwrap(); } 1 => { // handle handover to default_peer with socket in the future @@ -83,7 +93,7 @@ impl Listen { debug!( "[listener] unknown message_code: {}", message_code - ) + ); } } }