handle disconnected clients, use psocipher.header_size
This commit is contained in:
		
							parent
							
								
									3230954a50
								
							
						
					
					
						commit
						0e04968fd3
					
				@ -1,3 +1,5 @@
 | 
				
			|||||||
 | 
					pub mod cipherkeys;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use std::net::TcpStream;
 | 
					use std::net::TcpStream;
 | 
				
			||||||
use std::io::{Read, Write};
 | 
					use std::io::{Read, Write};
 | 
				
			||||||
use libpso::crypto::{PSOCipher, CipherError};
 | 
					use libpso::crypto::{PSOCipher, CipherError};
 | 
				
			||||||
@ -10,6 +12,7 @@ pub enum PacketNetworkError {
 | 
				
			|||||||
    PacketParseError(PacketParseError),
 | 
					    PacketParseError(PacketParseError),
 | 
				
			||||||
    IOError(std::io::Error),
 | 
					    IOError(std::io::Error),
 | 
				
			||||||
    DataNotReady,
 | 
					    DataNotReady,
 | 
				
			||||||
 | 
					    ClientDisconnected,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl From<CipherError> for PacketNetworkError {
 | 
					impl From<CipherError> for PacketNetworkError {
 | 
				
			||||||
@ -30,43 +33,54 @@ impl From<PacketParseError> for PacketNetworkError {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn recv_packet<T: Read>(socket: &mut T, cipher: &mut dyn PSOCipher) -> Result<Vec<u8>, PacketNetworkError> {
 | 
					pub fn recv_packet<T: Read>(socket: &mut T, cipher: &mut dyn PSOCipher) -> Result<Vec<u8>, PacketNetworkError> {
 | 
				
			||||||
    let mut size_buf = [0u8; 4];
 | 
					    let mut size_buf = vec![0u8; cipher.header_size()];
 | 
				
			||||||
    //socket.read_exact(&mut size_buf)?;
 | 
					    let mut offset = 0;
 | 
				
			||||||
    /*let mut offset = 0;
 | 
					    while offset < cipher.header_size() {
 | 
				
			||||||
    while offset < 4 {
 | 
					        let diff = socket.read(&mut size_buf[offset..])?;
 | 
				
			||||||
        offset += socket.read(&mut size_buf[offset..])?;
 | 
					        println!("! {} {:?}", diff, size_buf);
 | 
				
			||||||
    }*/
 | 
					        if diff == 0 {
 | 
				
			||||||
    let len = socket.read(&mut size_buf)?;
 | 
					            return Err(PacketNetworkError::ClientDisconnected);
 | 
				
			||||||
    if len != 4 {
 | 
					        }
 | 
				
			||||||
        return Err(PacketNetworkError::DataNotReady)
 | 
					        offset += diff;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let mut dec_size_buf = cipher.decrypt(&size_buf.to_vec())?;
 | 
					    let mut dec_size_buf = cipher.decrypt(&size_buf)?;
 | 
				
			||||||
    let size = u16::from_le_bytes([dec_size_buf[0], dec_size_buf[1]]);
 | 
					    let size = u16::from_le_bytes([dec_size_buf[0], dec_size_buf[1]]) as usize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let mut data_buf = vec![0u8; (size - 4) as usize];
 | 
					    let mut data_buf = vec![0u8; size - cipher.header_size()];
 | 
				
			||||||
    //socket.read_exact(&mut data_buf)?;
 | 
					 | 
				
			||||||
    let mut offset = 0;
 | 
					    let mut offset = 0;
 | 
				
			||||||
    while offset < size as usize - 4{
 | 
					    while offset < size - cipher.header_size() {
 | 
				
			||||||
        offset += socket.read(&mut data_buf[offset..])?;
 | 
					        let diff = socket.read(&mut data_buf[offset..])?;
 | 
				
			||||||
 | 
					        if diff == 0 {
 | 
				
			||||||
 | 
					            return Err(PacketNetworkError::ClientDisconnected);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        offset += diff;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let mut null_data_count = 0;
 | 
				
			||||||
 | 
					    while data_buf.len() % cipher.header_size() != 0 {
 | 
				
			||||||
 | 
					        data_buf.push(0);
 | 
				
			||||||
 | 
					        null_data_count += 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    let mut dec_data_buf = cipher.decrypt(&data_buf.to_vec())?;
 | 
					    let mut dec_data_buf = cipher.decrypt(&data_buf.to_vec())?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for _ in  0..null_data_count {
 | 
				
			||||||
 | 
					        dec_data_buf.pop();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    let mut full_buf = Vec::new();
 | 
					    let mut full_buf = Vec::new();
 | 
				
			||||||
    full_buf.append(&mut dec_size_buf);
 | 
					    full_buf.append(&mut dec_size_buf);
 | 
				
			||||||
    full_buf.append(&mut dec_data_buf);
 | 
					    full_buf.append(&mut dec_data_buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    println!("[recv]: {:X?}", full_buf);
 | 
					    //println!("[recv]: {:X?}", full_buf);
 | 
				
			||||||
    Ok(full_buf)
 | 
					    Ok(full_buf)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn send_packet<T: Write>(socket: &mut T, cipher: &mut dyn PSOCipher, pkt: &dyn PSOPacket) -> Result<(), PacketNetworkError> {
 | 
					pub fn send_packet<T: Write>(socket: &mut T, cipher: &mut dyn PSOCipher, pkt: &dyn PSOPacket) -> Result<(), PacketNetworkError> {
 | 
				
			||||||
    let buf = pkt.as_bytes();
 | 
					    let buf = pkt.as_bytes();
 | 
				
			||||||
    println!("[send]: {:X?}", buf);
 | 
					    //println!("[send]: {:X?}", buf);
 | 
				
			||||||
    let cbuf = cipher.encrypt(&buf)?;
 | 
					    let cbuf = cipher.encrypt(&buf)?;
 | 
				
			||||||
    Ok(socket.write_all(&cbuf)?)
 | 
					    Ok(socket.write_all(&cbuf)?)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user