fix: download directory handling

This commit is contained in:
michel
2025-10-26 01:57:22 +02:00
committed by Michel de Graaf
parent 436bc0fe1a
commit 4932386056
2 changed files with 88 additions and 59 deletions
+72 -53
View File
@@ -56,6 +56,7 @@ impl Default for ClientContext {
} }
impl ClientContext { impl ClientContext {
#[must_use]
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
peers: HashMap::new(), peers: HashMap::new(),
@@ -304,10 +305,10 @@ impl Client {
match download_peer.download_file( match download_peer.download_file(
client_context_clone, client_context_clone,
Some(download.size as usize), Some(download.size as usize),
Some(format!("/tmp/{}", filename)), Some(download.download_directory)
) { ) {
Ok((bytes, filename)) => { Ok((bytes, filename)) => {
info!("Successfully downloaded {} bytes to /tmp/{}", bytes, filename); info!("Successfully downloaded {} bytes to {}", bytes, filename);
} }
Err(e) => { Err(e) => {
error!( error!(
@@ -327,7 +328,7 @@ impl Client {
token token
); );
} }
}; }
} }
ClientOperation::NewPeer(new_peer) => { ClientOperation::NewPeer(new_peer) => {
if client_context if client_context
@@ -384,63 +385,81 @@ impl Client {
username, host, port, obfuscation_type, obfuscated_port username, host, port, obfuscation_type, obfuscated_port
); );
match client_context if let Some(_peer) =
.lock() client_context.lock().unwrap().peers.get(&username)
.unwrap()
.peers
.get(&username)
{ {
Some(_peer) => { // don't know if i should update? and or reconnect the peer
// don't know if i should update? and or reconnect the peer // debug!(
// debug!( // "existing peer: {:?}, new peer details:
// "existing peer: {:?}, new peer details: // username: {},
// username: {}, // host: {},
// host: {}, // port: {}
// port: {} // obfuscation_type: {}
// obfuscation_type: {} // obfuscated_port: {}",
// obfuscated_port: {}", // peer,
// peer, // username,
// username, // host,
// host, // port,
// port, // obfuscation_type,
// obfuscation_type, // obfuscated_port,
// obfuscated_port, // );
// ); } else {
} let peer = Peer::new(
None => { username,
let peer = Peer::new( ConnectionType::P,
username, host,
ConnectionType::P, port,
host, None,
port, 0,
None, obfuscation_type.try_into().unwrap(),
0, obfuscated_port.try_into().unwrap(),
obfuscation_type.try_into().unwrap(), );
obfuscated_port.try_into().unwrap(), Self::connect_to_peer(
); peer,
Self::connect_to_peer( client_context.clone(),
peer, own_username.clone(),
client_context.clone(), None,
own_username.clone(), );
None,
);
}
} }
} }
ClientOperation::UpdateDownloadTokens( ClientOperation::UpdateDownloadTokens(
transfer, transfer,
username, username,
) => { ) => {
client_context.lock().unwrap().download_tokens.insert( let mut context = client_context.lock().unwrap();
transfer.token,
Download { let key_to_remove = context
username, .download_tokens
filename: transfer.filename, .iter()
token: transfer.token, .find_map(|(key, d)| {
size: transfer.size, if d.username == username
download_directory: "~/Downloads/".to_string(), && 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);
}
} }
} }
} }
+16 -6
View File
@@ -1,7 +1,9 @@
use std::io::Write;
use std::sync::mpsc::Sender; use std::sync::mpsc::Sender;
use std::{io, net::TcpListener}; use std::{io, net::TcpListener};
use crate::client::ClientOperation; use crate::client::ClientOperation;
use crate::message::server::MessageFactory;
use crate::message::MessageReader; use crate::message::MessageReader;
use crate::{debug, error, info, trace, warn, FileSearchResult}; use crate::{debug, error, info, trace, warn, FileSearchResult};
@@ -13,11 +15,11 @@ impl Listen {
info!("starting listener on port {port}"); info!("starting listener on port {port}");
let listener = TcpListener::bind(format!("0.0.0.0:{port}")).unwrap(); let listener = TcpListener::bind(format!("0.0.0.0:{port}")).unwrap();
for stream in listener.incoming() { for stream in listener.incoming() {
let mut read_stream = stream.unwrap(); let mut stream = stream.unwrap();
let mut buffered_reader = MessageReader::new(); let mut buffered_reader = MessageReader::new();
loop { loop {
match buffered_reader.read_from_socket(&mut read_stream) { match buffered_reader.read_from_socket(&mut stream) {
Ok(()) => {} Ok(()) => {}
Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => { Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
continue continue
@@ -32,7 +34,6 @@ impl Listen {
} }
} }
// Extract all available messages from buffer
loop { loop {
match buffered_reader.extract_message() { match buffered_reader.extract_message() {
Ok(Some(mut message)) => { Ok(Some(mut message)) => {
@@ -46,8 +47,17 @@ impl Listen {
match message_code { match message_code {
0 => { 0 => {
// let token = message.read_string(); let token = message.read_int32();
// debug!("[listener] received Pierce Firewall, token: {}", token); debug!("[listener] received Pierce Firewall, token: {}", token);
stream
.write_all(
&MessageFactory::build_pierce_firewall_message(
token,
)
.get_data(),
)
.unwrap();
stream.flush().unwrap();
} }
1 => { 1 => {
// handle handover to default_peer with socket in the future // handle handover to default_peer with socket in the future
@@ -83,7 +93,7 @@ impl Listen {
debug!( debug!(
"[listener] unknown message_code: {}", "[listener] unknown message_code: {}",
message_code message_code
) );
} }
} }
} }