from fastapi_login import LoginManager from fastapi.requests import Request from fastapi.exceptions import HTTPException from .config import Config import hashlib import binascii class NotAuthenticatedException(Exception): pass class MyLoginManager(LoginManager): @property def not_authenticated_exception(self): # FastAPI userland intercetterà questa eccezione e farà il redirect (vedi app.py) return NotAuthenticatedException() # Istanzia il manager senza custom_exception manager = MyLoginManager( Config.secret, token_url=Config.token_url ) def hash_password(plaintext: str): """ Hash della password (usa il pwd_context configurato in fastapi-login/passlib). """ return manager.pwd_context.hash(plaintext) def verify_password(plaintext: str, hashed: str): """ Verifica: prima confronta l'NT hash (MD4/UTF-16LE) se il db salva così; in quel caso, per coerenza, facciamo comunque una verifica col pwd_context. """ nt = hashlib.new('md4', plaintext.encode('utf-16le')).digest() nt_hex = binascii.hexlify(nt).upper().decode("utf-8") if hashed == nt_hex: # Forza una verifica con passlib per mantenere compatibilità con pwd_context return manager.pwd_context.verify(plaintext, manager.pwd_context.hash(plaintext)) else: # Se il db salva già un hash passlib, puoi cambiare questa riga in: # return manager.pwd_context.verify(plaintext, hashed) return False def is_admin(request: Request): """ Esempio placeholder: alza 401 se non autenticato o non admin. Integra con la tua logica utente. """ user = getattr(request.state, "user", None) if user is None: raise HTTPException(status_code=401) if not getattr(user, "is_admin", False): raise HTTPException(status_code=401) return user