1.29.2 — Immediate account closure and the fleet operator tool
Editorial identity incomplete
2026-09-21
Adds immediate in-app account closure for a signed-in session with Sign in with Apple token revocation, erases every credential and sign-in link when an account closes, and ships an operator tool for surgical config edits, health-gated rolling restarts and node/database health.
Added
POST /api/account/closecloses the caller's account at once, for a person confirming the action inside an app. Password accounts sendcurrent_password; passwordless accounts need a session whoseauth_timeis withinACCOUNT_CLOSE_REAUTH_WINDOW(default 600 seconds), enforced even whenFRESH_AUTH_ENFORCEis off. Only an interactive user session may call it: user API keys, group API keys, group tokens and OAuth grant tokens are rejected.- Sign in with Apple token revocation on closure. Refresh tokens from active Apple connections are collected before local rows are removed and revoked with Apple only after the local erasure has landed. A remote failure is recorded as
account:apple_revoke_failedand never undoes a completed erasure. ACCOUNT_CLOSE_REAUTH_WINDOWsetting (integer seconds, default 600).python3 -m mojo.deploy.fleet, an operator-side tool for incidents:config keys|get|set|versions|rollbackedit the canonicaldjango.confin S3 by dotted path without re-rendering it (parse-proven, redacted diff, mode-0600 rollback copy, sha256 metadata);syncrolls nodes one at a time behind an ASGI and loopback health gate with every config-sync timer held;nodes status,db connections,db instanceanderrorsare read-only. Wired byaws/fleet.json; credentials come fromvar/django.confor the ambient AWS chain and are never printed.
Changed
- Account closure, through the email-confirmed flow and the new endpoint alike, now also deletes passkeys, registered push devices, TOTP secrets, OAuth connections, per-user API keys, OAuth grants and authorization codes, detaches reference-mode group API keys, and disables and detaches identity-override group API keys. After closure a passkey login fails with the same generic error as an unknown passkey.
pii_anonymize()deletes group memberships last. A product closure handler that reaches data through memberships must still purge it before the framework does.
Fixed
- Closing an account left the person's social sign-in links, machine keys and OAuth grants in place, still carrying their real email.
Upgrade notes
- No migration. The new endpoint shares the
ALLOW_SELF_DEACTIVATIONswitch, theaccount:deactivatedincident and the five-per-five-minutes IP limit with the email flow; a wrong password also spends the normal per-account login attempt budget. - Only
config set,config rollbackandsyncin the fleet tool change anything;config setrefuses to add keys and--dry-rundoes everything but the write.