Release v0.80.0
Release v0.80.0 — Post-Hardening Audit Remediation
This release closes the highest-leverage findings from the post-hardening quality audit of v0.79.0. The theme: hardened-production mode is the marketed safe posture, but a cluster of insecure-by-default config footguns on the SSO and HA deployment shapes previously passed straight through it. v0.80.0 makes hardened mode the real safety bar for those shapes, fixes a credential-file permission hole, and cleans up several posture/documentation items.
All changes are backward-compatible except the SMTP TLS default (F7), which is a deliberate, opt-out-able security default change called out under Behavior changes below.
Behavior changes (read before upgrading)
- Hardened mode + OIDC now requires
OIDC_EDITOR_GROUPSto be set explicitly (F1). If you run withNODE_ENV=production/HARDEN_PRODUCTION=trueand OIDC is enabled (OIDC_DISCOVERY_URL+OIDC_CLIENT_IDset), the server will refuse to boot untilOIDC_EDITOR_GROUPSis set. Choose deliberately:- a comma-separated group list (recommended) — only those groups get
editor; - an empty string — editor access only via
OIDC_ADMIN_GROUPS; *— acknowledge that every authenticated SSO user becomes an editor. The schema default is still*, so non-hardened and non-OIDC deployments are unaffected (non-hardened OIDC deployments now log a warning when*is in effect).
- a comma-separated group list (recommended) — only those groups get
- Scheduled email delivery enforces STARTTLS by default (F7). With
SCHEDULE_SMTP_SECURE=false(the default, port 587), the SMTP transport now setsrequireTLS: true. A relay that does not advertise STARTTLS will now fail closed instead of silently downgrading to plaintext. If you depend on a legacy plaintext-only relay, setSCHEDULE_SMTP_REQUIRE_TLS=falseto restore the old behavior (not recommended).
Security
- F1 — OIDC wildcard editor access no longer slips through hardening. New conditional
hardening violation (sibling to the existing
OIDC_REDIRECT_URI-https rule) + non-hardened startup warning.apps/api/src/config.ts. - F2 — editor user-registry file written
0o600. The file holds plaintext editor login keys.UserRegistry._persist()now removes any stale.tmp, writes owner-only, and re-chmods the final path after the atomic rename (POSIX; no-op on Windows).apps/api/src/lib/user-registry.ts. - F7 — STARTTLS enforced for scheduled email delivery (see Behavior changes).
apps/api/src/lib/delivery/email.provider.ts, newSCHEDULE_SMTP_REQUIRE_TLSconfig.
High-availability
- F3 — the bundled HA stack now ships Redis and shared rate limiting.
docker-compose.ha.ymlincludes aredisservice and setsRATE_LIMIT_STORE=redison both replicas; the CI overlaydocker-compose.ha.redis.ci.ymlis reduced to CI determinism (tinyRATE_LIMIT_MAX, direct per-replica ports). A production startup warning is logged whenRATE_LIMIT_STORE=memoryis used with a database-backed (multi-instance-capable) storage mode. - F4 — HA user-registry divergence is surfaced and documented. A startup warning fires when
OIDC auto-provisioning is combined with a file-backed registry in a multi-instance deployment.
docs/ha-reference-architecture.mddocuments the single-writer / pre-seed constraint. A DB-backed user registry remains a deferred follow-up.
Documentation & metadata
- F6 — triple-stash (
{{{ }}}) raw-HTML caveat added to theTextNodeJSDoc and the editor guide (it disables data escaping; never use it for lower-trust render data). - F8 —
LICENSING.mdclarified: licence enforcement is watermark-only; rendering never refuses. (The optional editorvendor-chunk split was deferred — it needs bundle-composition measurement first; the heavy libs are pulled in transitively, not via direct editor imports.) - F5 —
@pulp-engine/sdkdescription corrected so it no longer implies a live PyPI listing. - Hardening docs across the deployment guide, OIDC guide, runbook, release checklist, README, and
.env.examplenow describe the two conditional OIDC controls alongside the seven baseline controls.
Deferred (tracked follow-ups)
- DB-backed editor user registry (the proper HA fix behind F4).
- Actual npm/PyPI publication of the SDKs (pending trusted-publisher/registry setup).
- Editor
vendor-chunk split (pending bundle-composition measurement).
Tests
oidc-hardening.test.ts— new cases for the F1 gate (boot-fail when unset; boot-ok for*/empty/ group-list; non-hardened wildcard warning).user-registry-persist.test.ts— asserts0o600on the persisted file, including when a stale0o666.tmppre-exists (POSIX-only assertions; round-trip checked cross-platform).email-delivery-tls.test.ts— assertsrequireTLS: trueby default, the opt-out, and omission under implicit TLS.