Este es el objetivo que no tengo idea de cómo lograr. Como ingeniero inverso de iOS, mi idea es que, si sé en el código fuente cómo y dónde el servidor envía esta imagen, puedo rastrear hacia atrás y ver dónde el servidor carga esta imagen localmente. Pero leo Ruby como si fuera pseudocódigo, por lo que localizar dónde el servidor envía esta imagen se convierte en una tarea enorme para mí
Sin embargo, eso debería ser mucho más fácil para una persona familiarizada con el código fuente.
En discourse/app/models/upload.rb at main · discourse/discourse · GitHub
vi la tabla uploads, que almacena todas las subidas de un usuario. Para el usuario Baal998, cuyo ID de usuario es 1637, ejecuté SELECT * FROM uploads WHERE user_id = '1637'; y el resultado fue:
id | user_id | original_filename | filesize | width | height | url | created_at | updated_at | sha1 | origin | retain_hours | extension | thumbnail_width | thumbnail_height | etag | secure | access_control_post_id | original_sha1 | animated | verified | verification_status
------+---------+-------------------+----------+-------+--------+-----------------------------------------------------------------------------+----------------------------+----------------------------+------------------------------------------+--------+--------------+-----------+-----------------+------------------+------+--------+------------------------+---------------+----------+----------+---------------------
2210 | 1637 | 2.pic.jpg | 60610 | | | /uploads/default/original/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183.jpg | 2016-08-08 09:37:13.937306 | 2018-01-05 02:38:49.498264 | cb2188eaeecc3a648f021fa00da4734bd60ca183 | | | jpg | | | | f | | | | | 1
(1 fila)
Lo cual es equivalente a ejecutar Upload.find(user_avatar.custom_upload_id).url con Rails.
Mi hipótesis es que, después de que el usuario sube su avatar, Discourse realiza alguna operación sobre el archivo original y almacena los archivos optimizados en otro lugar.
En la tabla optimized_images, esta fila parecía sospechosa
id | sha1 | extension | width | height | upload_id | url | filesize | etag | version | created_at | updated_at
-------+------------------------------------------+-----------+-------+--------+-----------+----------------------------------------------------------------------------------------+----------+------+---------+----------------------------+----------------------------
49538 | e6dc9b0d6c18f2a4c3c0d2027534d01cfc89c84e | .jpg | 135 | 135 | 2210 | /uploads/default/optimized/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183_2_135x135.jpg | 10968 | | 2 | 2016-08-08 09:37:13.937306 | 2016-08-08 09:37:13.937306
(1 fila)
El sha1 y el filesize coinciden con https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png , pero en el servidor este archivo no existe.
root@iosre:/var/discourse/shared/standalone# ls /uploads/default/optimized/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183_2_135x135.jpg
ls: cannot access /uploads/default/optimized/2X/c/cb2188eaeecc3a648f021fa00da4734bd60ca183_2_135x135.jpg: No such file or directory
No tengo idea de qué estaba mal.
Problema resuelto:
Alguien de mi foro me dijo que esta imagen de avatar podría estar almacenada en la caché de nginx bajo proxy_cache_path, que suele ser /var/nginx/cache, pero no pude encontrar ni proxy_cache_path ni /var/nginx/cache.
Su sugerencia me inspiró a entrar a la aplicación de Discourse mediante launcher enter app y luego encontré la caché de nginx:
root@iosre:/var/discourse/shared# /var/discourse/launcher enter app
WARNING: Docker version 17.05.0-ce deprecated, recommend upgrade to 17.06.2 or newer.
root@iosre-app:/var/www/discourse# cd /var/nginx/cache
root@iosre-app:/var/nginx/cache# ls
0 1 2 3 4 5 6 7 8 9 a b c d e f
root@iosre-app:/var/nginx/cache#
Y eliminé todas las cachés:
root@iosre-app:/var/nginx/cache# ls
root@iosre-app:/var/nginx/cache#
La imagen desapareció.