Plugin pour poster un fil anonyme via MP ou donner un feedback anonyme

:information_source: Résumé Fournit deux formulaires de publication indépendants et anonymes
:hammer_and_wrench: Lien vers le dépôt GitHub - elRicharde/discourse-anonymous-feedback: Anonymous Feedback Formular in Discourse · GitHub
:open_book: Guide d’installation Comment installer des plugins dans Discourse

Ce plugin Discourse propose deux formulaires de publication indépendants et anonymes : « Feedback anonyme » et « Tableau blanc ». Les deux formulaires sont protégés par un « code d’accès » (un mot de passe simple) et permettent aux utilisateurs sans compte d’envoyer un message privé à un groupe d’utilisateurs préconfiguré, même si votre forum nécessite normalement une connexion. Ces deux formulaires, eux, ne le nécessitent pas.

Techniquement, les publications sont soumises via une page web sans nécessiter de connexion et peuvent même être utilisées dans un onglet de navigation privée. Il n’existe aucun moyen de remonter à l’expéditeur, car les adresses IP ne sont pas enregistrées. Ce plugin est conçu pour offrir un canal de communication sécurisé et confidentiel.

Pourquoi utiliser ce plugin ?

Dans de nombreuses communautés, les sujets sensibles ou les idées nécessitent un canal de feedback garantissant l’anonymat et réduisant la pression sociale. Ce plugin répond à plusieurs défis clés :

  • Favoriser un feedback sans retenue : Il offre un espace sûr aux utilisateurs (et même aux non-utilisateurs, si le code d’accès est partagé en externe) pour partager des opinions honnêtes, non filtrées, des préoccupations ou des idées innovantes sans craindre le jugement ou des représailles. Cela peut conduire à des contributions plus franches et précieuses qui seraient autrement retenues.

  • Confidentialité et confiance : En garantissant l’anonymat grâce à des mesures techniques (comme la limitation de débit basée sur HMAC sans journalisation des IP), le plugin renforce la confiance et encourage une participation plus large, en particulier pour des sujets délicats.

  • Combler les lacunes de communication : Il crée un pont de communication accessible pour les individus hésitant à publier publiquement ou ne disposant pas de compte Discourse, élargissant ainsi la portée de l’engagement communautaire.

  • Entrées structurées : En dirigeant le feedback vers un groupe privé spécifique, il garantit que les informations sensibles sont examinées par les membres appropriés de l’équipe, permettant une discussion et des actions ciblées à l’abri des regards publics.

  • Simplicité pour les non-utilisateurs : Le mécanisme du code d’accès permet aux parties externes ou aux visiteurs temporaires de fournir des contributions sans la lourdeur d’une inscription complète à un compte.

En fin de compte, ce plugin améliore l’interaction communautaire en permettant un environnement plus inclusif et sécurisé pour les discussions et suggestions critiques.

Fonctionnement (Vue d’ensemble technique)

Le plugin a été développé avec un accent mis sur l’anonymat et la sécurité.

  1. Accès : Un utilisateur se rend sur /anonymous-feedback ou /white-board.

  2. Déverrouillage : L’utilisateur doit entrer le bon code d’accès. Le serveur valide ce code.

    • Pour prévenir les attaques par force brute, le serveur utilise un système de limitation de débit basé sur un hachage HMAC de l’adresse IP de l’utilisateur et d’un secret rotatif. L’adresse IP elle-même n’est jamais stockée.

    • Si le code est correct, le serveur définit un indicateur temporaire, utilisable une seule fois, dans la session de l’utilisateur.

  3. Soumission : L’utilisateur rédige et envoie son message.

  4. Création du MP : Le serveur vérifie l’indicateur de session. S’il est valide, il crée un nouveau message privé vers le groupe cible configuré et le publie en tant que l’utilisateur bot configuré (ou utilisateur système). L’indicateur de session est ensuite immédiatement supprimé, de sorte que l’utilisateur doit à nouveau entrer le code d’accès pour tout message ultérieur.

Cas d’utilisation / Flux de travail

Ce plugin a été conçu pour être flexible. Voici deux flux de travail courants que vous pouvez mettre en œuvre :

Cas d’utilisation 1 : Le « Tableau blanc » - Un tableau d’affichage public modéré

Ce cas d’utilisation vise à rendre visibles des sujets sensibles ou des comportements inappropriés observés dans la communauté (par exemple, lors d’événements ou dans les interactions générales). Par exemple, rendre visibles des problèmes tels que le sexisme.

L’objectif : Rendre les problèmes importants visibles pour la communauté sans exposer l’identité de la personne qui les signale. L’accent est mis sur le message, et non sur l’expéditeur, et potentiellement même sur les individus impliqués. Une simple représentation de situations avec des comportements inappropriés, sans nommer les personnes concernées, crée tout de même une visibilité et sensibilise.

Le flux de travail :

  1. Soumission : Un utilisateur soumet une publication via le formulaire /white-board. Ce formulaire est accessible aux membres (MG), aux apprentis (ANW) et aux facilitateurs (FM). Seul l’utilisateur « Anonymous » peut créer des publications.

  2. Examen privé : La publication arrive sous forme de message privé au target_group configuré (par exemple, une équipe de modération ou un comité « Trust & Safety »). Elle sera identifiable comme une entrée « Tableau blanc ».

  3. Vérification : L’équipe examine la soumission par rapport à des critères prédéfinis (par exemple, pas d’attaques personnelles, pas d’insultes, respect des directives communautaires).

  4. Publication (si approuvée) : Un administrateur est invité au message et le convertit en un sujet public dans une catégorie publique dédiée « Tableau blanc ». Ce sujet est publié en utilisant un compte générique spécifique (par exemple, un « WhiteBoardBot » ou un utilisateur « Anonymous », configuré via le paramètre bot_username). Les identifiants de connexion de cet utilisateur peuvent être partagés avec le groupe d’examen. La publication est effectuée par l’utilisateur « Anonymous ».

  5. Contrôle des discussions : Les permissions de la catégorie « Tableau blanc » sont définies de manière à ce qu’elle soit visible par les membres/apprentis/facilitateurs mais non commentable. Les modérateurs du forum réguliers sont censés ne pas modérer cette zone spécifique ; cela relève uniquement de la responsabilité du target_group désigné. Il reste à savoir si le Tableau blanc devrait contenir des sous-catégories (par exemple, « anonyme fermé » ou des catégories spécifiques pour les publications du target_group).

  6. Gestion des rejets : Comme il n’y a aucun moyen de contacter l’expéditeur anonyme, il est bon de pratiquer de fixer un sujet épinglé dans la catégorie « Tableau blanc » expliquant les critères de publication et les raisons pour lesquelles une soumission pourrait être rejetée. Les règles justifiant la non-publication doivent toujours être rendues publiques à un endroit unique du forum.

Cas d’utilisation 2 : Feedback anonyme - Un canal direct et privé

Ce cas d’utilisation vise à fournir une ligne de communication directe et confidentielle à une équipe spécifique pour tout type de feedback (par exemple, pour des retours sur des votes ou d’autres suggestions anonymes).

L’objectif : Offrir aux membres et aux non-membres un moyen sûr de fournir des retours sur des questions communautaires, des votes ou d’autres sujets directement à la direction ou à un comité pertinent.

Le flux de travail :

  1. Soumission : Un utilisateur soumet un feedback via le formulaire /anonymous-feedback. L’objet peut aider à catégoriser le message. Cette publication arrive avec le préfixe d’objet « Message anonyme - jj.mm.aaaa, hh:mm:ss » dans la boîte de réception collective du target_group.

  2. Livraison privée : Le message arrive sous forme de message privé au target_group. Il est identifiable comme « Feedback anonyme » par son préfixe d’objet. Le target_group décide ensuite de quoi faire du message.

  3. Traitement interne : L’équipe peut ensuite discuter du feedback en privé, impliquer d’autres parties prenantes si nécessaire, ou décider d’une ligne de conduite. Ce feedback peut être utilisé pour des retours sur des votes ou d’autres suggestions anonymes.

  4. Meilleure pratique pour les feedbacks inappropriés : Si une soumission est inappropriée, l’équipe peut simplement la supprimer. Vous pourriez envisager de publier un avis public générique (par exemple, dans une catégorie « Actualités ») indiquant que « Le feedback reçu le [Date] n’a pas été traité car il violait nos normes communautaires pour une communication respectueuse. » Cela informe l’expéditeur sans révéler de détails et l’encourage à soumettre à nouveau de manière plus constructive. S’il s’agit d’une publication pour le Tableau blanc (identifiable par l’absence de marquage spécial, ou éventuellement un suffixe si utile) : les modérateurs sont invités au message, mais personne ne répond au message. Les modérateurs convertissent le message en un sujet dans la catégorie « Tableau blanc » → visible par les membres/apprentis/facilitateurs et non commentable.

Fonctionnalités

  • Deux points de terminaison indépendants : Fournit /anonymous-feedback et /white-board, chacun avec sa propre configuration distincte.

  • Protection par code d’accès : Chaque formulaire est protégé par son propre code d’accès secret pour prévenir le spam. Le code d’accès est le même pour tous, et la page peut également être utilisée en mode privé ou sur l’ordinateur des parents.

  • Groupe cible configurable : Les messages de chaque formulaire sont envoyés sous forme de message privé à un groupe d’utilisateurs spécifique et configurable.

  • Session à usage unique : Après l’envoi réussi d’un message, l’utilisateur est redirigé vers l’écran du code d’accès. Il doit entrer à nouveau le code pour envoyer un autre message, ce qui empêche le spam simple par multiples publications. Après l’envoi, vous revenez sur le code d’accès, il n’est pas facile de publier plusieurs fois.

  • Limitation de débit préservant l’anonymat : Protège contre les attaques par force brute et le spam sans journaliser les adresses IP.

  • Protection contre les bots : Contient un champ honeypot caché pour attraper les bots simples.

  • Utilisateur émetteur personnalisé : Vous pouvez définir un utilisateur bot pour chaque formulaire afin que les messages privés semblent être envoyés par cet utilisateur (par exemple, « FeedbackBot »). L’utilisateur doit exister. Si vide, l’utilisateur système est utilisé par défaut.

  • Interface utilisateur propre et moderne : Les formulaires sont basés sur un composant Ember.js réutilisable pour une expérience utilisateur cohérente et épurée.

Installation

Suivez le guide standard pour l’installation des plugins Discourse : Installer un plugin.

  1. Ajoutez l’URL du dépôt du plugin à votre fichier app.yml :

    hooks:
      after_code:
        - exec:
            cd: $home/plugins
            cmd:
              - git clone https://github.com/elRicharde/discourse-anonymous-feedback
    
  2. Reconstruisez votre conteneur : cd /var/discourse && ./launcher rebuild app

Configuration

Après l’installation, vous pouvez configurer le plugin dans les paramètres d’administration de Discourse. Recherchez « anonymous feedback ». Tous les paramètres sont indépendants pour les formulaires « Anonymous Feedback » et « White Board ».

Paramètre Description
anonymous_feedback_enabled Active ou désactive la page /anonymous-feedback.
white_board_enabled Active ou désactive la page /white-board.
... door_code Le mot de passe secret que les utilisateurs doivent entrer pour accéder au formulaire de message.
... target_group Le nom du groupe d’utilisateurs qui reçoit les messages privés. Ce groupe doit exister.
... rate_limit_per_hour Une limite globale sur le nombre de messages pouvant être envoyés par heure pour prévenir les abus. Défini sur 0 pour désactiver.
... max_message_length Le nombre maximum de caractères autorisés dans le texte du message.
... hmac_rotation_hours La fréquence à laquelle la clé secrète pour la limitation de débit est rotative. Une durée plus courte réinitialise plus rapidement les verrous de force brute mais est légèrement moins sécurisée.
... bot_username Optionnel. Le nom d’utilisateur de l’utilisateur qui enverra le MP. L’utilisateur doit exister. Si vide, l’utilisateur système est utilisé.

Développement / Architecture

  • Backend : Un seul contrôleur Ruby on Rails, AnonymousFeedbackController, traite toutes les requêtes pour les deux points de terminaison. Il utilise une méthode kind qui vérifie le chemin de la requête (/anonymous-feedback vs /white-board) pour déterminer quelles configurations utiliser. Cela évite la duplication de code. Un helper setting dynamique simplifie davantage la lecture de la configuration.

  • Frontend : L’interface utilisateur est basée sur un seul composant Ember.js réutilisable, <AnonymousFeedbackForm />.

    • Ce composant contient tout le HTML, CSS et la logique Javascript pour l’état du formulaire (déverrouillage, envoi, gestion des erreurs).

    • Les modèles de route (anonymous-feedback.hbs et white-board.hbs) sont maintenant extrêmement simples. Ils instancient simplement ce composant et passent les paramètres corrects (par exemple, titre, URLs API). Cette approche DRY (Don’t Repeat Yourself) rend le code frontend propre et facile à maintenir.

Analyse approfondie : Anonymat et limitation de débit (HMAC)

Une fonctionnalité clé de ce plugin est l’équilibre entre l’anonymat absolu et la protection contre les abus (spam).

Le problème : Adresses IP finies

Les adresses IPv4 consistent en un ensemble fini de combinaisons (environ 4,3 milliards).

  • Le risque : Les fonctions de hachage (comme SHA256) sont des fonctions à sens unique irréversibles. Cependant, si nous stockions simplement SHA256(Adresse_IP), un attaquant (ou un administrateur) pourrait pré-calculer les hachages pour toutes les adresses IP existantes (une « table arc-en-ciel ») en quelques secondes. En comparant le hachage stocké avec leur liste, ils pourraient immédiatement révéler l’adresse IP originale.

La solution : HMAC avec un secret rotatif

Nous utilisons HMAC (Hash-Based Message Authentication Code). Cela combine le message (IP) avec une clé secrète cryptographique avant le hachage.

  • Le mécanisme : Identifiant = HMAC(Adresse_IP + Clé_Secrète)

  • Pourquoi cela fonctionne : Même si l’attaquant connaît toutes les adresses IP possibles, il ne connaît pas la Clé_Secrète. Sans cette clé, il ne peut pas pré-calculer les hachages. L’attaque par « table arc-en-ciel » devient impossible car la variable secrète manque.

Confidentialité future (Rotation des clés)

La Clé_Secrète est rotative automatiquement (par exemple, toutes les 4 heures).

  • Scénario : Imaginez que le serveur soit piraté et que l’attaquant vole la Clé_Secrète actuelle et la base de données.

  • Protection : Comme la clé change régulièrement et que les anciennes clés sont définitivement jetées, l’attaquant ne peut calculer les hachages IP que pour la fenêtre de temps actuelle (par exemple, les 4 dernières heures). Toutes les activités d’hier ou de la semaine dernière ont été hachées avec des clés qui n’existent plus. Cela garantit la confidentialité future : l’anonymat passé ne peut être compromis, même si le système actuel est compromis.

Rotation rapide vs lente

Vous pouvez configurer l’intervalle de rotation (hmac_rotation_hours).

  • Rotation rapide (par exemple, 1 heure) :

    • Avantages : Anonymat maximal. La fenêtre de temps où des actions distinctes peuvent être liées au même acteur (inconnu) est très courte.

    • Inconvénients : « Perte de mémoire » pour la limitation de débit. Lorsque la clé tourne, le serveur « oublie » qui a déjà envoyé des messages. Un spammeur bloqué à l’heure 1 est effectivement débloqué à l’heure 2.

  • Rotation lente (par exemple, 24 heures) :

    • Avantages : Protection plus forte contre le spam, car les blocages persistent plus longtemps.

    • Inconvénients : Dans cette fenêtre de 24 heures, un administrateur peut voir que « l’utilisateur X » a envoyé 5 messages, même s’il ne sait pas qui est « l’utilisateur X » (Lienabilité).

Recommandation : Une valeur comprise entre 4 et 12 heures offre un équilibre solide.

3 « J'aime »