No se pueden conceder derechos de administrador debido a un error

Hola!

Al intentar otorgar derechos de administrador a un usuario (a cualquier usuario, en realidad) solo recibo el siguiente mensaje de error (después de hacer clic en el enlace de confirmación):

Revisé los registros y encontré los siguientes mensajes:

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

Aproximadamente al mismo tiempo, también recibo un mensaje sobre que MaxMind no funciona correctamente, no estoy seguro de si esto tiene algo que ver (no encontré ninguna configuración relacionada en la interfaz de administración):

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

¿Cómo puedo depurar esto más a fondo?

Gracias,
Hannes

¿Obtienes ese error cuando haces clic en el botón “Conceder administrador”?

No, hacer clic en el botón “Conceder administrador” funciona.

El proceso completo es el siguiente:

  1. Hago clic en el botón “Conceder administrador”, la aplicación me presenta una ventana modal “Te hemos enviado un correo electrónico para verificar al nuevo administrador. Por favor, ábrelo y sigue las instrucciones”.
  2. Hago clic en el enlace de confirmación en el correo electrónico (“Confirmar cuenta de administrador”), que me lleva a una página de confirmación.
  3. En la página de confirmación, hago clic en el botón “Conceder acceso de administrador”, que luego produce la página de error (ver captura de pantalla en mi publicación original) y también los mensajes de error en el registro.

También acabo de notar el siguiente mensaje más arriba en el registro (precedido por el número 46, ¿significa que se ha repetido 46 veces?):

Error ensuring consistency for Group: Validation failed: Name has already been taken

Este parece ser un caso límite muy interesante. Suponiendo que está autohospedado, ¿qué devuelve esto?

./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]]

Discourse es muy particular con estos IDs, staff debe ser 2, admins debe ser 1. Si de alguna manera tiene un grupo diferente con ese nombre, podría haber problemas. También me aseguraría de que ningún usuario se llame admins.

Parece ser así (hay muchos más grupos, pero claramente los creamos nosotros y no se parecían en nada a los grupos del sistema, así que no los incluí a continuación):

=> [["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]]

Noto que no hay un grupo staff, solo Staff. Si staff siempre tiene el id 3, entonces supongo que esto indica que alguien lo eliminó y creó un nuevo grupo (id 42).

¿Es suficiente volver a crear staff o cómo puedo solucionar esto?

Sí, creo que cambiar el nombre de tu grupo de personal será suficiente para solucionar el problema

1 me gusta

La interfaz de usuario no me permite hacerlo:

¿Necesito hacerlo directamente en la base de datos?

¿Es posible renombrar el grupo usando la línea de comandos o cómo puedo resolver esta situación?

Intenta directamente desde la base de datos, entonces, debería ser seguro

2 Me gusta

¡Sí, eso funcionó! El grupo existía, pero alguien lo había renombrado; dado que esto básicamente rompe la funcionalidad principal, me pregunto si se debería prohibir el cambio de nombre de los grupos del sistema en la interfaz de usuario.

Para que conste, en caso de que alguien se encuentre en una situación similar:

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

Sí, absolutamente debería ser un estado al que no se puede acceder.

3 Me gusta