encryption example

This commit is contained in:
2025-04-13 03:22:06 +02:00
parent 69ad3f92de
commit b5c1a3760c
2 changed files with 52 additions and 75 deletions
+47 -62
View File
@@ -29,72 +29,57 @@ fn main() -> std::io::Result<()> {
std::thread::spawn({ std::thread::spawn({
move || { move || {
let mut stream = encryption::handshake(stream.unwrap(), rsa); let mut stream = encryption::handshake(stream.unwrap(), rsa);
let mut last_activity = Instant::now();
println!("{:?}", stream.read()); match methods::Session::new(stream.clone(), database) {
Ok((session, res)) => {
stream.send(res);
stream.send("Daddy OMG!!!"); loop {
match stream.read() {
None => {
// Client disconnected
println!("[MOJANG] {} disconnected", session.local_player.name);
methods::player::logout(&session).unwrap();
println!("[MOJANG] {} went offline", session.local_player.name);
break;
}
Some(request_string) => {
last_activity = Instant::now();
let (method, params) = parser::parse(&request_string).unwrap();
let response = session.handle_request(&method, &params);
println!("OMG sent") stream.send(match response {
// let mut reader = BufReader::new(stream.try_clone().unwrap()); Ok(response) => response.to_string(),
// let mut last_activity = Instant::now(); Err(e) => format!("!{e}"),
});
}
// Err(e) => {
// println!(
// "[ERROR] Read error for {}: {}",
// session.local_player.name, e
// );
// break;
// }
};
// match methods::Session::new(&mut reader, database) { // Check for inactivity
// Ok((session, res)) => { if last_activity.elapsed() > Duration::from_secs(60) {
// writeln!(stream, "{res}").unwrap(); println!(
// stream.flush().unwrap(); "[MOJANG] {} inactive for too long",
session.local_player.name
// loop { );
// let mut request_string = String::new(); methods::player::logout(&session).unwrap();
// match reader.read_line(&mut request_string) { println!("[MOJANG] {} went offline", session.local_player.name);
// Ok(0) => { break;
// // Client disconnected }
// println!("[MOJANG] {} disconnected", session.local_player.name); }
// methods::player::logout(&session).unwrap(); }
// println!("[MOJANG] {} went offline", session.local_player.name); Err(e) => {
// break; // stream.write_all(format!("!{e}").as_bytes()).unwrap();
// } stream.close();
// Ok(_) => { }
// last_activity = Instant::now(); }
// let (method, params) = parser::parse(&request_string).unwrap();
// let response = session.handle_request(&method, &params);
// writeln!(
// stream,
// "{}",
// match response {
// Ok(response) => response.to_string(),
// Err(e) => format!("!{e}"),
// }
// )
// .unwrap();
// }
// Err(e) => {
// println!(
// "[ERROR] Read error for {}: {}",
// session.local_player.name, e
// );
// break;
// }
// };
// // Check for inactivity
// if last_activity.elapsed() > Duration::from_secs(60) {
// println!(
// "[MOJANG] {} inactive for too long",
// session.local_player.name
// );
// methods::player::logout(&session).unwrap();
// println!("[MOJANG] {} went offline", session.local_player.name);
// break;
// }
// }
// }
// Err(e) => {
// stream.write_all(format!("!{e}").as_bytes()).unwrap();
// stream
// .shutdown(std::net::Shutdown::Both)
// .expect("shutdown call failed");
// }
// }
} }
}); });
} }
+5 -13
View File
@@ -12,6 +12,7 @@ use std::{
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::{ use crate::{
encryption::ETcp,
parser::ParamMap, parser::ParamMap,
response::{PlayerResponse, Response, Result}, response::{PlayerResponse, Response, Result},
}; };
@@ -30,24 +31,15 @@ pub struct Session {
impl Session { impl Session {
pub fn new( pub fn new(
reader: &mut BufReader<TcpStream>, mut stream: ETcp,
database: Arc<crate::database::Database>, database: Arc<crate::database::Database>,
) -> Result<(Self, Response)> { ) -> Result<(Self, Response)> {
let (token_send, token_recv) = let (token_send, token_recv) =
mpsc::channel::<std::result::Result<String, crate::response::Error>>(); mpsc::channel::<std::result::Result<String, crate::response::Error>>();
let reader_clone = reader std::thread::spawn(move || match stream.read() {
.get_ref() Some(session_token) => token_send.send(Ok(session_token)),
.try_clone() _ => token_send.send(Err(crate::response::Error::InvalidHandshake)),
.map_err(|_| crate::response::Error::InvalidHandshake)?;
std::thread::spawn(move || {
let mut reader = BufReader::new(reader_clone);
let mut session_token = String::new();
if reader.read_line(&mut session_token).is_ok() {
token_send.send(Ok(session_token))
} else {
token_send.send(Err(crate::response::Error::InvalidHandshake))
}
}); });
match token_recv.recv_timeout(std::time::Duration::from_secs(20)) { match token_recv.recv_timeout(std::time::Duration::from_secs(20)) {