Comment supprimer le fichier de l'avatar utilisateur ?

Bonjour l’équipe,

Mon site web est hébergé en Chine et, comme vous le savez, tous les sites chinois doivent obtenir une licence gouvernementale ; par conséquent, tous les sites chinois sont soumis à une surveillance.

Quelqu’un a récemment signalé à mon fournisseur de CDN, Qiniu (qui est également une entreprise chinoise), que certaines images de mon site étaient illégales. Mon fournisseur de CDN m’a informé que je devais supprimer ces images et « rafraîchir les caches d’URL », sinon il pourrait suspendre mon compte conformément à la loi. Cependant, j’ai constaté que ces images étaient des avatars d’utilisateurs, et je ne sais pas comment les supprimer.

Selon How to Delete Uploaded Files? - #3 by codinghorror et How to Delete Uploaded Files? - #25 by Falco, les images téléchargées sans références sont automatiquement supprimées après 48 heures. J’ai remplacé ces avatars d’utilisateurs par les avatars par défaut avec des lettres, mais rien ne semble se produire avec les anciens avatars après 72 heures. Peut-être est-ce parce que les avatars d’utilisateurs ne sont pas considérés comme des images téléchargées ?

Avez-vous des idées sur la façon de supprimer complètement les fichiers d’avatars d’utilisateurs de mon serveur ?

Merci d’avance,
Yinglu

Je pense que cela fonctionne toujours ainsi.

À partir de l’URL du fichier que vous souhaitez supprimer, récupérez le nom du fichier.

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

Ensuite, vous devez procéder à sa purge depuis votre CDN.

Merci de m’avoir aidé, j’ai essayé mais ça n’a pas marché :frowning:

Le fichier est https://iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png, donc je suppose que le nom du fichier est 5414_2.png, c’est bien ça ?

Et /uploads se trouve sous /shared/standalone plutôt que sous /shared.
Et il n’y a pas un tel fichier dans /uploads, comme vous pouvez le voir dans le 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#

D’autres idées ?

Oh, désolé. Les avatars fonctionnent différemment. Je devrais examiner le code pour savoir où chercher. Si c’est une urgence et que vous avez un budget, veuillez me contacter directement. Sinon, je n’aurai probablement pas de temps libre pour enquêter. Peut-être que quelqu’un d’autre le sait.

Désolé, il s’agit d’un site personnel et je n’ai actuellement aucun budget. Merci quand même pour votre réponse !

Pour empêcher les utilisateurs de télécharger de futurs avatars, vous pouvez désactiver l’option « autoriser les avatars téléchargés » et activer le paramètre du site « avatars sélectionnables » avec une grande sélection.

Je pense que vous devrez peut-être télécharger un espace réservé de remplacement pour permettre la suppression automatique — l’enregistrement de l’utilisateur conserve toujours l’image de l’avatar téléchargée, même si elle n’est pas utilisée.


Les fichiers téléchargés sont nommés en fonction du SHA1 du contenu de l’image — cela pourrait vous aider à trouver le fichier sous-jacent ?

Quelque chose comme

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

Ensuite

cd /var/discourse/shared/standalone
rm UPLOAD_URL_FROM_ABOVE

J’ai plus de 7 000 utilisateurs enregistrés et moins de 5 d’entre eux utilisent des avatars illégaux sans le savoir. Je ne veux donc pas transformer cela en un problème binaire (0 ou 1) ; je préfère résoudre cela au cas par cas plutôt que d’empêcher tous les utilisateurs d’utiliser des avatars personnalisés.

Comment puis-je faire cela ? Je n’ai aucune idée du tout.

Par exemple, cette image : 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# 

Aucun succès. Est-ce bien cela que vous vouliez dire ? Et avez-vous des idées ?

S’agit-il d’un extrait de code ? Où et comment l’exécuter ? J’étais auparavant développeur iOS et je ne suis pas familier avec la programmation front-end.

C’est pour la console Rails. Vous y accédez avec

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

Vous pouvez utiliser exit pour quitter. Et à l’intérieur du conteneur, vous allez dans /shared plutôt que dans le chemin complet ci-dessus.

Pour l’utilisateur lincwee sur https://iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png
UserAvatar.where(user_id: 'lincwee') renvoie un tableau vide. Des idées ?

root@iosre:~# cd /var/discourse/shared/
root@iosre:/var/discourse/shared# /var/discourse/launcher enter app 
ATTENTION : La version Docker 17.05.0-ce est obsolète, il est recommandé de passer à la version 17.06.2 ou supérieure.
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 : variable locale ou méthode `lincwee' non définie pour main:Object
from (pry):2:in `__pry__'
[3] pry(main)> a=UserAvatar.where(user_id: 'lincwee')
=> []
[4] pry(main)> 

Vous aurez besoin de l’ID, pas du nom d’utilisateur.

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

Vous pourrez ensuite voir l’ID ou y accéder via u.id.

Merci, cela a fonctionné dans une certaine mesure. J’ai exécuté

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

dans le terminal, puis j’ai exécuté le code

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

pour lister toutes les URL des avatars et les supprimer de mon serveur.
Mais je suppose que je dois encore actualiser davantage le système/le cache ? Comment dois-je procéder ?

J’ai reçu un autre e-mail de mon fournisseur CDN et ils ont gelé mon compte CDN. Je dois donc mettre à jour ce fil pour obtenir de l’aide supplémentaire.

Le nouvel e-mail indiquait que les liens suivants étaient illégaux.

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

Comme vous pouvez le voir, il s’agit de deux avatars d’utilisateurs, qui sont des mèmes d’un ancien président chinois. Encore une fois, le fournisseur CDN m’a demandé de supprimer ces fichiers du serveur et de rafraîchir le CDN.

Je pouvais voir dans le lien que les utilisateurs étaient « baal998 » et « lincwee ». Selon l’extrait de code de mon dernier message, l’URL de l’avatar téléchargé de « lincwee » était /uploads/default/original/2X/5/55512211b1c8969c8038b79840464952cd3eb089.jpeg, tandis que pour « baal998 », c’était /uploads/default/original/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183.jpg. J’ai ensuite exécuté find /var/discourse/shared/ -name *55512211b1c8969c8038b79840464952cd3eb089* et supprimé tous les fichiers trouvés ; cela a fonctionné pour « lincwee ». Mais pas de chance pour « baal998 », je pouvais toujours accéder à https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png même s’il n’y avait plus de fichiers portant le nom *cb2188eaeecc3a648f021fa00da4734bd60ca183*.

Alors où diable est stocké https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png sur mon serveur ? :sob:

Hmm, c’est une situation délicate. Peut-être que @falco ou quelqu’un d’autre ayant travaillé récemment sur les avatars pourrait vous conseiller ?

Ou pour simplifier : Comment Discourse analyse-t-il une visite sur https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png ? Si quelqu’un qui connaît le code source peut m’indiquer le fichier source ou la classe/fonction concernée, ce serait vraiment utile. Merci !

Regardez dans le modèle Uploads, je pense.

De plus, commencez par récupérer depuis votre serveur, et non depuis le CDN. Vous devez vous assurer de résoudre le problème au bon endroit. Une fois que vous êtes certain que le serveur n’envoie pas les images, vous pourrez travailler avec le CDN.

Puisque https://cdn.iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png provient du CDN,
https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png devrait provenir de mon serveur, n’est-ce pas ?

Oui, et vous voyez que c’est envoyé par votre serveur. C’est donc ce lien qu’il faut tenter de corriger. Une fois que vous avez arrêté l’envoi des images, vous pouvez vider le CDN.