from functions.database import init_database, Usuario, get_db_connection import qrcode import os from pathlib import Path import pyotp def generate_qr_code(user): """ Gera o QR code para um usuário específico Args: user: Instância do modelo Usuario Returns: Path: Caminho do arquivo QR code gerado """ import qrcode # Gerar QR Code apenas na raiz do projeto qr_path = Path('admin_qr.png') # Remover arquivo antigo se existir if qr_path.exists(): os.remove(str(qr_path)) # Gerar e salvar QR Code qr = qrcode.QRCode(version=1, box_size=10, border=5) qr.add_data(user.get_otp_uri()) qr.make(fit=True) img = qr.make_image(fill_color="black", back_color="white") img.save(str(qr_path)) print(f"\nQR Code gerado em: {os.path.abspath(qr_path)}") return qr_path def create_admin_user(): try: # Inicializar o banco de dados init_database() # Obter a sessão db_session = get_db_connection() # Verificar se o admin foi criado admin = db_session.query(Usuario).filter_by(username="admin").first() if admin: print("\n=== Usuário Admin Encontrado ===") # Atualizar QR code mesmo se o usuário já existir qr_path = generate_qr_code(admin) else: print("\n=== Criando Novo Usuário Admin ===") # Criar usuário admin com novo segredo OTP admin = Usuario( username="admin", password="admin123", is_admin=True ) admin.email = "admin@example.com" # Adicionar e fazer commit para obter o ID db_session.add(admin) db_session.commit() # Recarregar o usuário do banco para garantir dados atualizados admin = db_session.query(Usuario).filter_by(username="admin").first() # Verificar e mostrar informações do OTP print("\n=== Informações do Usuário Admin ===") print(f"Username: admin") print(f"Senha: admin123") print(f"Email: {admin.email}") print(f"Segredo OTP atual: {admin.otp_secret}") # Gerar URI do OTP usando o segredo armazenado totp = pyotp.TOTP(admin.otp_secret) otp_uri = totp.provisioning_uri( name=admin.username, issuer_name="Sistema de Controles" ) # Usar a função extraída para gerar o QR code qr_path = generate_qr_code(admin) print("\n=== QR Code Gerado ===") print(f"QR Code salvo em: {qr_path}") print(f"URI do OTP: {otp_uri}") # Gerar código atual para verificação current_code = totp.now() print("\n=== Verificação do OTP ===") print(f"Código OTP atual: {current_code}") print(f"Verificação do código: {totp.verify(current_code)}") print("\n=== Instruções para Configuração ===") print("1. Instale um aplicativo autenticador no seu celular") print(" (Google Authenticator, Microsoft Authenticator, etc)") print("2. Abra o aplicativo") print("3. Selecione a opção para adicionar uma nova conta") print("4. Escaneie o QR Code salvo em:", qr_path) print("\nOU configure manualmente:") print(f"- Nome da conta: {admin.username}") print(f"- Segredo: {admin.otp_secret}") print("- Tipo: Baseado em tempo (TOTP)") print("- Algoritmo: SHA1") print("- Dígitos: 6") print("- Intervalo: 30 segundos") # Verificação final print("\n=== Teste de Verificação ===") test_code = totp.now() print(f"Código de teste: {test_code}") is_valid = admin.verify_otp(test_code) print(f"Verificação do código: {'Sucesso' if is_valid else 'Falha'}") if not is_valid: print("\nALERTA: Verificação do OTP falhou!") print("Por favor, verifique se o segredo OTP está correto.") except Exception as e: print(f"\nErro durante a execução: {e}") import traceback traceback.print_exc() finally: if 'db_session' in locals(): db_session.close() if __name__ == "__main__": # Remover banco de dados existente para começar limpo db_path = Path.home() / '.local' / 'share' / 'controles' / 'database.db' if db_path.exists(): os.remove(db_path) print("Banco de dados antigo removido.") create_admin_user()