v0.12.4
Security
v0.12.4 - Host-header hardening and import fixes
Closes a hostname spoofing hole, fixes content import losing every asset reference, and corrects several MCP and chat-tool contracts.
Security
- A tenant site could be served under any hostname whose first label matched an account subdomain (for example
acme.attacker.compointed at the platform), with forms posting into the real account. Subdomain routing is now bounded to the platform's own apex domains, and reserved labels never resolve to an account. - Domain ownership verification accepted any TXT record whose last
=segment was the id. The token is now one definition,airogel_cms=<id>, matched exactly by both the web verifier anddomains_verify. The legacyairogel-verify=prefix is still accepted so already-verified domains keep working.
Fixes
- Content import: image, gallery and rich-text asset references were silently lost, leaving literal
{{asset:…}}placeholders in published copy. Assets now import before the content that references them. - The subscription status API returned 500 for any subscription that was not active.
- An asset whose from-URL import failed could not be edited or re-uploaded afterwards.
- Chat assistant:
include_unpublishedsent as the string"false"leaked draft entries. Chat tools now advertise the same required/optional parameters and types as their MCP counterparts (entries_upsertwent from 12 required parameters to 2), so models no longer send placeholder values that reset per-entry routing. - Chat assistant: the system prompt's field-type table now includes
number, so the assistant stops modelling prices as text. - Chat conversation repair destroyed valid history whenever a turn opened parallel tool calls.
- Admin "replace file" on an asset left entry images on the old file and its metadata stale.
- Admin forms: list and dictionary
max_items, and collectiondefault_orderable, were silently discarded on save. - Liquid gallery fields reported a default
max_itemsof 10 instead of the configured 20. - Import/export progress no longer resets to zero mid-run.
assets_uploadnow accepts thelicenseparameter it was documented with.- Public page renders use preloaded entry data (roughly three fewer queries per entry).