You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix: make administrative user offboarding irreversible and complete (WI-1308)
Offboarding could be undone through pending invitations: user_invitations
survived the anonymization and invitation acceptance activated any inactive
user, resurrecting the retained row with an attacker-chosen password. The
admin activate endpoint and the RECOVER_USER tool could also reactivate an
offboarded account, and the cleanup missed several user-owned stores.
- add an irreversible users.offboarded_at lifecycle state, set by
OffboardUser and never cleared; every activation path rejects it
(invitation verify/accept/generate, admin activate, password reset,
RECOVER_USER)
- extend the offboarding transaction to delete pending invitations,
integration OAuth tokens, Todoist sync config and task links, integration
OAuth state, calendar feed tokens, portal request drafts, team
memberships, leave periods (releasing substitute slots), on-call layer
memberships and overrides, and asset set roles
- collect encrypted SCM and integration OAuth grant material before the
rows are deleted and revoke the grants best-effort after commit where
providers support it (GitHub OAuth Apps, Todoist); Gitea and Notion have
no revocation API and expire unused
- regression coverage: invitation reactivation, per-table cleanup,
revocation collection, migration upgrade, and HTTP-level activation and
password-reset denial contracts
0 commit comments