mirror of
https://github.com/telemt/telemt.git
synced 2026-04-26 15:04:09 +03:00
fix: limit only new ip when TimeWindow mode enabled
This commit is contained in:
@@ -269,9 +269,11 @@ impl UserIpTracker {
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let is_new_ip = !user_recent.contains_key(&ip);
|
||||||
|
|
||||||
if let Some(limit) = limit {
|
if let Some(limit) = limit {
|
||||||
let active_limit_reached = user_active.len() >= 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 {
|
let deny = match mode {
|
||||||
UserMaxUniqueIpsMode::ActiveWindow => active_limit_reached,
|
UserMaxUniqueIpsMode::ActiveWindow => active_limit_reached,
|
||||||
UserMaxUniqueIpsMode::TimeWindow => recent_limit_reached,
|
UserMaxUniqueIpsMode::TimeWindow => recent_limit_reached,
|
||||||
@@ -851,4 +853,19 @@ mod tests {
|
|||||||
.unwrap_or(false);
|
.unwrap_or(false);
|
||||||
assert!(!stale_exists);
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user