Rate limits: link checks, logo addresses and Find logo make the server fetch person-chosen URLs with no limit #407
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
performance
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo#407
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Found on 2026-09-29 in a read-only review of postulo at
95348908d, listing everythrottle.consumeandthrottle.capturecall and every caller ofpublic_only_clientandfetching.fetch_page.Checked again on 2026-10-01 against
mainat0a5cad587: still present. The code is now atjobs/forms.py:308-312(apply_logo); the other places are where they were.#112 and #194 bounded how often an account can make the server fetch an address it chose, and
POSTULO_CAPTURE_RATEis spent by the capture form and the capture API. Three other paths make the server fetch person-chosen public URLs and spend nothing: Check and Check all on career links, the logo address on the company form, and Find logo / Refresh. Related to #112 and #194 (closed), which covered capture and the API only.resume/views.py:363-391(LinkCheckView.post) andresume/links.py:47-56(check_all: oneHEAD, and aGETafter 401, 403, 405, 501 or 5xx, for every link the account has, each following up to three redirects, inside the request);jobs/forms.py:307-311(apply_logocallslogos.from_urlwhenever the logo address changes);jobs/views.py:450-467(CompanyLogoActionView.postsends alogoerrand) andjobs/logos.py:297(find_on_website: the company page throughfetching.fetch_page, then up to six images). None of these callsthrottle.links.check, inlogos.from_urland inCompanyLogoActionView.postbefore the errand is sent, either againstPOSTULO_CAPTURE_RATEor against a newPOSTULO_FETCH_RATEof its own. Check all stops when the allowance runs out and says how many links it did not check. Name the new consumers in Configuration → Rate limits and Hardening.Done when
tests/test_links_and_letters.pysets the rate to2/h, stores three links, posts Check all, and asserts only two requests were made and the message says one was not checked.tests/test_logos.pyasserts that saving a company with a new logo address and pressing Find logo each spend the allowance and are refused with a sentence once it is spent.