Como faço para excluir o arquivo do avatar do usuário?

Olá equipe,

Meu website está hospedado na China e, como vocês sabem, todos os sites chineses precisam registrar uma licença junto ao governo; portanto, todos os sites chineses estão sob supervisão.

Alguém relatou recentemente ao meu provedor de CDN, a Qiniu (que também é uma empresa chinesa), que algumas imagens em meu site são ilegais. Meu provedor de CDN me informou que devo excluir essas imagens e “atualizar os caches de URL”, caso contrário, poderão suspender minha conta de acordo com a lei. No entanto, descobri que essas imagens são avatares de usuários, e não sei como excluí-los.

De acordo com How to Delete Uploaded Files? - #3 by codinghorror e How to Delete Uploaded Files? - #25 by Falco, imagens carregadas sem referências serão excluídas automaticamente em 48 horas. Substituí esses avatares de usuários pelas imagens padrão com letras, mas nada parece estar acontecendo com os antigos avatares após 72 horas. Talvez seja porque os avatares de usuários não sejam considerados imagens carregadas?

Alguma ideia sobre como posso excluir completamente os arquivos de avatar de usuário no meu servidor?

Obrigado antecipadamente,
Yinglu

Acho que ainda funciona assim.

A partir da URL do arquivo que deseja excluir, obtenha o nome do arquivo.

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

Em seguida, faça o necessário para removê-lo da sua CDN.

Obrigado por me ajudar. Tentei, mas não funcionou :frowning:

O arquivo é https://iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png, então imagino que o nome do arquivo seja 5414_2.png, correto?

E o /uploads está dentro de /shared/standalone, e não em /shared.
E não há tal arquivo em /uploads, como você pode ver no shell:

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#

Alguma outra ideia?

Ah, desculpe. Os avatares funcionam de maneira diferente. Eu precisaria analisar o código para entender onde procurar. Se isso for uma emergência e você tiver orçamento, entre em contato comigo diretamente. Caso contrário, provavelmente não terei tempo livre para investigar. Talvez alguém mais saiba.

Desculpe, este é um site pessoal e, por enquanto, não tenho orçamento. Agradeço sua resposta mesmo assim!

Para evitar que os usuários façam upload de futuros avatares, você pode desativar a configuração allow uploaded avatars e ativar a configuração do site selectable avatars com uma grande seleção.

Acho que você pode precisar fazer o upload de um marcador de posição de substituição para que a exclusão automática ocorra — o registro do usuário ainda mantém a imagem do avatar carregada ativa, mesmo que não esteja em uso.


Os arquivos carregados são nomeados com base no SHA1 do conteúdo da imagem — isso pode ajudá-lo a encontrar o arquivo de suporte?

Algo como

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

Depois

cd /var/discourse/shared/standalone
rm URL_DE_UPLOAD_ACIMA

Tenho mais de 7 mil usuários registrados e menos de 5 usam avatares ilegais sem saber, então não quero transformar isso em um problema de 0 ou 1; prefiro resolver caso a caso, em vez de impedir todos os usuários de usar avatares personalizados.

Como faço isso? Não faço a menor ideia.

Por exemplo, esta imagem: 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# 

Sem sucesso. É isso que você quis dizer? E tem alguma ideia?

Is this a piece of code? Where and how do I execute it? I used to be an iOS developer and am not familiar with front-end programming

É para o console do Rails. Você acessa com:

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

Use exit para sair. E dentro do container, você faz cd para /shared em vez do caminho completo acima.

Para o usuário lincwee em https://iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png
UserAvatar.where(user_id: 'lincwee') retorna um array vazio. Alguma ideia?

root@iosre:~# cd /var/discourse/shared/
root@iosre:/var/discourse/shared# /var/discourse/launcher enter app 
AVISO: A versão do Docker 17.05.0-ce está descontinuada, recomenda-se atualizar para a 17.06.2 ou mais recente.
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: variável ou método local `lincwee' não definido para main:Object
from (pry):2:in `__pry__'
[3] pry(main)> a=UserAvatar.where(user_id: 'lincwee')
=> []
[4] pry(main)> 

Você precisará do ID, não do nome de usuário.

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

Depois, você pode ver o ID ou acessá-lo com u.id

Obrigado, funcionou até certo ponto. Executei

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

no terminal e, em seguida, executei o código

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

para listar todas as URLs de avatares e excluí-las do meu servidor.
Mas acho que ainda preciso atualizar o sistema/cache? Como devo fazer isso?

Recebi outro e-mail do meu provedor de CDN e eles congelaram minha conta de CDN. Então, preciso atualizar este tópico para obter mais ajuda.

O novo e-mail disse que os seguintes links eram ilegais.

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

Como você pode ver, são avatares de dois usuários, que são memes de um ex-presidente chinês. Novamente, o provedor de CDN pediu que eu excluísse esses arquivos do servidor e atualizasse a CDN.

Pude ver pelos links que os usuários eram “baal998” e “lincwee”. De acordo com o trecho de código em minha última postagem, a URL do avatar enviado de “lincwee” era /uploads/default/original/2X/5/55512211b1c8969c8038b79840464952cd3eb089.jpeg, enquanto para “baal998” era /uploads/default/original/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183.jpg. Em seguida, executei find /var/discourse/shared/ -name *55512211b1c8969c8038b79840464952cd3eb089* e excluí todos os arquivos encontrados; funcionou para “lincwee”. Mas não tive sorte com “baal998”; ainda consegui acessar https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png, mesmo que não houvesse mais arquivos com o nome *cb2188eaeecc3a648f021fa00da4734bd60ca183*.

Então, onde diabos está https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png armazenado no meu servidor? :sob:

Hmm, essa é uma situação difícil. Talvez @falco ou alguém mais que trabalhou recentemente com avatares possa te orientar?

Ou, para simplificar: como o Discourse processa uma visita a https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png? Se alguém familiarizado com o código-fonte puder me indicar o arquivo de origem ou a classe/função, seria muito útil. Obrigado!

Olhe no modelo Uploads, eu acho.

Além disso, comece buscando do seu servidor, não da CDN. Você quer ter certeza de que está resolvendo o problema no lugar certo. Assim que tiver certeza de que o servidor não está enviando as imagens, você pode trabalhar com a CDN.

Como https://cdn.iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png vem da CDN,
https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png deveria vir do meu servidor, certo?

Sim, e você vê que está sendo enviado pelo seu servidor. Então, esse é o link que deve ser corrigido. Depois que você impedir o envio das imagens, pode limpar o CDN.