Assinaturas do Discourse

Estou louco aqui ou não há validação nenhuma na URL da imagem da assinatura da entrada do usuário?
Basicamente, um usuário pode inserir o que quiser e isso será enviado para outros usuários?

Além disso, por que o tamanho do banco de dados da URL da assinatura está definido como 32.000?
Por que alguém precisaria de 32.000 caracteres para uma URL de imagem?

Assustador :ghost:

Modifiquei o CSS para o seguinte, a fim de codificar permanentemente uma altura e largura máximas;

.signature-img {
  max-width: 600px;
  max-height: 100px;
  width: auto;
  height: auto;
  display: block;
  margin: 5px 0;
}

Mudei o tamanho máximo da URL da assinatura para 250 em plugin.rb

  register_user_custom_field_type("signature_url", :string, max_length: 250)
  register_user_custom_field_type("signature_raw", :string, max_length: 250)

Adicionei isto ao final de “on(:user_updated) do |user|” em plugin.rb (não usarei o modo avançado)

    # Valida a URL se não estiver no modo avançado
    if !SiteSetting.signatures_advanced_mode && user.custom_fields["signature_url"]
      url = user.custom_fields["signature_url"]

      # Validação rigorosa: apenas HTTPS, apenas certos tipos de arquivo de imagem
      unless url =~ /\Ahttps:\/\/a-zA-Z0-9.\-\/_]+\.(png|jpe?g|gif|webp)(\?[a-zA-Z0-9=\&]+)?\z/
        Rails.logger.warn("[discourse-signatures] Rejeitada signature_url inválida para o usuário #{user.id}: #{url.inspect}")
        user.custom_fields["signature_url"] = nil
        user.save
      end
    end

Se estou fazendo algo errado aqui (nunca trabalhei com Discourse antes), por favor, corrija e me mostre a maneira certa de fazer isso.

1 curtida

Porque 250 não é o suficiente…

Essa é a ideia de uma assinatura. O mesmo vale para um fórum, as pessoas inserem coisas e outras pessoas as veem. Mundo louco, né?

5 curtidas

Quando o Discourse é atualizado para 3.5.0.beta8 (3.5.0.beta9-dev também é um problema), descobre-se que o usuário editou a assinatura e não consegue salvá-la (embora mostre salvo, não tem efeito), ainda está normal na 3.5.0.beta7. Esperamos que isso seja corrigido em breve, pois muitos plugins do beta7 para o beta8 são integrados.

2 curtidas

Temos um caso de uso específico para assinaturas e estou imaginando se seria relativamente fácil fazer algumas alterações.

  1. Concordo que gostaria de ver assinaturas apenas para grupos específicos na interface do usuário, não sou bom com CSS.
  2. Estamos usando nosso Discourse tanto como uma comunidade quanto como um sistema de tickets de suporte. Existe alguma maneira de termos uma configuração para “Exibir assinaturas apenas em X categorias”?

Realmente só precisamos delas em nossa seção de suporte, onde a maioria de nossas interações é feita por e-mail.

3 curtidas

4 publicações foram movidas para um novo tópico: Solicitação de recurso: incluir assinatura em notificações por e-mail

Alguém bom em CSS sabe como:

  1. Limitar a capacidade de ter uma assinatura apenas a grupos específicos?

  2. Limitar o tamanho máximo da imagem e o tamanho do texto para a assinatura para mantê-la menos “spammy”?

Acredito que você possa usar isto:

Você pode clicar com o botão direito \u003e Inspecionar para obter um id/classe de um elemento para ocultar com display:none. Receio estar no meu celular agora, então não consigo verificar as classes/ids :sweat_smile: .

Olá pessoal.

Este plugin ainda está disponível?

Não consigo encontrá-lo…

Não está #incluído-no-core, então você precisaria instalá-lo separadamente.

Obrigado. Eu sou péssimo em descobrir essas coisas. Não faço ideia de como eu faria isso. Deveria ser uma configuração. Seria muito mais fácil. Não sei por que algum grupo iria querer permitir assinaturas para todos. Também gostaria que houvesse uma opção para ocultar a configuração “Habilitar Assinaturas - Veja as assinaturas dos usuários abaixo das postagens”.

Também deveria haver uma opção para limitar a contagem de caracteres em uma assinatura de texto e limitar o tamanho da imagem para uma assinatura de banner.

Queria saber CSS, lol.

Ok, para aqueles que realmente querem fazer suas assinaturas funcionarem melhor para o seu grupo (especialmente se você quiser usar as opções para ter uma assinatura como parte de um upgrade/assinatura paga), aqui está o código (e o raciocínio por trás dele) que eu acho que o torna muito melhor e pode ajudar você a impulsionar mais upgrades. Levei muitas tentativas, mas está funcionando. Preste atenção onde você precisa substituir as partes “XXXXX”.

Eu queria realizar as 2 coisas a seguir:
A) Eu queria desabilitar a capacidade de NÃO visualizar assinaturas. Isso significa que os usuários que fizerem o upgrade sabem que sua assinatura será vista por todos.

B) Eu queria que SOMENTE um determinado grupo tivesse a capacidade de criar uma assinatura.

  1. Vá em Admin > Aparência > Temas e componentes > Componentes > Instalar > Criar novo

  2. Adicione este código na aba <head>:

<script>
// Aguarda a estrutura básica da página carregar primeiro
document.addEventListener("DOMContentLoaded", function() {
    
    // Configura o observador
    const observer = new MutationObserver(function(mutations) {
        // Encontra todos os rótulos de controle na página
        const labels = document.querySelectorAll('label.control-label');
        
        labels.forEach(label => {
            // Procura pelo rótulo específico de Assinaturas
            if (label.textContent.trim() === 'Enable Signatures') {
                // Encontra o contêiner principal que contém o rótulo e a caixa de seleção e o oculta
                const controlGroup = label.closest('.control-group') || label.parentElement;
                if (controlGroup) {
                    controlGroup.style.display = 'none';
                }
            }
        });
    });

    // AGORA começa a observar o body, já que sabemos que ele existe
    observer.observe(document.body, { childList: true, subtree: true });
});
</script>

3. Adicione este código na aba css (substitua XXXXX pelo nome do seu grupo):

/* Oculta a seção de assinatura para todos */
.user-preferences .control-group.signatures,
.user-preferences .signature-preferences,
.user-preferences div[data-setting-name="user_card_badge"] + .control-group {
    display: none !important;
}

/* Só mostra se a classe 'user-is-XXXXX' estiver presente no body */
body.user-is-XXXXX .user-preferences .control-group.signatures,
body.user-is-XXXXX .user-preferences .signature-preferences,
body.user-is-XXXXX .user-preferences div[data-setting-name="user_card_badge"] + .control-group {
    display: block !important;
}
  1. Adicione este código na tag <head> abaixo do primeiro bloco acima (substitua XXXXX pelo nome do seu grupo):
<script>
(function() {
  const checkAccess = () => {
    // O Discourse armazena os grupos do usuário atual neste objeto global
    const user = window.Discourse && window.Discourse.User && window.Discourse.User.current();
    
    if (user && user.groups) {
      // Verifica se algum nome de grupo corresponde a "XXXXX"
      const isXXXXX = user.groups.some(g => g.name === 'XXXXX');
      
      if (isXXXXX) {
        document.body.classList.add('user-is-XXXXX');
      }
    }
  };

  // Executa imediatamente
  checkAccess();

  // Executa sempre que o usuário navega entre as páginas
  document.addEventListener('discourse-ready', checkAccess);
  
  // Backup: Executa novamente após 1 segundo para capturar carregamentos lentos
  setTimeout(checkAccess, 1000);
})();
</script>
  1. Adicione este código na aba css abaixo do primeiro bloco acima (substitua XXXXX pelo nome do seu grupo):
/* Oculta a seção de assinatura para todos */
.user-preferences .control-group.signatures,
.user-preferences .signature-preferences,
.user-preferences div[data-setting-name="user_card_badge"] + .control-group {
    display: none !important;
}

/* Só mostra se a classe 'user-is-XXXXX' estiver presente no body */
body.user-is-XXXXX .user-preferences .control-group.signatures,
body.user-is-XXXXX .user-preferences .signature-preferences,
body.user-is-XXXXX .user-preferences div[data-setting-name="user_card_badge"] + .control-group {
    display: block !important;
}

Pronto.

Eu não sou um desenvolvedor. Tudo o que sei é que isso está funcionando 100% no meu site.

Além disso, para o autor do plugin – adoraria a capacidade de limitar a contagem de caracteres da assinatura. Tentei tantas coisas, mas nada funcionou.

1 curtida

Adicionei os recursos mais solicitados ao plugin em uma branch

Se vocês puderem testar esta branch e dar feedback, posso mesclá-la na próxima semana.

3 curtidas

Em relação à atualização, se for na próxima semana, como isso seria feito? :slight_smile:

Como testamos isso? Desculpe pela pergunta de novato. Eu preferiria isso ao que eu criei acima. Além disso, seria possível adicionar uma opção para desativar as assinaturas de imagem e permitir apenas as baseadas em texto? Obrigado!

Olá Long! Você está auto-hospedando seu site do Discourse? Se sim, você pode instalar o plugin usando as instruções vinculadas na primeira postagem.

Pessoalmente, eu recomendaria esperar até que o branch do Falco seja finalizado e mesclado.

Sim, auto-hospedagem. Eu tenho o plugin instalado. Assim que esse branch for finalizado e mesclado, ele será atualizado automaticamente? Obrigado!

1 curtida

Você altera sua linha de plugin no app.yml para ser assim

- sudo -E -u discourse git clone -b feature/group-category-restrictions git@github.com:discourse/discourse-signatures.git

Obrigado. Vou aguardar o plugin atualizado. É menos provável que eu estrague isso :rofl:

Esta pode ser uma pergunta boba, mas quando a atualização é mesclada, o plugin é atualizado automaticamente e veremos as novas opções nas configurações?

Não, eu acredito que você precisará atualizá-lo manualmente.

2 curtidas