fix: bug scan — API hardening, safer disk picker, updater rollback, friendlier installer #19
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/bug-scan-hw-compat"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Bug scan + "installable on more machines" pass. Seven commits, each self-contained. 410 tests,
ruff checkandruff format --checkgreen locally. Not yet validated on VM or hardware. Please run the smoke VM (UEFI + BIOS) before a release.Security
POST /api/apps/removewith{"name": "/"}or".."sentshutil.rmtreeat the root fs or/var/lib/furtka. The".."/"../catalog"cases were reproduced in a sandbox. Wipingusers.jsonalso reopened admin setup to the LAN..envwrites: line breaks are refused, and$values are single-quoted (compose turnedpa$wordintopa). Validation now runs before the write (a rejected/etcpath used to be saved anyway).users.jsonfails closed:/loginanswers 503 with recovery steps instead of an open create-admin form.save_usersfsyncs.ThreadingHTTPServer; state-changing POSTs are still serialised.Sec-Fetch-Siteis anything other thansame-origin.Installer / hardware
lsblk -JwithTRAN/ROTA:--anyon the target: no 2-minute boot stall with a second, unplugged NIC..localpreview, and "Pick a disk" with an erase warning.Runtime
errorstage that the settings page shows./logininstead of showing an empty app list.Also
website/tools/logo-assets.pymaderuff check .fail on main; that is fixed here.Known follow-ups (not in this PR)
/status.json.furtka-apihasRequires=docker.🤖 Generated with Claude Code
https://claude.ai/code/session_01Wq1hzUp4ZmCKHDuLKCnu73
- app names from URL paths and JSON bodies must match APP_NAME_RE; installer remove()/update_env() check it too. Before, {"name": ".."} or "/" sent remove() into shutil.rmtree on /var/lib/furtka or the root filesystem - manifests must carry a valid app name as well - settings are validated in memory (placeholders, system paths, line breaks) before .env is written — a rejected /etc used to be saved anyway - values containing $ are single-quoted so compose doesn't expand them ("pa$word" became "pa"); line breaks are refused (env injection) - ThreadingHTTPServer so status polls keep answering during slow requests; state-changing POSTs still run one at a time - 1 MiB body cap, 30 s socket timeout, bad Content-Length → 400 - POSTs with Sec-Fetch-Site other than same-origin are refused (apps on other ports of the same host count as same-site for SameSite=Strict) - unexpected exceptions return a JSON 500 instead of a dropped connection - UI pages send the browser to /login on a 401 instead of showing an empty app list after an API restart Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wq1hzUp4ZmCKHDuLKCnu73