Added mojang authentication

This commit is contained in:
Kyler 2024-06-02 23:10:07 -06:00
parent 149a3acc1d
commit 852934cd84
2 changed files with 25 additions and 20 deletions

View File

@ -8,7 +8,8 @@ license = "MIT"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [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"] } tokio = { version = "1", features = ["full"] }
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
serde_json = "1" serde_json = "1"

View File

@ -13,6 +13,8 @@ use purple_cello_mc_protocol::{
login, login,
}; };
use purple_cello_mojang_api::multiplayer_auth;
use crate::listener; use crate::listener;
const EXPIRATION_DURATION: Duration = Duration::from_secs(3600); 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, proxy_info: &listener::ProxyInfo,
player: Player, player: Player,
client_conn: &mut ProtocolConnection<'_>, client_conn: &mut ProtocolConnection<'_>,
) -> Result<PlayerAllowed> { ) -> Result<PlayerAllowed> {
let encryption_request = client_conn.create_encryption_request( match proxy_info.online_status {
proxy_info.private_key.clone())?; listener::OnlineStatus::Online => {
encryption_request.write(client_conn).await?; let encryption_request = client_conn.create_encryption_request(
let encryption_response = proxy_info.private_key.clone())?;
login::serverbound::EncryptionResponse::read(client_conn).await?; encryption_request.write(client_conn).await?;
client_conn.handle_encryption_response(encryption_response)?; let encryption_response =
// TODO: Make authentication verification request login::serverbound::EncryptionResponse::read(client_conn).await?;
Ok(check_player_whitelist(player)) 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 {
fn check_player_offline(player: Player) -> Result<PlayerAllowed> { Ok(_) => Ok(check_player_whitelist(player)),
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( pub async fn respond_login(
@ -222,12 +231,7 @@ async fn login_to_proxy(
player_uuid: start_packet.player_uuid, player_uuid: start_packet.player_uuid,
}; };
match proxy_info.online_status { check_player(proxy_info, player, client_conn).await
listener::OnlineStatus::Online =>
check_player_online(proxy_info, player, client_conn).await,
listener::OnlineStatus::Offline =>
check_player_offline(player),
}
} }
async fn login_to_backend( async fn login_to_backend(