Dispatch read one byte of the code, so a code with a non-zero high byte was handled as its low byte. Message::get_message_code now reads the whole little-endian uint32 and handlers register by u32. PeerInit and PierceFirewall, the only frames with a one-byte code, get their own accessor for the listener's first frame.
36 lines
1.0 KiB
Rust
36 lines
1.0 KiB
Rust
use crate::actor::server_actor::ServerMessage;
|
|
use crate::message::{Message, MessageHandler};
|
|
use std::sync::mpsc::Sender;
|
|
|
|
pub struct GetPeerAddressHandler;
|
|
|
|
impl MessageHandler<ServerMessage> for GetPeerAddressHandler {
|
|
fn get_code(&self) -> u32 {
|
|
3
|
|
}
|
|
|
|
fn handle(&self, message: &mut Message, sender: Sender<ServerMessage>) {
|
|
let username = message.read_string();
|
|
|
|
// Read IP address as 4 bytes
|
|
let mut ip: Vec<u8> = vec![];
|
|
for _ in 0..4 {
|
|
ip.push(message.read_int8());
|
|
}
|
|
let host = format!("{}.{}.{}.{}", ip[3], ip[2], ip[1], ip[0]);
|
|
|
|
let port = message.read_int32();
|
|
let obfuscation_type = message.read_int32();
|
|
let obfuscated_port = message.read_int32() as u16;
|
|
crate::debug!("GetPeerAddressHandler: {username:?}");
|
|
|
|
let _ = sender.send(ServerMessage::GetPeerAddressResponse {
|
|
username,
|
|
host,
|
|
port,
|
|
obfuscation_type,
|
|
obfuscated_port,
|
|
});
|
|
}
|
|
}
|