Security (API): bounded rename oracle, narrowed rendering answer, wrong-token counting, no-store, text bounds #1000
No reviewers
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
performance
security
tier
1
tier
2
tier
3
tier/4
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo!1000
Loading…
Reference in a new issue
No description provided.
Delete branch "sec2-c-api"
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?
PR C (API) of the SEC2 series.
Closes #949, Closes #950, Closes #951, Closes #952, Closes #953, Closes #954
POSTULO_COMPANY_NAME_RATE(20/h) times, asked before the lookup, and once it is spent a free and a held name are refused alike with a 429 (the #758 pattern,core/throttle). Same helper (jobs/company_names.py) for the API and the web form. Threat model amended. Owners are never bounded.PUT /captures/{id}/renderingreturns_as_listed, so a captures-only token gets the narrowed row in both the 201 and the 200.auth.live_token: bar check, lookup and wrong-token count foropenapi.json, the unknown-address answer and the 405 wrapper; a barred address gets the same 429 problem document andRetry-After. Not changed: the schema view still spends no allowance for a live token (not in the issue's fix).urls()wraps every address (schema, 401/404 of unknown addresses included) so an answer with noCache-Controlof its own getsprivate, max-age=0, no-store.max_length=BODY_MAX_CHARS(40,000) on the ten write-side free-text fields (API refuses with 422,maxLengthin OpenAPI);record_eventcuts a longer body from a page or import with the history marker.docs/THREAT-MODEL.md. The user still has to confirm this at review.Tests: each issue has tests that fail without the change (
tests/security/test_rate_limits.py,tests/security/test_captured_pages.py,tests/test_hardening_799.py,tests/security/test_downloads_not_cached.py,tests/test_api.py). Full unit suite: 18,898 passed; 25 failures on the first run were uncompiled catalogues in the fresh worktree and passed aftermessages.py compile. No browser tests run locally; no JS or templates touched. No new translatable strings (extract --checkclean).Wiki commit 28573ba (not pushed): Configuration.md and The-capture-API.md.
🤖 Generated with Claude Code
82f44854010dc9433dc2