From 852934cd84469578a807597038f3ac5a9ca62887 Mon Sep 17 00:00:00 2001 From: Kyler <59854022+KylerOlsen@users.noreply.github.com> Date: Sun, 2 Jun 2024 23:10:07 -0600 Subject: [PATCH] Added mojang authentication --- Cargo.toml | 3 ++- src/login_handle.rs | 42 +++++++++++++++++++++++------------------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index cdc9012..7368cf6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,8 @@ license = "MIT" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -purple_cello_mc_protocol = { git = "https://github.com/PurpleCelloServer/purple_cello_mc_protocol.git", rev = "9ff2e95c66b1d773362936733273350e4bdd399a" } +purple_cello_mc_protocol = { git = "https://github.com/PurpleCelloServer/purple_cello_mc_protocol.git", rev = "196592ae78e3878843c3dea99323c1477da6d380" } +purple_cello_mojang_api = { git = "https://github.com/PurpleCelloServer/mojang_api.git", rev = "08848a0a95b338bdaead303ac646cb3347cf1af6" } tokio = { version = "1", features = ["full"] } serde = { version = "1", features = ["derive"] } serde_json = "1" diff --git a/src/login_handle.rs b/src/login_handle.rs index 0df256e..cb6b99a 100644 --- a/src/login_handle.rs +++ b/src/login_handle.rs @@ -13,6 +13,8 @@ use purple_cello_mc_protocol::{ login, }; +use purple_cello_mojang_api::multiplayer_auth; + use crate::listener; const EXPIRATION_DURATION: Duration = Duration::from_secs(3600); @@ -162,23 +164,30 @@ purplecelloserver@gmail.com".to_string()) } } -async fn check_player_online( +async fn check_player( proxy_info: &listener::ProxyInfo, player: Player, client_conn: &mut ProtocolConnection<'_>, ) -> Result { - let encryption_request = client_conn.create_encryption_request( - proxy_info.private_key.clone())?; - encryption_request.write(client_conn).await?; - let encryption_response = - login::serverbound::EncryptionResponse::read(client_conn).await?; - client_conn.handle_encryption_response(encryption_response)?; - // TODO: Make authentication verification request - Ok(check_player_whitelist(player)) -} - -fn check_player_offline(player: Player) -> Result { - Ok(check_player_whitelist(player)) + match proxy_info.online_status { + listener::OnlineStatus::Online => { + let encryption_request = client_conn.create_encryption_request( + proxy_info.private_key.clone())?; + encryption_request.write(client_conn).await?; + let encryption_response = + login::serverbound::EncryptionResponse::read(client_conn).await?; + client_conn.handle_encryption_response(encryption_response)?; + let server_id = client_conn.server_id_hash().await?; + match multiplayer_auth::joined(&player.name, &server_id, None).await { + Ok(_) => Ok(check_player_whitelist(player)), + Err(_) => + Ok(PlayerAllowed::False( + "Mojang Authentication Failed".to_string())), + } + }, + listener::OnlineStatus::Offline => + Ok(check_player_whitelist(player)), + } } pub async fn respond_login( @@ -222,12 +231,7 @@ async fn login_to_proxy( player_uuid: start_packet.player_uuid, }; - match proxy_info.online_status { - listener::OnlineStatus::Online => - check_player_online(proxy_info, player, client_conn).await, - listener::OnlineStatus::Offline => - check_player_offline(player), - } + check_player(proxy_info, player, client_conn).await } async fn login_to_backend(