diff --git a/sapl/legacy/migracao_usuarios.py b/sapl/legacy/migracao_usuarios.py index 2bbee7423..bd7d413e5 100644 --- a/sapl/legacy/migracao_usuarios.py +++ b/sapl/legacy/migracao_usuarios.py @@ -1,4 +1,6 @@ +import yaml from django.contrib.auth.models import Group, User + from sapl.settings import MEDIA_ROOT PERFIL_LEGADO_PARA_NOVO = {legado: Group.objects.get(name=novo) @@ -30,9 +32,20 @@ IGNORADOS = { } +def decode_nome(nome): + if isinstance(nome, bytes): + try: + return nome.decode('utf-8') + except UnicodeDecodeError: + return nome.decode('iso8859-1') + else: + assert isinstance(nome, str) + return nome + + def migra_usuarios(): """ - Lê o arquivo media/USERS e importa os usuários nele listados, + Lê o arquivo media/usuarios.yaml e importa os usuários nele listados, com senhas e perfis. Os usuários são criados se necessário e seus perfis ajustados. @@ -54,16 +67,19 @@ def migra_usuarios(): Também podemos assumir que essa é uma tarefa de um administrador """ - ARQUIVO_USUARIOS = MEDIA_ROOT.child('USERS') + ARQUIVO_USUARIOS = MEDIA_ROOT.child('usuarios.yaml') with open(ARQUIVO_USUARIOS, 'r') as f: - usuarios = eval(f.read()) + usuarios = yaml.load(f) + # conferimos de que só há um nome de usuário + assert all(nome == dados['name'] for nome, dados in usuarios.items()) usuarios = [ - (nome, - # troca senha "inicial" por uma inutilizável - senha if senha != 'inicial' else None, + (decode_nome(nome), + # troca senha "inicial" (que existe em alguns zopes) + # por uma inutilizável + dados['__'] if dados['__'] != 'inicial' else None, # filtra perfis ignorados - {p for p in perfis if p not in IGNORADOS}) - for nome, senha, perfis in usuarios] + set(dados['roles']) - IGNORADOS) + for nome, dados in usuarios.items()] for nome, senha, perfis in usuarios: usuario = User.objects.get_or_create(username=nome)[0]