Plugin para Postar Tópico Anônimo via MP ou dar Feedback anônimo

:information_source: Resumo fornece dois formulários de postagem independentes e anônimos
:hammer_and_wrench: Link do Repositório GitHub - elRicharde/discourse-anonymous-feedback: Anonymous Feedback Formular in Discourse · GitHub
:open_book: Guia de Instalação Como instalar plugins no Discourse

Este plugin do Discourse oferece dois formulários de postagem independentes e anônimos: “Feedback Anônimo” e “Quadro Branco”. Ambos os formulários são protegidos por um “código de porta” (uma senha simples) e permitem que usuários sem conta enviem uma mensagem privada para um grupo de usuários pré-configurado, mesmo que seu fórum exija login normalmente; esses dois formulários não exigem.

Tecnicamente, as postagens são enviadas por meio de uma página da web sem necessidade de login e podem até ser usadas em uma aba de navegação anônima. Não há possibilidade de rastrear o remetente, pois os endereços IP não são registrados. Este plugin foi projetado para oferecer um canal seguro e confidencial para comunicação.

Por que usar este plugin?

Em muitas comunidades, tópicos sensíveis ou ideias exigem um canal de feedback que garanta anonimato e reduza a pressão social. Este plugin aborda vários desafios-chave:

  • Fomentar Feedback Sem Inibições: Oferece um espaço seguro para usuários (e até mesmo não usuários, se o código de porta for compartilhado externamente) compartilharem opiniões honestas e sem filtros, preocupações ou ideias inovadoras, sem medo de julgamento ou represálias. Isso pode levar a contribuições mais francas e valiosas que, de outra forma, seriam omitidas.

  • Confidencialidade e Confiança: Ao garantir o anonimato por meio de medidas técnicas (como limitação de taxa baseada em HMAC sem registro de IP), o plugin gera confiança e encoraja uma participação mais ampla, especialmente para assuntos delicados.

  • Preencher Lacunas de Comunicação: Cria uma ponte de comunicação acessível para indivíduos que hesitam em postar publicamente ou que não possuem uma conta no Discourse, ampliando assim o alcance do engajamento da comunidade.

  • Entrada Estruturada: Ao direcionar o feedback para um grupo privado específico, garante que informações sensíveis sejam revisadas pelos membros da equipe adequados, permitindo discussão focada e ação fora da vista pública.

  • Simplicidade para Não Usuários: O mecanismo de código de porta permite que partes externas ou visitantes temporários forneçam contribuições sem a sobrecarga do registro completo de conta.

Em última análise, este plugin aprimora a interação da comunidade, permitindo um ambiente mais inclusivo e seguro para discussões e sugestões críticas.

Como Funciona (Visão Técnica)

O plugin foi desenvolvido com foco no anonimato e na segurança.

  1. Acesso: Um usuário navega até /anonymous-feedback ou /white-board.

  2. Desbloqueio: O usuário deve inserir o código de porta correto. O servidor valida esse código.

    • Para evitar ataques de força bruta, o servidor utiliza um sistema de limitação de taxa baseado em um hash HMAC do endereço IP do usuário e de um segredo rotativo. O endereço IP em si nunca é armazenado.

    • Se o código estiver correto, o servidor define uma flag temporária e de uso único na sessão do usuário.

  3. Envio: O usuário escreve e envia sua mensagem.

  4. Criar MP: O servidor verifica a flag da sessão. Se válida, cria uma nova mensagem privada para o grupo de destino configurado e a publica como o usuário bot configurado (ou usuário do sistema). A flag da sessão é então imediatamente excluída, de modo que o usuário precisa inserir o código de porta novamente para qualquer mensagem adicional.

Casos de Uso / Fluxos de Trabalho

Este plugin foi projetado para ser flexível. Aqui estão dois fluxos de trabalho comuns que você pode implementar:

Caso de Uso 1: O “Quadro Branco” - Um Mural de Avisos Público Moderado

Este caso de uso é para criar visibilidade para tópicos sensíveis ou comportamentos inadequados observados na comunidade (por exemplo, em eventos ou em interações gerais). Por exemplo, tornar visíveis questões como sexismo.

O Objetivo: Tornar questões importantes visíveis para a comunidade sem expor a identidade da pessoa que as relatou. O foco está na mensagem, não no remetente, e possivelmente nem mesmo nos indivíduos envolvidos. Uma representação simples de situações com comportamento inadequado, sem citar nomes, ainda cria visibilidade e aumenta a conscientização.

O Fluxo de Trabalho:

  1. Submissão: Um usuário envia uma postagem por meio do formulário /white-board. Isso pode ser acessado por membros (MG), aprendizes (ANW) e facilitadores (FM). Apenas o usuário “Anonymous” pode criar postagens.

  2. Revisão Privada: A postagem chega como uma Mensagem Privada ao target_group configurado (por exemplo, uma equipe de moderação ou um comitê de “Confiança e Segurança”). Será identificável como uma entrada do “Quadro Branco”.

  3. Análise: A equipe revisa a submissão contra critérios pré-definidos (por exemplo, sem ataques pessoais, sem insultos, adesão às diretrizes da comunidade).

  4. Publicação (Se Aprovada): Um administrador é convidado para a mensagem, que a converte em um tópico público em uma categoria pública dedicada chamada “Quadro Branco”. Este tópico é publicado usando uma conta genérica específica (por exemplo, um usuário “WhiteBoardBot” ou “Anonymous”, configurado via a configuração bot_username). As credenciais de login deste usuário podem ser compartilhadas com o grupo revisor. A publicação é feita pelo usuário “Anonymous”.

  5. Controle de Discussão: As permissões da categoria “Quadro Branco” são definidas de modo que sejam visíveis para membros/aprendizes/facilitadores, mas não comentáveis. Espera-se que os moderadores normais do fórum não moderem esta área específica; isso é responsabilidade exclusiva do target_group designado. Ainda resta a questão de saber se o Quadro Branco deve conter subcategorias (por exemplo, “anônimo fechado” ou categorias específicas para postagens do target_group).

  6. Tratamento de Rejeições: Como não há como entrar em contato com o remetente anônimo, é uma boa prática ter um tópico fixado na categoria “Quadro Branco” explicando os critérios de publicação e as razões pelas quais uma submissão pode ser rejeitada. Regras que justificam a não publicação devem sempre ser tornadas públicas em um único local no fórum.

Caso de Uso 2: Feedback Anônimo - Um Canal Direto e Privado

Este caso de uso é para fornecer uma linha de comunicação direta e confidencial a uma equipe específica para qualquer tipo de feedback (por exemplo, feedback de votação ou outras sugestões anônimas).

O Objetivo: Oferecer aos membros e não membros uma maneira segura de fornecer feedback sobre assuntos da comunidade, votações ou outros tópicos diretamente para a liderança ou um comitê relevante.

O Fluxo de Trabalho:

  1. Submissão: Um usuário envia feedback por meio do formulário /anonymous-feedback. A linha de assunto pode ajudar a categorizar a mensagem. Esta postagem chega com o prefixo de assunto “Mensagem Anônima - dd.mm.aaaa, hh:mm:ss” para a caixa de entrada coletiva do target_group.

  2. Entrega Privada: A mensagem chega como uma Mensagem Privada ao target_group. É identificável como “Feedback Anônimo” pelo prefixo do assunto. O target_group então decide o que fazer com a mensagem.

  3. Tratamento Interno: A equipe pode então discutir o feedback em privado, envolver outras partes relevantes se necessário ou decidir sobre uma ação. Este feedback pode ser usado para feedback de votação ou outras sugestões anônimas.

  4. Melhor Prática para Feedback Inadequado: Se uma submissão for inadequada, a equipe pode simplesmente excluí-la. Você pode considerar publicar um aviso genérico e público (por exemplo, em uma categoria “Notícias”) declarando que “Feedback recebido em [Data] não foi processado porque violou nossos padrões da comunidade para comunicação respeitosa.” Isso informa o remetente sem revelar detalhes e o encoraja a reenviar de maneira mais construtiva. Se for uma postagem para o Quadro Branco (identificável por não ter marcação especial, ou possivelmente um sufixo se útil): os moderadores são convidados para a mensagem, mas ninguém responde à mensagem. Os moderadores convertem a mensagem em um tópico na categoria “Quadro Branco” → visível para membros/aprendizes/facilitadores e não comentável.

Recursos

  • Dois Endpoints Independentes: Fornece /anonymous-feedback e /white-board, cada um com sua própria configuração separada.

  • Proteção por Código de Porta: Cada formulário é protegido por seu próprio código de porta secreto para evitar spam. O código de porta é o mesmo para todos, e a página também pode ser usada em modo privado ou no computador dos pais.

  • Grupo de Destino Configurável: Mensagens de cada formulário são enviadas como uma mensagem privada para um grupo de usuários específico e configurável.

  • Sessão de Uso Único: Após o envio bem-sucedido de uma mensagem, o usuário é redirecionado de volta para a tela do código de porta. Eles devem inserir o código novamente para enviar outra mensagem, o que evita spam simples de múltiplas postagens. Após o envio, você retorna ao código de porta; múltiplas postagens não são facilmente possíveis.

  • Limitação de Taxa que Preserva o Anonimato: Protege contra ataques de força bruta e spam sem registrar endereços IP.

  • Proteção contra Bots: Contém um campo honeypot oculto para capturar bots simples.

  • Usuário Remetente Personalizável: Você pode definir um usuário bot para cada formulário para que as mensagens privadas pareçam ser enviadas por este usuário (por exemplo, “FeedbackBot”). O usuário deve existir. Se vazio, o usuário do sistema é usado por padrão.

  • Interface de Usuário Limpa e Moderna: Os formulários são baseados em um componente reutilizável Ember.js para uma experiência de usuário consistente e limpa.

Instalação

Siga o guia padrão para instalar plugins do Discourse: Instalar um Plugin.

  1. Adicione a URL do repositório do plugin ao seu arquivo app.yml:

    hooks:
      after_code:
        - exec:
            cd: $home/plugins
            cmd:
              - git clone https://github.com/elRicharde/discourse-anonymous-feedback
    
  2. Reconstrua seu contêiner: cd /var/discourse && ./launcher rebuild app

Configuração

Após a instalação, você pode configurar o plugin nas configurações de administração do Discourse. Pesquise por “anonymous feedback”. Todas as configurações são independentes para os formulários “Feedback Anônimo” e “Quadro Branco”.

Configuração Descrição
anonymous_feedback_enabled Ativa ou desativa a página /anonymous-feedback.
white_board_enabled Ativa ou desativa a página /white-board.
... door_code A senha secreta que os usuários devem inserir para acessar o formulário de mensagem.
... target_group O nome do grupo de usuários que receberá as mensagens privadas. Este grupo deve existir.
... rate_limit_per_hour Um limite global de quantas mensagens podem ser enviadas por hora para evitar abusos. Defina como 0 para desativar.
... max_message_length O número máximo de caracteres permitidos no texto da mensagem.
... hmac_rotation_hours Com que frequência a chave secreta para limitação de taxa é rotacionada. Uma duração menor redefine as travas de força bruta mais rapidamente, mas é ligeiramente menos segura.
... bot_username Opcional. O nome de usuário do usuário que enviará a MP. O usuário deve existir. Se vazio, o usuário do sistema é usado.

Desenvolvimento / Arquitetura

  • Backend: Um único controlador Ruby on Rails, AnonymousFeedbackController, processa todas as solicitações para ambos os endpoints. Ele usa um método kind que verifica o caminho da solicitação (/anonymous-feedback vs. /white-board) para determinar quais configurações usar. Isso evita duplicação de código. Um helper dinâmico setting simplifica ainda mais a leitura da configuração.

  • Frontend: A interface do usuário é baseada em um único componente reutilizável Ember.js, <AnonymousFeedbackForm />.

    • Este componente contém todo o HTML, CSS e lógica Javascript para o estado do formulário (desbloqueio, envio, tratamento de erros).

    • Os modelos de rota (anonymous-feedback.hbs e white-board.hbs) agora são extremamente simples. Eles apenas instanciam este componente e passam os parâmetros corretos (por exemplo, título, URLs da API). Esta abordagem DRY (Don’t Repeat Yourself) torna o código do frontend limpo e fácil de manter.

Análise Profunda: Anonimato e Limitação de Taxa (HMAC)

Um recurso central deste plugin é o equilíbrio entre anonimato absoluto e proteção contra abusos (spam).

O Problema: Endereços IP Finitos

Os endereços IPv4 consistem em um conjunto finito de combinações (aproximadamente 4,3 bilhões).

  • O Risco: Funções de hash (como SHA256) são funções unidirecionais irreversíveis. No entanto, se simplesmente armazenássemos SHA256(IP_Address), um atacante (ou administrador) poderia pré-calcular os hashes para todos os endereços IP existentes (uma “Tabela Arco-íris”) em segundos. Ao comparar o hash armazenado com sua lista, eles poderiam revelar imediatamente o IP original.

A Solução: HMAC com um Segredo Rotativo

Usamos HMAC (Hash-Based Message Authentication Code). Isso combina a mensagem (IP) com uma Chave Secreta criptográfica antes de fazer o hash.

  • O Mecanismo: Identificador = HMAC(IP_Address + Secret_Key)

  • Por que funciona: Mesmo que o atacante conheça todos os endereços IP possíveis, ele não conhece a Secret_Key. Sem essa chave, ele não pode pré-calcular os hashes. O ataque de “Tabela Arco-íris” torna-se impossível porque a variável secreta está faltando.

Sigilo Futuro (Rotação de Chave)

A Secret_Key é rotacionada automaticamente (por exemplo, a cada 4 horas).

  • Cenário: Imagine que o servidor foi hackeado e o atacante roubou a Secret_Key atual e o banco de dados.

  • Proteção: Como a chave muda regularmente e as chaves antigas são descartadas permanentemente, o atacante só pode calcular hashes de IP para a janela de tempo atual (por exemplo, as últimas 4 horas). Todas as atividades de ontem ou da semana passada foram hashadas com chaves que não existem mais. Isso garante Sigilo Futuro: o anonimato passado não pode ser quebrado, mesmo que o sistema atual seja comprometido.

Rotação Rápida vs. Lenta

Você pode configurar o intervalo de rotação (hmac_rotation_hours).

  • Rotação Rápida (por exemplo, 1 hora):

    • Prós: Anonimato máximo. A janela de tempo em que ações distintas podem ser vinculadas ao mesmo ator (desconhecido) é muito curta.

    • Contras: “Perda de memória” para limitação de taxa. Quando a chave é rotacionada, o servidor “esquece” quem já enviou mensagens. Um spammer bloqueado na Hora 1 é efetivamente desbloqueado na Hora 2.

  • Rotação Lenta (por exemplo, 24 horas):

    • Prós: Proteção mais forte contra spam, pois os bloqueios persistem por mais tempo.

    • Contras: Dentro desta janela de 24 horas, um administrador pode ver que o “Usuário X” enviou 5 mensagens, mesmo que não saiba quem é o “Usuário X” (Vinculabilidade).

Recomendação: Um valor entre 4 e 12 horas oferece um equilíbrio sólido.

3 curtidas