85 lines
No EOL
3.2 KiB
Text
85 lines
No EOL
3.2 KiB
Text
"""
|
|
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) |