SEC2-086: Shared copies are 14 postulo-chromium commits behind, missing the non-JSON-answer and request-hardening fixes to api.js #15
Labels
No labels
bug
documentation
enhancement
security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo-thunderbird#15
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-10-16 in a read-only security review of
postulo-thunderbirdat4a10c95, checked by a second, independent pass.Severity: Informational · Category: Dependencies · Reference: CWE-1104 (Use of Unmaintained Third Party Components); OWASP A06:2021 (Vulnerable and Outdated Components)
Location:
shared.json:3("ref": "7998de37...")src/lib/api.js:71-82(readResponse)src/options.js:60-62Issue
The copies of
src/lib/api.js,src/lib/i18n.js,src/style.cssand the five icons arebyte-identical (after the
eol=lfnormalisation.gitattributesandscripts/shared.mjsapply)to postulo-chromium at the pinned commit
7998de3, so there is no drift in the sense the guardtests for. The pin itself is stale: postulo-chromium has 14 later commits touching the shared
files (
git log 7998de3..b6c1009 -- src/lib/api.js src/lib/i18n.js src/style.css), among them:2d04678"Say translated sentences for an unscriptable page and a non-JSON answer": the currentchromium
readResponsethrowsRefusal("notPostulo")when a 2xx answer is not a JSON object.The copy here still does
so a sign-in page, a reverse proxy's landing page or a captive portal answering
200 text/htmlat
/api/v1/memakeswhoAmIresolve tonull, andoptions.js:61(me.scopes) throws aTypeErrorwhose engine-written message is whatexplain()shows, instead of a sentence fromthe catalogue.
41f1e60(anIdempotency-Keyon every capture POST) andb7c8e78(addresses kept withinPostulo's limits,
/captures/knownasked in chunks): request hardening the capture feature (#1)will need and would otherwise re-learn.
2d04678/d5f30bdaddAccept-Languageand a chosen-language catalogue; chromium'si18n.jsnow imports
./languages.jsand./messages.js, which this repository does not have, sonpm run shared:syncis no longer a plain copy but a small migration (what #7 and #8 are for).Impact
No exposure today: the only request the skeleton makes is
GET /meon Test, and the worstoutcome is an unhelpful error message. The cost is that the next feature is built on a copy of
api.jsthat lacks fixes its source already has.Fix
Re-pin: run
npm run shared:syncagainst a postulo-chromium checkout at or afterb6c1009, addlanguages.js/messages.jstoshared.json(or land #7/#8 first), and reword any new cataloguekey that speaks of a browser (the "no sentence speaks of a browser" test enforces it).
Done when
shared.json'srefis at or after2d04678and a test intest/feedsreadResponsea200response whose body is not JSON and asserts aRefusalwith keynotPostulois thrown.Related
#7 and #8 (open) are the features that bring
languages.jsandmessages.js.postulo/postulo-firefox#8 (closed) was the same kind of stale pin for the Firefox build.