""" TEE OFF ADMIN PASSWORD UPDATER (API CONTAINER VERSION) --------------------------------------------------------------------------- FUNKSJON: Kobler direkte til databasen inni API-containeren, sjekker at brukeren finnes, og utfører passordoppdateringen automatisk. STATUS: Påvirker IKKE tofaktor (2FA). Gjør jobben fra start til slutt. --------------------------------------------------------------------------- """ import asyncio import asyncpg import sys import getpass from passlib.hash import pbkdf2_sha256 from env_config import get_database_url # Henter database-URL fra miljøvariabler (samme metode som backenden din bruker) DB_URL = get_database_url() async def update_admin_password(): print("\n" + "="*50) print(" TEE OFF ADMIN PASSORD-OPPDATERER (DIREKTE TILKOBLING)") print("="*50) # Kobler til databasen på ekte backend-vis conn = None try: conn = await asyncpg.connect(DB_URL) except Exception as exc: print(f"❌ Kunne ikke koble til databasen: {type(exc).__name__}") sys.exit(1) try: # Brukernavn-verifisering while True: username = input("Brukernavn på admin som skal oppdateres: ").strip() print("⏳ Sjekker databasen...") # Spør databasen direkte hvor mange som har dette navnet count = await conn.fetchval("SELECT COUNT(*) FROM admins WHERE username = $1", username) if count == 0: print(f"❌ Fant ingen bruker med navnet '{username}'. Prøv igjen.\n") elif count > 1: print(f"⚠️ KRITISK FEIL: Fant {count} brukere med navnet '{username}'. Avbryter.") sys.exit(1) else: print(f"✅ Bruker '{username}' funnet i databasen!\n") break # Passord-verifisering while True: password = getpass.getpass("Skriv inn NYTT passord: ") password_confirm = getpass.getpass("Gjenta NYTT passord: ") if password == password_confirm: if len(password) < 8: print("⚠️ Advarsel: Passordet bør være minst 8 tegn.") break else: print("❌ Passordene er ikke like. Prøv igjen.\n") print("⏳ Genererer PBKDF2-hash...") password_hash = pbkdf2_sha256.hash(password) print("⏳ Oppdaterer databasen automatisk...") # Utfører selve oppdateringen (sikret mot SQL-injeksjoner) await conn.execute("UPDATE admins SET password_hash = $1 WHERE username = $2", password_hash, username) print("\n✅ PASSORD OPPDATERT VELLYKKET!") print("-" * 50) print(f"Passordet for '{username}' er nå endret i databasen.") print("Tofaktor (2FA) og alt annet er beholdt urørt.") print("-" * 50 + "\n") finally: # Lukk tilkoblingen pent if conn is not None: await conn.close() if __name__ == "__main__": try: # Siden vi bruker asyncpg, må scriptet kjøres i en asyncio-loop asyncio.run(update_admin_password()) except KeyboardInterrupt: print("\nAvbrutt.") sys.exit(0)