v0.4.10 — Multiple superadmins, OIDC floor-guard, emergency CLI
Pre-release
Pre-release
[0.4.10] - 2026-07-02
Changed
- Remove instance-superadmin ceiling: multiple active
superadmin@instanceassignments are allowed; OIDC group→superadmin grants are no longer capped at one. The dropped index was redundant with the Serializableuser.count()guard inPOST /setup; first-run bootstrap protection is unchanged. - Consolidate rate-limit factories into declarative policy registry (no behavior change)
- Centralize MFA enroll rate-limit constants in
RATE_POLICIES; add registry edge-case and wiring tests - Extract inline-only rate limits to
INLINE_RATE_LIMITS(excluded fromRatePolicyName; compile-time guard againstrateLimit()misuse) - Remove unused SSE message variant and stale nginx metrics location; fix dangling ADR links in deploy docs
- Docs: superadmin runbook for multiple instance admins and OIDC offboarding prerequisites (
SECURITY-CONTROLS.md,deploy/README.md)
Security
- Fix event-settings GET authz-order oracle (404→403 for cross-org probing of non-existent events); add defense-in-depth
assertEventManageAccesstohandlePatchEventhandler body (route wrapper already enforced scope); reduce QR image cache TTL from 24h to 5min - Emergency CLI attendee export: enforce mode 0600 on overwrite; writable
emergency-exportsbind mount; reject--outunder publicUPLOAD_DIRor outsideEMERGENCY_EXPORT_DIRwhen those env vars are set; rejectEMERGENCY_EXPORT_DIRwhen it is a public alias underUPLOAD_DIRraw or realpath (including symlinked upload roots); require raw--outunder rawEMERGENCY_EXPORT_DIR(not only canonical realpath); resolve symlinks before path checks; write via validated canonical path withO_NOFOLLOW(loop until full buffer is written)
Fixed
POST /setupmaps Serializable transaction conflicts (P2034) to409 already_initializedwhen two first-run submissions race with different emailsbootstrap-superadmin --forcerecovery path works after removing the single-superadmin partial unique index- OIDC group-sync cannot revoke the last active instance superadmin (floor-guard with audit event
auth.oidc.superadmin_revoke_blocked; Serializable transaction on active instance-superadmin revoke; inactive owners skip the floor check; retriesP2034serialization losers so concurrent OIDC logins do not fail)
Added
- CLI:
admittoemergency ops binary (apps/cli) — checkin admit/lookup, attendees export, mail retry-failed, auth bootstrap-superadmin/reset-mfa, sessions revoke/purge, retention run - Automated retention cron (auth sessions, mail delivery snapshots) and nightly pg_dump backup sidecar in deploy compose
Deploy
- Container image:
ghcr.io/solarssk/admitto:0.4.10(rolling:0.4) - Migrations apply automatically on container start (with pre-migration backup when pending). No manual
migrate deploy.