Discourse detectando incorretamente arquivo enviado como imagem

Investiguei esse problema.

Resumindo, seu arquivo está sendo detectado como JPEG porque começa com a mesma assinatura deste tipo de arquivo.
Corrigir esse comportamento no Discourse é possível, mas requer uma modificação. (veja no final)


Aqui algumas coisas técnicas.
Este problema começa aqui:

A biblioteca FastImage abre o arquivo e determina o tipo e o tamanho.
Como esperado, ela retorna um tipo JPEG.

Se você olhar a assinatura JPEG, ela se parece com isto:

Marcadores JPEG

Mais informações: List of file signatures - Wikipedia
JPEG - Wikipedia

Sempre começa com os seguintes bytes de marcador: FF D8

Olhando para sua amostra de arquivo com um editor hexadecimal, você verá que começa da mesma forma.

Agora, se você olhar como o FastImage detecta um JPEG, você pode ver aqui:

No entanto, você não pode extrair nenhuma informação da imagem, pois nem todos os bytes necessários estão presentes.

Como corrigimos esse problema no Discourse?
Olhando o código do FastImage, há uma opção valiosa que você pode passar.

Usando essa opção, qualquer erro (SizeNotFound, ImageFetchFailure, CannotParseImage, UnknownImageType, BadImageURI) não retornará nenhuma informação de imagem; e seu arquivo não será detectado como uma imagem.

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

Então, pode funcionar agora:

Posso fazer um PR mais tarde. Usar essa opção faz sentido aqui. :+1: