Discourse détecte incorrectement le fichier téléchargé comme une image

J’ai creusé un peu ce problème.

En bref, votre fichier est détecté comme JPEG car il commence par la même signature que ce type de fichier.
Corriger ce comportement dans Discourse est possible, mais cela nécessite une modification. (voir à la fin)


Voici quelques informations techniques.
Ce problème commence ici :

La bibliothèque FastImage ouvre le fichier et détermine le type et la taille.
Comme vous vous y attendez, elle renvoie un type JPEG.

Si vous regardez la signature JPEG, elle ressemble à ceci :

Marqueurs JPEG

Plus d’informations : List of file signatures - Wikipedia
JPEG - Wikipedia

Elle commence toujours par les octets de marqueur suivants : FF D8

En regardant votre échantillon de fichier avec un éditeur hexadécimal, vous verrez qu’il commence de la même manière.

Maintenant, si vous regardez comment FastImage détecte un JPEG, vous pouvez voir ici :

Cependant, vous ne pouvez pas extraire d’informations d’image car tous les octets requis ne sont pas présents.

Comment résoudre ce problème dans Discourse ?
En regardant le code de FastImage, il y a une option précieuse que vous pouvez passer.

En utilisant cette option, toute erreur (SizeNotFound, ImageFetchFailure, CannotParseImage, UnknownImageType, BadImageURI) ne renverra aucune information d’image ; et votre fichier ne sera pas détecté comme une image.

@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}")

Alors, cela peut fonctionner maintenant :

Je pourrai faire une PR plus tard. Utiliser cette option a du sens ici. :+1: