|
|
@ -4,8 +4,6 @@ use std::net; |
|
|
use super::constants::*;
|
|
|
use super::constants::*;
|
|
|
use super::super::packet::Packet;
|
|
|
use super::super::packet::Packet;
|
|
|
|
|
|
|
|
|
const MAX_PORT: u32 = (1 << 16) - 1;
|
|
|
|
|
|
|
|
|
|
|
|
/*=================*
|
|
|
/*=================*
|
|
|
* SERVER RESPONSE *
|
|
|
* SERVER RESPONSE *
|
|
|
*=================*/
|
|
|
*=================*/
|
|
|
@ -100,13 +98,8 @@ impl ConnectToPeerResponse { |
|
|
let username = try!(packet.read_str());
|
|
|
let username = try!(packet.read_str());
|
|
|
let connection_type = try!(packet.read_str());
|
|
|
let connection_type = try!(packet.read_str());
|
|
|
|
|
|
|
|
|
let ip = net::Ipv4Addr::from(try!(packet.read_uint()));
|
|
|
|
|
|
|
|
|
|
|
|
let port = try!(packet.read_uint());
|
|
|
|
|
|
if port > MAX_PORT {
|
|
|
|
|
|
return Err(
|
|
|
|
|
|
io::Error::new(io::ErrorKind::Other, "Invalid port number"));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
let ip = try!(packet.read_ipv4_addr());
|
|
|
|
|
|
let port = try!(packet.read_port());
|
|
|
|
|
|
|
|
|
let token = try!(packet.read_uint());
|
|
|
let token = try!(packet.read_uint());
|
|
|
let is_privileged = try!(packet.read_bool());
|
|
|
let is_privileged = try!(packet.read_bool());
|
|
|
@ -115,7 +108,7 @@ impl ConnectToPeerResponse { |
|
|
username: username,
|
|
|
username: username,
|
|
|
connection_type: connection_type,
|
|
|
connection_type: connection_type,
|
|
|
ip: ip,
|
|
|
ip: ip,
|
|
|
port: port as u16,
|
|
|
|
|
|
|
|
|
port: port,
|
|
|
token: token,
|
|
|
token: token,
|
|
|
is_privileged: is_privileged,
|
|
|
is_privileged: is_privileged,
|
|
|
})
|
|
|
})
|
|
|
@ -141,24 +134,25 @@ pub enum LoginResponse { |
|
|
impl LoginResponse {
|
|
|
impl LoginResponse {
|
|
|
pub fn from_packet(packet: &mut Packet) -> io::Result<Self> {
|
|
|
pub fn from_packet(packet: &mut Packet) -> io::Result<Self> {
|
|
|
let ok = try!(packet.read_bool());
|
|
|
let ok = try!(packet.read_bool());
|
|
|
let resp = if ok {
|
|
|
|
|
|
|
|
|
if ok {
|
|
|
let motd = try!(packet.read_str());
|
|
|
let motd = try!(packet.read_str());
|
|
|
let ip = net::Ipv4Addr::from(try!(packet.read_uint()));
|
|
|
|
|
|
|
|
|
let ip = try!(packet.read_ipv4_addr());
|
|
|
|
|
|
|
|
|
match packet.read_bool() {
|
|
|
match packet.read_bool() {
|
|
|
Ok(value) => debug!("LoginResponse last field: {}", value),
|
|
|
Ok(value) => debug!("LoginResponse last field: {}", value),
|
|
|
Err(e) => debug!("Error reading LoginResponse field: {:?}", e),
|
|
|
Err(e) => debug!("Error reading LoginResponse field: {:?}", e),
|
|
|
}
|
|
|
}
|
|
|
LoginResponse::LoginOk {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ok(LoginResponse::LoginOk {
|
|
|
motd: motd,
|
|
|
motd: motd,
|
|
|
ip: ip,
|
|
|
ip: ip,
|
|
|
password_md5_opt: None |
|
|
password_md5_opt: None |
|
|
}
|
|
|
|
|
|
|
|
|
})
|
|
|
} else {
|
|
|
} else {
|
|
|
LoginResponse::LoginFail {
|
|
|
|
|
|
|
|
|
Ok(LoginResponse::LoginFail {
|
|
|
reason: try!(packet.read_str())
|
|
|
reason: try!(packet.read_str())
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
Ok(resp)
|
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -212,16 +206,13 @@ pub struct PeerAddressResponse { |
|
|
impl PeerAddressResponse {
|
|
|
impl PeerAddressResponse {
|
|
|
fn from_packet(packet: &mut Packet) -> io::Result<Self> {
|
|
|
fn from_packet(packet: &mut Packet) -> io::Result<Self> {
|
|
|
let username = try!(packet.read_str());
|
|
|
let username = try!(packet.read_str());
|
|
|
let ip = net::Ipv4Addr::from(try!(packet.read_uint()));
|
|
|
|
|
|
let port = try!(packet.read_uint());
|
|
|
|
|
|
if port > MAX_PORT {
|
|
|
|
|
|
return Err(
|
|
|
|
|
|
io::Error::new(io::ErrorKind::Other, "Invalid port number"));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
let ip = try!(packet.read_ipv4_addr());
|
|
|
|
|
|
let port = try!(packet.read_port());
|
|
|
|
|
|
|
|
|
Ok(PeerAddressResponse {
|
|
|
Ok(PeerAddressResponse {
|
|
|
username: username,
|
|
|
username: username,
|
|
|
ip: ip,
|
|
|
ip: ip,
|
|
|
port: port as u16,
|
|
|
|
|
|
|
|
|
port: port,
|
|
|
})
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|