veza/veza-backend-api/internal/config/rate_limit.go

60 lines
2.1 KiB
Go
Raw Normal View History

package config
import (
"os"
)
// getDefaultRateLimitLimit retourne la limite globale par défaut selon l'environnement (A04)
func getDefaultRateLimitLimit(env string) int {
if env == EnvDevelopment || env == EnvTest {
return 1000 // Très permissif pour dev/tests
}
return 200 // Staging/prod
}
// getDefaultRegisterAttempts retourne le nombre d'inscriptions autorisées par heure (A04)
func getDefaultRegisterAttempts(env string) int {
if env == EnvDevelopment || env == EnvTest {
return 20 // Assoupli pour dev/tests
}
return 3 // Staging/prod
}
// getAuthRateLimitLoginAttempts retourne le nombre de tentatives de login autorisées
// Augmente les limites pour l'environnement de test/E2E
func getAuthRateLimitLoginAttempts(env string) int {
// Vérifier si on est en mode test/E2E
if env == "test" || env == "e2e" ||
os.Getenv("GO_ENV") == "test" ||
os.Getenv("GO_ENV") == "e2e" ||
os.Getenv("E2E_TEST") == "true" {
// Limite élevée pour les tests (100 tentatives)
return getEnvInt("AUTH_RATE_LIMIT_LOGIN_ATTEMPTS", 100)
}
// Limite normale en production (5 tentatives)
return getEnvInt("AUTH_RATE_LIMIT_LOGIN_ATTEMPTS", 5)
}
// getAuthRateLimitLoginWindow retourne la fenêtre de temps pour les tentatives de login
func getAuthRateLimitLoginWindow(env string) int {
// En mode test, utiliser 1 minute (comme en production)
// La fenêtre reste la même, seule la limite de tentatives change
return getEnvInt("AUTH_RATE_LIMIT_LOGIN_WINDOW", 1)
}
2026-03-05 18:27:34 +00:00
// getDefaultRateLimitIPPerHour returns default hourly limit for non-auth (TASK-SEC-003)
func getDefaultRateLimitIPPerHour(env string) int {
if env == EnvDevelopment || env == EnvTest {
return getEnvInt("RATE_LIMIT_IP_PER_HOUR", 5000) // Very relaxed in dev
2026-03-05 18:27:34 +00:00
}
return getEnvInt("RATE_LIMIT_IP_PER_HOUR", 100) // 100 req/h in prod
}
// getDefaultRateLimitUserPerHour returns default hourly limit for auth (TASK-SEC-003)
func getDefaultRateLimitUserPerHour(env string) int {
if env == EnvDevelopment || env == EnvTest {
return getEnvInt("RATE_LIMIT_USER_PER_HOUR", 2000) // More relaxed in dev
}
return getEnvInt("RATE_LIMIT_USER_PER_HOUR", 1000) // 1000 req/h in prod
}