如何删除用户头像文件?

这正是我不知该如何实现的目标。作为一名 iOS 逆向工程师,我的思路是:如果我能从源代码中了解服务器发送这张图片的方式或位置,我就可以逆向追踪,找到服务器在本地加载该图片的位置。但我读 Ruby 代码就像在读伪代码,因此定位服务器发送该图片的位置对我来说是一项极其艰巨的任务 :sob: 不过,对于熟悉源代码的人来说,这应该会容易得多。

discourse/app/models/upload.rb at main · discourse/discourse · GitHub 中,我看到了 uploads 表,它存储了用户的所有上传文件。对于用户 Baal998(其用户 ID 为 1637),我执行了 SELECT * FROM uploads WHERE user_id = '1637';,结果如下:

  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)

这与在 Rails 中运行 Upload.find(user_avatar.custom_upload_id).url 得到的结果相同。

我的猜测是,在用户上传头像后,Discourse 会对原始头像文件进行一些处理,并将优化后的文件存储在其他位置?

在表 optimized_images 中,这一行看起来有些可疑:

  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)

该行的 sha1filesizehttps://iosre.com/user_avatar/iosre.com/baal998/135/2210_2.png 匹配,但在服务器上该文件并不存在。

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

不知道问题出在哪里。

问题已解决:

我论坛上的一位用户告诉我,该头像图片可能存储在 nginx 的 proxy_cache_path 缓存中,通常路径为 /var/nginx/cache,但我既找不到 proxy_cache_path 配置,也找不到 /var/nginx/cache 目录。

受他启发,我通过 launcher enter app 进入 discourse 应用,随后找到了 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# 

并删除了所有缓存:

root@iosre-app:/var/nginx/cache# ls
root@iosre-app:/var/nginx/cache# 

图片随后消失了。