在尝试提升管理员权限时,`run_second_factor!` 失败

Can't upgrade user to admin - unhandled server error 的基础上。

(嘿 @Discoursenaut。)我花了一整个下午来处理这个问题。我仍然找不到问题的真正所在,但如果我在第 1099 行(manager.run!')周围添加一个 rescue`,神秘的“发生未处理的服务器错误。”错误就会消失。我在源代码中找不到这个字符串。

捕获错误没有帮助,因为 result 未定义,所以稍后会失败。

我尝试了用户启用/未启用 2FA、enforce_second_factor 关闭/员工的所有排列组合。奇怪的是,当我今天添加我的用户并尝试从另一个管理员帐户将其设为管理员时,它按预期工作,但其他管理员无法将任何其他用户设为管理员。他们说这个问题已经存在一年了。会不会是数据库问题?

这是一个最近的构建(至少是今天的)。只有标准的插件,即使在安全模式下也是如此。

@Osama,你在几行之后有一个评论,也许你有什么想法?

不明白在以下代码中 result 如何会是 undefined:

您确定您使用的是绝对最新的版本吗?

1 个赞

我今天运行了重建。

我能把调试日志放在别处吗?

如果您能提供一个最小化的重现(例如站点设置及其值的列表),那将非常有帮助。

你能 rescue 整个方法并记录错误吗?

def run_second_factor!(action_class, action_data: nil, target_user: current_user)
  if current_user && target_user != current_user
    # Anon 可以针对其他目标运行 2fa,但已登录用户不应如此。
    # 这应该在 `run_second_factor!` 调用站点进行验证。
    raise "running 2fa against another user is not allowed"
  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?
    # 永远不应该发生,但我很想知道如果它发生了(Osama)。
    raise "2fa process ended up in a bad state!"
  end

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

一旦你做出这个改变(并重新加载 Unicorn workers),/logs 就会显示一些东西,这应该能帮助我们弄清楚问题所在。

2 个赞

叹气。看来 run_second_factor! 中的错误是我的调试语句造成的;查找它们时引起错误是我最喜欢的消遣方式之一。

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)

我猜守护进程因为某种原因不允许我将该用户设为管理员。

但我仍然不明白为什么它会失败,以及为什么它会显示“发生了未处理的服务器错误”,因为我在 Discourse 代码中找不到这个错误。

啊。这很有趣。我已经能够将电子邮件从 jay@example.com 更改为 myaddress@gmail.com,但尝试确认 myaddress+123@gmail.com 地址时也会收到“发生了未处理的服务器错误”消息。normalize_emails 未设置。

我认为 run_second_factor! 有问题,但我无法完全弄清楚。我添加了一些 Rails.logger.warn 和一些 xxx.inspect,所以也许我会找到一些东西。

我能想到的最好的就是 auth_manager 有问题。它似乎试图重定向,为什么?普通用户不需要 2FA,所以我不知道为什么普通用户无法更改他们的电子邮件地址。但我已经尝试过一个没有 2FA、没有备用代码的用户,在点击确认新电子邮件链接之前和之后登录,所有这些都以“发生了未处理的服务器错误”失败。

这似乎是相关的:

403错误是正常且符合预期的——前端应用程序会捕获403响应并将其解释为“无法授予管理员权限,因为需要双重身份验证,让我们导航到双重身份验证页面”。

不正常的是:

你能告诉我你在哪里看到这个错误吗?是前端的弹出窗口?日志中的错误?正如你提到的,我在代码库的整个历史记录中都找不到这个错误消息,所以这很奇怪。

那么,后端是否没有渲染包含双重身份验证 URL 的内容?但无论用户是否启用了双重身份验证,无论是否启用了 force-2fa 站点设置,无论用户是否已登录并设置了双重身份验证,都会发生错误。

是的。我尝试了安全模式,但这些是插件:

          - 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

我发现唯一线索是它暗示消息来自 Rails 本身。尽管如此,我还是无法弄清楚这可能如何发生。

所以也许有什么东西触发了“我们需要双重身份验证”,而实际上双重身份验证并非必需。当不存在双重身份验证时,触发双重身份验证登录错误肯定是有道理的。我猜那是在 guardian 中?我找不到在哪里放置调试 Rails.logger 来调试它。

1 个赞

这是一个非常渺茫的希望,所以如果我说了一些完全荒谬的话,请原谅……但是谷歌搜索“An unhandled server error has occurred指向 Bitwarden 代码,这让我认为可能是你本地系统上的某些东西正在拦截/干扰你的请求。你能从另一台电脑上重现这个问题吗?

2 个赞

请检查浏览器开发者工具中的“网络”选项卡,看看对 grant_admin 端点的请求响应是什么样的?

另外,请显示“Payload”选项卡。

2 个赞

image

这似乎来自服务器。我在数据库(例如自定义文本)中找不到该字符串,也无法在 /var/www/discourse 中进行全局搜索。

没有“Payload”选项卡:

image

等等!!! 我将数据库恢复到另一台服务器,它正确地重定向到第二因素页面,在获取第二因素密钥后,该页面会立即更改用户的管理员状态(无需电子邮件!我竟然不知道!)。

所以问题出在……某个地方,但一个干净的、基本标准的安装可以解决问题。无论如何,这(明显地?)不是一个 :discourse: :bug: 。我已经更改了类别。

另一个可能的解释,也似乎牵强附会,是 UserSecondFactor 模型存在某种问题,因为我在测试服务器上执行了 UserSecondFactor.all.destroy_all;UserSecurityKey.all.destroy_all;,因为它使用了不同的域名。我还使用了 Google Authenticator 而不是我的 Yubi key。

1 个赞

此主题在上次回复后 30 天自动关闭。不再允许回复。