`run_second_factor!` schlägt fehl beim Versuch, Administrator zu befördern

Folgend auf Can't upgrade user to admin - unhandled server error

(Hallo @Discoursenaut.) Ich habe den ganzen Nachmittag daran gearbeitet. Ich kann immer noch nicht herausfinden, was das Problem tatsächlich ist, aber wenn ich eine rescue-Anweisung um Zeile 1099 (`manager.run!') hinzufüge, verschwindet der mysteriöse Fehler „Ein unbehandelter Serverfehler ist aufgetreten“. Ich kann diese Zeichenkette nirgendwo im Quellcode finden.

Das Abfangen des Fehlers hilft nicht, da result nicht definiert ist, sodass er später fehlschlägt.

Ich habe dies mit allen Permutationen versucht, bei denen der Benutzer mit 2FA aktiviert/nicht aktiviert ist, enforce_second_factor aus/Staff. Seltsamerweise hat es heute funktioniert, als ich meinen Benutzer hinzugefügt und versucht habe, ihn von einem anderen Admin-Konto zu einem Admin zu machen, aber kein anderer Admin kann andere Benutzer zu Admins machen. Sie sagen, das sei seit einem Jahr ein Problem. Könnte es ein Datenbankproblem geben?

Es ist ein aktueller Build (mindestens einer von heute). Nur Standard-Plugins und sogar im Safe-Mode.

@Osama, Sie haben einen Kommentar ein paar Zeilen später, vielleicht haben Sie eine Idee?

Ich sehe nicht, wie result undefiniert sein kann, gegeben:

Sind Sie absolut sicher, dass Sie die allerneueste Version verwenden?

1 „Gefällt mir“

Ich habe heute einen Rebuild durchgeführt.

Gibt es eine andere Stelle, an der ich ein Debug-Log platzieren kann?

Wenn Sie uns eine minimale Reproduktion (wie eine Liste von Website-Einstellungen und deren Werten) zur Verfügung stellen könnten, wäre das sehr hilfreich.

Können Sie die gesamte Methode rescuen und den Fehler protokollieren?

def run_second_factor!(action_class, action_data: nil, target_user: current_user)
  if current_user && target_user != current_user
    # Anon kann 2FA gegen ein anderes Ziel ausführen, aber angemeldete Benutzer sollten dies nicht tun.
    # Dies sollte an der Aufrufstelle von `run_second_factor!` validiert werden.
    raise "das Ausführen von 2FA gegen einen anderen Benutzer ist nicht gestattet"
  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?
    # sollte nie passieren, aber ich möchte wissen, wenn es irgendwie doch passiert! (osama)
    raise "2FA-Prozess ist in einem schlechten Zustand gelandet!"
  end

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

Etwas sollte in /logs erscheinen, sobald Sie diese Änderung vorgenommen haben (und die Unicorn-Worker neu geladen haben), und das sollte uns helfen, das Problem zu identifizieren.

2 „Gefällt mir“

Seufz. Es sieht so aus, als ob der Fehler in run_second_factor! von meinen Debugging-Anweisungen herrührte; Fehler zu verursachen, wenn man nach ihnen sucht, ist eines meiner Lieblingshobbys.

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)

Ich schätze, der Guardian erlaubt mir aus irgendeinem Grund nicht, den Benutzer zum Administrator zu machen.

Aber ich verstehe immer noch nicht, warum es fehlschlägt und warum die Fehlermeldung “An unhandled server error has occurred.” lautet, wenn ich diesen Fehler nirgendwo im Discourse-Code finden kann.

Ah. Und das ist interessant. Ich konnte von jay@example.com zu myaddress@gmail.com wechseln, aber der Versuch, eine Adresse von myaddress+123@gmail.com zu bestätigen, führt ebenfalls zu der Meldung “An unhandled server error has occurred.”. normalize_emails ist nicht gesetzt.

Ich glaube, dass etwas mit run_second_factor! nicht stimmt, aber ich kann nicht ganz herausfinden, was. Ich füge einige Rails.logger.warn mit einigen xxx.inspect hinzu, vielleicht finde ich etwas.

Meiner Meinung nach ist etwas mit dem auth_manager falsch. Es scheint, als ob er aus irgendeinem Grund versucht, weiterzuleiten? Normale Benutzer müssen keine 2FA haben, daher weiß ich nicht, warum ein normaler Benutzer seine E-Mail-Adresse nicht ändern können sollte. Aber ich habe es mit einem Benutzer ohne 2FA, mit Backup-Codes, eingeloggt, bevor ich auf den Link zur Bestätigung der neuen E-Mail geklickt habe, und auch danach versucht, und alles schlägt mit “An unhandled server error has occurred.” fehl.

Das scheint damit zusammenzuhängen:

Der 403-Fehler ist normal und erwartet – die Frontend-App fängt die 403-Antwort ab und interpretiert sie als „kann Administrator nicht gewähren, da 2FA erforderlich ist, navigieren wir zur 2FA-Seite“.

Was nicht normal ist:

Können Sie mir sagen, wo Sie diesen Fehler sehen? Ist es ein Popup im Frontend? Fehler in den Protokollen? Wie Sie erwähnen, kann ich diese Fehlermeldung nirgendwo in der gesamten Historie des Codebestands finden, daher ist sie sehr seltsam.

Also rendert das Backend vielleicht nicht die Elemente, die die 2FA-URL enthalten? Aber der Fehler tritt unabhängig davon auf, ob der Benutzer 2FA aktiviert hat und unabhängig davon, ob die Force-2FA-Sitesetting aktiviert ist. Und unabhängig davon, ob der Benutzer mit bereits eingerichteter 2FA angemeldet ist.

Richtig. Ich habe den abgesicherten Modus ausprobiert, aber das sind die 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

Der einzige Hinweis, den ich gefunden habe, ist, dass die Nachricht von Rails selbst zu kommen scheint. Dennoch konnte ich nicht herausfinden, wie das passieren könnte.

Es könnte also etwas im Spiel sein, das „wir brauchen 2FA“ auslöst, obwohl 2FA nicht benötigt wird. Es ist sicherlich sinnvoll, dass ein Fehler ausgelöst wird, um sich bei 2FA anzumelden, wenn keine vorhanden ist. Ich schätze, das ist in guardian? Ich kann nicht herausfinden, wo ich Debugging-Rails.logger-Sachen platzieren kann, um das zu debuggen.

1 „Gefällt mir“

Das ist eine sehr vage Vermutung, daher entschuldige ich mich, wenn ich etwas völlig Lächerliches sage … aber wenn man nach „ An unhandled server error has occurred“ googelt, verweist dies nur auf Bitwarden Code, was mich zu der Annahme veranlasst, dass auf Ihrem lokalen System etwas Ihre Anfrage abfängt / manipuliert. Können Sie dies von einem anderen Computer aus reproduzieren?

2 „Gefällt mir“

Können Sie den Netzwerktab im Entwicklertools Ihres Browsers überprüfen und sehen, wie die Antwort für die Anfrage an den Endpunkt grant_admin aussieht?

Bitte zeigen Sie auch den Payload-Tab an.

2 „Gefällt mir“

image

Das scheint vom Server zu kommen. Ich kann diese Zeichenkette weder in der Datenbank (z. B. in benutzerdefiniertem Text) noch durch Durchsuchen von /var/www/discourse finden.

Es gibt keinen Payload-Tab:

image

Moment!!! Ich habe die Datenbank auf einen anderen Server wiederhergestellt und sie leitet ordnungsgemäß zur Seite für die zweite Faktor-Authentifizierung weiter, die nach Erhalt des Schlüssels für den zweiten Faktor sofort den Admin-Status des Benutzers ändert (keine E-Mail erforderlich! Was ich nicht wusste!).

Es liegt also an etwas… etwas, aber eine saubere, größtenteils standardmäßige Installation löst das Problem. Auf jeden Fall nicht (offensichtlich?) ein :discourse: :bug: . Ich habe die Kategorie geändert.

Die andere mögliche Erklärung, die ebenfalls weit hergeholt erscheint, ist, dass mit dem UserSecondFactor-Modell etwas nicht stimmt, da ich auf meinem Testserver UserSecondFactor.all.destroy_all;UserSecurityKey.all.destroy_all; ausgeführt habe, da dieser eine andere Domain hatte. Ich habe auch Google Authenticator anstelle meines Yubi-Schlüssels verwendet.

1 „Gefällt mir“

Dieses Thema wurde 30 Tage nach der letzten Antwort automatisch geschlossen. Neue Antworten sind nicht mehr möglich.