Skip to main content

🟑 Release v2.475.14

⭐⭐ Moderate Complexity β€’ 3 commits β€’ 24 files
This release hardens security around email sign-in with rate limiting and improves reliability by persisting rate-limit state to MongoDB. Sign-in email callbacks are now protected against brute force attacks with a 5-attempt limit and 15-minute lockout, and this protection survives server restarts.

What’s New

  • Rate-Limited Email Sign-Ins: Email sign-in attempts are now rate-limited to 5 per 15 minutes, preventing brute force attacks on both user and admin platforms
  • Persistent Rate Limiting: OTP failure counters now persist in MongoDB instead of in-memory storage, surviving server restarts and deployments
  • Clear User Feedback: Users see a helpful error message with a 15-minute recovery window when rate-limited

Apps Updated

User App

βœ“ Updated - Rate limiting on email sign-in callbacks

API

β€” No changes

Admin

βœ“ Updated - Rate limiting on email sign-in callbacks

MCP Server

β€” No changes

Website

β€” No changes

Games

β€” No changes

Detailed Changes

  • Rate limit email sign-in callbacks to 5 attempts per 15 minutes
  • Return HTTP 429 with user-friendly error message when rate limit exceeded
  • Clear rate limit on successful sign-in
  • Comprehensive test coverage for rate limiting and callback validation
  • Rate limit email sign-in callbacks to 5 attempts per 15 minutes
  • Return HTTP 429 with user-friendly error message when rate limit exceeded
  • Clear rate limit on successful sign-in
  • Comprehensive test coverage for rate limiting and callback validation
  • Add new OTP_FAILED_ATTEMPTS collection for persisting OTP failure counters
  • Create unique index on (location, organisationId, appSurface, normalizedEmail) for atomic rate limit tracking
  • Add TTL index with automatic cleanup of expired rate limit records
  • Move OTP failure counter from in-memory Map to MongoDB for cross-restart persistence

Technical Details

Rate Limiting Strategy

The email sign-in rate limiting uses atomic MongoDB operations to prevent race conditions:
  • Shared bucket per email: Each unique (location, organisationId, appSurface, normalizedEmail) combination gets its own counter
  • Atomic increment: Counter is updated atomically within MongoDB, supporting concurrent requests
  • Automatic reset: Counter resets after 15 minutes of inactivity
  • Fail-open behavior: If MongoDB is unavailable, the limiter permits the attempt to preserve sign-in availability

Data Persistence

OTP failure counters now survive server restarts:
  • Previously: In-memory Map (lost on restart)
  • Now: MongoDB documents with TTL-based cleanup
  • Ensures consistent rate limiting across deployments and outages

Contributors

hienhang@hotmail.co.uk@hienhang2 commits β€’ +1401/-195 lines
nudj-changelog-bot@nudj-changelog-bot1 commit β€’ Generated changelog

Release Stats


v2.475.14 deployed on August 11, 2026