core: fire on_user_quit for unregistered users too — pre-registration module state (captcha Challenged/Verified) leaked one Uid per held-then-dropped bot

This commit is contained in:
Jean Chevronnet 2026-08-17 21:37:18 +00:00
parent f2e23fffa9
commit 0da0906dc9

View file

@ -623,13 +623,14 @@ impl Ircd {
if !self.server.users.contains_key(&uid) { if !self.server.users.contains_key(&uid) {
return; return;
} }
let registered = self.server.users[&uid].registered; // Fire the quit hook while the user still exists — for EVERY user, registered
if registered { // or not. A client that disconnects mid-registration (e.g. a captcha bot held
// fire the quit hook while the user still exists // before registration) still has per-uid module state to reclaim, and Uids are
// never reused, so skipping this leaks one entry per such disconnect (which
// scales with exactly the hostile traffic the captcha/challenge modules target).
for m in &mut self.modules { for m in &mut self.modules {
m.on_user_quit(&mut self.server, uid, reason); m.on_user_quit(&mut self.server, uid, reason);
} }
}
self.server.remove_user(uid, reason); self.server.remove_user(uid, reason);
} }