fix: download directory handling
This commit is contained in:
+72
-53
@@ -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
@@ -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
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user