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
Generated
+67
View File
@@ -60,8 +60,10 @@ dependencies = [
name = "auraclient-api" name = "auraclient-api"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"base64 0.22.1",
"minreq", "minreq",
"mongodb", "mongodb",
"openssl",
"serde", "serde",
] ]
@@ -393,6 +395,21 @@ version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "foreign-types"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
dependencies = [
"foreign-types-shared",
]
[[package]]
name = "foreign-types-shared"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
[[package]] [[package]]
name = "form_urlencoded" name = "form_urlencoded"
version = "1.2.1" version = "1.2.1"
@@ -1071,6 +1088,44 @@ version = "1.20.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e"
[[package]]
name = "openssl"
version = "0.10.72"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da"
dependencies = [
"bitflags 2.9.0",
"cfg-if",
"foreign-types",
"libc",
"once_cell",
"openssl-macros",
"openssl-sys",
]
[[package]]
name = "openssl-macros"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.99",
]
[[package]]
name = "openssl-sys"
version = "0.9.107"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07"
dependencies = [
"cc",
"libc",
"pkg-config",
"vcpkg",
]
[[package]] [[package]]
name = "parking_lot" name = "parking_lot"
version = "0.12.3" version = "0.12.3"
@@ -1121,6 +1176,12 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
name = "pkg-config"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
[[package]] [[package]]
name = "powerfmt" name = "powerfmt"
version = "0.2.0" version = "0.2.0"
@@ -1784,6 +1845,12 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "vcpkg"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]] [[package]]
name = "version_check" name = "version_check"
version = "0.9.5" version = "0.9.5"
+2
View File
@@ -4,6 +4,8 @@ version = "0.1.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
base64 = "0.22.1"
minreq = { version = "2.13.2", features = ["https", "urlencoding", "json-using-serde"] } minreq = { version = "2.13.2", features = ["https", "urlencoding", "json-using-serde"] }
mongodb = { version = "3.2.1", features = ["sync"] } mongodb = { version = "3.2.1", features = ["sync"] }
openssl = "0.10.72"
serde = { version ="1.0.218", features = ["derive"] } serde = { version ="1.0.218", features = ["derive"] }
+70 -58
View File
@@ -5,12 +5,17 @@ use std::{
time::{Duration, Instant}, time::{Duration, Instant},
}; };
use openssl::rsa::Rsa;
pub mod database; pub mod database;
pub mod encryption;
pub mod methods; pub mod methods;
pub mod parser; pub mod parser;
pub mod response; pub mod response;
fn main() -> std::io::Result<()> { 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 client = mongodb::sync::Client::with_uri_str("mongodb://admin:admin@localhost/").unwrap();
let database = Arc::new(database::Database::new(&client)); let database = Arc::new(database::Database::new(&client));
@@ -19,70 +24,77 @@ fn main() -> std::io::Result<()> {
for stream in listener.incoming() { for stream in listener.incoming() {
println!("New connection"); println!("New connection");
let database = Arc::clone(&database); let database = Arc::clone(&database);
let rsa = rsa.clone();
std::thread::spawn({ std::thread::spawn({
move || { move || {
let mut stream = stream.unwrap(); let mut stream = encryption::handshake(stream.unwrap(), rsa);
let mut reader = BufReader::new(stream.try_clone().unwrap());
let mut last_activity = Instant::now();
match methods::Session::new(&mut reader, database) { println!("{:?}", stream.read());
Ok((session, res)) => {
writeln!(stream, "{res}").unwrap();
stream.flush().unwrap();
loop { stream.send("Daddy OMG!!!");
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 println!("OMG sent")
if last_activity.elapsed() > Duration::from_secs(60) { // let mut reader = BufReader::new(stream.try_clone().unwrap());
println!( // let mut last_activity = Instant::now();
"[MOJANG] {} inactive for too long",
session.local_player.name // match methods::Session::new(&mut reader, database) {
); // Ok((session, res)) => {
methods::player::logout(&session).unwrap(); // writeln!(stream, "{res}").unwrap();
println!("[MOJANG] {} went offline", session.local_player.name); // stream.flush().unwrap();
break;
} // loop {
} // let mut request_string = String::new();
} // match reader.read_line(&mut request_string) {
Err(e) => { // Ok(0) => {
stream.write_all(format!("!{e}").as_bytes()).unwrap(); // // Client disconnected
stream // println!("[MOJANG] {} disconnected", session.local_player.name);
.shutdown(std::net::Shutdown::Both) // methods::player::logout(&session).unwrap();
.expect("shutdown call failed"); // 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");
// }
// }
} }
}); });
} }