Secure Media Uploads ломает логотипы категорий

Варианты «Безопасные медиа» + «Включить загрузки S3», похоже, ломают логотипы категорий.

Недавно я обнаружил, что загруженные документы можно просматривать и скачивать по прямой ссылке пользователи, у которых нет доступа к закрытому посту, в котором был загружен документ. Я понимал, что для использования функции «Безопасные медиа» сначала нужно включить загрузки S3, поэтому я сначала включил их и вручную скопировал загрузки с сервера Discourse в бакет S3. Затем я последовал этой теме, чтобы включить «Безопасные медиа»:

После выполнения этой процедуры мне пришлось выполнить discourse remap, чтобы изменить путь /uploads/default/ на //bucketname-etc-etc/. После remap я выполнил rake posts:rebake, и в целом всё выглядело хорошо. Все остальные загрузки (документы и изображения в постах, изображения брендинга сайта и т. д.) по-прежнему отображались и ссылались корректно после включения «Безопасных медиа» и выполнения соответствующих задач rake и remap. Мне пришлось повторно загрузить аватары пользователей и логотипы групп, но после этого они все корректно отображались и имели новые короткие URL-адреса и URL-адреса secure-media-uploads, как и ожидалось.

Однако я заметил, что изображения логотипов категорий больше не отображаются. При проверке в режиме разработчика браузера я обнаружил, что при повторной загрузке изображения логотипа категории создавался правильный URL secure-media-uploads, и изображение отображалось корректно. Но как только я нажимал «Сохранить категорию», страница категории обновлялась и пыталась отобразить изображение, напрямую обращаясь к не подписанному URL AWS S3, из-за чего изображение не отображалось:

Каждая страница в Discourse, где отображается изображение логотипа категории, пытается обратиться к не подписанному URL AWS S3 вместо URL secure-media-uploads.

В качестве обходного решения мне пришлось утомительно посещать каждый объект изображения логотипа категории в AWS S3 и изменять разрешения на «Чтение для всех».

Я подтвердил, что это поведение наблюдается в браузерах Chrome, Firefox и Microsoft Edge. Я пробовал выполнять задачи rake posts:rebake и uploads:secure_upload_analyse_and_update, но они, похоже, никак не влияют на логотипы категорий. Возможно, существует другая задача, которая исправит неправильно указанные URL-адреса изображений логотипов категорий? Или это действительно задумано так, и все объекты загрузок S3 должны быть доступны для чтения всеми, за исключением тех, которые защищены (закрытые посты)?

3 лайка

Спасибо, что подняли этот вопрос. Я не знал, что существуют логотипы категорий :sweat: Я изучу это на этой неделе и постараюсь найти для вас решение.

6 лайков

Круто! Большое спасибо, @martin!

3 лайка

Я думаю, что основная проблема здесь заключается в том, что метод secure_upload_analyse_and_update слишком категоричен при определении того, что должно быть защищено, а что нет. Класс UploadSecurity (discourse/lib/upload_security.rb at main · discourse/discourse · GitHub) проверяет, должны ли такие публичные типы загрузок (например, аватары, логотипы категорий и т. д.) быть защищёнными, в момент загрузки, но этот type отсутствует при повторной проверке в задаче Rake.

У меня есть внутренняя задача по улучшению этого механизма путём проверки всех мест, где может находиться загрузка, в момент выполнения этой проверки безопасности, но это займёт время и является частью более широкого плана по более аккуратному хранению ссылок на загрузки.

В любом случае, я сейчас создаю PR для исправления этой проблемы, сделав логотипы и фоны категорий публичными типами при решении, должны ли они быть защищёнными. После того как этот PR будет принят и вы обновите систему, вам нужно будет просто повторно загрузить изображения категорий, и всё должно заработать корректно.

4 лайка