يبدو أن خيارا “وسائط آمنة” + “تمكين تحميلات S3” يتسببان في تعطل شعارات الفئات.
اكتشفتُ مؤخرًا أنه يمكن للمستخدمين الذين لا يملكون صلاحية الوصول إلى المنشور الخاص الذي تم فيه تحميل المستند، عرض أو تنزيل المستندات عبر رابط URL مباشر. وقد فهمتُ أنه يجب تمكين “تحميلات S3” أولًا لاستخدام ميزة “الوسائط الآمنة”، لذا قمتُ بتمكينها أولاً ونقلتُ يدويًا الملفات المُحمَّلة من خادم Discourse إلى سلة S3. ثم اتبعتُ هذا المنشور لتمكين “الوسائط الآمنة”:
بعد اتباع هذه الإجراءات، كان عليّ إجراء عملية إعادة تعيين (remap) في Discourse لتغيير مسار /uploads/default/ إلى //bucketname-etc-etc/. وبعد إعادة التعيين، نفذتُ أمر rake posts:rebake، فبدت الأمور جيدة إلى حد كبير. فكل التحميلات الأخرى (المستندات والصور في المنشورات، وصور العلامة التجارية للموقع، إلخ) ظلت تُعرض وتُربط بشكل صحيح بعد تمكين “الوسائط الآمنة” وتنفيذ مهام rake وإعادة التعيين المناسبة. ومع ذلك، كان عليّ إعادة تحميل صور رموز المستخدمين وشعارات المجموعات، ولكن بمجرد إعادة تحميلها، ظهرت جميعها بشكل صحيح وحصلت على عناوين URL القصيرة وعناوين URLs الخاصة بـ secure-media-uploads كما هو متوقع.
ولكن لاحظتُ أن صور شعارات الفئات لم تعد تُعرض. وعند التحقق عبر وضع المطور في المتصفح، لاحظتُ أنه عند إعادة تحميل صورة شعار فئة ما، يتم إنشاء عنوان URL صحيح خاص بـ secure-media-uploads، فتُعرض الصورة بشكل صحيح. ومع ذلك، بمجرد النقر على “حفظ الفئة”، يتم تحديث صفحة الفئة وتُحاول بشكل خاطئ الربط مباشرةً بعنوان URL غير موقّع من AWS S3 للصورة، مما يمنع عرض الصورة:
كل صفحة في Discourse تعرض فيها صورة شعار فئة ما تحاول الربط مباشرةً بعنوان URL غير موقّع من AWS S3 للصورة بدلاً من عنوان URL الخاص بـ secure-media-uploads.
كحل بديل، اضطررتُ إلى زيارة كل كائن صورة شعار فئة في AWS S3 بشكل متعب وتغيير الصلاحيات إلى “قراءة عامة”.
لقد تأكدتُ من أن هذا السلوك موجود في متصفحات Chrome وFirefox وMicrosoft Edge. وقد جربتُ مهام rake posts:rebake وuploads:secure_upload_analyse_and_update، لكنها لا تبدو وكأنها تؤثر على شعار الفئة. هل هناك ربما مهمة أخرى ستصلح عناوين URLs غير الصحيحة لشعارات الفئات؟ أم أن هذا السلوك مقصود بالفعل، مما يتطلب أن تكون جميع كائنات التحميل في S3 ذات صلاحيات قراءة عامة، باستثناء تلك الآمنة (المنشورات الخاصة)؟
أعتقد أن المشكلة الرئيسية هنا هي أن دالة secure_upload_analyse_and_update قاسية بعض الشيء عند تحديد ما يجب أن يكون آمناً وما لا يجب، لأن فئة UploadSecurity (discourse/lib/upload_security.rb at main · discourse/discourse · GitHub) تتحقق من مكان وجود هذه الأنواع العامة من التحميلات (مثل صور الرموز الشخصية، وشعارات التصنيفات، وما إلى ذلك) سواء يجب أن تكون آمنة أم لا وقت التحميل، وهذا type غير موجود عند إعادة التحقق في مهمة rake.
لدي مهمة مسجلة داخلياً لتحسين هذا الأمر من خلال التحقق من جميع الأماكن التي يمكن أن توجد فيها التحميلات وقت إجراء فحص الأمان، لكن هذا الأمر بعيد المنال حالياً، وهو جزء من خطة أكبر لتخزين مراجع التحميلات بطريقة أكثر تنظيماً.
على أي حال، أقوم حالياً ببناء طلب دمج (PR) لحل هذه المشكلة بجعل شعارات التصنيفات والخلفيات من الأنواع العامة عند النظر في ما إذا كان يجب أن تكون آمنة أم لا. بمجرد دمج هذا الطلب وتحديثك، ستحتاج فقط إلى إعادة تحميل صور التصنيفات، وستكون الأمور على ما يرام.