/
githubmirror
/
vaultwarden
Обзор
Документация
Войти
/
githubmirror
/
vaultwarden
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/ratelimit.rs
55 строк
2 KB
Daniel García
Trusted proxy support, unauthenticated rate limit & other fixes (#7472)
24 июл 2026, 19:27
Не верифицирован
24 июл 2026, 19:27
46ae59e
Код
Авторство
О чём код?
use std::{net::IpAddr, num::NonZeroU32, sync::LazyLock, time::Duration}; use governor::{Quota, RateLimiter, clock::DefaultClock, state::keyed::DashMapStateStore}; use crate::{CONFIG, Error}; type Limiter<T = IpAddr> = RateLimiter<T, DashMapStateStore<T>, DefaultClock>; static LIMITER_LOGIN: LazyLock<Limiter> = LazyLock::new(|| { let seconds = Duration::from_secs(CONFIG.login_ratelimit_seconds()); let burst = NonZeroU32::new(CONFIG.login_ratelimit_max_burst()).expect("Non-zero login ratelimit burst"); RateLimiter::keyed(Quota::with_period(seconds).expect("Non-zero login ratelimit seconds").allow_burst(burst)) }); static LIMITER_ADMIN: LazyLock<Limiter> = LazyLock::new(|| { let seconds = Duration::from_secs(CONFIG.admin_ratelimit_seconds()); let burst = NonZeroU32::new(CONFIG.admin_ratelimit_max_burst()).expect("Non-zero admin ratelimit burst"); RateLimiter::keyed(Quota::with_period(seconds).expect("Non-zero admin ratelimit seconds").allow_burst(burst)) }); static LIMITER_UNAUTHENTICATED: LazyLock<Limiter> = LazyLock::new(|| { let seconds = Duration::from_secs(CONFIG.unauthenticated_ratelimit_seconds()); let burst = NonZeroU32::new(CONFIG.unauthenticated_ratelimit_max_burst()) .expect("Non-zero unauthenticated ratelimit burst"); RateLimiter::keyed( Quota::with_period(seconds).expect("Non-zero unauthenticated ratelimit seconds").allow_burst(burst), ) }); pub fn check_limit_unauthenticated(ip: &IpAddr) -> Result<(), Error> { match LIMITER_UNAUTHENTICATED.check_key(ip) { Ok(()) => Ok(()), Err(_e) => { err_code!("Too many requests", 429); } } } pub fn check_limit_login(ip: &IpAddr) -> Result<(), Error> { match LIMITER_LOGIN.check_key(ip) { Ok(()) => Ok(()), Err(_e) => { err_code!("Too many login requests", 429); } } } pub fn check_limit_admin(ip: &IpAddr) -> Result<(), Error> { match LIMITER_ADMIN.check_key(ip) { Ok(()) => Ok(()), Err(_e) => { err_code!("Too many admin requests", 429); } } }