import os from functions.database import get_db_connection, Usuario from functions.rbac import Role import pyotp import qrcode import base64 from io import BytesIO def create_admin(): """Cria o usuário admin se não existir""" db = get_db_connection() try: # Verificar se o admin já existe admin = db.query(Usuario).filter_by(username='admin').first() if admin: print("Usuário admin já existe") # Verificar se o arquivo admin_qr.png existe if os.path.exists('admin_qr.png'): print("Usando OTP existente do arquivo admin_qr.png") # Extrair o OTP secret do QR code existente with open('admin_qr.png', 'rb') as f: qr_data = f.read() # Aqui você precisaria implementar a lógica para extrair o OTP secret do QR code # Por enquanto, vamos apenas manter o OTP existente return else: print("Gerando novo OTP para o admin...") # Gerar novo OTP otp_secret = pyotp.random_base32() admin.otp_secret = otp_secret db.commit() else: print("Criando usuário admin...") # Criar usuário admin admin = Usuario( username='admin', password='admin123', is_admin=True ) admin.email = 'admin@controles.com' db.add(admin) db.commit() # Gerar OTP otp_secret = pyotp.random_base32() admin.otp_secret = otp_secret db.commit() # Atribuir role de Secretário Geral admin_role = db.query(Role).filter_by(nivel=Role.SECRETARIO_GERAL).first() if admin_role: admin.roles.append(admin_role) db.commit() # Gerar QR code totp = pyotp.TOTP(otp_secret) provisioning_uri = totp.provisioning_uri(admin.username, issuer_name="Sistema de Controles") qr = qrcode.QRCode(version=1, box_size=10, border=5) qr.add_data(provisioning_uri) qr.make(fit=True) img = qr.make_image(fill_color="black", back_color="white") # Salvar QR code como base64 buffered = BytesIO() img.save(buffered, format="PNG") qr_base64 = base64.b64encode(buffered.getvalue()).decode() # Salvar QR code como arquivo img.save('admin_qr.png') print("\nConfiguração do OTP para o admin:") print(f"OTP Secret: {otp_secret}") print("\nInstruções:") print("1. Use um aplicativo autenticador (como Google Authenticator ou Authy)") print("2. Escaneie o QR code ou insira o OTP Secret manualmente") print("3. Use o código gerado para fazer login") print("\nQR code salvo em 'admin_qr.png'") except Exception as e: print(f"Erro ao criar admin: {str(e)}") db.rollback() raise finally: db.close() if __name__ == '__main__': create_admin()