Okay, ich scheine diese Woche auf einer Bug-Jagd zu sein.
Wir haben ein Forum mit aktiviertem secure_uploads; alle Uploads werden auf (dem offiziellen) AWS S3 gespeichert.
Problem: Short-URL-Links funktionieren nicht richtig, der Teil uploads/{database_id} fehlt in der URL.
Der Fehler liegt anscheinend im Code in 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
Wenn also upload.secure? && SiteSetting.secure_media? wahr ist, wird die Anfrage von
handle_secure_upload_request(upload, Discourse.store.get_path_for_upload(upload)) verarbeitet.
Nun gibt Discourse.store.get_path_for_upload(upload) eine URL zurück, der der Teil uploads/{database_id} fehlt:
original/3X/f/d/fd0b5775899541b9d42e67f8e0dd6bf587a179d3.png
Folglich gibt handle_secure_upload_request eine signierte URL zurück, bei der jedoch ein Teil fehlt, da sie mit /original beginnt:
https://redacted.s3.us-east-2.amazonaws.com/original/3X/f/d/fd0b5775899541b9d42e67f8e0dd6bf587a179d3.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKI....
Wenn upload.secure? && SiteSetting.secure_media? falsch wäre (was jedoch nicht der Fall ist), würde die Anfrage von Discourse.store.url_for(upload, force_download: params[:dl] == "1") verarbeitet werden.
Und das liefert tatsächlich eine korrekte URL:
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...
Anscheinend gibt es also ein url_for und ein get_path_for_upload, die sich unterschiedlich verhalten, und es wird anscheinend das falsche verwendet?