encryption example
This commit is contained in:
Generated
+67
@@ -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"
|
||||||
|
|||||||
@@ -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
@@ -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, ¶ms);
|
|
||||||
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, ¶ms);
|
||||||
|
// 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");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user