هذا هو الهدف الذي لا أعرف كيف أحققه. بصفتي مهندسا عكسيا لنظام iOS، فإن فكرتي هي أنه إذا كنت أعرف في الكود المصدري كيف/أين يرسل الخادم هذه الصورة، فيمكنني تتبع المسار الخلفي ورؤية أين يقوم الخادم بتحميل هذه الصورة محليًا. لكنني أقرأ لغة Ruby كما لو كنت أقرأ كودًا وهميًا، لذا فإن تحديد مكان إرسال الخادم لهذه الصورة يصبح مهمة شاقة للغاية بالنسبة لي
ومع ذلك، يجب أن تكون هذه المهمة أسهل بكثير بالنسبة لشخص على دراية بالكود المصدري.
في discourse/app/models/upload.rb at main · discourse/discourse · GitHub
لاحظت الجدول uploads الذي يخزن جميع ملفات التحميل الخاصة بالمستخدم. بالنسبة للمستخدم Baal998 الذي يحمل معرف مستخدم 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)
وهو نفس ناتج تشغيل 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)
يتطابق sha1 و filesize مع https://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.
ألهمني ذلك بالدخول إلى تطبيق discourse عبر launcher enter app ثم العثور على ذاكرة التخزين المؤقت لـ 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#
اختفت الصورة.