`run_second_factor!` falla al intentar promover a administrador

Siguiendo Can't upgrade user to admin - unhandled server error

(Hola @Discoursenaut.) Pasé toda la tarde en esto. Todavía no puedo averiguar cuál es el problema real, pero si agrego un rescue alrededor de la línea 1099 (`manager.run!') el misterioso error “Ha ocurrido un error de servidor no controlado”. No puedo encontrar esa cadena en ninguna parte del código fuente.

Capturar el error no ayuda ya que result no está definido, por lo que falla más tarde.

He intentado esto con todas las permutaciones de tener al usuario con 2FA habilitado/no habilitado, enforce_second_factor desactivado/personal. Curiosamente, cuando agregué mi usuario hoy e intenté convertirlo en administrador desde otra cuenta de administrador, funcionó como se esperaba, pero ningún otro administrador puede convertir a ningún otro usuario en administrador. Dicen que este ha sido un problema durante un año. ¿Podría haber algún problema con la base de datos?

Es una compilación reciente (al menos una de hoy). Solo plugins estándar e incluso con modo seguro.

@Osama, tienes un comentario un par de líneas más abajo, ¿quizás tienes alguna idea?

No veo cómo result puede ser indefinido dado:

¿Estás absolutamente seguro de que estás en la última versión?

1 me gusta

Ejecuté una reconstrucción hoy.

¿Hay algún otro lugar donde pueda poner un registro de depuración?

Si puede proporcionarnos una reproducción mínima (como una lista de la configuración del sitio y sus valores), nos ayudaría mucho.

¿Puedes rescue todo el método y registrar el error?

def run_second_factor!(action_class, action_data: nil, target_user: current_user)
  if current_user && target_user != current_user
    # Anon puede ejecutar 2fa contra otro objetivo, pero los usuarios autenticados no deberían.
    # Esto debe validarse en el sitio de llamada `run_second_factor!`.
    raise "no se permite ejecutar 2fa contra otro usuario"
  end

  action = action_class.new(guardian, request, opts: action_data, target_user: target_user)
  manager = SecondFactor::AuthManager.new(guardian, action, target_user: target_user)
  yield(manager) if block_given?
  result = manager.run!(request, params, secure_session)

  if !result.no_second_factors_enabled? && !result.second_factor_auth_completed? &&
       !result.second_factor_auth_skipped?
    # nunca debería suceder, ¡pero quiero saber si de alguna manera sucede! (osama)
    raise "¡el proceso 2fa terminó en un mal estado!"
  end

  result
+rescue => err
+  Rails.logger.error(err.full_message)
+  raise
end

Algo debería aparecer en /logs una vez que hagas este cambio (y recargues los workers de Unicorn) y eso debería ayudarnos a averiguar cuál es el problema.

2 Me gusta

Sus. Parece que el error en run_second_factor! se debió a mis declaraciones de depuración; causar errores al buscarlos es una de mis actividades favoritas.

Started PUT "/admin/users/30591/grant_admin" for 174.50.213.142 at 2024-07-02 14:14:38 +0000
Processing by Admin::UsersController#grant_admin as */*
  Parameters: {"user_id"=>"30591"}
Completed 403 Forbidden in 6ms (Views: 0.1ms | ActiveRecord: 0.0ms | Allocations: 2263)

Supongo que el guardián no me permite hacer administrador al usuario por alguna razón.

Pero todavía no entiendo por qué falla y por qué muestra el error “Ha ocurrido un error de servidor no manejado”, cuando no encuentro ese error en ninguna parte del código de Discourse.

Ah. Y esto es interesante. He podido cambiar de jay@example.com a myaddress@gmail.com, pero intentar confirmar una dirección de myaddress+123@gmail.com también muestra el mensaje “Ha ocurrido un error de servidor no manejado”. normalize_emails no está configurado.

Creo que algo anda mal con run_second_factor!, pero no puedo entender exactamente qué. Estoy agregando algunos Rails.logger.warn con algunos xxx.inspect, así que tal vez encuentre algo.

Lo mejor que puedo deducir es que algo anda mal con el auth_manager. ¿Parece que tal vez está intentando redirigir por alguna razón? Los usuarios normales no requieren 2fa, así que no sé por qué un usuario normal no podría cambiar su dirección de correo electrónico. Pero lo he intentado con un usuario sin 2fa, códigos de respaldo, iniciado sesión antes de hacer clic en el enlace de confirmar nuevo correo electrónico y después de iniciar sesión, y todos fallan con “Ha ocurrido un error de servidor no manejado”.

Esto parece relacionado:

El error 403 es normal y esperado: la aplicación frontend captura la respuesta 403 y la interpreta como “no se puede conceder acceso de administrador porque se requiere 2FA, vamos a navegar a la página de 2FA”.

Lo que no es normal es:

¿Puedes decirme dónde estás viendo este error? ¿Es una ventana emergente en el frontend? ¿Un error en los registros? Como mencionas, no puedo encontrar este mensaje de error en ningún lugar del historial completo del código base, así que es muy extraño.

Entonces, ¿quizás el backend no está renderizando las cosas que tienen la URL de 2FA? Pero el error ocurre independientemente de si el usuario tiene activado el 2FA y de si la configuración del sitio force-2fa está habilitada. Y independientemente de si el usuario ha iniciado sesión con 2FA ya configurado.

Correcto. He probado el modo seguro, pero estos son los plugins:

          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-topic-voting.git
          - git clone https://github.com/discourse/discourse-chat-integration.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-reactions.git
          - git clone https://github.com/discourse/discourse-docs.git
          - git clone https://github.com/discourse/discourse-user-notes.git

La única pista que he encontrado es que implica que el mensaje proviene de Rails mismo. Aun así, no he podido averiguar cómo podría estar sucediendo eso.

Así que tal vez algo está en juego que está activando “necesitamos 2FA” cuando, de hecho, el 2FA no es necesario. Ciertamente tiene sentido que se active un error para iniciar sesión con 2FA cuando no existe ninguno. Supongo que eso está en guardian? No puedo averiguar dónde poner la depuración de Rails.logger para depurar eso.

1 me gusta

Esta es una posibilidad muy remota, así que me disculpo si digo algo totalmente ridículo… pero buscar en Google " An unhandled server error has occurred" se refiere únicamente al código de Bitwarden, lo que me lleva a creer que podría haber algo en tu sistema local que esté interceptando / interfiriendo con tu solicitud. ¿Puedes reproducir esto desde otra computadora?

2 Me gusta

¿Puedes revisar la pestaña de redes en las herramientas de desarrollador de tu navegador y ver cómo se ve la respuesta para la solicitud al endpoint grant_admin?

Por favor, muestra también la pestaña Payload.

2 Me gusta

image

Esto parece venir del servidor. No puedo encontrar esa cadena en la base de datos (por ejemplo, en texto personalizado) ni buscando en todo /var/www/discourse.

No hay pestaña de Carga útil:

image

¡Espera!!! Restauré la base de datos en otro servidor y redirige correctamente a la página del segundo factor, que, después de obtener la clave del segundo factor, cambia inmediatamente el estado de administrador del usuario (¡no se requiere correo electrónico! ¡lo cual no sabía!).

Así que es algo con . . . algo, pero una instalación limpia y mayormente estándar resuelve el problema. En cualquier caso, no es (obviamente) un :discourse: :bug: . Cambié la categoría.

La otra explicación potencial, que también parece exagerada, es que hay algo mal con el modelo UserSecondFactor, ya que hice un UserSecondFactor.all.destroy_all;UserSecurityKey.all.destroy_all; en mi servidor de prueba ya que tenía un nombre de dominio diferente. También usé Google Authenticator en lugar de mi Yubi key.

1 me gusta

Este tema se cerró automáticamente 30 días después de la última respuesta. Ya no se permiten nuevas respuestas.