Как удалить файл аватара пользователя?

Привет, команда,

Мой сайт размещён в Китае, и, как вы знаете, все китайские сайты обязаны регистрироваться для получения лицензии от правительства, поэтому все китайские сайты находятся под надзором.

Недавно кто-то сообщил моему провайдеру CDN, Qiniu (также китайской компании), что некоторые изображения на моём сайте являются незаконными. Мой провайдер CDN сообщил мне, что мне следует удалить эти изображения и «обновить кэш URL», иначе они могут приостановить мой аккаунт в соответствии с законом. Однако я обнаружил, что эти изображения являются аватарами пользователей, и я не знаю, как их удалить.

Согласно How to Delete Uploaded Files? - #3 by codinghorror и How to Delete Uploaded Files? - #25 by Falco, загруженные изображения без ссылок будут автоматически удалены через 48 часов. Я заменил эти аватары пользователей на стандартные буквенные, но спустя 72 часа старые аватары пользователей всё ещё не исчезли. Возможно, это связано с тем, что аватары пользователей не считаются загруженными изображениями?

Есть ли у кого-нибудь идеи, как полностью удалить файлы аватаров пользователей с моего сервера?

Заранее спасибо,
Yinglu

Думаю, это всё ещё работает так.

Из URL файла, который вы хотите удалить, извлеките имя файла.

cd /var/discourse/shared/uploads
find . -name =FILENAME= | xargs exec rm

Затем выполните необходимые действия для очистки его из вашего CDN.

Спасибо за помощь! Я пробовал, но не получилось :frowning:

Файл находится по адресу https://iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png, так что, полагаю, имя файла — 5414_2.png, верно?

И путь /uploads находится внутри /shared/standalone, а не /shared.

При этом в /uploads такого файла нет, как видно из вывода оболочки:

root@iosre:/var/discourse/shared# ls
standalone
root@iosre:/var/discourse/shared# cd standalone/
root@iosre:/var/discourse/shared/standalone# ls
backups  postgres_backup  postgres_run  state  uploads
log      postgres_data    redis_data    tmp
root@iosre:/var/discourse/shared/standalone# find . -name 5414_2.png
root@iosre:/var/discourse/shared/standalone# cd uploads/
root@iosre:/var/discourse/shared/standalone/uploads# find . -name 5414_2.png
root@iosre:/var/discourse/shared/standalone/uploads#

Есть ещё какие-нибудь идеи?

Ой, извините. Аватары работают по-другому. Мне нужно будет посмотреть код, чтобы понять, где искать. Если это срочно и у вас есть бюджет, пожалуйста, свяжитесь со мной напрямую. В противном случае, скорее всего, у меня не будет свободного времени на расследование. Возможно, кто-то другой знает.

Извините, это личный сайт, и на данный момент у меня нет бюджета. Спасибо за ваш ответ в любом случае!

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

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


Загруженные файлы именуются на основе SHA1 содержимого изображения — это может помочь вам найти соответствующий файл?

Что-то вроде

a=UserAvatar.where(user_id: 1234)
u=Upload.find(a.custom_upload_id)
upload_url=u.url

Затем

cd /var/discourse/shared/standalone
rm ССЫЛКА_НА_ЗАГРУЗКУ_ВЫШЕ

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

Как это сделать? У меня нет ни малейшего представления.

Например, это изображение: https://iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png

snakeninny@bogon ~ % shasum /Users/snakeninny/Desktop/5414_2.png.jpeg 
c8d561c5484a1f197abd32995411caaa25e53bd6  /Users/snakeninny/Desktop/5414_2.png.jpeg
root@iosre:~# cd /var/discourse/shared/standalone
root@iosre:/var/discourse/shared/standalone# find ./ -name *c8d561c5484a1f197abd32995411caaa25e53bd6*
root@iosre:/var/discourse/shared/standalone# 

Ничего не нашёл. Имеете ли вы в виду это? И есть ли какие-либо идеи?

Это фрагмент кода? Где и как его выполнить? Раньше я был разработчиком под iOS и не знаком с фронтенд-программированием.

Это для консоли Rails. Чтобы попасть туда, выполните:

cd /var/discourse 
./launcher enter app 
rails c

Для выхода используйте exit. А внутри контейнера переходите в /shared, а не по указанному выше полному пути.

Для пользователя lincwee на https://iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png
UserAvatar.where(user_id: 'lincwee') возвращает пустой массив. Есть какие-то идеи?

root@iosre:~# cd /var/discourse/shared/
root@iosre:/var/discourse/shared# /var/discourse/launcher enter app 
WARNING: Docker версия 17.05.0-ce устарела, рекомендуется обновиться до 17.06.2 или новее.
root@iosre-app:/var/www/discourse# rails c
[1] pry(main)> a=UserAvatar.where(user_id: 1234)
=> []
[2] pry(main)> a=UserAvatar.where(user_id: lincwee)
NameError: неопределённая локальная переменная или метод `lincwee' для main:Object
из (pry):2:in `__pry__'
[3] pry(main)> a=UserAvatar.where(user_id: 'lincwee')
=> []
[4] pry(main)> 

Вам понадобится ID, а не имя пользователя.

u=User.find_by(username: "lincwee")

Затем вы можете увидеть ID или получить к нему доступ через u.id

Спасибо, это сработало в какой-то степени. Я выполнил в терминале:

cd /var/discourse/shared/
/var/discourse/launcher enter app
rails c

а затем запустил код:

uid = User.find_by(username: "user_name").id
user_avatars = UserAvatar.where(user_id: uid)
user_avatar = user_avatars[0]
upload_url = Upload.find(user_avatar.custom_upload_id).url

чтобы получить все URL аватаров и удалить их с моего сервера.
Но, полагаю, мне всё ещё нужно обновить систему/кэш? Как это сделать?

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

В новом письме говорилось, что следующие ссылки являются незаконными:

https://cdn.iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/64/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/75/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/75/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/75/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/75/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/lincwee/75/5414_2.png
https://cdn.iosre.com/user_avatar/iosre.com/baal998/96/2210_2.png
https://cdn.iosre.com/user_avatar/iosre.com/lincwee/90/5414_2.png

Как вы видите, это аватары двух пользователей, представляющие собой мемы с бывшим председателем Китая. Снова провайдер CDN попросил меня удалить эти файлы с сервера и обновить кэш CDN.

Из ссылок я увидел, что пользователи — «baal998» и «lincwee». Согласно фрагменту кода в моём предыдущем сообщении, URL загруженной аватарки «lincwee» был /uploads/default/original/2X/5/55512211b1c8969c8038b79840464952cd3eb089.jpeg, а для «baal998» — /uploads/default/original/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183.jpg. Затем я выполнил find /var/discourse/shared/ -name *55512211b1c8969c8038b79840464952cd3eb089* и удалил все найденные файлы; это сработало для «lincwee». Но с «baal998» мне не повезло: я всё ещё мог получить доступ к https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png, хотя файлов с именем *cb2188eaeecc3a648f021fa00da4734bd60ca183* больше не было.

Так где же, чёрт возьми, хранится https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png на моём сервере? :sob:

Хм, это сложная ситуация. Может быть, @falco или кто-то другой, кто недавно работал с аватарами, сможет дать совет?

Или, чтобы упростить: как Discourse обрабатывает переход по ссылке https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png? Если кто-то, знакомый с исходным кодом, сможет подсказать имя файла, класса или функции, это было бы очень полезно. Спасибо!

Посмотрите, кажется, в модели Uploads.

Также начните с получения данных с вашего сервера, а не из CDN. Вам нужно убедиться, что вы решаете проблему в правильном месте. Как только вы убедитесь, что сервер не отправляет изображения, можно работать с CDN.

Поскольку https://cdn.iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png загружается с CDN,
https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png должна загружаться с моего сервера, верно?

Да, и вы видите, что это отправляется вашим сервером. Значит, нужно исправлять именно эту ссылку. После того как вы остановите отправку изображений, можно очистить CDN.