Ok, sembra che questa settimana sia in piena caccia ai bug.
Abbiamo un forum con secure_uploads abilitato; tutti gli upload sono su (il servizio ufficiale) AWS S3.
Problema: i collegamenti short-url non sembrano funzionare correttamente; manca uploads/{database_id} nell’URL.
Sembra che il codice responsabile si trovi 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
Quindi, se upload.secure? && SiteSetting.secure_media? è vero, la richiesta viene elaborata da
handle_secure_upload_request(upload, Discourse.store.get_path_for_upload(upload)).
Ora, Discourse.store.get_path_for_upload(upload) restituisce un URL senza la parte uploads/{database_id}:
original/3X/f/d/fd0b5775899541b9d42e67f8e0dd6bf587a179d3.png
e di conseguenza handle_secure_upload_request restituisce un URL firmato, ma con una parte mancante nell’URL, dato che inizia con /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....
Se upload.secure? && SiteSetting.secure_media? fosse falso (ma non lo è), la richiesta verrebbe elaborata da Discourse.store.url_for(upload, force_download: params[:dl] == "1")
e in quel caso verrebbe restituito un URL corretto:
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...
Quindi, a quanto pare, esistono sia url_for che get_path_for_upload, che si comportano in modo diverso, e sembra che venga utilizzato quello sbagliato?