| """Dev tool:重設 admin 密碼(產生新隨機密碼 + 解鎖 + 強制改密 + 撤銷舊 token)。 | |
| 用法: | |
| py reset_admin.py | |
| """ | |
| import secrets | |
| import sqlite3 | |
| from pathlib import Path | |
| import bcrypt | |
| DB = Path(__file__).parent / "kbv5.db" | |
| MARKER = Path(__file__).parent / "ADMIN_INITIAL_PASSWORD.txt" | |
| ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789!@#$%^&*" | |
| pwd = "".join(secrets.choice(ALPHABET) for _ in range(16)) | |
| hashed = bcrypt.hashpw(pwd.encode("utf-8"), bcrypt.gensalt(rounds=12)).decode("utf-8") | |
| c = sqlite3.connect(str(DB)) | |
| c.execute( | |
| "UPDATE users SET password_hash=?, failed_login_count=0, locked_until=NULL, " | |
| "force_password_change=1, jwt_version=jwt_version+1, totp_enabled=0, totp_secret=NULL " | |
| "WHERE username='admin'", | |
| (hashed,), | |
| ) | |
| c.execute("DELETE FROM sessions WHERE user_id IN (SELECT id FROM users WHERE username='admin')") | |
| c.commit() | |
| n = c.execute("SELECT COUNT(*) FROM users WHERE username='admin'").fetchone()[0] | |
| c.close() | |
| if n == 0: | |
| print("ERROR: admin 帳號不存在") | |
| raise SystemExit(1) | |
| MARKER.write_text( | |
| f"username: admin\npassword: {pwd}\n" | |
| f"force_password_change: 1\n首次登入後系統會要求改密碼。\n", | |
| encoding="utf-8", | |
| ) | |
| print("admin 密碼已重設") | |
| print(f"新密碼:{pwd}") | |
| print("(同時:解鎖、強制改密、撤銷舊 token、關閉 2FA)") | |
| print(f"已寫入:{MARKER}") | |