Skip to content

Commit 3ae7ba8

Browse files
committed
master: reuse server challenges
1 parent 25750d2 commit 3ae7ba8

File tree

2 files changed

+53
-18
lines changed

2 files changed

+53
-18
lines changed

master/src/master_server.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -314,21 +314,14 @@ impl<Addr: AddrExt> MasterServer<Addr> {
314314

315315
match p {
316316
server::Packet::Challenge(p) => {
317-
let master_challenge = self.add_challenge(from);
318-
let resp = master::ChallengeResponse::new(master_challenge, p.server_challenge);
317+
let challenge = self.server_challenge_add(from);
318+
let resp = master::ChallengeResponse::new(challenge, p.server_challenge);
319319
trace!("{from}: send {resp:?}");
320320
let mut buf = [0; 32];
321321
let packet = resp.encode(&mut buf)?;
322322
self.sock.send_to(packet, from)?;
323323
}
324324
server::Packet::ServerAdd(p) => {
325-
let challenge = match self.challenges.get(&from) {
326-
Some(e) => e.value,
327-
None => {
328-
trace!("{from}: challenge does not exists");
329-
return Ok(());
330-
}
331-
};
332325
if p.version < self.cfg.server.min_version {
333326
let min = self.cfg.server.min_version;
334327
warn!(
@@ -337,6 +330,10 @@ impl<Addr: AddrExt> MasterServer<Addr> {
337330
);
338331
return Ok(());
339332
}
333+
let Some(challenge) = self.server_challenge_get(&from) else {
334+
trace!("{from}: challenge does not exist");
335+
return Ok(());
336+
};
340337
if p.challenge != challenge {
341338
warn!(
342339
"{from}: expected challenge {challenge} but received {}",
@@ -606,10 +603,15 @@ impl<Addr: AddrExt> MasterServer<Addr> {
606603
Err(Error::UndefinedPacket)
607604
}
608605

609-
fn add_challenge(&mut self, addr: Addr) -> u32 {
610-
let x = self.rng.u32(..);
611-
self.challenges.insert(addr, x);
612-
x
606+
fn server_challenge_add(&mut self, addr: Addr) -> u32 {
607+
self.challenges
608+
.entry(addr)
609+
.or_insert_with(|| Timed::new(self.rng.u32(..)))
610+
.value
611+
}
612+
613+
fn server_challenge_get(&self, addr: &Addr) -> Option<u32> {
614+
self.challenges.get(addr).map(|i| i.value)
613615
}
614616

615617
fn admin_challenge_add(&mut self, addr: Addr) -> (u32, u32) {

master/tests/master.rs

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,21 @@ struct Test {
3333
}
3434

3535
impl Test {
36-
fn new(cfg: &Config) -> Test {
37-
let mut test = Test {
36+
fn new() -> Test {
37+
Test {
3838
master_addr: UNSPECIFIED.into(),
3939
server_addr: UNSPECIFIED.into(),
40-
};
40+
}
41+
}
42+
43+
fn with_master(cfg: &Config) -> Test {
44+
let mut test = Self::new();
4145
test.create_master(cfg);
46+
test
47+
}
48+
49+
fn with_master_and_server(cfg: &Config) -> Test {
50+
let mut test = Self::with_master(cfg);
4251
test.add_server(cfg);
4352
test
4453
}
@@ -87,7 +96,7 @@ fn server_add() {
8796
log::set_max_level(log::LevelFilter::Trace);
8897

8998
let cfg = Config::default();
90-
let test = Test::new(&cfg);
99+
let test = Test::with_master_and_server(&cfg);
91100
let mut buf = [0; 1024];
92101
let sock = UdpSocket::bind(UNSPECIFIED).unwrap();
93102
let game_key = Some(0xbeefdead);
@@ -115,6 +124,30 @@ fn server_add() {
115124
assert_eq!(servers[0].port(), test.server_addr.port());
116125
}
117126

127+
#[test]
128+
fn server_reuse_challenge() {
129+
log::set_logger(&LOGGER).ok();
130+
log::set_max_level(log::LevelFilter::Trace);
131+
132+
let test = Test::with_master(&Config::default());
133+
let sock = UdpSocket::bind(UNSPECIFIED).unwrap();
134+
let mut challenges = [0; 3];
135+
for (i, j) in challenges.iter_mut().enumerate() {
136+
let challenge = Some(i as u32);
137+
let packet = server::Challenge::new(challenge);
138+
let mut buf = [0; 512];
139+
let p = packet.encode(&mut buf).unwrap();
140+
sock.send_to(p, test.master_addr).unwrap();
141+
142+
let (len, _) = sock.recv_from(&mut buf).unwrap();
143+
let resp = master::ChallengeResponse::decode(&buf[..len]).unwrap();
144+
assert_eq!(resp.server_challenge, challenge);
145+
*j = resp.master_challenge;
146+
}
147+
148+
assert!(challenges.iter().all(|i| *i == challenges[0]));
149+
}
150+
118151
#[test]
119152
fn client_rate_limit() {
120153
log::set_logger(&LOGGER).ok();
@@ -124,7 +157,7 @@ fn client_rate_limit() {
124157
cfg.master.server.client_rate_limit = 10;
125158
info!("client rate limit {}", cfg.master.server.client_rate_limit);
126159

127-
let test = Test::new(&cfg);
160+
let test = Test::with_master_and_server(&cfg);
128161
let sock = UdpSocket::bind(UNSPECIFIED).unwrap();
129162
sock.set_read_timeout(Some(Duration::from_millis(100)))
130163
.unwrap();

0 commit comments

Comments
 (0)