Account Chatbot ID -4: perché non è possibile cancellare tramite l'admin e quali sono i workarounds

Note di lavoro dopo l’analisi tramite l’API Admin e il codice del kernel di Discourse (ramo Cursor nel repository hoee).

Oggetto

Sull’istanza, la card amministrativa: /admin/users/-4/chatbot (Chatbot nell’amministrazione).

Cosa restituisce il JSON amministrativo (copia di verifica)

  • id: -4 (questo è un bot secondo le regole del kernel: user_id > 0 solo per gli utenti «vivi»)
  • username: Chatbot
  • admin: true
  • moderator: false
  • post_count: 0
  • can_be_deleted: false
  • can_be_anonymized: false

Perché can_be_deleted: false anche con 0 post

Nel metodo Guardian#can_delete_user? l’eliminazione è proibita se l’utente target è admin. Questo non è legato al numero di post nel nostro caso.

Perché manualmente tramite UI e HTTP amministrativo spesso «non funziona»

Per operazioni come revoke admin / destroy, sullo id negativo non passa Guardian#can_administer?: c’è una condizione che richiede che l’identificatore target sia positivo (obj.id.positive?). Quindi le richieste ai route member tipo «come per un normale username» restituiscono 404, mentre con il segmento -4 si ottiene un 403 invalid_access, anche quando l’attore API è staff.

Risultato: rimuovere l’admin e cancellare l’account tramite l’API amministrativa nello stesso UX usato per gli utenti normali, non è possibile — serve un altro percorso (sotto).

Percorso morbido senza cancellare la riga nel DB

Disattivare il modulo del bot AI nelle impostazioni del sito: parametro ai_bot_enabled (false — il comportamento del bot GPT e l’interfaccia correlata nel messaggio privato/testata viene spento; la riga dell’utente rimane comunque).

Sul sistema con checkout del repository hoee e file discourse.env aggiunto un helper:

  • scripts/discourse-ai-chatbot-operator.sh audit — dump rapido dei campi da /admin/users/-4/list.json
  • ai-bot-disable / ai-bot-enable — PUT su ai_bot_enabled (chiavi system da discourse.env, non pubblicare)

Percorso duro: cancellare realmente l’utente

Solo sul server dell’applicazione Discourse, con un backup del DB prima delle modifiche: in console Rails rimuovere la flag admin dal record (ad esempio con update_columns), poi usare UserDestroyer da un admin vivo con id > 0 e delete_posts: true se necessario. Il blocco di testo da copiare: scripts/discourse-ai-chatbot-operator.sh rails-destroy-snippet.

Rischi: il plugin discourse-ai potrebbe ricreare i bot durante gli aggiornamenti; possono verificarsi messaggi di missing bot user finché il modulo non ripristina lo stato.

Link al codice upstream

Se necessario, nelle risposte si può fornire una procedura separata per «verificare il valore attuale di ai_bot_enabled tramite Admin → Impostazioni → plugin discourse-ai» senza API.

Aggiornamento: account eliminato

L’operazione sul host è stata eseguita non tramite Admin API (dove Guardian non permette ancora l’accesso per un id negativo), ma tramite rails runner all’interno del contenitore di produzione app dall’utente discourse:

  • il flag admin è stato rimosso dall’utente User.find(-4) tramite update_columns + reload;
  • successivamente UserDestroyer è stato attivato da un amministratore attivo con id > 0 con l’opzione delete_posts: true (in nostro caso non c’erano post).

Verifica esterna: GET /u/chatbot.json non restituisce più l’utente, GET /admin/users/-4/list.jsonnot_found.

Ricordo: se il modulo discourse-ai viene riattivato, il plugin potrebbe ripristinare automaticamente l’account del bot se necessario.