Plugin per pubblicare thread anonimi tramite MP o dare feedback anonimo

:information_source: Sintesi Fornisce due moduli di pubblicazione indipendenti e anonimi
:hammer_and_wrench: Link al Repository GitHub - elRicharde/discourse-anonymous-feedback: Anonymous Feedback Formular in Discourse · GitHub
:open_book: Guida all’Installazione Come installare i plugin in Discourse

Questo plugin per Discourse offre due moduli di pubblicazione indipendenti e anonimi: “Feedback Anonimo” e “Bacheca Bianca”. Entrambi i moduli sono protetti da un “codice d’ingresso” (una semplice password) e permettono agli utenti senza account di inviare un messaggio privato a un gruppo di utenti preconfigurato, anche se il tuo forum richiede normalmente il login; questi due moduli, invece, non lo richiedono.

Tecnicamente, i post vengono inviati tramite una pagina web senza necessità di login e possono essere utilizzati anche in una scheda di navigazione in incognito. Non esiste la possibilità di tracciare il mittente, poiché gli indirizzi IP non vengono registrati. Questo plugin è progettato per offrire un canale di comunicazione sicuro e riservato.

Perché Utilizzare Questo Plugin?

In molte comunità, argomenti sensibili o idee richiedono un canale di feedback che garantisca l’anonimato e riduca la pressione sociale. Questo plugin affronta diverse sfide chiave:

  • Promuovere un Feedback Libero: Fornisce uno spazio sicuro per gli utenti (e persino per i non utenti, se il codice d’ingresso viene condiviso esternamente) per condividere opinioni oneste e non filtrate, preoccupazioni o idee innovative senza timore di giudizi o ritorsioni. Questo può portare a contributi più sinceri e preziosi che altrimenti verrebbero trattenuti.

  • Riservatezza e Fiducia: Garantendo l’anonimato attraverso misure tecniche (come il limitamento della frequenza basato su HMAC senza registrazione degli IP), il plugin costruisce fiducia e incoraggia una partecipazione più ampia, specialmente per argomenti delicati.

  • Colmare le Lacune nella Comunicazione: Crea un ponte di comunicazione accessibile per gli individui esitanti a pubblicare pubblicamente o che non hanno un account Discourse, ampliando così la portata del coinvolgimento della comunità.

  • Input Strutturato: Indirizzando il feedback a un gruppo privato specifico, assicura che le informazioni sensibili siano esaminate dai membri del team appropriati, consentendo discussioni mirate e azioni al di fuori della vista pubblica.

  • Semplicità per i Non Utenti: Il meccanismo del codice d’ingresso permette a parti esterne o visitatori temporanei di fornire input senza il sovraccarico della registrazione completa di un account.

In definitiva, questo plugin migliora l’interazione della comunità abilitando un ambiente più inclusivo e sicuro per discussioni e suggerimenti critici.

Come Funziona (Panoramica Tecnica)

Il plugin è stato sviluppato con un focus sull’anonimato e la sicurezza.

  1. Accesso: Un utente naviga verso /anonymous-feedback o /white-board.

  2. Sblocco: L’utente deve inserire il codice d’ingresso corretto. Il server valida questo codice.

    • Per prevenire attacchi brute-force, il server utilizza un sistema di limitazione della frequenza basato su un hash HMAC dell’indirizzo IP dell’utente e di un segreto rotante. L’indirizzo IP stesso non viene mai memorizzato.

    • Se il codice è corretto, il server imposta un flag temporaneo, utilizzabile una sola volta, nella sessione dell’utente.

  3. Invio: L’utente scrive e invia il proprio messaggio.

  4. Creazione PM: Il server controlla il flag della sessione. Se valido, crea un nuovo messaggio privato al gruppo target configurato e lo pubblica come utente bot configurato (o utente di sistema). Il flag della sessione viene quindi immediatamente cancellato, così l’utente deve inserire nuovamente il codice d’ingresso per qualsiasi ulteriore messaggio.

Casi d’Uso / Flussi di Lavoro

Questo plugin è stato progettato per essere flessibile. Ecco due flussi di lavoro comuni che puoi implementare:

Caso d’Uso 1: La “Bacheca Bianca” - Una bacheca pubblica moderata

Questo caso d’uso serve a creare visibilità per argomenti sensibili o comportamenti inappropriati osservati nella comunità (ad esempio, durante eventi o nelle interazioni generali). Ad esempio, rendere visibili problemi come il sessismo.

L’Obiettivo: Rendere visibili questioni importanti alla comunità senza esporre l’identità della persona che le segnala. Il focus è sul messaggio, non sul mittente, e potenzialmente nemmeno sugli individui coinvolti. Una semplice rappresentazione di situazioni con comportamenti inappropriati, senza fare nomi, crea comunque visibilità e aumenta la consapevolezza.

Il Flusso di Lavoro:

  1. Invio: Un utente invia un post tramite il modulo /white-board. Questo può essere accessibile ai membri (MG), agli apprendisti (ANW) e ai facilitatori (FM). Solo l’UTENTE “Anonymous” può creare post.

  2. Revisione Privata: Il post arriva come Messaggio Privato al target_group configurato (ad esempio, un team di moderazione o un comitato “Trust & Safety”). Sarà identificabile come voce “Bacheca Bianca”.

  3. Verifica: Il team esamina l’invio rispetto a criteri predefiniti (ad esempio, nessun attacco personale, nessun insulto, rispetto delle linee guida della comunità).

  4. Pubblicazione (Se Approvata): Un amministratore viene invitato al messaggio e lo converte in un argomento pubblico in una categoria pubblica dedicata “Bacheca Bianca”. Questo argomento viene pubblicato utilizzando un account generico specifico (ad esempio, un “WhiteBoardBot” o un utente “Anonymous”, configurato tramite l’impostazione bot_username). Le credenziali di accesso per questo utente possono essere condivise con il gruppo di revisione. La pubblicazione è effettuata dall’UTENTE “Anonymous”.

  5. Controllo delle Discussioni: Le autorizzazioni della categoria “Bacheca Bianca” sono impostate in modo che sia visibile ai membri/apprendisti/facilitatori ma non commentabile. Si prevede che i moderatori del forum ordinario non moderino quest’area specifica; questa è responsabilità esclusiva del target_group designato. Rimane ancora la questione se la Bacheca Bianca debba contenere sottocategorie (ad esempio, “anonimo chiuso” o categorie specifiche per i post del target_group).

  6. Gestione dei Rifiuti: Poiché non esiste un modo per contattare il mittente anonimo, è buona norma avere un argomento fissato nella categoria “Bacheca Bianca” che spieghi i criteri di pubblicazione e le ragioni per cui un invio potrebbe essere rifiutato. Le regole che giustificano la non pubblicazione devono essere sempre rese pubbliche in un unico punto del forum.

Caso d’Uso 2: Feedback Anonimo - Un canale diretto e privato

Questo caso d’uso serve a fornire una linea di comunicazione diretta e riservata a un team specifico per qualsiasi tipo di feedback (ad esempio, feedback sui voti o altri suggerimenti anonimi).

L’Obiettivo: Offrire ai membri e ai non membri un modo sicuro per fornire feedback su questioni della comunità, voti o altri argomenti direttamente alla leadership o a un comitato pertinente.

Il Flusso di Lavoro:

  1. Invio: Un utente invia un feedback tramite il modulo /anonymous-feedback. La riga dell’oggetto può aiutare a categorizzare il messaggio. Questo post arriva con il prefisso dell’oggetto “Messaggio Anonimo - gg.mm.aaaa, hh:mm:ss” alla casella di posta collettiva del target_group.

  2. Consegna Privata: Il messaggio arriva come Messaggio Privato al target_group. È identificabile come “Feedback Anonimo” dal prefisso dell’oggetto. Il target_group decide quindi cosa fare con il messaggio.

  3. Gestione Interna: Il team può quindi discutere il feedback in privato, coinvolgere altre parti interessate se necessario o decidere una linea d’azione. Questo feedback potrebbe essere utilizzato per feedback sui voti o altri suggerimenti anonimi.

  4. Best Practice per Feedback Inappropriati: Se un invio è inappropriato, il team può semplicemente cancellarlo. Potresti considerare di pubblicare un avviso generico e pubblico (ad esempio, in una categoria “Notizie”) che afferma che “Il feedback ricevuto il [Data] non è stato elaborato perché ha violato i nostri standard di comunità per una comunicazione rispettosa.” Questo informa il mittente senza rivelare dettagli e lo incoraggia a inviare nuovamente in modo più costruttivo. Se si tratta di un post per la Bacheca Bianca (identificabile dall’assenza di una marcatura speciale, o possibilmente da un suffisso se utile): i moderatori sono invitati al messaggio, ma nessuno risponde al messaggio. I moderatori convertono il messaggio in un argomento nella categoria “Bacheca Bianca” → visibile ai membri/apprendisti/facilitatori e non commentabile.

Funzionalità

  • Due Endpoint Indipendenti: Fornisce /anonymous-feedback e /white-board, ciascuno con la propria configurazione separata.

  • Protezione tramite Codice d’Ingresso: Ogni modulo è protetto dal proprio codice d’ingresso segreto per prevenire lo spam. Il codice d’ingresso è lo stesso per tutti e la pagina può essere utilizzata anche in modalità privata o sul computer dei genitori.

  • Gruppo Target Configurabile: I messaggi da ciascun modulo vengono inviati come messaggio privato a un gruppo di utenti specifico e configurabile.

  • Sessione Una Tantum: Dopo che un messaggio è stato inviato con successo, l’utente viene reindirizzato alla schermata del codice d’ingresso. Deve inserire nuovamente il codice per inviare un altro messaggio, il che previene lo spam multiplo semplice. Dopo l’invio, si torna al codice d’ingresso; non è facilmente possibile effettuare post multipli.

  • Limitazione della Frequenza che Preserva l’Anonimato: Protegge contro gli attacchi brute-force e lo spam senza registrare gli indirizzi IP.

  • Protezione dai Bot: Contiene un campo honeypot nascosto per catturare i bot semplici.

  • Utente Mittente Personalizzato: Puoi definire un utente bot per ciascun modulo in modo che i messaggi privati appaiano inviati da questo utente (ad esempio, “FeedbackBot”). L’utente deve esistere. Se vuoto, viene utilizzato di default l’utente di sistema.

  • Interfaccia Utente Pulita e Moderna: I moduli si basano su un componente Ember.js riutilizzabile per un’esperienza utente coerente e pulita.

Installazione

Segui la guida standard per l’installazione dei plugin Discourse: Installa un Plugin.

  1. Aggiungi l’URL del repository del plugin al tuo file app.yml:

    hooks:
      after_code:
        - exec:
            cd: $home/plugins
            cmd:
              - git clone https://github.com/elRicharde/discourse-anonymous-feedback
    
  2. Ricompila il tuo container: cd /var/discourse && ./launcher rebuild app

Configurazione

Dopo l’installazione, puoi configurare il plugin nelle impostazioni di amministrazione di Discourse. Cerca “anonymous feedback”. Tutte le impostazioni sono indipendenti per i moduli “Feedback Anonimo” e “Bacheca Bianca”.

Impostazione Descrizione
anonymous_feedback_enabled Attiva o disattiva la pagina /anonymous-feedback.
white_board_enabled Attiva o disattiva la pagina /white-board.
... door_code La password segreta che gli utenti devono inserire per accedere al modulo dei messaggi.
... target_group Il nome del gruppo di utenti che riceve i messaggi privati. Questo gruppo deve esistere.
... rate_limit_per_hour Un limite globale su quanti messaggi possono essere inviati all’ora per prevenire abusi. Imposta a 0 per disabilitare.
... max_message_length Il numero massimo di caratteri consentiti nel testo del messaggio.
... hmac_rotation_hours La frequenza con cui ruota la chiave segreta per la limitazione della frequenza. Una durata più breve resetta i blocchi brute-force più velocemente ma è leggermente meno sicura.
... bot_username Opzionale. Il nome utente dell’utente che invierà il PM. L’utente deve esistere. Se vuoto, viene utilizzato l’utente di sistema.

Sviluppo / Architettura

  • Backend: Un singolo controller Ruby on Rails, AnonymousFeedbackController, elabora tutte le richieste per entrambi gli endpoint. Utilizza un metodo kind che controlla il percorso della richiesta (/anonymous-feedback vs /white-board) per determinare quali configurazioni utilizzare. Questo evita la duplicazione del codice. Un helper setting dinamico semplifica ulteriormente la lettura della configurazione.

  • Frontend: L’interfaccia utente si basa su un singolo componente Ember.js riutilizzabile, <AnonymousFeedbackForm />.

    • Questo componente contiene l’intera logica HTML, CSS e Javascript per lo stato del modulo (sblocco, invio, gestione errori).

    • I template delle route (anonymous-feedback.hbs e white-board.hbs) sono ora estremamente semplici. Istanziano semplicemente questo componente e passano i parametri corretti (ad esempio, titolo, URL API). Questo approccio DRY (Don’t Repeat Yourself) rende il codice frontend pulito e facile da mantenere.

Approfondimento: Anonimato e Limitazione della Frequenza (HMAC)

Una funzionalità fondamentale di questo plugin è l’equilibrio tra anonimato assoluto e protezione contro gli abusi (spam).

Il Problema: Indirizzi IP Fini

Gli indirizzi IPv4 consistono in un insieme finito di combinazioni (circa 4,3 miliardi).

  • Il Rischio: Le funzioni di hashing (come SHA256) sono funzioni unidirezionali irreversibili. Tuttavia, se memorizzassimo semplicemente SHA256(Indirizzo_IP), un attaccante (o un amministratore) potrebbe pre-calcolare gli hash per tutti gli indirizzi IP esistenti (una “Tabella Arcobaleno”) in pochi secondi. Confrontando l’hash memorizzato con la propria lista, potrebbe rivelare immediatamente l’IP originale.

La Soluzione: HMAC con un Segreto Rotante

Utilizziamo HMAC (Hash-Based Message Authentication Code). Questo combina il messaggio (IP) con una Chiave Segreta crittografica prima di eseguire l’hash.

  • Il Meccanismo: Identificatore = HMAC(Indirizzo_IP + Chiave_Segreta)

  • Perché funziona: Anche se l’attaccante conosce tutti i possibili indirizzi IP, non conosce la Chiave_Segreta. Senza questa chiave, non può pre-calcolare gli hash. L’attacco della “Tabella Arcobaleno” diventa impossibile perché manca la variabile segreta.

Segretezza Inversa (Rotazione della Chiave)

La Chiave Segreta viene ruotata automaticamente (ad esempio, ogni 4 ore).

  • Scenario: Immagina che il server venga hackerato e l’attaccante rubi la Chiave Segreta corrente e il database.

  • Protezione: Poiché la chiave cambia regolarmente e le vecchie chiavi vengono scartate permanentemente, l’attaccante può calcolare gli hash IP solo per la finestra temporale corrente (ad esempio, le ultime 4 ore). Tutte le attività di ieri o della settimana scorsa sono state hashate con chiavi che non esistono più. Questo garantisce la Segretezza Inversa: l’anonimato passato non può essere violato, anche se il sistema corrente è compromesso.

Rotazione Veloce vs Lenta

Puoi configurare l’intervallo di rotazione (hmac_rotation_hours).

  • Rotazione Veloce (ad esempio, 1 ora):

    • Pro: Anonimato massimo. La finestra temporale in cui azioni distinte possono essere collegate allo stesso attore (sconosciuto) è molto breve.

    • Contro: “Amnesia” per la limitazione della frequenza. Quando la chiave ruota, il server “dimentica” chi ha già inviato messaggi. Uno spammer bloccato nell’Ora 1 è effettivamente sbloccato nell’Ora 2.

  • Rotazione Lenta (ad esempio, 24 ore):

    • Pro: Protezione più forte contro lo spam, poiché i blocchi persistono più a lungo.

    • Contro: All’interno di questa finestra di 24 ore, un amministratore può vedere che “Utente X” ha inviato 5 messaggi, anche se non sa chi sia “Utente X” (Collegabilità).

Raccomandazione: Un valore compreso tra 4 e 12 ore offre un solido equilibrio.

3 Mi Piace