Skip to content

v3.17.0

Choose a tag to compare

@syswave-dev syswave-dev released this 02 Nov 14:08
· 9 commits to main since this release

Added

  • /api/status flags a Playwright sidecar that predates the SSRF fix. The fix for GHSA-26wr-prg5-vr77 (v3.15.2) lives in the sidecar, and an older pullmd-playwright image silently ignores the allowedHosts field pullmd sends, so a new pullmd next to an old sidecar stayed vulnerable with nothing to show for it. The sidecar's /health now reports "policy": {"ssrf": 1}, and /api/status reports a Playwright sidecar without it (or with an older revision) as {"status": "degraded", "error": "policy-missing"} and answers 503, so the documented plain-HTTP Uptime Kuma monitor catches it. Renders are not blocked; the check only reports. Behaviour change on upgrade: an instance that updates pullmd but keeps a pullmd-playwright image older than 3.15.2 now gets 503 from /api/status until the sidecar is updated too.

Fixed

  • Reddit pages that are not posts no longer crash the extractor. Any reddit.com URL went down the post path, so a rules page, wiki page, user profile or sorted listing (/r/x/top/) failed with Cannot read properties of undefined (reading 'data'). Only posts (including comment permalinks), galleries and subreddit front pages are read now; anything else answers 400 with {"code":"reddit_unsupported_page"} and a readable message, without a request to Reddit. The MCP read_url tool returns the same message.
  • A blocked Reddit request no longer stores an empty post. Without API credentials, Reddit answers the JSON request with 403 and sends the old.reddit fallback to its login page with a 200. PullMD parsed that login page as the post and cached an empty entry titled "Reddit Post". The fallback now reports the block (502, "Reddit blocked the request.") and nothing is cached. Setting REDDIT_CLIENT_ID and REDDIT_CLIENT_SECRET avoids the block.
  • DISABLE_PUBLIC_HISTORY now also blocks anonymous deletes. With the switch on and no sign-in, /api/history and /api/archive were hidden, but DELETE /api/cache still cleared the whole cache and DELETE /api/cache/:id removed single entries (their ids are sequential), share links included. Both routes now answer 403 for anonymous callers when public history is off. Instances with sign-in were not affected; with sign-in off and public history on, deletes stay open as before. SECURITY.md now describes what that open mode exposes.
  • README: the self-hosted OCR note promised too much. It said PULLMD_PDF_OCR_BASE_URL could point at a local engine such as Docling. PullMD sends the Mistral OCR request shape (POST /ocr), which Docling does not speak, so that setup never worked without a translating adapter. The README and .env.example now say so, and that the OCR tier handles PDFs only.