Impossibile concedere i diritti di amministratore a causa di un errore

Ciao!

Quando tento di concedere i diritti di amministratore a un utente (in realtà a qualsiasi utente) ricevo solo il seguente messaggio di errore (dopo aver cliccato sul link di conferma):

Ho controllato i log e ho trovato i seguenti messaggi:

ActiveRecord::RecordInvalid (Validation failed: Name has already been taken) app/models/group.rb:607:in 'refresh_automatic_group!' app/models/group.rb:666:in 'block in refresh_automatic_groups!' app/m

Failed to handle exception in exception app middleware : ActiveRecord::RecordInvalid : Validation failed: Name has already been taken

Circa nello stesso periodo ricevo anche un messaggio sul malfunzionamento di MaxMind, non sono sicuro se questo abbia a che fare con il problema (non ho trovato impostazioni correlate nell’interfaccia di amministrazione):

MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-City.mmdb) could not be found: No such file or directory @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-City.mmdb

Come posso eseguire ulteriori debug?

Grazie,
Hannes

Ricevi quell’errore quando fai clic sul pulsante “Concedi amministratore”?

No, fare clic sul pulsante “Concedi amministratore” funziona.

Il processo completo è il seguente:

  1. Faccio clic sul pulsante “Concedi amministratore”, l’applicazione mi presenta una finestra modale “Ti abbiamo inviato un’e-mail per verificare il nuovo amministratore. Aprila e segui le istruzioni.”
  2. Faccio clic sul collegamento di conferma nell’e-mail (“Conferma account amministratore”) che mi porta a una pagina di conferma.
  3. Nella pagina di conferma faccio clic sul pulsante “Concedi accesso amministratore”, che quindi produce la pagina di errore (vedi screenshot nel mio post originale) e anche i messaggi di errore nel log.

Ho anche appena notato il seguente messaggio più in alto nel log (preceduto dal numero 46, significa che è stato ripetuto 46 volte?):

Errore nel garantire la coerenza per il Gruppo: Convalida non riuscita: Il nome è già stato preso

Questo sembra un caso limite molto interessante. Supponendo che sia self-hosted, cosa restituisce?

./launcher enter app
rails c
Group.pluck(:name, :id)
=> [["everyone", 0],
 ["moderators", 2],
 ["admins", 1],
 ["staff", 3],
 ["trust_level_0", 10],
 ["trust_level_1", 11],
 ["trust_level_2", 12],
 ["trust_level_3", 13],
 ["trust_level_4", 14]]

Discourse è molto particolare riguardo a questi ID, lo staff deve essere 2, gli amministratori devono essere 1. Se in qualche modo hai un gruppo diverso con quel nome, potrebbero esserci problemi. Mi assicurerei anche che nessun utente si chiami admins.

Sembra che sia così (ci sono molti altri gruppi, ma erano chiaramente creati da noi e non avevano alcuna somiglianza con i gruppi di sistema, quindi non li ho inclusi di seguito):

=> [["everyone", 0],
 ["moderators", 2],
 ["admins", 1],
 ["trust_level_0", 10]
 ["trust_level_1", 11],
 ["trust_level_2", 12],
 ["trust_level_3", 13],
 ["trust_level_4", 14],
 ["Staff", 42]]

Noto che non c’è il gruppo staff, solo Staff - se staff ha sempre id 3 allora immagino che questo indichi che qualcuno lo ha rimosso e creato un nuovo gruppo (id 42).

È sufficiente ricreare staff o come posso risolvere questo problema?

Sì, credo che rinominare il tuo gruppo di personale sarà abbastanza per risolvere il problema

1 Mi Piace

L’interfaccia utente non me lo permette:

Devo farlo direttamente nel database?

È possibile rinominare il gruppo tramite la riga di comando o come posso risolvere questa situazione?

Prova direttamente dal database, dovrebbe essere sicuro

2 Mi Piace

Sì, questo ha funzionato! Il gruppo esisteva, ma qualcuno lo aveva rinominato: poiché questo interrompe fondamentalmente le funzionalità principali, mi chiedo se la ridenominazione dei gruppi di sistema dovrebbe essere vietata nell’interfaccia utente.

Per la cronaca, nel caso in cui qualcuno si trovi in una situazione simile:

docker exec -it app /bin/bash
su - postgres
psql -d discourse
discourse=# update groups set name='staff' where id=3;
\q
5 Mi Piace

Sì, dovrebbe assolutamente essere uno stato in cui non si può entrare.

3 Mi Piace