- UserDeleteConfirm Pydantic model + Argon2 password verification in delete_user
- adminDeleteUser(id, adminPassword) exported from client.js
- AdminUsersTab inline delete confirmation panel with password field
- Three new tests pass: 204/403/422 scenarios
- Full 21-test admin suite green; frontend build clean
Argon2 password verification before destructive action
Vue inline confirmation panel
created
modified
backend/api/admin.py
frontend/src/api/client.js
frontend/src/components/admin/AdminUsersTab.vue
backend/tests/test_admin_api.py
Password verification added as fail-fast check before user lookup — admin cannot fish for user existence via timing
Delete panel and deactivate panel are mutually exclusive (each clears the other on open)
Tests added to existing test_admin_api.py (not a separate file) — plan referenced test_admin.py but actual file is test_admin_api.py
duration
completed_date
tasks_completed
files_modified
2m
2026-05-30T09:39:26Z
2
4
ADMIN-02
SEC-09
Phase 05 Plan 11: Admin Hard-Delete with Password Confirmation Summary
Admin users can now permanently delete non-admin user accounts with Argon2 password verification — wrong or missing password returns 403 without touching any data; correct password triggers the existing SEC-09 cloud/MinIO purge pipeline.
Tasks Completed
Task
Name
Commits
Files
1 (RED)
Failing tests for delete_user password verification
Found during: Task 1
Issue: Plan references backend/tests/test_admin.py but the actual file is backend/tests/test_admin_api.pyFix: Tests added to backend/tests/test_admin_api.py (the existing correct file)
Impact: None — tests run and pass correctly
TDD Gate Compliance
RED gate: commit 8727592 — test(05-11): add failing tests for delete_user password verification
GREEN gate: commit 390a693 — feat(05-11): add UserDeleteConfirm model + admin password verification in delete_user
2/2 tests failed in RED phase (correct_password passed because old endpoint had no auth check; wrong_password and no_body failed correctly)
Threat Surface Scan
No new network endpoints introduced. The DELETE /api/admin/users/{id} endpoint existed before this plan. Changes add a body requirement (reducing attack surface — anonymous DELETE calls now return 422 instead of 204). No new trust boundaries.
Known Stubs
None — adminDeleteUser wired directly to the backend endpoint; delete panel uses live API with real error propagation.
Self-Check: PASSED
backend/api/admin.py — modified, contains UserDeleteConfirm and verify_password check