Multisite + short-url + secure_uploads + s3

Ok, parece que estou em uma caçada a bugs esta semana.

Temos um fórum com o secure_uploads ativado; todos os uploads estão na AWS S3 (oficial).

Problema: os links de URL curta não parecem funcionar corretamente; o segmento uploads/{database_id} está faltando na URL.

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

Assim, se upload.secure? && SiteSetting.secure_media? for verdadeiro, a requisição é processada por
handle_secure_upload_request(upload, Discourse.store.get_path_for_upload(upload)).

Agora, Discourse.store.get_path_for_upload(upload) retorna uma URL sem a parte uploads/{database_id}:

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

e, consequentemente, handle_secure_upload_request retorna uma URL assinada, mas com uma parte faltando na URL, já que ela começa com /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 (o que não é), a requisição seria processada por Discourse.store.url_for(upload, force_download: params[:dl] == "1").

E isso, na verdade, retorna uma URL correta:

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

Portanto, aparentemente há um url_for e um get_path_for_upload que se comportam de maneira diferente, e parece que o errado está sendo usado?

7 curtidas

Obrigado pelo relatório; isso deve ser bastante fácil de corrigir. handle_secure_upload_request simplesmente não está levando em conta conexões multissítio. Vou trabalhar em uma correção para isso hoje e retorno assim que terminar.

8 curtidas

Corrigido aqui:

9 curtidas