Firmas de Discourse

¿Estoy loco o no hay ninguna validación en la URL de la imagen de la firma de la entrada del usuario?
Básicamente, ¿un usuario puede introducir lo que quiera y se enviará a otros usuarios?

Además, ¿por qué el tamaño de la base de datos de la URL de la firma se establece en 32_000?
¿Por qué alguien necesitaría 32000 caracteres para una URL a una imagen?

Espeluznante :ghost:

Modifiqué el CSS a esto para codificar de forma rígida una altura y anchura máximas;

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

Cambié el tamaño máximo de la URL de la firma a 250 en plugin.rb

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

Añadí esto al final de “on(:user_updated) do |user|” en plugin.rb (no usaré el modo avanzado)

    # Validar la URL si no está en modo avanzado
    if !SiteSetting.signatures_advanced_mode && user.custom_fields["signature_url"]
      url = user.custom_fields["signature_url"]

      # Validación estricta: solo HTTPS, solo ciertos tipos de archivos de imagen
      unless url =~ /\Ahttps:\/\/\[a-zA-Z0-9.\-\/_]+\.(png|jpe?g|gif|webp)(\?[a-zA-Z0-9=\&]+)?\z/
        Rails.logger.warn("[discourse-signatures] Rechazada signature_url inválida para el usuario #{user.id}: #{url.inspect}")
        user.custom_fields["signature_url"] = nil
        user.save
      end
    end

Si estoy haciendo algo mal aquí (nunca he trabajado con Discourse antes), por favor corrígelo y muéstrame la forma correcta de hacerlo.

1 me gusta

Porque 250 no es suficiente…

Esta es la idea de una firma. Lo mismo ocurre con un foro, la gente introduce cosas y otras personas las ven. Mundo loco, ¿eh?

5 Me gusta

Cuando Discourse se actualiza a 3.5.0.beta8 (3.5.0.beta9-dev también es un problema), se descubre que el usuario editó la firma y no puede guardarla (aunque muestra que se guardó pero no tiene efecto), todavía es normal en 3.5.0.beta7. Espero que se solucione pronto, ya que muchos plugins de beta7 a beta8 están integrados.

2 Me gusta

Tenemos un caso de uso específico para las firmas y me pregunto si sería relativamente fácil hacer algunos cambios.

  1. Estoy de acuerdo en que me gustaría ver firmas solo para grupos específicos en la interfaz de usuario, no soy bueno con CSS.
  2. Estamos utilizando nuestro Discourse tanto como una comunidad como un sistema de tickets de soporte. ¿Hay alguna manera de que podamos obtener una configuración para “Mostrar solo firmas en X categorías”?

Realmente solo las necesitamos en nuestra sección de soporte, donde la mayoría de nuestras interacciones se realizan por correo electrónico.

3 Me gusta

4 publicaciones se dividieron en un nuevo tema: Solicitud de función: incluir firma en las notificaciones por correo electrónico

¿Alguien que sepa de css sabe cómo:

  1. ¿Limitar la capacidad de tener una firma solo a grupos específicos?

  2. ¿Limitar el tamaño máximo de imagen y el tamaño de texto para la firma para mantenerla menos spam?

Creo que puedes usar esto:

Puedes hacer clic derecho > Inspeccionar para obtener un id/clase de un elemento para ocultar con display:none. Me temo que ahora estoy en mi teléfono, así que no puedo verificar las clases/ids :sweat_smile: .

Hola a todos.

¿Este complemento sigue disponible?

No logro encontrarlo…

No está included-in-core, por lo que necesitarías instalarlo por separado.

Gracias. Soy malísimo para descifrar esas cosas. No tengo idea de cómo haría esto. Debería ser una configuración. Mucho más fácil. No sé por qué algún grupo querría permitir firmas para todos. También desearía que hubiera una opción para ocultar la configuración “Habilitar firmas - Ver firmas de usuario debajo de las publicaciones”.

También debería haber una opción para limitar el número de caracteres en una firma de texto y limitar el tamaño de la imagen para una firma de banner.

Ojalá supiera css jaja.

Ok, para aquellos que realmente quieran que sus firmas funcionen mejor para su grupo (especialmente si quieren usar las opciones para que una firma sea parte de una mejora/suscripción pagada), aquí hay código (y el razonamiento detrás de él) que creo que lo hace mucho mejor y puede ayudarlo a impulsar más mejoras. Me tomó muchos intentos, pero está funcionando. Preste atención a dónde necesita reemplazar las partes “XXXXX”.

Quería lograr las siguientes 2 cosas:
A) Quería deshabilitar la capacidad de NO ver las firmas. Esto significa que aquellos usuarios que sí mejoran saben que su firma será vista por todos.

B) Quería que SOLO un cierto grupo tuviera la capacidad de crear una firma.

  1. Vaya a Admin > Apariencia > Temas y componentes > Componentes > Instalar > Crear nuevo

  2. Agregue este código a la pestaña <head>:

<script>
// Esperar a que se cargue primero la estructura básica de la página
document.addEventListener("DOMContentLoaded", function() {
    
    // Configurar el observador
    const observer = new MutationObserver(function(mutations) {
        // Encontrar todas las etiquetas de control en la página
        const labels = document.querySelectorAll('label.control-label');
        
        labels.forEach(label => {
            // Buscar la etiqueta específica de Firmas
            if (label.textContent.trim() === 'Enable Signatures') {
                // Encontrar el contenedor principal que contiene tanto la etiqueta como la casilla de verificación y ocultarlo
                const controlGroup = label.closest('.control-group') || label.parentElement;
                if (controlGroup) {
                    controlGroup.style.display = 'none';
                }
            }
        });
    });

    // AHORA empezar a observar el body, ya que sabemos que existe
    observer.observe(document.body, { childList: true, subtree: true });
});
</script>

3. Agregue este código a la pestaña css (reemplace XXXXX con el nombre de su grupo):

/* Ocultar la sección de firma 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;
}

/* Solo mostrar si la clase 'user-is-XXXXX' está presente en el 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. Agregue este código a la etiqueta <head> debajo del primer bloque de arriba (reemplace XXXXX con el nombre de su grupo):
<script>
(function() {
  const checkAccess = () => {
    // Discourse almacena los grupos del usuario actual en este objeto global
    const user = window.Discourse && window.Discourse.User && window.Discourse.User.current();
    
    if (user && user.groups) {
      // Comprobar si algún nombre de grupo coincide con "XXXXX"
      const isXXXXX = user.groups.some(g => g.name === 'XXXXX');
      
      if (isXXXXX) {
        document.body.classList.add('user-is-XXXXX');
      }
    }
  };

  // Ejecutar inmediatamente
  checkAccess();

  // Ejecutar cada vez que el usuario navega entre páginas
  document.addEventListener('discourse-ready', checkAccess);
  
  // Copia de seguridad: Ejecutar de nuevo después de 1 segundo para capturar cargas lentas
  setTimeout(checkAccess, 1000);
})();
</script>
  1. Agregue este código a la pestaña css debajo del primer bloque de arriba (reemplace XXXXX con el nombre de su grupo):
/* Ocultar la sección de firma 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;
}

/* Solo mostrar si la clase 'user-is-XXXXX' está presente en el 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;
}

Hecho.

No soy desarrollador. Todo lo que sé es que esto está funcionando al 100% en mi sitio.

Además, para el autor del complemento: ME ENCANTARÍA la capacidad de limitar el recuento de caracteres de la firma. Intenté muchas cosas pero nada funcionó.

1 me gusta

He añadido las características más solicitadas al complemento en una rama

Si podéis probar esta rama y dar vuestra opinión, puedo fusionarla la próxima semana.

3 Me gusta

Con respecto a la actualización, si es la próxima semana, ¿cómo se haría? :slight_smile:

¿Cómo probamos esto? Disculpa la pregunta de novato. Preferiría esto a lo que se me ocurrió anteriormente. Además, ¿sería posible añadir una opción para desactivar las firmas de imagen y solo permitir las basadas en texto? ¡Gracias!

¡Hola Long! ¿Estás autoalojando tu sitio de Discourse? Si es así, puedes instalar el complemento usando las instrucciones enlazadas en la primera publicación.

Personalmente, recomendaría esperar hasta que la rama de Falco esté finalizada y fusionada.

Sí, autoalojamiento. Tengo el complemento instalado. Una vez que esa rama se finalice y se fusione, ¿se actualizará automáticamente? ¡Gracias!

1 me gusta

Cambias tu línea de plugin en app.yml para que sea así

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

Gracias. Esperaré el complemento actualizado. Es menos probable que lo estropee :rofl:

Esta podría ser una pregunta tonta, pero cuando se fusiona la actualización, ¿el complemento se actualiza automáticamente y veremos las nuevas opciones en la configuración?

No, creo que necesitarás actualizarlo manualmente.

2 Me gusta