`run_second_factor!` が管理者昇格時に失敗する

Can't upgrade user to admin - unhandled server error に続く

(やあ @Discoursenaut。)午後はずっとこれに取り組んでいました。実際の問題が何であるかをまだ突き止めることができませんが、1099行目(manager.run!')の周りに rescue` を追加すると、「サーバーで未処理のエラーが発生しました。」という謎のエラーが発生します。ソースのどこにもこの文字列が見つかりません。

result が定義されていないため、エラーをキャッチしても役に立たず、後で失敗します。

ユーザーが 2FA を有効/無効にしている場合、enforce_second_factor がオフ/スタッフの場合など、すべての順列を試しました。奇妙なことに、今日私のユーザーを追加して、別の管理者アカウントから管理者になろうとしたときは、期待どおりに機能しましたが、他の管理者は他のユーザーを管理者になれません。これは1年間問題になっているとのことです。データベースの問題の可能性がありますか?

最近のビルドです(少なくとも今日のビルドの1つ)。標準のプラグインのみで、セーフモードでも。

@Osama 、数行後にコメントがありますが、何かアイデアはありますか?

result が未定義になる方法がわかりません。以下を参照してください。

本当に最新バージョンを使用していますか?

「いいね!」 1

今日、再構築を実行しました。

デバッグログを他に置ける場所はありますか?

最小限の再現手順(サイト設定とその値のリストなど)をご提供いただけると、大変助かります。

メソッド全体を rescue してエラーをログに記録できますか?

def run_second_factor!(action_class, action_data: nil, target_user: current_user)
  if current_user && target_user != current_user
    # Anon can run 2fa against another target, but logged-in users should not.
    # This should be validated at the `run_second_factor!` call site.
    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?
    # should never happen, but I want to know if somehow it does! (osama)
    raise "2fa process ended up in a bad state!"
  end

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

この変更を加えて(Unicorn ワーカーをリロードして)、/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 のコードのどこにも見当たらないエラー An unhandled server error has occurred. が表示されるのか、まだ理解できません。

ああ。そして、これは興味深い。jay@example.com から myaddress@gmail.com に変更することはできましたが、myaddress+123@gmail.com のアドレスを確認しようとすると、これも「An unhandled server error has occurred.」というメッセージが表示されます。normalize_emails は設定されていません。

run_second_factor! に何か問題があると思いますが、正確には何が問題なのかよくわかりません。いくつかの Rails.logger.warnxxx.inspect を追加したので、何か見つかるかもしれません。

私の推測では、auth_manager に何か問題があるようです。何らかの理由でリダイレクトしようとしているのでしょうか? 通常のユーザーは 2fa を必要としないので、通常のユーザーがメールアドレスを変更できない理由がわかりません。しかし、2fa がないユーザー、バックアップコードがあるユーザー、確認リンクをクリックする前にログインしたユーザー、そしてログイン後にすべて試しましたが、すべて「An unhandled server error has occurred.」で失敗します。

これは関連しているようです:

403エラーは正常であり、予期されたものです。フロントエンドアプリは403レスポンスをキャッチし、「2FAが必要なため管理者権限を付与できません。2FAページに移動しましょう」と解釈します。

正常ではないのは次の点です。

このエラーはどこで確認できますか?フロントエンドのポップアップですか?ログのエラーですか?言及されているように、コードベースの履歴全体でこのエラーメッセージを見つけることができないため、非常に奇妙です。

では、バックエンドは2FA URLを含むものをレンダリングしていないのでしょうか?しかし、このエラーは、ユーザーが2FAを有効にしているかどうかにかかわらず、force-2faサイト設定が有効になっているかどうかにかかわらず、ユーザーがログインしているかどうかにかかわらず発生します。また、ユーザーがすでに設定済みの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自体から来ていることを示唆していることです。それでも、それがどのように起こりうるかを特定できませんでした。

したがって、実際には2FAが必要ないのに、「2FAが必要」というトリガーが発生している可能性があります。2FAが存在しない場合に2FAログインをトリガーするエラーが発生するのは、確かに理にかなっています。これはguardianにあるのでしょうか?デバッグ用のRails.loggerをどこに配置してデバッグできるのかわかりません。

「いいね!」 1

これは非常に可能性が低いことなので、もし全くばかげたことを言っていたら申し訳ありません…しかし、「An unhandled server error has occurred」でGoogle検索すると、Bitwarden のコードのみが参照されるため、ローカルシステム上の何かがリクエストをインターセプト/妨害している可能性があると考えられます。別のコンピューターから再現することは可能ですか?

「いいね!」 2

ブラウザの開発者ツールのネットワークタブを確認し、grant_admin エンドポイントへのリクエストに対するレスポンスがどのようになっているか確認していただけますか?

ペイロードタブも表示してください。

「いいね!」 2

image

これはサーバーから来ているようです。データベース(カスタマイズされたテキストなど)や /var/www/discourse の全体をgrepしても、その文字列は見つかりません。

ペイロードタブがありません。

image

待て!!! データベースを別のサーバーに復元したところ、正しくセカンドファクターページにリダイレクトされました。セカンドファクターキーを取得した後、ユーザーの管理者ステータスがすぐに変更されました(メールは不要です!知りませんでした!)。

つまり、何かが原因ですが、クリーンでほとんど標準的なインストールで問題は解決します。いずれにしても、明らかに :discourse: :bug: ではありません。カテゴリを変更しました。

もう一つの可能性のある説明は、これもこじつけのように思えますが、UserSecondFactor モデルに何らかの問題があるということです。テストサーバーではドメイン名が異なっていたため、UserSecondFactor.all.destroy_all;UserSecurityKey.all.destroy_all; を実行しました。また、Yubiキーの代わりにGoogle Authenticatorを使用しました。

「いいね!」 1

このトピックは、最後の返信から30日後に自動的にクローズされました。新しい返信は許可されていません。