187 lines
27 KiB
Plaintext
187 lines
27 KiB
Plaintext
# Rate Limiting Audit - 20251123-104211
|
|
== Rate Limiter Implementation ==
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:24:// Rate limiting configuration
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:26: rateLimitWindow = 1 * time.Minute
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:31:type rateLimiter struct {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:41:var writeLimiter = &rateLimiter{requests: make(map[string]*requestInfo)}
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:42:var readLimiter = &rateLimiter{requests: make(map[string]*requestInfo)}
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:44:func (rl *rateLimiter) checkRateLimit(key string, maxRequests int, window time.Duration) bool {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:189: // Configure connection pool limits
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:490: limitStr := r.URL.Query().Get("limit")
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:493: limit := 20
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:495: if l, err := strconv.Atoi(limitStr); err == nil && l > 0 && l <= 100 {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:496: limit = l
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:531: args = append(args, limit, offset)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:1236: // Wrap all routes with rate limiting
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:1237: rateLimitedHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:1241: if readLimiter.checkRateLimit(clientIP, maxReadRequests, rateLimitWindow) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:1242: log.Printf("SECURITY: Read rate limit exceeded for IP %s on %s", clientIP, r.URL.Path)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:1247: if writeLimiter.checkRateLimit(clientIP, maxWriteRequests, rateLimitWindow) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:1248: log.Printf("SECURITY: Write rate limit exceeded for IP %s on %s", clientIP, r.URL.Path)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/forum-service/main.go:1259: Handler: rateLimitedHandler,
|
|
/home/administrator/projects/coppertone.tech/backend/functions/payment-service/main.go:50: TaxRate float64 `json:"taxRate"`
|
|
/home/administrator/projects/coppertone.tech/backend/functions/work-management-service/main.go:24:// Rate limiting configuration
|
|
/home/administrator/projects/coppertone.tech/backend/functions/work-management-service/main.go:26: rateLimitWindow = 1 * time.Minute
|
|
/home/administrator/projects/coppertone.tech/backend/functions/work-management-service/main.go:31:type rateLimiter struct {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/work-management-service/main.go:41:var writeLimiter = &rateLimiter{requests: make(map[string]*requestInfo)}
|
|
/home/administrator/projects/coppertone.tech/backend/functions/work-management-service/main.go:42:var readLimiter = &rateLimiter{requests: make(map[string]*requestInfo)}
|
|
/home/administrator/projects/coppertone.tech/backend/functions/work-management-service/main.go:44:func (rl *rateLimiter) checkRateLimit(key string, maxRequests int, window time.Duration) bool {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/work-management-service/main.go:279: // Configure connection pool limits
|
|
/home/administrator/projects/coppertone.tech/backend/functions/work-management-service/main.go:301: // Rate limiting
|
|
/home/administrator/projects/coppertone.tech/backend/functions/work-management-service/main.go:304: if readLimiter.checkRateLimit(clientIP, maxReadRequests, rateLimitWindow) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/work-management-service/main.go:305: log.Printf("SECURITY: Read rate limit exceeded for IP %s on %s", clientIP, r.URL.Path)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/work-management-service/main.go:310: if writeLimiter.checkRateLimit(clientIP, maxWriteRequests, rateLimitWindow) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/work-management-service/main.go:311: log.Printf("SECURITY: Write rate limit exceeded for IP %s on %s", clientIP, r.URL.Path)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main_test.go:49:func TestGenerateJWT(t *testing.T) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main_test.go:59: token, err := generateJWT(user, roles)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:29:// Rate limiting configuration
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:31: rateLimitWindow = 15 * time.Minute // Window for counting attempts
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:44:// rateLimiter tracks login attempts per IP/email
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:45:type rateLimiter struct {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:57:var loginLimiter = &rateLimiter{attempts: make(map[string]*attemptInfo)}
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:58:var registerLimiter = &rateLimiter{attempts: make(map[string]*attemptInfo)}
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:60:// checkRateLimit returns true if the request should be blocked
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:61:func (rl *rateLimiter) checkRateLimit(key string, maxAttempts int, window time.Duration) bool {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:105:func (rl *rateLimiter) recordFailedAttempt(key string) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:118: if now.Sub(info.firstTry) > rateLimitWindow {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:133:func (rl *rateLimiter) clearAttempts(key string) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:168: maxEmailLength = 254 // RFC 5321 limit
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:170: maxPasswordLength = 72 // bcrypt limit
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:489: // Configure connection pool limits
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:557: // Rate limit registrations by IP
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:559: if registerLimiter.checkRateLimit(clientIP, maxRegisterPerHour, time.Hour) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:560: log.Printf("SECURITY: Registration rate limit exceeded for IP %s", clientIP)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:619: passwordHash, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:687: // Rate limit registrations by IP
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:689: if registerLimiter.checkRateLimit(clientIP, maxRegisterPerHour, time.Hour) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:690: log.Printf("SECURITY: Blockchain registration rate limit exceeded for IP %s", clientIP)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:820: // Rate limit by IP and email combination
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:821: rateLimitKey := clientIP + ":" + strings.ToLower(req.Email)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:822: if loginLimiter.checkRateLimit(rateLimitKey, maxLoginAttempts, rateLimitWindow) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:823: log.Printf("SECURITY: Rate limit exceeded for %s", rateLimitKey)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:838: loginLimiter.recordFailedAttempt(rateLimitKey)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:849: loginLimiter.recordFailedAttempt(rateLimitKey)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:855: // Clear rate limit on successful login
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:856: loginLimiter.clearAttempts(rateLimitKey)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:859: // Generate token pair (access + refresh)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:860: tokenResponse, err := generateTokenPair(userID, clientIP)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:863: http.Error(w, "Failed to generate tokens", http.StatusInternalServerError)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:885: // Rate limit by IP and address combination
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:886: rateLimitKey := clientIP + ":" + strings.ToLower(req.Address)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:887: if loginLimiter.checkRateLimit(rateLimitKey, maxLoginAttempts, rateLimitWindow) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:888: log.Printf("SECURITY: Rate limit exceeded for blockchain login %s", rateLimitKey)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:895: loginLimiter.recordFailedAttempt(rateLimitKey)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:910: loginLimiter.recordFailedAttempt(rateLimitKey)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:919: // Clear rate limit on successful login
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:920: loginLimiter.clearAttempts(rateLimitKey)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:923: // Generate token pair (access + refresh)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:924: tokenResponse, err := generateTokenPair(userID, clientIP)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:927: http.Error(w, "Failed to generate tokens", http.StatusInternalServerError)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:970: // Generate new token pair
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:971: tokenResponse, err := generateTokenPair(userID, clientIP)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1088: passwordHash, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1370:// generateAccessToken creates a short-lived JWT access token
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1371:func generateAccessToken(userID int) (string, error) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1407:// generateRefreshToken creates a secure random refresh token and stores it in the database
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1408:func generateRefreshToken(userID int, clientIP string) (string, error) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1409: // Generate cryptographically secure random token
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1412: return "", fmt.Errorf("failed to generate random token: %w", err)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1417: tokenHash, err := bcrypt.GenerateFromPassword([]byte(token), bcrypt.DefaultCost)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1494:// generateTokenPair creates both access and refresh tokens
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1495:func generateTokenPair(userID int, clientIP string) (*AuthTokenResponse, error) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1496: accessToken, err := generateAccessToken(userID)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1498: return nil, fmt.Errorf("failed to generate access token: %w", err)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1501: refreshToken, err := generateRefreshToken(userID, clientIP)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1503: return nil, fmt.Errorf("failed to generate refresh token: %w", err)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1515:func generateToken(userID int) (string, error) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1516: return generateAccessToken(userID)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1577:func generateJWT(user User, roles []string) (string, error) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:1592: hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/ipfs-service/main.go:97: // Generate a new identity for this node
|
|
/home/administrator/projects/coppertone.tech/backend/functions/ipfs-service/main.go:98: priv, _, err := crypto.GenerateKeyPairWithReader(crypto.Ed25519, -1, rand.Reader)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/ipfs-service/main.go:100: return fmt.Errorf("failed to generate key pair: %w", err)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:23:// Rate limiting configuration
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:25: rateLimitWindow = 1 * time.Minute
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:30:// rateLimiter tracks requests per IP
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:31:type rateLimiter struct {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:41:var writeLimiter = &rateLimiter{requests: make(map[string]*requestInfo)}
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:42:var readLimiter = &rateLimiter{requests: make(map[string]*requestInfo)}
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:44:func (rl *rateLimiter) checkRateLimit(key string, maxRequests int, window time.Duration) bool {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:100: BlogTypeUser = "USER" // Community blogs (user authored, separate section)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:209: // Configure connection pool limits
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:278: // Migrate old published boolean to new status
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:321:// rateLimitMiddleware applies rate limiting based on request method
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:322:func rateLimitMiddleware(next http.HandlerFunc) http.HandlerFunc {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:326: // Apply different limits for read vs write operations
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:328: if readLimiter.checkRateLimit(clientIP, maxReadRequests, rateLimitWindow) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:329: log.Printf("SECURITY: Read rate limit exceeded for IP %s", clientIP)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:334: if writeLimiter.checkRateLimit(clientIP, maxWriteRequests, rateLimitWindow) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:335: log.Printf("SECURITY: Write rate limit exceeded for IP %s", clientIP)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:644: // Admin panel only shows SITE blogs - user community blogs have separate endpoints
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:1067:// These endpoints are completely separate from SITE blogs (admin/staff content)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:1728: // ============ COMMUNITY BLOG ROUTES (Separate from Site Blogs) ============
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:1852: // Wrap all routes with rate limiting
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:1853: rateLimitedHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:1856: // Apply different limits for read vs write operations
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:1858: if readLimiter.checkRateLimit(clientIP, maxReadRequests, rateLimitWindow) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:1859: log.Printf("SECURITY: Read rate limit exceeded for IP %s on %s", clientIP, r.URL.Path)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:1864: if writeLimiter.checkRateLimit(clientIP, maxWriteRequests, rateLimitWindow) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:1865: log.Printf("SECURITY: Write rate limit exceeded for IP %s on %s", clientIP, r.URL.Path)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/blog-service/main.go:1876: Handler: rateLimitedHandler,
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:23:// Rate limiting configuration
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:25: rateLimitWindow = 1 * time.Minute
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:30:type rateLimiter struct {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:40:var submitLimiter = &rateLimiter{requests: make(map[string]*requestInfo)}
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:41:var readLimiter = &rateLimiter{requests: make(map[string]*requestInfo)}
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:43:func (rl *rateLimiter) checkRateLimit(key string, maxRequests int, window time.Duration) bool {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:133: mux.HandleFunc("/submit", corsMiddleware(rateLimitSubmit(submitHandler)))
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:140: // Wrap with rate limiting for all requests
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:141: rateLimitedMux := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:144: // Read requests (GET) have higher limits
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:146: if readLimiter.checkRateLimit(clientIP, maxReadRequests, rateLimitWindow) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:147: log.Printf("SECURITY: Read rate limit exceeded for IP %s on %s", clientIP, r.URL.Path)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:158: Handler: rateLimitedMux,
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:193:// rateLimitSubmit applies strict rate limiting for contact form submissions
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:194:func rateLimitSubmit(next http.HandlerFunc) http.HandlerFunc {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:198: if submitLimiter.checkRateLimit(clientIP, maxSubmitRequests, rateLimitWindow) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:199: log.Printf("SECURITY: Contact form rate limit exceeded for IP %s", clientIP)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/contact-service/main.go:242: // Configure connection pool limits
|
|
|
|
== Login Attempt Limiting ==
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:31: rateLimitWindow = 15 * time.Minute // Window for counting attempts
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:32: maxLoginAttempts = 5 // Max failed login attempts per window
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:34: lockoutDuration = 30 * time.Minute // How long to lock out after max attempts
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:44:// rateLimiter tracks login attempts per IP/email
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:47: attempts map[string]*attemptInfo
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:50:type attemptInfo struct {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:57:var loginLimiter = &rateLimiter{attempts: make(map[string]*attemptInfo)}
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:58:var registerLimiter = &rateLimiter{attempts: make(map[string]*attemptInfo)}
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:61:func (rl *rateLimiter) checkRateLimit(key string, maxAttempts int, window time.Duration) bool {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:66: info, exists := rl.attempts[key]
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:69: rl.attempts[key] = &attemptInfo{count: 1, firstTry: now}
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:95: if info.count > maxAttempts {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:104:// recordFailedAttempt records a failed attempt (for login failures)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:105:func (rl *rateLimiter) recordFailedAttempt(key string) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:110: info, exists := rl.attempts[key]
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:113: rl.attempts[key] = &attemptInfo{count: 1, firstTry: now}
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:125: if info.count >= maxLoginAttempts {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:128: log.Printf("SECURITY: IP/email %s locked out after %d failed attempts", key, info.count)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:132:// clearAttempts clears attempts for a key (called on successful login)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:133:func (rl *rateLimiter) clearAttempts(key string) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:136: delete(rl.attempts, key)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:561: http.Error(w, "Too many registration attempts. Please try again later.", http.StatusTooManyRequests)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:691: http.Error(w, "Too many registration attempts. Please try again later.", http.StatusTooManyRequests)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:822: if loginLimiter.checkRateLimit(rateLimitKey, maxLoginAttempts, rateLimitWindow) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:824: http.Error(w, "Too many login attempts. Please try again later.", http.StatusTooManyRequests)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:838: loginLimiter.recordFailedAttempt(rateLimitKey)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:839: log.Printf("SECURITY: Failed login attempt for email %s from IP %s (user not found)", req.Email, clientIP)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:849: loginLimiter.recordFailedAttempt(rateLimitKey)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:850: log.Printf("SECURITY: Failed login attempt for email %s from IP %s (wrong password)", req.Email, clientIP)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:856: loginLimiter.clearAttempts(rateLimitKey)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:887: if loginLimiter.checkRateLimit(rateLimitKey, maxLoginAttempts, rateLimitWindow) {
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:889: http.Error(w, "Too many login attempts. Please try again later.", http.StatusTooManyRequests)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:895: loginLimiter.recordFailedAttempt(rateLimitKey)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:910: loginLimiter.recordFailedAttempt(rateLimitKey)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:920: loginLimiter.clearAttempts(rateLimitKey)
|
|
/home/administrator/projects/coppertone.tech/backend/functions/auth-service/main.go:960: log.Printf("SECURITY: Invalid refresh token attempt from IP %s: %v", clientIP, err)
|