Files
controles/create_test_users.py

130 lines
5.5 KiB
Python
Raw Permalink Normal View History

from functions.database import get_db_connection, Usuario
from functions.rbac import Role
import pyotp
import qrcode
import os
import base64
from io import BytesIO
def create_test_users():
"""Cria usuários de teste se não existirem"""
db = get_db_connection()
try:
# Usuários de teste
test_users = [
{
'username': 'teste',
'password': 'admin123', # Mesma senha do admin
'email': 'teste@controles.com',
'is_admin': True
},
{
'username': 'aligner',
'password': 'Test123!@#',
'email': 'aligner@controles.com',
'is_admin': False
},
{
'username': 'tester',
'password': 'Test123!@#',
'email': 'tester@controles.com',
'is_admin': False
},
{
'username': 'deployer',
'password': 'Test123!@#',
'email': 'deployer@controles.com',
'is_admin': False
}
]
# Obter o OTP secret do admin se existir
admin = db.query(Usuario).filter_by(username='admin').first()
admin_otp_secret = admin.otp_secret if admin else None
for user_data in test_users:
# Verificar se o usuário já existe
user = db.query(Usuario).filter_by(username=user_data['username']).first()
if not user:
print(f"Criando usuário {user_data['username']}...")
# Criar usuário
user = Usuario(
username=user_data['username'],
email=user_data['email'],
is_admin=user_data['is_admin']
)
user.set_password(user_data['password'])
user.tipo = "ADMIN" if user_data['is_admin'] else "USUARIO"
# Se for o usuário teste, usar o mesmo OTP do admin
if user_data['username'] == 'teste' and admin_otp_secret:
user.otp_secret = admin_otp_secret
else:
# Gerar novo OTP para outros usuários
user.otp_secret = pyotp.random_base32()
db.add(user)
db.commit()
# Atribuir role de Secretário Geral para o usuário teste
if user_data['username'] == 'teste':
admin_role = db.query(Role).filter_by(nivel=Role.SECRETARIO_GERAL).first()
if admin_role:
user.roles.append(admin_role)
db.commit()
print(f"Usuário {user_data['username']} criado com sucesso!")
# Gerar QR code para o novo usuário
qr_path = f"{user_data['username']}_qr.png"
if not os.path.exists(qr_path):
totp = pyotp.TOTP(user.otp_secret)
qr = qrcode.QRCode(version=1, box_size=10, border=5)
qr.add_data(totp.provisioning_uri(user.email, issuer_name="Sistema de Controles"))
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.save(qr_path)
print(f"QR Code gerado para {user_data['username']} em: {qr_path}")
else:
print(f"Usuário {user_data['username']} já existe")
# Se for o usuário teste e não tiver o OTP do admin, atualizar
if user_data['username'] == 'teste' and admin_otp_secret and user.otp_secret != admin_otp_secret:
user.otp_secret = admin_otp_secret
db.commit()
print(f"OTP do usuário teste atualizado para o mesmo do admin")
elif not user.otp_secret:
# Se não tiver OTP, gerar um novo
user.otp_secret = pyotp.random_base32()
db.commit()
print(f"Novo OTP gerado para {user_data['username']}")
# Gerar QR code
qr_path = f"{user_data['username']}_qr.png"
if not os.path.exists(qr_path):
totp = pyotp.TOTP(user.otp_secret)
qr = qrcode.QRCode(version=1, box_size=10, border=5)
qr.add_data(totp.provisioning_uri(user.email, issuer_name="Sistema de Controles"))
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.save(qr_path)
print(f"QR Code gerado para {user_data['username']} em: {qr_path}")
# Verificar se o usuário teste tem a role de Secretário Geral
if user_data['username'] == 'teste':
admin_role = db.query(Role).filter_by(nivel=Role.SECRETARIO_GERAL).first()
if admin_role and admin_role not in user.roles:
user.roles.append(admin_role)
db.commit()
print(f"Role de Secretário Geral atribuída ao usuário teste")
except Exception as e:
print(f"Erro ao criar usuários de teste: {str(e)}")
db.rollback()
raise
finally:
db.close()
if __name__ == '__main__':
create_test_users()