حسناً، يبدو أنني في حالة صيد للأخطاء هذا الأسبوع.
لدينا منتدى مفعّل فيه خيار secure_uploads، وجميع الملفات المرفوعة مُخزّنة على (الخادم الرسمي) AWS S3.
المشكلة: روابط الاختصار القصير لا تعمل بشكل صحيح، حيث يبدو أن جزء uploads/{database_id} مفقود من الرابط.
يبدو أن الكود المُسبّب للمشكلة موجود في UploadsController::show_short:
if upload = Upload.find_by(sha1: sha1)
return handle_secure_upload_request(upload, Discourse.store.get_path_for_upload(upload))
if upload.secure? && SiteSetting.secure_media?
if Discourse.store.internal?
send_file_local_upload(upload)
else
redirect_to Discourse.store.url_for(upload, force_download: params[:dl] == "1")
end
else
render_404
end
إذن، إذا كانت upload.secure? && SiteSetting.secure_media? صحيحة، فإن الطلب تتم معالجته بواسطة
handle_secure_upload_request(upload, Discourse.store.get_path_for_upload(upload))
الآن، Discourse.store.get_path_for_upload(upload) تُرجع رابطاً يفتقر إلى جزء uploads/{database_id}:
`original/3X/f/d/fd0b5775899541b9d42e67f8e0dd6bf587a179d3.png"
وبالتالي، فإن handle_secure_upload_request تُرجع رابطاً موقّعاً لكنه يفتقر إلى جزء في الرابط لأنه يبدأ بـ /original:
https://redacted.s3.us-east-2.amazonaws.com/original/3X/f/d/fd0b5775899541b9d42e67f8e0dd6bf587a179d3.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKI....
لو كانت upload.secure? && SiteSetting.secure_media? خاطئة (وهي ليست كذلك)، لكان الطلب تتم معالجته بواسطة Discourse.store.url_for(upload, force_download: params[:dl] == "1")
وهذا في الواقع يُرجع رابطاً صحيحاً:
https://redacted.s3.us-east-2.amazonaws.com/uploads/db3999/original/3X/f/d/fd0b5775899541b9d42e67f8e0dd6bf587a179d3.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKI...
إذن، يبدو أن هناك دالتين: url_for و get_path_for_upload، كلتاهما تتصرفان بشكل مختلف، ويبدو أن الدالة الخاطئة هي التي تُستخدم؟