Multisite + short-url + secure_uploads + s3

Ok, parece que esta semana me he lanzado a una cacería de bugs.

Tenemos un foro con secure_uploads activado; todas las subidas están en AWS S3 (oficial).

Problema: los enlaces de URL corta no parecen funcionar correctamente; falta uploads/{database_id} en la URL.

Parece que el código problemático está en 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

Así que, si upload.secure? && SiteSetting.secure_media? es verdadero, la solicitud se procesa mediante
handle_secure_upload_request(upload, Discourse.store.get_path_for_upload(upload)).

Ahora bien, Discourse.store.get_path_for_upload(upload) devuelve una URL sin la parte uploads/{database_id}:

original/3X/f/d/fd0b5775899541b9d42e67f8e0dd6bf587a179d3.png

y, en consecuencia, handle_secure_upload_request devuelve una URL firmada, pero con una parte faltante en la URL, ya que comienza 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....

Si upload.secure? && SiteSetting.secure_media? fuera falso (lo cual no es), la solicitud se procesaría mediante Discourse.store.url_for(upload, force_download: params[:dl] == "1").

Y eso, de hecho, devuelve una URL correcta:

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...

Así que, aparentemente, hay un url_for y un get_path_for_upload que se comportan de manera diferente, y parece que se está utilizando el incorrecto.

7 Me gusta

Gracias por el informe; esto debería ser bastante fácil de solucionar. handle_secure_upload_request simplemente no está teniendo en cuenta las conexiones multisitio. Trabajaré en una solución para esto hoy y te informaré cuando esté listo.

8 Me gusta

Arreglado aquí:

9 Me gusta