Nye-TeeOff/backend/create_admin.py

83 lines
2.4 KiB
Python
Raw Permalink Normal View History

"""
2026-04-16 11:02:50 +02:00
TEE OFF ADMIN GENERATOR
---------------------------------------------------------------------------
2026-04-16 11:02:50 +02:00
FUNKSJON: Oppretter eller erstatter administrator direkte i databasen uten
å skrive ut SQL, passordhash eller andre hemmeligheter.
STATUS: Nullstiller admins-tabellen og lager en ny 2FA-hemmelighet.
---------------------------------------------------------------------------
"""
2026-04-16 11:02:50 +02:00
import asyncio
import getpass
2026-03-02 19:39:40 +01:00
import sys
2026-04-16 11:02:50 +02:00
import asyncpg
import pyotp
from passlib.hash import pbkdf2_sha256
from env_config import get_database_url
DB_URL = get_database_url()
async def generate_admin() -> None:
print("\n" + "=" * 50)
print(" TEE OFF ADMIN GENERATOR")
print("=" * 50)
username = input("Brukernavn (f.eks Brukeren Leif): ").strip()
email = input("E-post: ").strip()
2026-04-16 11:02:50 +02:00
2026-03-02 19:39:40 +01:00
while True:
password = getpass.getpass("Skriv inn passord: ")
password_confirm = getpass.getpass("Gjenta passord: ")
2026-04-16 11:02:50 +02:00
if password != password_confirm:
2026-03-02 19:39:40 +01:00
print("❌ Passordene er ikke like. Prøv igjen.\n")
2026-04-16 11:02:50 +02:00
continue
if len(password) < 8:
print("⚠️ Advarsel: Passordet bør være minst 8 tegn.")
break
2026-03-02 19:39:40 +01:00
password_hash = pbkdf2_sha256.hash(password)
2026-04-16 11:02:50 +02:00
otp_secret = pyotp.random_base32()
conn = None
try:
conn = await asyncpg.connect(DB_URL)
async with conn.transaction():
await conn.execute("TRUNCATE admins")
await conn.execute(
"""
INSERT INTO admins (username, email, password_hash, otp_secret)
VALUES ($1, $2, $3, $4)
""",
username,
email,
password_hash,
otp_secret,
)
except Exception as exc:
print(f"❌ Kunne ikke opprette admin-brukeren: {type(exc).__name__}")
sys.exit(1)
finally:
if conn is not None:
await conn.close()
print("\n✅ ADMIN BRUKER OPPRETTET")
print("-" * 50)
2026-04-16 11:02:50 +02:00
print("Brukeren er lagret direkte i databasen.")
print("2FA-hemmeligheten vises nedenfor kun denne ene gangen.")
print("Lagre den i authenticator-appen din før du lukker terminalen.")
2026-03-02 19:39:40 +01:00
print("-" * 50)
2026-04-16 11:02:50 +02:00
print(f"2FA-nøkkel: {otp_secret}")
print("-" * 50 + "\n")
2026-04-16 11:02:50 +02:00
if __name__ == "__main__":
2026-03-02 19:39:40 +01:00
try:
2026-04-16 11:02:50 +02:00
asyncio.run(generate_admin())
2026-03-02 19:39:40 +01:00
except KeyboardInterrupt:
print("\nAvbrutt.")
2026-04-16 11:02:50 +02:00
sys.exit(0)