Discourse detecta incorrectamente el archivo subido como una imagen

Investigué un poco sobre este problema.

En resumen, tu archivo está siendo detectado como JPEG porque comienza con la misma firma que este tipo de archivo.
Es posible solucionar este comportamiento en Discourse, pero requiere una modificación. (ver al final)


Aquí hay algo técnico.
Este problema comienza aquí:

La biblioteca FastImage abre el archivo y determina el tipo y el tamaño.
Como esperas, devuelve un tipo JPEG.

Si miras la firma JPEG, se ve así:

Marcadores JPEG

Más información: List of file signatures - Wikipedia
JPEG - Wikipedia

Siempre comienza con los siguientes bytes de marcador: FF D8

Si miras tu muestra de archivo con un editor hexadecimal, verás que comienza igual.

Ahora, si miras cómo FastImage detecta un JPEG, puedes verlo aquí:

Sin embargo, no puedes extraer ninguna información de la imagen ya que no están todos los bytes requeridos.

¿Cómo solucionamos este problema en Discourse?
Mirando el código de FastImage, hay una opción valiosa que puedes pasar.

Al usar esta opción, cualquier error (SizeNotFound, ImageFetchFailure, CannotParseImage, UnknownImageType, BadImageURI) no devolverá información de imagen; y tu archivo no será detectado como una imagen.

@image_info =
  begin
    FastImage.new(@file, raise_on_failure: true)
  rescue StandardError
    nil
  end
...
is_image ||= @image_info && FileHelper.is_supported_image?("test.#{@image_info.type}")

Entonces, puede funcionar ahora:

Puedo hacer un PR más tarde. Usar esta opción tiene sentido aquí. :+1: