encryption example

This commit is contained in:
2025-04-13 03:14:16 +02:00
parent a48a8c2dda
commit 69ad3f92de
3 changed files with 139 additions and 58 deletions
+70 -58
View File
@@ -5,12 +5,17 @@ use std::{
time::{Duration, Instant},
};
use openssl::rsa::Rsa;
pub mod database;
pub mod encryption;
pub mod methods;
pub mod parser;
pub mod response;
fn main() -> std::io::Result<()> {
let rsa = Rsa::generate(2048).expect("Failed to generate RSA keys");
let client = mongodb::sync::Client::with_uri_str("mongodb://admin:admin@localhost/").unwrap();
let database = Arc::new(database::Database::new(&client));
@@ -19,70 +24,77 @@ fn main() -> std::io::Result<()> {
for stream in listener.incoming() {
println!("New connection");
let database = Arc::clone(&database);
let rsa = rsa.clone();
std::thread::spawn({
move || {
let mut stream = stream.unwrap();
let mut reader = BufReader::new(stream.try_clone().unwrap());
let mut last_activity = Instant::now();
let mut stream = encryption::handshake(stream.unwrap(), rsa);
match methods::Session::new(&mut reader, database) {
Ok((session, res)) => {
writeln!(stream, "{res}").unwrap();
stream.flush().unwrap();
println!("{:?}", stream.read());
loop {
let mut request_string = String::new();
match reader.read_line(&mut request_string) {
Ok(0) => {
// Client disconnected
println!("[MOJANG] {} disconnected", session.local_player.name);
methods::player::logout(&session).unwrap();
println!("[MOJANG] {} went offline", session.local_player.name);
break;
}
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;
}
};
stream.send("Daddy OMG!!!");
// 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");
}
}
println!("OMG sent")
// let mut reader = BufReader::new(stream.try_clone().unwrap());
// let mut last_activity = Instant::now();
// match methods::Session::new(&mut reader, database) {
// Ok((session, res)) => {
// writeln!(stream, "{res}").unwrap();
// stream.flush().unwrap();
// loop {
// let mut request_string = String::new();
// match reader.read_line(&mut request_string) {
// Ok(0) => {
// // Client disconnected
// println!("[MOJANG] {} disconnected", session.local_player.name);
// methods::player::logout(&session).unwrap();
// println!("[MOJANG] {} went offline", session.local_player.name);
// break;
// }
// 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");
// }
// }
}
});
}