Nye-TeeOff/kode_eksport_3/backend_update_admin_py.txt

85 lines
3.2 KiB
Text
Raw Normal View History

2026-04-10 09:52:34 +02:00
"""
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 os
import sys
import getpass
from passlib.hash import pbkdf2_sha256
# Henter database-URL fra miljøvariabler (samme metode som backenden din bruker)
DB_URL = os.getenv("DATABASE_URL", "postgresql://teeoff_admin:teeoff_secret_password@db:5432/teeoff")
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
try:
conn = await asyncpg.connect(DB_URL)
except Exception as e:
print(f"❌ Kunne ikke koble til databasen: {e}")
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.")
print(f"\n[DEBUG] Passord akseptert.")
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
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)