Multisite + short-url + secure_uploads + s3

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?

7 „Gefällt mir“

Vielen Dank für den Bericht. Das sollte sich recht einfach beheben lassen; handle_secure_upload_request berücksichtigt Multi-Site-Verbindungen einfach nicht. Ich werde heute an einer Lösung dafür arbeiten und mich melden, sobald sie fertig ist.

8 „Gefällt mir“

Hier behoben:

9 „Gefällt mir“