C’est l’objectif que je ne sais pas comment atteindre. En tant qu’ingénieur en rétro-ingénierie iOS, mon idée est que si je connais dans le code source comment et où le serveur envoie cette image, je peux remonter la piste et voir où le serveur charge cette image localement. Mais je lis le Ruby comme si c’était du pseudo-code, donc localiser l’endroit où le serveur envoie cette image devient une tâche énorme pour moi
Cela devrait être beaucoup plus facile pour quelqu’un qui connaît bien le code source.
Dans discourse/app/models/upload.rb at main · discourse/discourse · GitHub,
j’ai remarqué la table uploads qui stocke tous les fichiers uploadés par un utilisateur. Pour l’utilisateur Baal998 dont l’ID est 1637, j’ai ensuite exécuté SELECT * FROM uploads WHERE user_id = '1637'; et le résultat est :
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 row)
Cela correspond au résultat de l’exécution de Upload.find(user_avatar.custom_upload_id).url avec Rails.
Je suppose qu’après que l’utilisateur a téléchargé son avatar, Discourse effectue certaines opérations sur le fichier d’origine et stocke les fichiers optimisés ailleurs ?
Dans la table optimized_images, cette ligne semblait suspecte
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 row)
Le sha1 et la filesize correspondent à https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png , mais ce fichier n’existe pas sur le serveur.
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
Je ne sais pas ce qui ne va pas.
Problème résolu :
Quelqu’un de mon forum m’a indiqué que cette image d’avatar pourrait être stockée dans le cache nginx sous proxy_cache_path, qui se trouve généralement dans /var/nginx/cache, mais je n’ai trouvé ni proxy_cache_path ni /var/nginx/cache.
Ses propos m’ont inspiré : j’ai accédé à l’application Discourse via launcher enter app, puis j’ai trouvé le cache 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#
Et j’ai supprimé tous les caches :
root@iosre-app:/var/nginx/cache# ls
root@iosre-app:/var/nginx/cache#
L’image a disparu.