Siste move før flytting

This commit is contained in:
Erol 2026-04-16 11:02:50 +02:00
parent c26f6e8f20
commit 1292fd0e20
3 changed files with 80 additions and 58 deletions

View file

@ -1,64 +1,82 @@
"""
TEE OFF ADMIN GENERATOR v1.9 (DEBUG & BULLETPROOF)
TEE OFF ADMIN GENERATOR
---------------------------------------------------------------------------
FUNKSJON: Genererer SQL-kommando for administrator.
STATUS: Beholder TRUNCATE for feilsøking, men sikrer SQL-innsendingen.
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.
---------------------------------------------------------------------------
"""
import pyotp
from passlib.hash import pbkdf2_sha256
import asyncio
import getpass
import sys
def generate_admin():
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 v1.9 (DEBUG MODE)")
print(" TEE OFF ADMIN GENERATOR")
print("=" * 50)
username = input("Brukernavn (f.eks Envide Webutvikling): ").strip()
username = input("Brukernavn (f.eks Brukeren Leif): ").strip()
email = input("E-post: ").strip()
# Sikre mot SQL-feil hvis navnet/eposten inneholder apostrof
safe_username = username.replace("'", "''")
safe_email = email.replace("'", "''")
# Passord-verifisering
while True:
password = getpass.getpass("Skriv inn passord: ")
password_confirm = getpass.getpass("Gjenta passord: ")
if password == password_confirm:
if password != password_confirm:
print("❌ Passordene er ikke like. Prøv igjen.\n")
continue
if len(password) < 8:
print("⚠️ Advarsel: Passordet bør være minst 8 tegn.")
print(f"\n[DEBUG] Passord akseptert. Lengde: {len(password)} tegn.")
break
else:
print("❌ Passordene er ikke like. Prøv igjen.\n")
password_hash = pbkdf2_sha256.hash(password)
otp_secret = pyotp.random_base32()
print("⏳ Genererer PBKDF2-hash...")
password_hash = pbkdf2_sha256.hash(password)
print(f"[DEBUG] Hash generert. Lengde: {len(password_hash)} tegn.")
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✅ GENERERING VELLYKKET!")
print("\nADMIN BRUKER OPPRETTET")
print("-" * 50)
print("SLIK LEGGER DU INN BRUKEREN TRYGT:")
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.")
print("-" * 50)
print("1. Gå inn i databasen:")
print(" docker exec -it teeoff_db psql -U teeoff_admin -d teeoff")
print("\n2. Lim inn disse to linjene nøyaktig slik de står:")
print("TRUNCATE admins;")
print(f"INSERT INTO admins (username, email, password_hash, otp_secret) VALUES ('{safe_username}', '{safe_email}', '{password_hash}', '{otp_secret}');")
print("\n3. Skriv 'exit' for å gå ut.")
print("-" * 50)
print("4. KONFIGURER 2FA I GOOGLE AUTHENTICATOR:")
print(f"Bruk denne nøkkelen: {otp_secret}")
print(f"2FA-nøkkel: {otp_secret}")
print("-" * 50 + "\n")
if __name__ == "__main__":
try:
generate_admin()
asyncio.run(generate_admin())
except KeyboardInterrupt:
print("\nAvbrutt.")
sys.exit(0)

View file

@ -1,6 +1,7 @@
import asyncio
import asyncpg
import os
import sys
from passlib.context import CryptContext
from env_config import get_database_url, get_required_env
@ -17,6 +18,7 @@ async def test_sannheten():
username = os.getenv("TEST_ADMIN_USERNAME", "Envide Webutvikling").strip()
test_password = get_required_env("TEST_ADMIN_PASSWORD")
conn = None
try:
conn = await asyncpg.connect(DB_URL)
row = await conn.fetchrow("SELECT password_hash FROM admins WHERE username = $1", username)
@ -26,9 +28,8 @@ async def test_sannheten():
return
db_hash = row['password_hash']
print(f"1. Hash funnet i databasen: {db_hash[:30]}...")
print(f"2. Tester mot passordet: '{test_password}'")
print("1. Hash funnet i databasen.")
print("2. Tester om oppgitt TEST_ADMIN_PASSWORD matcher.")
# Den magiske testen
is_valid = pwd_context.verify(test_password, db_hash)
@ -40,8 +41,11 @@ async def test_sannheten():
else:
print("❌ FEIL! Passordet stemmer IKKE med hashen i databasen.")
print("➡️ KONKLUSJON: Scriptet som oppdaterer passordet gjør en feil (f.eks. legger til usynlige tegn), eller lagringen i databasen blir korrupt.")
except Exception as exc:
print(f"❌ Kunne ikke teste admin-login: {type(exc).__name__}")
sys.exit(1)
finally:
if conn is not None:
await conn.close()
if __name__ == "__main__":

View file

@ -8,7 +8,6 @@ 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
@ -23,10 +22,11 @@ async def update_admin_password():
print("="*50)
# Kobler til databasen på ekte backend-vis
conn = None
try:
conn = await asyncpg.connect(DB_URL)
except Exception as e:
print(f"❌ Kunne ikke koble til databasen: {e}")
except Exception as exc:
print(f"❌ Kunne ikke koble til databasen: {type(exc).__name__}")
sys.exit(1)
try:
@ -55,7 +55,6 @@ async def update_admin_password():
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")
@ -75,6 +74,7 @@ async def update_admin_password():
finally:
# Lukk tilkoblingen pent
if conn is not None:
await conn.close()
if __name__ == "__main__":