Compare commits
2 commits
ee7a05152e
...
1bce912a1a
| Author | SHA1 | Date | |
|---|---|---|---|
| 1bce912a1a | |||
| 1229127101 |
3 changed files with 48 additions and 34 deletions
|
|
@ -12,11 +12,7 @@ use tracing::Instrument;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
mc_server::{sanitize_addr, MinecraftAPI, MinecraftServerHandle, ServerDeploymentStatus},
|
mc_server::{sanitize_addr, MinecraftAPI, MinecraftServerHandle, ServerDeploymentStatus},
|
||||||
packets::{
|
packets::{clientbound::status::StatusTrait, SendPacket},
|
||||||
clientbound::status::StatusTrait,
|
|
||||||
serverbound::handshake::{self},
|
|
||||||
SendPacket,
|
|
||||||
},
|
|
||||||
OpaqueError,
|
OpaqueError,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -438,6 +434,7 @@ impl fmt::Debug for ServerDeploymentStatus {
|
||||||
Self::Starting => write!(f, "Starting"),
|
Self::Starting => write!(f, "Starting"),
|
||||||
Self::PodOk => write!(f, "PodOk"),
|
Self::PodOk => write!(f, "PodOk"),
|
||||||
Self::Offline => write!(f, "Offline"),
|
Self::Offline => write!(f, "Offline"),
|
||||||
|
Self::Unavailable(s) => write!(f, "Unavailable ({s})"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
74
src/main.rs
74
src/main.rs
|
|
@ -103,35 +103,49 @@ async fn process_connection<T: MinecraftServerHandle>(
|
||||||
api: impl MinecraftAPI<T>,
|
api: impl MinecraftAPI<T>,
|
||||||
config: Config,
|
config: Config,
|
||||||
) -> Result<(), OpaqueError> {
|
) -> Result<(), OpaqueError> {
|
||||||
let client_packet = Packet::parse(&mut client_stream).await?;
|
// this is wrapper so that async doesnt mess up the span, and
|
||||||
|
// to make sure this doesn't propagate to later `handle_*`
|
||||||
|
#[tracing::instrument(level = "info", skip(client_stream, config))]
|
||||||
|
async fn first_packet(
|
||||||
|
client_stream: &mut TcpStream,
|
||||||
|
config: Config,
|
||||||
|
) -> Result<Option<packets::serverbound::handshake::Handshake>, OpaqueError> {
|
||||||
|
let client_packet = Packet::parse(client_stream).await?;
|
||||||
|
|
||||||
// --- Handshake ---
|
// --- Handshake ---
|
||||||
let handshake;
|
let handshake;
|
||||||
let next_server_state;
|
let packet_id = client_packet.id.get_int();
|
||||||
let packet_id = client_packet.id.get_int();
|
if packet_id != 0 {
|
||||||
if packet_id != 0 {
|
return Err(OpaqueError::create(&format!(
|
||||||
return Err(OpaqueError::create(&format!(
|
"Client HANDSHAKE -> bad packet; id={packet_id} Disconnecting..."
|
||||||
"Client HANDSHAKE -> bad packet; id={packet_id} Disconnecting..."
|
)));
|
||||||
)));
|
}
|
||||||
|
handshake = packets::serverbound::handshake::Handshake::parse(client_packet)
|
||||||
|
.await
|
||||||
|
.ok_or_else(|| "Client HANDSHAKE -> malformed packet; Disconnecting...".to_string())?;
|
||||||
|
|
||||||
|
let filter = eval_boolean(&format!(
|
||||||
|
"addr=\"{}\";{}",
|
||||||
|
handshake.get_server_address(),
|
||||||
|
config.filter_conn
|
||||||
|
))
|
||||||
|
.map_err(|e| format!("filter error! err={:?}", e))?;
|
||||||
|
if filter {
|
||||||
|
// TODO: if the server just returns here, the client does not know it
|
||||||
|
// and sends a packet with the 122 WeirdID
|
||||||
|
tracing::trace!("filtered out the connection");
|
||||||
|
return Ok(None);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(Some(handshake))
|
||||||
}
|
}
|
||||||
handshake = packets::serverbound::handshake::Handshake::parse(client_packet)
|
let handshake = match first_packet(&mut client_stream, config).await? {
|
||||||
.await
|
Some(x) => x,
|
||||||
.ok_or_else(|| "Client HANDSHAKE -> malformed packet; Disconnecting...".to_string())?;
|
// this is needed because of the filter
|
||||||
|
None => return Ok(()),
|
||||||
let filter = eval_boolean(&format!(
|
};
|
||||||
"addr=\"{}\";{}",
|
|
||||||
handshake.get_server_address(),
|
|
||||||
config.filter_conn
|
|
||||||
))
|
|
||||||
.map_err(|e| format!("filter error! err={:?}", e))?;
|
|
||||||
if filter {
|
|
||||||
// TODO: if the server just returns here, the client does not know it
|
|
||||||
// and sends a packet with the 122 WeirdID
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
|
|
||||||
next_server_state = handshake.get_next_state();
|
|
||||||
|
|
||||||
|
let next_server_state = handshake.get_next_state();
|
||||||
match next_server_state {
|
match next_server_state {
|
||||||
packets::ProtocolState::Status => {
|
packets::ProtocolState::Status => {
|
||||||
handle_status(&mut client_stream, &handshake, api).await?;
|
handle_status(&mut client_stream, &handshake, api).await?;
|
||||||
|
|
@ -221,9 +235,9 @@ async fn handle_status<T: MinecraftServerHandle>(
|
||||||
.instrument(span.clone())
|
.instrument(span.clone())
|
||||||
.await
|
.await
|
||||||
.map_err(|_| tracing::debug!("failed to send pong packet"));
|
.map_err(|_| tracing::debug!("failed to send pong packet"));
|
||||||
let _guard = span.enter();
|
|
||||||
|
|
||||||
tracing::info!(status = "unavailable", "status request");
|
let status = ServerDeploymentStatus::Unavailable(e.get_kind().to_string());
|
||||||
|
tracing::info!(status = ?status, "status request");
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -250,6 +264,7 @@ async fn handle_status<T: MinecraftServerHandle>(
|
||||||
status_struct.description.text =
|
status_struct.description.text =
|
||||||
format!("{motd}\n§4Offline§r §oJoin to start!§r - {BYE_MESSAGE}");
|
format!("{motd}\n§4Offline§r §oJoin to start!§r - {BYE_MESSAGE}");
|
||||||
}
|
}
|
||||||
|
ServerDeploymentStatus::Unavailable(_) => unreachable!(),
|
||||||
};
|
};
|
||||||
|
|
||||||
mc_server::complete_status_request(client_stream, status_struct).await?;
|
mc_server::complete_status_request(client_stream, status_struct).await?;
|
||||||
|
|
@ -307,7 +322,7 @@ async fn handle_login<T: MinecraftServerHandle>(
|
||||||
|
|
||||||
match traffic.error {
|
match traffic.error {
|
||||||
Some(e) => {
|
Some(e) => {
|
||||||
tracing::info!(
|
tracing::warn!(
|
||||||
tx = traffic.tx,
|
tx = traffic.tx,
|
||||||
rx = traffic.rx,
|
rx = traffic.rx,
|
||||||
err = ?e,
|
err = ?e,
|
||||||
|
|
@ -330,6 +345,7 @@ async fn handle_login<T: MinecraftServerHandle>(
|
||||||
.await?;
|
.await?;
|
||||||
mc_server::send_disconnect(client_stream, format!("[\"\",{{\"text\":\"Okayy, §2starting§r the server!\n\n\"}},{{\"text\":\"{BYE_MESSAGE}\"}}]").as_str()).await?;
|
mc_server::send_disconnect(client_stream, format!("[\"\",{{\"text\":\"Okayy, §2starting§r the server!\n\n\"}},{{\"text\":\"{BYE_MESSAGE}\"}}]").as_str()).await?;
|
||||||
}
|
}
|
||||||
|
ServerDeploymentStatus::Unavailable(_) => unreachable!(),
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -139,6 +139,7 @@ pub enum ServerDeploymentStatus {
|
||||||
Starting,
|
Starting,
|
||||||
PodOk,
|
PodOk,
|
||||||
Offline,
|
Offline,
|
||||||
|
Unavailable(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn sanitize_addr(addr: &str) -> &str {
|
pub fn sanitize_addr(addr: &str) -> &str {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue