Multisite + short-url + secure_uploads + s3

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?

7 Mi Piace

Grazie per la segnalazione; dovrebbe essere abbastanza semplice da risolvere: handle_secure_upload_request non tiene semplicemente conto delle connessioni multisito. Lavorerò oggi stesso su una correzione e farò rapporto non appena sarà completata.

8 Mi Piace

Corretto qui:

9 Mi Piace