Configuration (wiki): stale on unreadable rates and on implicit TLS; POSTULO_RECOVERY_RATE is missing #404
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#404
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
95348908dand the wiki at de1f52467, readingConfiguration.mdagainst the configuration checks and the mail settings. Related to #233 (closed), which added the start-up configuration checks, and #158 (closed), which implemented implicit TLS: both changed the behaviour and documented it on this page, and each left an older paragraph standing that now says the opposite. This issue removes the two leftovers and adds the one rate the page never named.Checked again on 2026-10-01 against
mainat0a5cad587: still present. The code is now atcore/server_views.py:340-342(where the recovery rate is spent), andMailSecuritymoved tocore/mail_choices.py:17-27, with 465 as the default port forMailSecurity.SSLatcore/mail.py:31-36(DEFAULT_MAIL_PORTS).The wiki's
Configuration.mdcontradicts itself in two places, and in both the stale statement is the one an operator meets first or reads last. The rate-limit section says a mistyped rate quietly means no limit, though start-up now refuses it. The Email section says implicit TLS on port 465 is not offered, though it is, and the same page explains how fifty lines further down. The rate table also omitsPOSTULO_RECOVERY_RATE.1. Rate limits: an unreadable rate is said to mean no limit
Configuration.md:661-663(the note under the rate table), againstConfiguration.md:135-140on the same page andcore/checks.py:77-95(rates, which reportspostulo.E002whenthrottle.is_well_formedatcore/throttle.py:58-66fails).throttle.parsealone. Since #233,docker/entrypoint.sh:34runsmanage.py check --deploy --fail-level ERROR, and a rate that is not<times>/<s|m|h|d>, empty or0stops the container. An operator who writesPOSTULO_API_RATE=600/houron the strength of the note gets an instance that does not start: the pattern incore/throttle.py:39accepts onlys,m,hordas the unit.postulo.E002, naming the variable; empty or0means no limit."2. Rate limits:
POSTULO_RECOVERY_RATEis not on the pageConfiguration.md:652-659;config/settings/base.py:433-436, which definesPOSTULO_RECOVERY_RATE(default10/h), andcore/server_views.py:339-341, which spends it when an administrator issues a recovery link.POSTULO_*_RATEsettings inconfig/settings/base.py, ten are named in the wiki (six in this table,POSTULO_TEXT_RATE,POSTULO_TEXT_PER_NUMBER_RATEandPOSTULO_CONFIRMATION_RATEfurther down the page,POSTULO_NUMBER_RATEinYour-career-record.md).POSTULO_RECOVERY_RATEappears nowhere in the wiki; only.env.example:202-205describes it. Getting somebody back in without email (Accounts-and-invitations.md:270) explains recovery links without saying they are bounded.POSTULO_RECOVERY_RATE(10/h, recovery links one administrator may issue) to the table, and a sentence naming it in Getting somebody back in without email that links back to the table.3. Email: implicit TLS on port 465 is said not to be offered
Configuration.md:481-482, againstConfiguration.md:529-557(STARTTLS or implicit TLS, and why the port decides),config/settings/base.py:713-723(POSTULO_EMAIL_SECURITY:none,starttlsorssl),core/mail.py:26-46(MailSecurity.SSL, with 465 as its default port) andplugins/smtp/__init__.py:77, which passesuse_ssl.POSTULO_EMAIL_SECURITY=sslin the environment (listed in the table just above, atConfiguration.md:468) and the three-state Connection security control on Server settings → Email. An operator whose provider documents SMTPS on 465 first, which the page itself says of Gmail, Microsoft 365, Fastmail, OVH and most shared hosting (Configuration.md:537-538), reads the earlier paragraph, concludes Postulo cannot reach it, and routes mail through a relay or a transport plugin they did not need.Configuration.md:481-482, or replace it with one sentence pointing to STARTTLS or implicit TLS, and why the port decides below.Done when
Configuration.mdno longer says an unreadable rate means no limit, no longer says implicit TLS is unavailable, and namesPOSTULO_RECOVERY_RATEwith its default.tests/test_wiki_surface.pyasserts that every namecore.checks.rate_settings()returns appears somewhere in the wiki; it fails today onPOSTULO_RECOVERY_RATE. (Like the rest of that file it runs only where the wiki is checked out beside the repository.)Configuration.mdcontains neither "unreadable also means no limit" nor "not offered yet", so neither paragraph comes back; both assertions fail today. The behaviour itself is already covered bytests/test_checks.pyandtests/test_mail_security.py.Fixed in
ebb9290d0on main.