Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 23 additions & 12 deletions src/clientindicatorsrv/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ const MIN_PRESENCE_INTERVAL: Duration = Duration::from_millis(200);
const MIN_DEV_AUTH_INTERVAL: Duration = Duration::from_secs(1);
const MIN_VERSION_INTERVAL: Duration = Duration::from_secs(1);
const MAX_ENTRIES: usize = 5000;
const MAX_ENTRIES_PER_IP: usize = 4;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Почему вы выбрали именно значение 4 в качестве максимального? В DDNet существуют не только стандартные серверы DDRace, где это ограничение равно четырём.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it is just a default setting that can be changed based on specific server needs, it was set to 4 because i don't expect people to launch more than 2 client instances. back to 16 if you're so critic about it

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

back to 16 if you're so critic about it

Моя главная мысль была в том, чтобы это не сломало логику для нестандартных или кастомных серверов.

Так как это отдельный сервис на Rust, мы, очевидно, не можем просто взять и использовать C++ константу MAX_CLIENTS_PER_IP из server.cpp. Но если предполагается, что владельцы серверов могут менять этот лимит под свои нужды, то, возможно, это вообще не должно быть жестко зашитой const на этапе компиляции?

Может, имеет смысл вынести это в аргументы командной строки (например, --max-entries-per-ip)? Тогда администраторы смогут настраивать лимит без необходимости перекомпилировать исходный код.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

back to 16 if you're so critic about it

Моя главная мысль была в том, чтобы это не сломало логику для нестандартных или кастомных серверов.

Так как это отдельный сервис на Rust, мы, очевидно, не можем просто взять и использовать C++ константу MAX_CLIENTS_PER_IP из server.cpp. Но если предполагается, что владельцы серверов могут менять этот лимит под свои нужды, то, возможно, это вообще не должно быть жестко зашитой const на этапе компиляции?

Может, имеет смысл вынести это в аргументы командной строки (например, --max-entries-per-ip)? Тогда администраторы смогут настраивать лимит без необходимости перекомпилировать исходный код.

you're confusing this rust server with the game server itself. ddnet limits are irrelevant because this is a private indicator backend for bestclient, not a public game server. adding cli arguments for a single constant is just unnecessary customization bloat for IRC service. if the developer wants to change a limit, they change one line of code and rebuild in a second. stop giving stupid ai advice without looking at the problem. and use english please, it's the repository standard.

const MAX_NONCES: usize = 20000;
const MAX_BROADCAST_PEERS: usize = 128;
const DEFAULT_TLS_HANDSHAKE_TIMEOUT: Duration = Duration::from_secs(5);
Expand Down Expand Up @@ -232,20 +233,32 @@ impl ServerState {

match packet.packet_type {
PACKET_JOIN | PACKET_HEARTBEAT => self.handle_join_or_heartbeat(packet, from, now),
PACKET_LEAVE => self.handle_leave(key),
PACKET_LEAVE => self.handle_leave(key, from),
_ => (false, Vec::new()),
}
}

fn handle_join_or_heartbeat(&mut self, packet: PresencePacket, from: SocketAddr, now: Instant) -> (bool, Vec<OutPacket>) {
if self.entries.len() >= MAX_ENTRIES && !self.entries.contains_key(&IdentityKey { instance_id: packet.instance_id, client_id: packet.client_id }) {
return (false, Vec::new());
}
let identity = IdentityKey {
instance_id: packet.instance_id,
client_id: packet.client_id,
};
let old = self.entries.get(&identity).cloned();

if let Some(ref old_entry) = old {
if old_entry.remote_addr != from {
return (false, Vec::new());
}
} else {
if self.entries.len() >= MAX_ENTRIES {
return (false, Vec::new());
}
let ip_count = self.entries.values().filter(|e| e.remote_addr.ip() == from.ip()).count();
if ip_count >= MAX_ENTRIES_PER_IP {
return (false, Vec::new());
}
}

let treat_as_join = packet.packet_type == PACKET_JOIN || old.is_none();
let old_server = old.as_ref().map(|entry| entry.server_address.clone());
let old_name = old.as_ref().map(|entry| entry.player_name.clone());
Expand Down Expand Up @@ -302,7 +315,12 @@ impl ServerState {
(treat_as_join || server_changed || name_changed, out)
}

fn handle_leave(&mut self, key: IdentityKey) -> (bool, Vec<OutPacket>) {
fn handle_leave(&mut self, key: IdentityKey, from: SocketAddr) -> (bool, Vec<OutPacket>) {
if let Some(entry) = self.entries.get(&key) {
if entry.remote_addr != from {
return (false, Vec::new());
}
}
let Some(entry) = self.entries.remove(&key) else {
return (false, Vec::new());
};
Expand Down Expand Up @@ -882,15 +900,8 @@ async fn web_loop(
}
});

let shared_token = config.shared_token.clone();
let token = warp::path("token.json")
.and(warp::path::end())
.and(warp::get())
.map(move || warp::reply::json(&serde_json::json!({ "token": shared_token })));

let routes = healthz
.or(users)
.or(token)
.with(warp::reply::with::header("cache-control", "no-store"))
.with(warp::reply::with::header("connection", "close"));
let tls_acceptor = load_tls_acceptor(&config)?;
Expand Down
Loading