This is the goal that I have no idea how to achieve. As an iOS reverse engineer, my idea is that if I know in the source code how/where the server sends this image, I can track back and see where the server loads this image locally. But I read Ruby like reading seudo code, so locating where the server sends this image becomes a great great task for me
That should be a lot easier for a person whoâre familiar with the source code though
In discourse/upload.rb at master ¡ discourse/discourse ¡ GitHub
I saw the table uploads which stored all the uploads of a user. For user Baal998 whose user ID is 1637, I then run SELECT * FROM uploads WHERE user_id = '1637'; and the result is
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)
Which is the same to running Upload.find(user_avatar.custom_upload_id).url with rails.
My guess is that after the user uploaded avatar, discourse will do something to the original avatar file and store the optimized files in somewhere else?
In table optimized_images this row seemed suspicious
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)
The sha1 and filesize matches https://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png , but on server this file doesnât exist.
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 idea what was wrong.
Problem solved:
Someone from my forum told me that this avatar image might be stored in nginx cache under proxy_cache_path, which was usually /var/nginx/cache, but I couldnât find either proxy_cache_path or /var/nginx/cache.
I was inspired by him that I entered the discourse app via launcher enter app and then found nginx cache:
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#
And deleted all the caches:
root@iosre-app:/var/nginx/cache# ls
root@iosre-app:/var/nginx/cache#
The image was gone.
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.