root a8b2cddcf5 fix(workers): safe_fetch pins IP + manual redirect re-validation
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>
2026-06-01 10:28:55 +10:00
2026-05-31 01:22:10 +10:00
2026-05-31 01:22:10 +10:00
2026-05-31 01:22:10 +10:00

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 runtime
  • void-workers — Python ingest workers (separate repo, later plan)

Quick start (dev)

  1. Provision void2-db LXC (see deploy/README.md)
  2. Install Postgres + pgvector on void2-db
  3. npm install
  4. cp .env.example .env and edit
  5. npm run migrate
  6. npm start
  7. curl -H "Authorization: Bearer $OWNER_TOKEN" http://localhost:3000/health
Description
No description provided
Readme 2.6 MiB
Languages
JavaScript 87.5%
CSS 6.4%
Python 5.2%
Shell 0.7%
HTML 0.2%