`run_second_factor!` falha ao tentar promover admin

Seguindo em Can't upgrade user to admin - unhandled server error

(Olá @Discoursenaut.) Passei a tarde toda nisso. Ainda não consigo descobrir qual é o problema, mas se eu adicionar um rescue na linha 1099 (`manager.run!') o misterioso erro "Ocorreu um erro de servidor não tratado". Não consigo encontrar essa string em nenhum lugar no código-fonte.

Capturar o erro não ajuda, pois result não está definido, então falha mais tarde.

Tentei isso com todas as permutações de ter o usuário com 2FA ativado/desativado, enforce_second_factor desativado/staff. Estranhamente, quando adicionei meu usuário hoje e tentei torná-lo um administrador de outra conta de administrador, funcionou como esperado, mas nenhum outro administrador pode tornar outros usuários administradores. Eles dizem que este tem sido um problema por um ano. Poderia haver algum problema no banco de dados?

É uma compilação recente (pelo menos uma hoje). Apenas plugins padrão e mesmo no modo de segurança.

@Osama, você tem um comentário algumas linhas depois, talvez você tenha uma ideia?

Não estou vendo como result pode ser indefinido, dado:

Você tem certeza absoluta de que está na versão mais recente?

1 curtida

Executei uma reconstrução hoje.

Existe algum outro lugar onde eu possa colocar um log de depuração?

Se você puder nos fornecer uma reprodução mínima (como uma lista de configurações do site e seus valores), isso ajudará muito.

Você pode rescue o método inteiro e registrar o erro?

def run_second_factor!(action_class, action_data: nil, target_user: current_user)
  if current_user && target_user != current_user
    # Anon pode executar 2fa contra outro alvo, mas usuários logados não devem.
    # Isso deve ser validado no local de chamada de `run_second_factor!`.
    raise "executar 2fa contra outro usuário não é permitido"
  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 deve acontecer, mas quero saber se de alguma forma acontecer! (osama)
    raise "processo 2fa acabou em um estado ruim!"
  end

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

Algo deve aparecer em /logs assim que você fizer essa alteração (e recarregar os workers do Unicorn) e isso deve nos ajudar a descobrir qual é o problema.

2 curtidas

Suspiro. Parece que o erro em run_second_factor! foi causado pelas minhas declarações de depuração; causar bugs ao procurá-los é um dos meus passatempos favoritos.

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)

Acho que o guardião não está me permitindo tornar o usuário um administrador por algum motivo.

Mas ainda não entendo por que está falhando e por que exibe An unhandled server error has occurred. como erro, quando não encontro esse erro em nenhum lugar no código do Discourse.

Ah. E isso é interessante. Consegui mudar de jay@example.com para myaddress@gmail.com, mas tentar confirmar um endereço de myaddress+123@gmail.com também gera a mensagem “An unhandled server error has occurred.”. normalize_emails não está definido.

Acho que algo está errado com run_second_factor!, mas não consigo descobrir o quê. Estou adicionando alguns Rails.logger.warn com alguns xxx.inspects, então talvez eu encontre algo.

Da melhor forma que consigo entender, algo está errado com o auth_manager. Parece que ele está tentando redirecionar por algum motivo? Usuários normais não são obrigados a ter 2fa, então não sei por que um usuário comum não conseguiria alterar seu endereço de e-mail. Mas tentei com um usuário sem 2fa, códigos de backup, logado antes de clicar no link de confirmação de novo e-mail e depois de logado, e todos falham com “An unhandled server error has occurred.”.

Isso parece relacionado:

O erro 403 é normal e esperado — o aplicativo frontend captura a resposta 403 e a interpreta como “não é possível conceder permissão de administrador porque a autenticação de dois fatores (2FA) é necessária, vamos navegar para a página de 2FA”.

O que não é normal é:

Você pode me dizer onde está vendo esse erro? É um pop-up no frontend? Um erro nos logs? Como você mencionou, não consigo encontrar essa mensagem de erro em nenhum lugar em todo o histórico da base de código, então é muito estranho.

Então, talvez o backend não esteja renderizando as coisas que contêm o URL do 2FA? Mas o erro ocorre independentemente de o usuário ter o 2FA ativado e independentemente de a configuração do site “force-2fa” estar habilitada. E independentemente de o usuário estar logado com o 2FA já configurado.

Certo. Eu tentei o modo seguro, mas estes são os 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

A única pista que encontrei é que isso implica que a mensagem vem do próprio Rails. Ainda assim, não consegui descobrir como isso poderia estar acontecendo.

Então, talvez algo esteja em jogo que esteja acionando “precisamos de 2FA” quando, na verdade, o 2FA não é necessário. Certamente faz sentido que um erro seja acionado para fazer o login com 2FA quando nenhum existe. Acho que isso está no guardian? Não consigo descobrir onde colocar depuração de Rails.logger para depurar isso.

1 curtida

Esta é uma possibilidade remota, então peço desculpas se eu estiver dizendo algo totalmente ridículo… mas pesquisar por “An unhandled server error has occurred” refere-se apenas ao código do Bitwarden, o que me leva a crer que pode haver algo em seu sistema local que esteja interceptando / bagunçando sua solicitação. Isso é algo que você consegue reproduzir de outro computador?

2 curtidas

Você pode verificar a aba de redes nas ferramentas de desenvolvedor do seu navegador e ver como está a resposta para a solicitação para o endpoint grant_admin?

Por favor, mostre também a aba Payload.

2 curtidas

image

Isso parece estar vindo do servidor. Não consigo encontrar essa string no banco de dados (digamos, em texto personalizado) ou fazendo grep em todo o /var/www/discourse

Não há aba Payload:

image

Espere!!! Restaurei o banco de dados para outro servidor e ele redireciona corretamente para a página do segundo fator, que, após obter a chave do segundo fator, muda imediatamente o status de administrador do usuário (sem e-mail necessário! o que eu não sabia!).

Portanto, é algo com . . . algo, mas uma instalação limpa e quase padrão resolve o problema. Em qualquer caso, não é (obviamente?) um :discourse: :bug: . Mudei a categoria.

A outra explicação potencial, que também parece forçada, é que há algo de errado com o modelo UserSecondFactor, pois fiz um UserSecondFactor.all.destroy_all;UserSecurityKey.all.destroy_all; no meu servidor de teste, já que ele tinha um nome de domínio diferente. Também usei o Google Authenticator em vez da minha Yubi key.

1 curtida

Este tópico foi fechado automaticamente 30 dias após a última resposta. Novas respostas não são mais permitidas.