July 4 - Implement TOTP 2FA

This commit is contained in:
2026-07-04 13:40:03 -04:00
parent 07226b4878
commit d87c889ca2
23 changed files with 1336 additions and 10 deletions
+3 -2
View File
@@ -64,7 +64,8 @@ tenant_domains
tls_status ENUM(pending, active, failed), created_at
superadmins -- cross-tenant accounts, control-plane only
id, username, email, password_hash, active, created_at
id, username, email, password_hash, active, created_at,
mfa_enabled, mfa_secret, mfa_recovery_codes -- control0005: opt-in TOTP 2FA
provisioning_jobs
id, tenant_id (FK), action ENUM(create_db, migrate, seed, suspend, delete),
@@ -115,7 +116,7 @@ db = SQLAlchemy(session_options={'class_': RoutingSession})
Two independent Alembic chains:
1. **Tenant schema** — existing chain (HEAD: **`phase34_inspection_schedules`**). Runs per-tenant DB. New tenant features continue as `phase35_…` per existing naming.
2. **Control schema** — chain `control{N}_…`, runs once against `jqc_control`. HEAD: `control0004_dunning_tracking` (`control0001_init → control0002_billing → control0003_trial_reminder_sent → control0004_dunning_tracking`).
2. **Control schema** — chain `control{N}_…`, runs once against `jqc_control`. HEAD: `control0005_superadmin_mfa` (`control0001_init → control0002_billing → control0003_trial_reminder_sent → control0004_dunning_tracking → control0005_superadmin_mfa`).
**CLI (always source env first):**
```bash