Commit Graph

13 Commits

Author SHA1 Message Date
e446eb1775 fix(p8-010): move rate-limit store to a shared distributed DB store
Replace the per-Vercel-instance in-memory Map rate-limit cache with an
atomic shared store backed by the existing Turso RateLimit table, so limits
hold across all instances/redeploys and cannot be bypassed by distributing
brute-force attempts across instances (audit finding p8-010, MEDIUM).

- checkRateLimit now performs a single atomic round-trip:
  INSERT ... ON CONFLICT(identifier) DO UPDATE ... RETURNING count, reset_at
  with window-reset semantics (CASE WHEN reset_at < now THEN 1 ELSE count+1).
- The DB is now the primary source of truth (no longer a fire-and-forget
  fallback). The per-instance Map is reduced to a short-TTL local cache used
  ONLY to fast-fail already-blocked identifiers (cuts DB load during brute-
  force storms); it can never let a request bypass the limit.
- ensureRateLimitSchema() creates the table + a UNIQUE identifier index so
  ON CONFLICT upserts are well-defined; added RateLimit to db/create.ts.
- resetLoginRateLimits / clearRateLimitStore invalidate the local cache.
- getClientIP now trusts proxy headers in non-development environments
  (production + test); local dev stays strict against header spoofing.
- bunfig.toml defines import.meta.env.SSR=true so the server-only env guard
  loads under 'bun test'.
- Tests: await clearRateLimitStore in beforeEach (fixes a race where an
  un-awaited clear let leftover rows corrupt the next upsert); unique test
  identifiers; realistic remote-shared-store perf bounds; new p8-010
  distributed-store tests (restart-survival, multi-instance aggregation,
  no bypass by alternating instances).
2026-07-22 18:10:28 -04:00
30b2d03c68 cleanup 2026-05-28 20:22:30 -04:00
d48bbc0fc3 security cleanup, fix turnstile 2026-05-28 16:48:06 -04:00
9fc0a73fea general: hot path cooldown 2026-01-11 14:24:28 -05:00
41b8a5416e fix: reverse check 2026-01-11 11:28:43 -05:00
1fb8f45705 fix: session validation fixes 2026-01-11 11:23:32 -05:00
041b2f8dc2 oof 2026-01-07 14:37:40 -05:00
7e89e6dda2 removed excess comments 2026-01-04 11:14:54 -05:00
0fb071a5d7 password validation meter 2026-01-01 14:51:23 -05:00
8e77727148 config centralized 2026-01-01 02:22:33 -05:00
6e31246060 lockout 2025-12-30 09:50:04 -05:00
f5abf77454 idk h3 at all 2025-12-28 21:56:34 -05:00
1ba20339a8 security hardening 2025-12-28 20:04:29 -05:00