Impossível conceder direitos de admin devido a um erro

Olá!

Ao tentar conceder direitos de administrador a um usuário (qualquer usuário, na verdade), recebo apenas a seguinte mensagem de erro (após clicar no link de confirmação):

Verifiquei os logs e encontrei as seguintes mensagens:

ActiveRecord::RecordInvalid (Validation failed: Name has already been taken) app/models/group.rb:607:in 'refresh_automatic_group!' app/models/group.rb:666:in 'block in refresh_automatic_groups!' app/m

Failed to handle exception in exception app middleware : ActiveRecord::RecordInvalid : Validation failed: Name has already been taken

Na mesma época, também recebo uma mensagem sobre o MaxMind não estar funcionando corretamente, não tenho certeza se isso tem algo a ver com o problema (não encontrei nenhuma configuração relacionada na interface de administração):

MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-City.mmdb) could not be found: No such file or directory @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-City.mmdb

Como posso depurar isso ainda mais?

Obrigado,
Hannes

Você recebe esse erro quando clica no botão "Conceder administrador"?

Não, clicar no botão "Conceder Administrador" funciona.

O processo completo é o seguinte:

  1. Eu clico no botão "Conceder Administrador", a aplicação me apresenta um modal "Enviamos um e-mail para você para verificar o novo administrador. Por favor, abra-o e siga as instruções."
  2. Eu clico no link de confirmação no e-mail ("Confirmar Conta de Administrador"), que me leva a uma página de confirmação.
  3. Na página de confirmação, eu clico no botão "Conceder Acesso de Administrador", que então produz a página de erro (veja a captura de tela na minha postagem original) e também as mensagens de erro no log.

Eu também acabei de notar a seguinte mensagem mais acima no log (prefixada com o número 46 - isso significa que foi repetida 46 vezes?):

Erro ao garantir a consistência do Grupo: Falha na validação: O nome já foi utilizado

isso parece um caso extremo muito interessante. Assumindo que está auto-hospedado, o que isso retorna?

./launcher enter app
rails c
Group.pluck(:name, :id)
=> [["everyone", 0],
 ["moderators", 2],
 ["admins", 1],
 ["staff", 3],
 ["trust_level_0", 10],
 ["trust_level_1", 11],
 ["trust_level_2", 12],
 ["trust_level_3", 13],
 ["trust_level_4", 14]]

O Discourse é muito particular sobre esses IDs, staff deve ser 2, admins devem ser 1. Se de alguma forma você tiver um grupo diferente com esse nome, pode haver problemas. Eu também garantiria que nenhum usuário seja chamado de admins.

Parece com isto (há muitos outros grupos, mas eles foram claramente criados por nós e não tinham qualquer semelhança com os grupos do sistema, por isso não os incluí abaixo):

=> [["everyone", 0],
 ["moderators", 2],
 ["admins", 1],
 ["trust_level_0", 10]
 ["trust_level_1", 11],
 ["trust_level_2", 12],
 ["trust_level_3", 13],
 ["trust_level_4", 14],
 ["Staff", 42]]

Notei que não há o grupo staff, apenas Staff - se staff sempre tem o id 3, então acho que isso indica que alguém o removeu e criou um novo grupo (id 42).

É suficiente criar staff novamente ou como posso resolver isto?

Sim, acho que renomear seu grupo de equipe será suficiente para resolver o problema

1 curtida

A UI não me permite fazer isso:

Preciso fazer isso diretamente no banco de dados?

É possível renomear o grupo usando a linha de comando ou como posso resolver esta situação?

Tente diretamente do banco de dados então, deve ser seguro

2 curtidas

Sim, isso resolveu o problema! O grupo existia, mas alguém o renomeou - como isso basicamente quebra a funcionalidade principal, estou me perguntando se a renomeação de grupos do sistema deveria ser proibida na interface do usuário.

Para registro, caso alguém se encontre em uma situação semelhante:

docker exec -it app /bin/bash
su - postgres
psql -d discourse
discourse=# update groups set name='staff' where id=3;
\q
5 curtidas

Sim, definitivamente deveria ser um estado em que você não pode entrar.

3 curtidas