`run_second_factor!` fallisce durante il tentativo di promuovere admin

Seguendo Can't upgrade user to admin - unhandled server error
(Ciao @Discoursenaut.) Ho passato tutto il pomeriggio su questo. Non riesco ancora a capire quale sia il problema, ma se aggiungo un rescue intorno alla riga 1099 (`manager.run!') l’errore misterioso "Si è verificato un errore del server non gestito". Non riesco a trovare quella stringa da nessuna parte nel codice sorgente.

Catturare l’errore non aiuta poiché result non è definito, quindi fallisce più tardi.
Ho provato questo con tutte le permutazioni di avere l’utente con 2fa abilitato/non abilitato, enforce_second_factor disattivato/staff. Stranamente, quando ho aggiunto il mio utente oggi e ho provato a renderlo un amministratore da un altro account amministratore, ha funzionato come previsto, ma nessun altro amministratore può rendere amministratori altri utenti. Dicono che questo è un problema da un anno. Potrebbe esserci qualche problema con il database?
È una build recente (almeno una di oggi). Solo plugin standard e anche in modalità sicura.
@Osama, hai un commento un paio di righe più avanti, forse hai un’idea?

Non vedo come result possa essere indefinito dato:

Sei assolutamente sicuro di essere sull’ultima versione?

1 Mi Piace

Ho eseguito una ricompilazione oggi.

C’è un altro posto dove posso mettere un log di debug?

Se riuscite a fornirci una riproduzione minima (come un elenco delle impostazioni del sito e dei loro valori) ci aiutereste molto.

Puoi rescue l’intero metodo e registrare l’errore?

def run_second_factor!(action_class, action_data: nil, target_user: current_user)
  if current_user && target_user != current_user
    # Anon può eseguire 2fa contro un altro target, ma gli utenti connessi non dovrebbero.
    # Questo dovrebbe essere convalidato nel sito di chiamata `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?
    # non dovrebbe mai succedere, ma voglio saperlo se in qualche modo succede! (osama)
    raise "2fa process ended up in a bad state!"
  end

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

Qualcosa dovrebbe apparire in /logs una volta apportata questa modifica (e ricaricati i worker di Unicorn) e questo dovrebbe aiutarci a capire qual è il problema.

2 Mi Piace

Sospirare. Sembra che l’errore in run_second_factor! fosse dovuto alle mie dichiarazioni di debug; causare bug mentre li cerco è uno dei miei passatempi preferiti.

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)

Immagino che il guardiano non mi permetta di rendere l’utente amministratore per qualche motivo.

Ma ancora non capisco perché fallisce e perché mostra An unhandled server error has occurred. come errore, quando non trovo quell’errore da nessuna parte nel codice di Discourse.

Ah. E questo è interessante. Sono riuscito a cambiare da jay@example.com a myaddress@gmail.com, ma provare a confermare un indirizzo di myaddress+123@gmail.com riceve anche il messaggio “An unhandled server error has occurred.”. normalize_emails non è impostato.

Penso che qualcosa non vada in run_second_factor!, ma non riesco a capire bene cosa. Sto aggiungendo alcuni Rails.logger.warn con alcuni xxx.inspect, quindi forse troverò qualcosa.

Al meglio delle mie capacità, qualcosa non va con auth_manager. Sembra che stia cercando di reindirizzare per qualche motivo? Gli utenti normali non sono tenuti ad avere il 2fa, quindi non capisco perché un utente normale non dovrebbe essere in grado di cambiare il proprio indirizzo email. Ma ho provato con un utente senza 2fa, codici di backup, effettuato l’accesso prima di fare clic sul link di conferma della nuova email e dopo aver effettuato l’accesso e tutti falliscono con “An unhandled server error has occurred.”.

Questo sembra correlato:

L’errore 403 è normale e previsto — l’app frontend intercetta la risposta 403 e la interpreta come “impossibile concedere i permessi di amministratore perché è richiesta l’autenticazione a due fattori, navighiamo alla pagina 2FA”.

Ciò che non è normale è:

Puoi dirmi dove stai riscontrando questo errore? È un popup nel frontend? Un errore nei log? Come hai menzionato, non riesco a trovare questo messaggio di errore da nessuna parte nell’intera cronologia del codebase, quindi è molto strano.

Quindi forse il backend non sta renderizzando le cose che contengono l’URL 2FA? Ma l’errore si verifica indipendentemente dal fatto che l’utente abbia l’autenticazione a due fattori attiva, indipendentemente dal fatto che l’impostazione del sito “forza 2FA” sia abilitata. E indipendentemente dal fatto che l’utente sia loggato con l’autenticazione a due fattori già impostata.

Giusto. Ho provato la modalità sicura, ma questi sono i plugin:

          - 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

L’unica indizio che ho trovato è che implica che il messaggio provenga da Rails stesso. Tuttavia, non sono riuscito a capire come ciò possa accadere.

Quindi forse c’è qualcosa in gioco che attiva “abbiamo bisogno di 2FA” quando, in realtà, 2FA non è necessaria. Certamente ha senso che venga attivato un errore per il login 2FA quando non ne esiste uno. Immagino che sia in guardian? Non riesco a capire dove inserire il debug di Rails.logger per fare il debug.

1 Mi Piace

È un’ipotesi molto remota, quindi mi scuso se dico qualcosa di totalmente ridicolo… ma cercare su Google “An unhandled server error has occurred” si riferisce solo al codice di Bitwarden il che mi porta a credere che ci possa essere qualcosa sul tuo sistema locale che sta intercettando / interferendo con la tua richiesta. È qualcosa che puoi riprodurre da un altro computer?

2 Mi Piace

Puoi controllare la scheda Reti negli strumenti per sviluppatori del tuo browser e vedere come appare la risposta per la richiesta all’endpoint grant_admin?

Mostra anche la scheda Payload.

2 Mi Piace

image

Sembra provenire dal server. Non riesco a trovare quella stringa nel database (ad esempio nel testo personalizzato) né eseguendo una ricerca in tutto /var/www/discourse

Non c’è una scheda Payload:

image

Aspetta!!! Ho ripristinato il database su un altro server e reindirizza correttamente alla pagina del secondo fattore, che, dopo aver ottenuto la chiave del secondo fattore, cambia immediatamente lo stato di amministratore dell’utente (nessuna email richiesta! cosa che non sapevo!).

Quindi è qualcosa con . . . qualcosa, ma un’installazione pulita e per lo più standard risolve il problema. In ogni caso, non è (ovviamente?) un :discourse: :bug: . Ho cambiato la categoria.

L’altra potenziale spiegazione, che sembra anche inverosimile, è che ci sia qualcosa di sbagliato nel modello UserSecondFactor, poiché ho eseguito un UserSecondFactor.all.destroy_all;UserSecurityKey.all.destroy_all; sul mio server di test poiché aveva un nome di dominio diverso. Ho anche usato Google Authenticator invece della mia Yubi key.

1 Mi Piace

Questo argomento è stato chiuso automaticamente 30 giorni dopo l’ultima risposta. Non sono più consentite nuove risposte.