Handling offline login
This commit is contained in:
parent
cf377ec1c8
commit
bc4c7544ac
|
@ -8,7 +8,7 @@ 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" }
|
purple_cello_mc_protocol = { git = "https://github.com/PurpleCelloServer/purple_cello_mc_protocol.git", rev = "b1a8cfdc91657566d68fb6f7dbc71bdee390cc9e" }
|
||||||
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"
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
// Yeahbut December 2023
|
// Yeahbut December 2023
|
||||||
|
|
||||||
use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf};
|
use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf};
|
||||||
use tokio::io;
|
|
||||||
use std::error::Error;
|
|
||||||
|
|
||||||
use purple_cello_mc_protocol::{
|
use purple_cello_mc_protocol::{
|
||||||
mc_types::{self, Result, Packet},
|
mc_types::{self, Result, Packet},
|
||||||
|
@ -10,17 +8,89 @@ use purple_cello_mc_protocol::{
|
||||||
login,
|
login,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Player {
|
||||||
|
name: String,
|
||||||
|
player_uuid: Option<u128>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check_player(player: &Player) -> Result<bool> {
|
||||||
|
Ok(true)
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn respond_login(
|
pub async fn respond_login(
|
||||||
client_reader: &mut OwnedReadHalf,
|
client_reader: &mut OwnedReadHalf,
|
||||||
client_writer: &mut OwnedWriteHalf,
|
client_writer: &mut OwnedWriteHalf,
|
||||||
server_reader: &mut OwnedReadHalf,
|
server_reader: &mut OwnedReadHalf,
|
||||||
server_writer: &mut OwnedWriteHalf,
|
server_writer: &mut OwnedWriteHalf,
|
||||||
) -> Result<bool> {
|
) -> Result<bool> {
|
||||||
|
let proxy_login = login_to_proxy(client_reader).await?;
|
||||||
|
match proxy_login {
|
||||||
|
Some(player) => {
|
||||||
|
login_to_backend(
|
||||||
|
player,
|
||||||
|
client_writer,
|
||||||
|
server_reader,
|
||||||
|
server_writer,
|
||||||
|
).await?;
|
||||||
|
return Ok(true)
|
||||||
|
},
|
||||||
|
None => return Ok(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn login_to_proxy(
|
||||||
|
client_reader: &mut OwnedReadHalf,
|
||||||
|
) -> Result<Option<Player>> {
|
||||||
|
println!("Logging into proxy");
|
||||||
|
|
||||||
|
let start_packet =
|
||||||
|
login::serverbound::LoginStart::read(client_reader).await?;
|
||||||
|
|
||||||
|
let player: Player = Player {
|
||||||
|
name: start_packet.name,
|
||||||
|
player_uuid: start_packet.player_uuid,
|
||||||
|
};
|
||||||
|
|
||||||
|
if check_player(&player)? {
|
||||||
|
println!("Player allowed");
|
||||||
|
Ok(Some(player))
|
||||||
|
} else {
|
||||||
|
println!("Player blocked");
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn login_to_backend(
|
||||||
|
player: Player,
|
||||||
|
client_writer: &mut OwnedWriteHalf,
|
||||||
|
server_reader: &mut OwnedReadHalf,
|
||||||
|
server_writer: &mut OwnedWriteHalf,
|
||||||
|
) -> Result<()> {
|
||||||
|
println!("Logging into backend");
|
||||||
handshake::serverbound::Handshake {
|
handshake::serverbound::Handshake {
|
||||||
protocol_version: mc_types::VERSION_PROTOCOL,
|
protocol_version: mc_types::VERSION_PROTOCOL,
|
||||||
server_address: "localhost".to_string(),
|
server_address: "localhost".to_string(),
|
||||||
server_port: 25565,
|
server_port: 25565,
|
||||||
next_state: 2,
|
next_state: 2,
|
||||||
}.write(server_writer).await?;
|
}.write(server_writer).await?;
|
||||||
Ok(true)
|
|
||||||
|
println!("Login start");
|
||||||
|
login::serverbound::LoginStart {
|
||||||
|
name: player.name,
|
||||||
|
player_uuid: player.player_uuid,
|
||||||
|
}.write(server_writer).await?;
|
||||||
|
|
||||||
|
println!("Finishing backend login");
|
||||||
|
let packet = login::clientbound::LoginSuccess::read(server_reader).await?;
|
||||||
|
|
||||||
|
println!("Finishing proxy login");
|
||||||
|
login::clientbound::LoginSuccess {
|
||||||
|
uuid: packet.uuid.clone(),
|
||||||
|
username: packet.username.clone(),
|
||||||
|
properties: packet.properties.clone(),
|
||||||
|
}.write(client_writer).await?;
|
||||||
|
|
||||||
|
println!("Client logged in");
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
35
src/main.rs
35
src/main.rs
|
@ -5,7 +5,7 @@ use tokio::io;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
|
||||||
use purple_cello_mc_protocol::{
|
use purple_cello_mc_protocol::{
|
||||||
mc_types::Packet,
|
mc_types::{self, Packet},
|
||||||
handshake,
|
handshake,
|
||||||
login,
|
login,
|
||||||
};
|
};
|
||||||
|
@ -71,6 +71,7 @@ async fn handle_client(client_socket: TcpStream) {
|
||||||
).await.expect("Error handling status request");
|
).await.expect("Error handling status request");
|
||||||
return;
|
return;
|
||||||
} else if handshake_packet.next_state == 2 {
|
} else if handshake_packet.next_state == 2 {
|
||||||
|
if handshake_packet.protocol_version == mc_types::VERSION_PROTOCOL {
|
||||||
match server_writer {
|
match server_writer {
|
||||||
Some(mut server_writer) => {
|
Some(mut server_writer) => {
|
||||||
match server_reader {
|
match server_reader {
|
||||||
|
@ -81,15 +82,17 @@ async fn handle_client(client_socket: TcpStream) {
|
||||||
&mut client_writer,
|
&mut client_writer,
|
||||||
&mut server_reader,
|
&mut server_reader,
|
||||||
&mut server_writer,
|
&mut server_writer,
|
||||||
)
|
).await.expect(
|
||||||
.await
|
"Error logging into proxy or server"
|
||||||
.expect("Error logging into backend server") {
|
) {
|
||||||
handle_play(
|
handle_play(
|
||||||
client_reader,
|
client_reader,
|
||||||
client_writer,
|
client_writer,
|
||||||
server_reader,
|
server_reader,
|
||||||
server_writer,
|
server_writer,
|
||||||
).await;
|
).await;
|
||||||
|
} else {
|
||||||
|
println!("Player blocked from server");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
None => {
|
None => {
|
||||||
|
@ -110,6 +113,30 @@ async fn handle_client(client_socket: TcpStream) {
|
||||||
Failed to connect to the backend server");
|
Failed to connect to the backend server");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if handshake_packet.protocol_version < mc_types::VERSION_PROTOCOL {
|
||||||
|
println!("Client on outdated version");
|
||||||
|
login::clientbound::Disconnect {
|
||||||
|
reason: format!(
|
||||||
|
"\"Client Error: Outdated Version (I'm on {})\"",
|
||||||
|
mc_types::VERSION_NAME,
|
||||||
|
).to_string()
|
||||||
|
}
|
||||||
|
.write(&mut client_writer).await.expect(
|
||||||
|
"Error sending disconnect on: Client on wrong version");
|
||||||
|
// if handshake_packet.protocol_version > mc_types::VERSION_PROTOCOL
|
||||||
|
} else {
|
||||||
|
println!("Client on future version");
|
||||||
|
login::clientbound::Disconnect {
|
||||||
|
reason: format!(
|
||||||
|
"\"Client Error: Future Version (I'm on {})\"",
|
||||||
|
mc_types::VERSION_NAME,
|
||||||
|
).to_string()
|
||||||
|
}
|
||||||
|
.write(&mut client_writer).await.expect(
|
||||||
|
"Error sending disconnect on: Client on wrong version");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue