2026-03-02 09:05:18 +01:00
|
|
|
"""
|
2026-04-16 11:02:50 +02:00
|
|
|
TEE OFF ADMIN GENERATOR
|
2026-03-02 09:05:18 +01:00
|
|
|
---------------------------------------------------------------------------
|
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-03-02 09:05:18 +01:00
|
|
|
---------------------------------------------------------------------------
|
|
|
|
|
"""
|
2026-04-16 11:02:50 +02:00
|
|
|
import asyncio
|
2026-03-02 09:05:18 +01:00
|
|
|
import getpass
|
2026-03-02 19:39:40 +01:00
|
|
|
import sys
|
2026-03-02 09:05:18 +01:00
|
|
|
|
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()
|
2026-03-02 09:05:18 +01:00
|
|
|
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
|
|
|
|
2026-03-02 09:05:18 +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")
|
2026-03-02 09:05:18 +01:00
|
|
|
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}")
|
2026-03-02 09:05:18 +01:00
|
|
|
print("-" * 50 + "\n")
|
|
|
|
|
|
2026-04-16 11:02:50 +02:00
|
|
|
|
2026-03-02 09:05:18 +01: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)
|