create_user.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #!/usr/bin/env python3
  2. """
  3. Usage: python create_user.py <email> <name> <password> [--admin]
  4. Creates a GUI user account in users.json.
  5. The user will be required to change their password on first login.
  6. Use --admin to grant admin privileges.
  7. """
  8. import hashlib
  9. import json
  10. import os
  11. import secrets
  12. import sys
  13. import uuid
  14. from datetime import datetime
  15. USERS_FILE = os.path.join(os.path.dirname(__file__), "users.json")
  16. def hash_password(password: str, salt: str | None = None) -> tuple:
  17. if salt is None:
  18. salt = secrets.token_hex(16)
  19. key = hashlib.pbkdf2_hmac("sha256", password.encode(), salt.encode(), 200_000)
  20. return key.hex(), salt
  21. def create_user(email: str, name: str, password: str, role: str = "user") -> str:
  22. users: dict = {}
  23. if os.path.exists(USERS_FILE):
  24. with open(USERS_FILE) as f:
  25. users = json.load(f)
  26. for u in users.values():
  27. if u["email"] == email:
  28. print(f"[!] A user already exists with email {email}")
  29. print(" Delete the entry from users.json first if you want to recreate it.")
  30. sys.exit(1)
  31. user_id = str(uuid.uuid4())
  32. pw_hash, pw_salt = hash_password(password)
  33. users[user_id] = {
  34. "id": user_id,
  35. "email": email,
  36. "name": name,
  37. "role": role,
  38. "password_hash": pw_hash,
  39. "password_salt": pw_salt,
  40. "is_default_password": True,
  41. "created_at": datetime.now().isoformat(),
  42. }
  43. with open(USERS_FILE, "w") as f:
  44. json.dump(users, f, indent=2)
  45. print(f"\n✓ User created: {name} <{email}> [{role}]")
  46. print(f" Default password: {password}")
  47. print(f" The user will be prompted to change it on first login.\n")
  48. return user_id
  49. if __name__ == "__main__":
  50. if len(sys.argv) < 4:
  51. print("Usage: python create_user.py <email> <name> <password> [--admin]")
  52. sys.exit(1)
  53. _email = sys.argv[1]
  54. _name = sys.argv[2]
  55. _password = sys.argv[3]
  56. _role = "admin" if "--admin" in sys.argv else "user"
  57. create_user(_email, _name, _password, _role)