Fix the open bug and security issues (#8-#22, #24) #25
No reviewers
Labels
No labels
bug
documentation
enhancement
performance
security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo-imap!25
Loading…
Reference in a new issue
No description provided.
Delete branch "sec2-fixes"
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?
Fixes every open
bugandsecurityissue of this repository in three commits: the dev lock and CI audit (#24), the code and its tests (#8-#22), and the catalogue extraction.What and why
42be52048;uv lock --upgrade(pyjwt 2.15.1, urllib3 2.8.0, oauthlib 4.0.0, django 6.1.2, allauth 65.20.0, imapclient 4.1.0).pip-audit 2.10.1 --strictover the exported lock reports no known vulnerabilities. CI and the release gate now run that audit (Postulo itself is--no-emit-packaged: git dependency, not on PyPI) and install uv from a pinned version through the core's checksum-verified installer pattern. No action is SHA-pinned.try, own savepoint), counted, noted and flagged with the rest. Bad Date bytes,charset=idna/undefinedand NUL characters are handled inparse.HOW_LABELS,KIND_LABELS);Match.howandVerdict.kindstay identifiers. The language the scheduler runs in is the core's to set (see below).ngettextfor both count sentences (and the new "could not be read" one).Message-ID->sha256-<hash of the message>, not the UID.INBOXrefused (form, Test and the pass);move_to == folderrefused; help text, validation text and README say every message read is flagged or moved, recognised or not.HTMLParserover at most 200 KB; headers cut to 4 KB; bounded identifier regex; threading keeps the In-Reply-To parent and the last 8 References, so the thread query binds at most nine values.<head>/<title>dropped, inline vs block tags handled; the stored excerpt keeps its line breaks.MOST_CONSEQUENTIAL_FIRSTorder across all languages.registrable()from a short built-in table (no dependency, no download), bare suffixes reduce to nothing, IDNA-normalised hosts, public providers checked in full and reduced.Message-IDand not downloaded again.MailboxErrorbecomesSyncReport(error=...)with the plain sentence; a refused flag/move keeps the report and adds a note (server words only in the log); MOVE fallback (copy,\Deleted, UID EXPUNGE) or a clear refusal;PERMANENTFLAGSread;folder_existswrapped in Test.Tests
uv run pytest: 280 passed (23 release-gate tests deselected as usual);ruff check,ruff format --check,postulo-messages extract --check / check / guardclean. New cases are intests/test_review_fixes.pyand use the sentences and inputs from the issues;tests/test_imap.pygot a fake mailbox that records fetches, answers sizes/partial fetches and can refuse a call. Without the source changes the suite does not even import (it needsMOST_CONSEQUENTIAL_FIRST,HOW_LABELS).Left open / notes
LANGUAGE_CODEuntil the core runs each sync in the owner's language (the half the issue assigns to the core). The test therefore asserts the labels are the lazy translated ones rather than a Portuguese string: no translation is written here (Weblate only), so the new msgids have empty slots until Weblate drafts them.Closes #8, #9, #10, #11, #12, #13, #15, #16, #17, #18, #19, #20, #21, #22, #24
🤖 Generated with Claude Code
INBOXis accepted although the form and the README say the inbox is never read #12