v0.6.2 #239
fdemusso
announced in
Announcements
v0.6.2
#239
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
BeechCMS v0.6.2
Release Date: July 11, 2026
Pull Request: [#237 — Fix validation issues, enhance API logic, and improve security](#237)
🔒 Security Fixes
apply-policies.tsbehaviour. ((Masked visibility policy silently bypassed for non-string branch values #200))public-add.tswas writing sanitized data directly to the repository, bypassingapplyPrivacy(). Fields withprivacy: 'hash'were stored in plaintext andpublic: falsefields could be seeded on create. Privacy policies are now fully enforced on entry creation. ((Public add endpoint never applies privacy policy — hash/encrypt fields stored raw, sensitive fields writable #201))policies.public/policies.filter, allowing non-public branches (e.g. a field markedpublic: false) to be used as a data-inference oracle. Filters on hidden branches are now rejected. ((Public filter endpoint ignores field policies — hidden/non-public branches usable as a data-inference oracle #202))extractMediaKeyusedstartsWithto matchMEDIA_CDN_URL, which could be confused by subdomain or suffix-crafted URLs, allowing unauthorized deletion of unrelated R2 media objects. Now uses exact parsed-origin comparison. ((extractMediaKey: CDN prefix check uses startsWith, letting attacker-crafted file URLs control which R2 object gets deleted #222))indexableSearchBranchescheckedpolicies.searchbut neverpolicies.public, so full-text search matches on hidden fields (e.g. SSN) could leak content viameta.total. Non-public branches are now excluded from the FTS index. ((Public FTS search indexes non-public branches — same data-inference oracle as #202, viasearchparam #234))🐛 Bug Fixes
_touched_fieldsrace condition — ConcurrentsaveDraftcalls for the same entry could interleave their read-modify-write of_touched_fields, causing a later write to clobber an earlier one. On publish, relation branches missing from_touched_fieldswould have their junction rows silently deleted without promotion to live. The merge is now handled in a single atomicINSERT ... ON CONFLICT DO UPDATESQL statement usingjson_each/json_group_array. ((Concurrent saveDraft calls can silently drop a multi-relation field's promotion on publish #210))String(value)coerced JSON, repeater, and richtext branches to the literal"[object Object]"and comma-joined arrays, so every distinct object hashed to the same digest underprivacy: 'hash'. All non-string values are now serialized withJSON.stringifybefore hashing. ((applyPrivacy hashes json/repeater fields via String(value) — all distinct objects collide to the same digest #215))settingsApi.uploadAvatarposted raw file bytes to a nonexistent/uploadroute (returning 404), bypassing the required presign → PUT → confirm flow. It now delegates to the existinguploadFile()helper used byRichtextEditorandmedia.tsx. ((uploadAvatar posts raw file bytes to nonexistent /upload route (404, violates presigned-upload invariant) #226))🛠️ Internal & Maintenance
getCachedSchema/setCachedSchemaandbyteLengthincache.tsandprimitives.ts, causingtscto reject the build. Duplicate implementations have been removed. ((fix(validation): dedupe cache.ts and primitives.ts duplicate implementations #236))Upgrading
This release contains critical security fixes for the public API. Upgrading is strongly recommended for all deployments that expose public-facing endpoints. No breaking changes to the existing API contract or schema format are introduced.
This discussion was created from the release v0.6.2.
All reactions