fix: modded(neoforge 1.20.1) address string handling
This commit is contained in:
parent
2eb9adc61a
commit
6c56b9e0e3
2 changed files with 37 additions and 18 deletions
|
|
@ -83,7 +83,7 @@ pub struct McApi {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MinecraftAPI<Server> for McApi {
|
impl MinecraftAPI<Server> for McApi {
|
||||||
#[tracing::instrument(name = "MinecraftAPI::query_server", level = "info", skip(self))]
|
#[tracing::instrument(name = "MinecraftAPI::query_server", level = "info", skip(self, addr))]
|
||||||
async fn query_server(&self, addr: &str) -> Result<Server, OpaqueError> {
|
async fn query_server(&self, addr: &str) -> Result<Server, OpaqueError> {
|
||||||
let dep_name = match self.cache.query_dep_addr(&addr).await {
|
let dep_name = match self.cache.query_dep_addr(&addr).await {
|
||||||
Some(x) => x,
|
Some(x) => x,
|
||||||
|
|
|
||||||
53
src/main.rs
53
src/main.rs
|
|
@ -124,12 +124,13 @@ async fn handle_status<T: MinecraftServerHandle>(
|
||||||
};
|
};
|
||||||
|
|
||||||
let server_addr = handshake.get_server_address();
|
let server_addr = handshake.get_server_address();
|
||||||
|
let server_addr = sanitize_addr(&server_addr);
|
||||||
let commit_hash: &'static str = env!("COMMIT_HASH");
|
let commit_hash: &'static str = env!("COMMIT_HASH");
|
||||||
let mut status_struct = StatusStructNew::create();
|
let mut status_struct = StatusStructNew::create();
|
||||||
status_struct.version.protocol = handshake.protocol_version.get_int();
|
status_struct.version.protocol = handshake.protocol_version.get_int();
|
||||||
let bye_message = format!(" - §dTami§r with §d<3§r §8(rev: {commit_hash})§r");
|
let bye_message = format!(" - §dTami§r with §d<3§r §8(rev: {commit_hash})§r");
|
||||||
|
|
||||||
let server = match api.query_server(&handshake.get_server_address()).await {
|
let server = match api.query_server(server_addr).await {
|
||||||
Ok(x) => x,
|
Ok(x) => x,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
tracing::warn!(err = e.context);
|
tracing::warn!(err = e.context);
|
||||||
|
|
@ -186,22 +187,9 @@ async fn handle_login<T: MinecraftServerHandle>(
|
||||||
handshake: &Handshake,
|
handshake: &Handshake,
|
||||||
api: impl MinecraftAPI<T>,
|
api: impl MinecraftAPI<T>,
|
||||||
) -> Result<(), OpaqueError> {
|
) -> Result<(), OpaqueError> {
|
||||||
let addr = handshake.get_server_address();
|
let server = api
|
||||||
// Thanks to a buggy minecraft, when the client sends a join
|
.query_server(sanitize_addr(&handshake.get_server_address()))
|
||||||
// from a SRV DNS record, it will not use the address typed
|
.await?;
|
||||||
// in the game, but use the address redicted *to* by the
|
|
||||||
// DNS record as the address for joining, plus a trailing "."
|
|
||||||
//
|
|
||||||
// For example:
|
|
||||||
// server.example.com (_minecraft._tcp.server.example.com)
|
|
||||||
// (the typed address) I (the DNS SRV record which gets read)
|
|
||||||
// V
|
|
||||||
// 5 25565 server.example.com
|
|
||||||
// I (the response for the DNS SRV query)
|
|
||||||
// V
|
|
||||||
// server.example.com.
|
|
||||||
// (the address used in the protocol)
|
|
||||||
let server = api.query_server(addr.trim_end_matches(".")).await?;
|
|
||||||
|
|
||||||
let status = server.query_status().await?;
|
let status = server.query_status().await?;
|
||||||
tracing::debug!(msg = "server status", status = ?status);
|
tracing::debug!(msg = "server status", status = ?status);
|
||||||
|
|
@ -247,3 +235,34 @@ async fn handle_login<T: MinecraftServerHandle>(
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn terminate_at_null(str: &str) -> &str {
|
||||||
|
match str.split('\0').next() {
|
||||||
|
Some(x) => x,
|
||||||
|
None => str,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sanitize_addr(addr: &str) -> &str {
|
||||||
|
// Thanks to a buggy minecraft, when the client sends a join
|
||||||
|
// from a SRV DNS record, it will not use the address typed
|
||||||
|
// in the game, but use the address redicted *to* by the
|
||||||
|
// DNS record as the address for joining, plus a trailing "."
|
||||||
|
//
|
||||||
|
// For example:
|
||||||
|
// server.example.com (_minecraft._tcp.server.example.com)
|
||||||
|
// (the typed address) I (the DNS SRV record which gets read)
|
||||||
|
// V
|
||||||
|
// 5 25565 server.example.com
|
||||||
|
// I (the response for the DNS SRV query)
|
||||||
|
// V
|
||||||
|
// server.example.com.
|
||||||
|
// (the address used in the protocol)
|
||||||
|
let addr = addr.trim_end_matches(".");
|
||||||
|
|
||||||
|
// Modded minecraft clients send null terminated strings,
|
||||||
|
// after which they have extra data. This just removes them
|
||||||
|
// from the addr lookup
|
||||||
|
let addr = terminate_at_null(addr);
|
||||||
|
addr
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue