a8b2cddcf537009f1dcad39a015de1b268723806
Two real findings from the security reviewer: 1. urllib auto-follows 3xx redirects via the default HTTPRedirectHandler. The previous code's hop loop never ran — urllib silently followed. Replaced with http.client + a manual hop loop. Every hop re-runs _validate_url, so an open-redirect to 127.0.0.1 / RFC1918 / metadata gets caught on the second hop. 2. DNS TOCTOU — _resolve() validated but urllib.request re-resolved on connect. Now the connection is pinned to the validated IP via a PinnedHTTPConn / PinnedHTTPSConn subclass that overrides connect() to bind socket.create_connection to (addr, port). For HTTPS, TLS server_hostname is set to the original host so SNI + cert verification still work against the named host while the TCP destination is the pinned IP. Tests added: redirect-to-loopback short-circuits at validation; too-many-redirects exhausts max_hops; 2xx returns body; non-2xx raises. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Void 2.0
Homelab orchestrator + canonical knowledge store. Cradle-themed.
Successor to Void 1.x (CT 301). Spec at
/project/docs/superpowers/specs/2026-05-31-void-v2-design.md.
Layout
void-server(this repo) — Node API, MCP, UI, cron, agent runtimevoid-workers— Python ingest workers (separate repo, later plan)
Quick start (dev)
- Provision
void2-dbLXC (seedeploy/README.md) - Install Postgres + pgvector on
void2-db npm installcp .env.example .envand editnpm run migratenpm startcurl -H "Authorization: Bearer $OWNER_TOKEN" http://localhost:3000/health
Description
Languages
JavaScript
87.5%
CSS
6.4%
Python
5.2%
Shell
0.7%
HTML
0.2%