↑ ↓ to navigate
↵ to select
esc to close
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.com pointed 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 and domains_verify. The legacy airogel-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_unpublished sent as the string "false" leaked draft entries. Chat tools now advertise the same required/optional parameters and types as their MCP counterparts (entries_upsert went 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 collection default_orderable, were silently discarded on save.
  • Liquid gallery fields reported a default max_items of 10 instead of the configured 20.
  • Import/export progress no longer resets to zero mid-run.
  • assets_upload now accepts the license parameter it was documented with.
  • Public page renders use preloaded entry data (roughly three fewer queries per entry).