Skip to content

fix(domains,routes): address footgun review findings (async/correctness/perf/security) - #188

Merged
CallMeTechie merged 1 commit into
masterfrom
worktree-fix+footgun-domain-routes
Jun 25, 2026
Merged

CallMeTechie merged 1 commit into
masterfrom
worktree-fix+footgun-domain-routes

Conversation

@CallMeTechie

Copy link
Copy Markdown
Owner

footgun-Review-Fixes — Domain/Routes-Subsystem

Behebt alle 13 Funde der footgun-Analyse des Domain/Routes-Subsystems (2 major, 6 minor, 5 nit). Keine Merge-Blocker, aber risikoarme Verbesserungen + 2 echte Korrekturen.

routes.js

  • (major, async) monitor.checkRouteById() in Create+Update war fire-and-forget → eine async-Rejection wurde zur unhandled rejection. Jetzt .catch(() => {}).
  • (minor, correctness) /:id/trace: ?limit hatte keine Untergrenze → negativer Wert führte bei entries.splice(limit) zum Löschen vom Ende. Jetzt Math.max(…, 1).
  • (minor, perf) Trace-Log-Tail wird asynchron gelesen (fs.promises) statt synchron bis 8 MB → blockiert den Event-Loop nicht mehr.
  • (nit, security) Zentrale isPrivateOrReservedIpv4()-Helper inkl. 100.64.0.0/10 (CGNAT), einheitlich in POST+PUT.
  • (minor maint + nit async/maint) /check-dns nutzt jetzt domains.getServerPublicIp() als einzige Server-IP-Quelle; die divergente getServerIp()/ipify-Cache- + isPublicIp()-Logik (mit Race + irreführendem Namen) wurde entfernt.

domains.js

  • (minor, correctness) IP-Vergleich in verify() kanonisiert beide Seiten (ipaddr.js) → ein nicht-kanonischer IPv6-Server-IP-Override verifiziert jetzt korrekt.
  • (nit, perf) upsert() nutzt RETURNING * statt eines zweiten SELECT.

domainBoot.js

  • (minor, async + perf) verifyAndReflag führt die unabhängigen Verifikationen parallel aus und bereitet seine UPDATE-Statements einmal vor (statt pro Zeile).
  • (perf) Seed-Schleife bereitet ihr INSERT einmal vor.

Sonstiges

  • ipaddr.js als direkte Dependency deklariert (gepinnt 1.9.1, bereits via proxy-addr dedupliziert).
  • Neue Regressionstests: IPv6-non-kanonisch-verify; CGNAT-SSRF-Ablehnung + 100.128/9-Grenze-erlaubt.

Tests (lokal grün, CI ist das Gate)

Domain-Suites 23/23 · Routes-API 46/46 · api/sync/grouping 71/71 · neue/aktualisierte 13/13.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Nfanfu8v8xvSMCbuAmd8Sq

…ss/perf/security)

Domain/routes subsystem review follow-ups:
- routes.js: await-safe monitor.checkRouteById() in create+update (no unhandled
  rejection); clamp ?limit lower bound on /:id/trace (negative splice bug);
  async (non-blocking) tail read of the trace log; central
  isPrivateOrReservedIpv4() SSRF guard incl. 100.64/10 CGNAT (POST+PUT);
  /check-dns now uses domains.getServerPublicIp() as the single server-IP
  source (drops the divergent ipify/getServerIp cache + isPublicIp helper).
- domains.js: canonicalize IPs (ipaddr.js) before compare so a non-canonical
  IPv6 server-IP override still verifies; upsert() uses RETURNING * (no second
  SELECT).
- domainBoot.js: verifyAndReflag runs verifications concurrently and prepares
  its UPDATE statements once; seed loop prepares its INSERT once.
- ipaddr.js promoted to a direct dependency (pinned 1.9.1, already deduped via
  proxy-addr).
- Tests: IPv6 non-canonical verify; CGNAT SSRF reject + 100.128/9 allow boundary.
@CallMeTechie
CallMeTechie merged commit a75abd8 into master Jun 25, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant