From d567dfe40bb9557f673f7adb49fc2a411d48a660 Mon Sep 17 00:00:00 2001 From: sanekb Date: Sat, 25 Apr 2026 14:36:43 +0300 Subject: [PATCH] fix: limit only new ip when TimeWindow mode enabled --- src/ip_tracker.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/ip_tracker.rs b/src/ip_tracker.rs index b4d934f..a5219fa 100644 --- a/src/ip_tracker.rs +++ b/src/ip_tracker.rs @@ -269,9 +269,11 @@ impl UserIpTracker { return Ok(()); } + let is_new_ip = !user_recent.contains_key(&ip); + if let Some(limit) = limit { let active_limit_reached = user_active.len() >= limit; - let recent_limit_reached = user_recent.len() >= limit; + let recent_limit_reached = user_recent.len() >= limit && is_new_ip; let deny = match mode { UserMaxUniqueIpsMode::ActiveWindow => active_limit_reached, UserMaxUniqueIpsMode::TimeWindow => recent_limit_reached, @@ -851,4 +853,19 @@ mod tests { .unwrap_or(false); assert!(!stale_exists); } + + #[tokio::test] + async fn test_time_window_allows_same_ip_reconnect() { + let tracker = UserIpTracker::new(); + tracker.set_user_limit("test_user", 1).await; + tracker + .set_limit_policy(UserMaxUniqueIpsMode::TimeWindow, 1) + .await; + + let ip1 = test_ipv4(10, 4, 0, 1); + + assert!(tracker.check_and_add("test_user", ip1).await.is_ok()); + tracker.remove_ip("test_user", ip1).await; + assert!(tracker.check_and_add("test_user", ip1).await.is_ok()); + } }