엔지니어링 사용자 중 일부가 이색적인 확장자를 가진 데이터 파일을 게시글에 첨부하길 원합니다. 해당 파일은 기본적으로 일반 텍스트 파일이지만 확장 ASCII 문자를 포함하고 있습니다.
Discourse의 NGINX 설정을 업데이트하여 이러한 파일에 대한 MIME 미디어 유형을 지정하도록 해보았지만 작동하지 않았습니다. 2주 전 이 주제에 대해 메타 포럼(How to customize MIME media type emitted for certain attachments?)에 질문을 게시했지만 아직 답변을 받지 못했습니다. NGINX를 업데이트하지 않아도 Discourse는 "application/octet-stream"이라는 폴백 MIME 유형을 사용하여 알려지지 않은 파일 유형을 서빙합니다. 당장은 그 정도는 감당할 수 있습니다.
그러나 사용자가 이러한 데이터 파일을 게시글에 업로드할 때(“업로드” 버튼을 사용하거나 드래그 앤 드롭을 하는 경우), Discourse에서 다음과 같은 오류 팝업이 표시됩니다:
사용자가 파일을 업로드할 때 Discourse가 지능적으로 작동하여 해당 파일이 이미지인지 다른 파일 유형인지 감지하려는 것 같습니다. 또한, 이 판정은 파일 내용(표준 Unix 명령인 "file"이 하는 방식과 유사하게)을 확인하여 내리는 것으로 보입니다. 이는 Discourse가 파일을 게시글 내용과 인라인으로 표시할지, 아니면 첨부파일로 옆에 둘지 결정하기 위한 것으로 추정됩니다.
이러한 데이터 파일의 경우, 이 체크가 파일을 이미지로 잘못 식별하고 있습니다. 재미로 몇몇 데이터 파일을 Ubuntu 시스템에 올려 “file” 명령으로 확인해 보니, 과연 "JPEG image data"로 식별되었습니다.
Discourse가 이미지가 아닌지 감지하려는 시도를 하지 않고 파일을 업로드할 수 있는 방법이 있을까요? 즉, "무조건 첨부파일로 업로드하고, 인라인으로 표시하지 말 것"과 같은 기능 말입니다.
대안으로, Discourse를 zip 파일 허용으로 설정하고 사용자가 업로드 전에 파일을 압축하도록 안내할 수 있지만, 사이트가 임의의 zip 파일 업로드에 열려 있게 되는 것은 원하지 않습니다. 이는 보안 문제로 보입니다.
수정을 하라고 제안하는 것은 아닙니다. 다만, 더 이상 기다릴 수 없다면 해당 변경 사항을 테스트해 볼 수 있습니다.
임시 변경 (재빌드 후 사라짐):
cd /var/discourse
./launcher enter app
sed -i "s/FastImage.new(@file)/FastImage.new(@file, :raise_on_failure=>true)/" lib/upload_creator.rb
sed -i "s/FastImage.new(original_path)/FastImage.new(original_path, :raise_on_failure=>true)/" app/models/upload.rb
exit
영구 변경 (재빌드 후에도 유지):
cd /var/discourse
nano containers/app.yml (편한 편집기를 사용하세요)
다음 커스텀 명령을 파일의 끝(run 섹션)에 추가하세요:
- replace:
filename: "/var/www/discourse/lib/upload_creator.rb"
from: "FastImage.new(@file)"
to: "FastImage.new(@file, :raise_on_failure=>true)"
- replace:
filename: "/var/www/discourse/app/models/upload.rb"
from: "FastImage.new(original_path)"
to: "FastImage.new(original_path, :raise_on_failure=>true)"
그리고 재빌드하세요:
./launcher rebuild app
확장자 없이 파일을 업로드할 계획이라면 그렇게 될 것 같습니다. 다른 발생 위치에서도 동일한 변경이 필요한지는 확인하지 않았습니다.