¿Cómo elimino el archivo del avatar del usuario?

Hola equipo,

Mi sitio web está alojado en China y, como saben, todos los sitios web chinos deben registrarse para obtener una licencia del gobierno; por lo tanto, todos los sitios web chinos están bajo supervisión.

Alguien informó recientemente a mi proveedor de servicios CDN, Qiniu (que también es una empresa china), de que algunas imágenes de mi sitio web son ilegales. Mi proveedor de CDN me informó que debía eliminar estas imágenes y “actualizar la caché de las URL”, de lo contrario podrían suspender mi cuenta según la ley. Sin embargo, descubrí que estas imágenes eran avatares de usuarios, y no sé cómo eliminarlos.

Según How to Delete Uploaded Files? - #3 by codinghorror y How to Delete Uploaded Files? - #25 by Falco, las imágenes cargadas sin referencias se eliminarán automáticamente en 48 horas. He reemplazado estos avatares de usuario por los predeterminados con letras, pero después de 72 horas no parece haber ocurrido nada con los avatares antiguos; quizás sea porque los avatares de usuario no se consideran imágenes cargadas.

¿Alguna idea sobre cómo puedo eliminar completamente los archivos de los avatares de usuario en mi servidor?

Gracias de antemano,
Yinglu

Creo que todavía funciona así.

A partir de la URL del archivo que deseas eliminar, obtén el nombre del archivo.

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

Luego, harás lo necesario para eliminarlo de tu CDN.

¡Gracias por ayudarme! Lo intenté, pero no funcionó :frowning:

El archivo es https://iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png, así que supongo que el nombre del archivo es 5414_2.png, ¿correcto?

Y /uploads está bajo /shared/standalone en lugar de /shared.
No hay tal archivo en /uploads, como puedes ver en la terminal:

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#

¿Alguna otra idea?

Lo siento. Los avatares funcionan de manera diferente. Tendría que revisar el código para saber dónde buscar. Si esto es una emergencia y tienes presupuesto, por favor contáctame directamente. De lo contrario, probablemente no tendré tiempo libre para investigarlo. Quizás alguien más lo sepa.

Lo siento, pero este es un sitio web personal y por ahora no tengo presupuesto. ¡Gracias de todos modos por tu respuesta!

Para evitar que los usuarios suban nuevos avatares, puedes desactivar la opción allow uploaded avatars (permitir avatares subidos) y activar la configuración del sitio selectable avatars (avatares seleccionables) con una gran selección.

Creo que es posible que necesites subir un marcador de posición de reemplazo para que se produzca la eliminación automática; el registro del usuario sigue manteniendo activa la imagen del avatar subido, aunque no se esté utilizando.


Los archivos subidos se nombran según el SHA1 del contenido de la imagen; eso podría ayudarte a encontrar el archivo de respaldo.

Algo así como

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

Luego

cd /var/discourse/shared/standalone
rm UPLOAD_URL_FROM_ABOVE

Tengo más de 7 mil usuarios registrados y menos de 5 utilizan avatares ilegales sin saberlo, así que no quiero convertir esto en un problema de 0 o 1; prefiero resolverlo caso por caso en lugar de impedir que todos los usuarios usen avatares personalizados.

¿Cómo lo hago? No tengo la menor idea.

Por ejemplo, esta imagen: 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# 

Sin éxito. ¿Es esto a lo que te refieres? ¿Tienes alguna idea?

¿Es esto un fragmento de código? ¿Dónde y cómo lo ejecuto? Solía ser desarrollador de iOS y no estoy familiarizado con la programación del lado del cliente.

Es para la consola de Rails. Puedes acceder con:

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

Puedes usar exit para salir. Y dentro del contenedor, navegas a /shared en lugar de la ruta completa anterior.

Para el usuario lincwee en https://iosre.com/user_avatar/iosre.com/lincwee/135/5414_2.png
UserAvatar.where(user_id: 'lincwee') devuelve un array vacío. ¿Alguna idea?

root@iosre:~# cd /var/discourse/shared/
root@iosre:/var/discourse/shared# /var/discourse/launcher enter app 
ADVERTENCIA: La versión de Docker 17.05.0-ce está obsoleta; se recomienda actualizar a 17.06.2 o superior.
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 o método local no definido `lincwee' para main:Object
de (pry):2:in `__pry__'
[3] pry(main)> a=UserAvatar.where(user_id: 'lincwee')
=> []
[4] pry(main)> 

Necesitarás el ID, no el nombre de usuario.

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

Luego puedes ver el ID o acceder a él con u.id.

Gracias, funcionó hasta cierto punto. He ejecutado

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

en la terminal y luego ejecuté el 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 las URLs de avatares y las eliminé de mi servidor.
Pero supongo que todavía necesito actualizar más el sistema o la caché. ¿Cómo debería hacerlo?

Recibí otro correo de mi proveedor de CDN y han congelado mi cuenta. Así que tengo que actualizar este hilo para pedir más ayuda.

El nuevo correo indicaba que los siguientes enlaces eran ilegales:

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 pueden ver, se trata de dos avatares de usuarios que son memes de un ex presidente chino. De nuevo, el proveedor de CDN me pidió que eliminara estos archivos del servidor y actualizara la CDN.

Pude ver por los enlaces que los usuarios eran “baal998” y “lincwee”. Según el fragmento de código de mi última publicación, la URL del avatar subido de “lincwee” era /uploads/default/original/2X/5/55512211b1c8969c8038b79840464952cd3eb089.jpeg, mientras que para “baal998” era /uploads/default/original/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183.jpg. Ejecuté entonces find /var/discourse/shared/ -name *55512211b1c8969c8038b79840464952cd3eb089* y eliminé todos los archivos encontrados; funcionó para “lincwee”. Pero no tuve suerte con “baal998”; aún podía acceder a https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png, aunque ya no hubiera archivos con el nombre *cb2188eaeecc3a648f021fa00da4734bd60ca183*.

Entonces, ¿dónde demonios está almacenado en mi servidor https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png? :sob:

Hmm, esa es una situación difícil. ¿Quizás @falco o alguien más que haya trabajado recientemente en avatares pueda asesorarte?

O para hacerlo más sencillo: ¿Cómo analiza Discourse una visita a https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png? Si alguien familiarizado con el código fuente puede indicarme el archivo o la clase/función correspondiente, sería de gran ayuda. ¡Gracias!

Mira en el modelo de Cargas, creo.

Además, empieza extrayendo desde tu servidor, no desde la CDN. Quieres asegurarte de que estás resolviendo el problema en el lugar correcto. Una vez que estés seguro de que el servidor no está enviando las imágenes, puedes trabajar con la CDN.

Dado que https://cdn.iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png proviene de la CDN,
https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png debería provenir de mi servidor, ¿correcto?

Sí, y puedes ver que se está enviando desde tu servidor. Así que ese es el enlace que debes intentar corregir. Después de que logres que deje de enviar las imágenes, puedes limpiar la CDN.