Bug no Upload de Chat

Demorou um pouco para eu analisar isso, mas acho que encontrei a causa. Acho que tem a ver com este código:

def fetch_uploads(params:, guardian:)
  return [] if !SiteSetting.chat_allow_uploads
  guardian.user.uploads.where(id: params.upload_ids) # Especificamente, aqui
end

Quando uma nova mensagem de chat é criada, isso é chamado para buscar os uploads a serem anexados à mensagem. Possivelmente para garantir a propriedade, o método passa pelo usuário do Guardian para buscar os uploads, de modo a permitir apenas uploads pertencentes a esse usuário.

O problema é que os uploads são deduplicados, como visto aqui:

# já temos esse upload?
@upload = Upload.find_by(sha1: sha1)

# ...

# retorna o upload anterior, se houver
if @upload
  add_metadata!
  UserUpload.find_or_create_by!(user_id: user_id, upload_id: @upload.id) if user_id
  return @upload
end

Eu acho que uma possível correção seria passar pelos UserUploads em vez de apenas considerar os uploads pertencentes ao usuário. UserUpload vincula uploads a vários usuários, o que parece ser o que precisamos. Ainda não tenho 100% de certeza de como fazer isso corretamente; está ficando tarde, então vou dormir, mas se ninguém mais corrigir, tentarei voltar mais tarde e trabalhar em um PR. :slightly_smiling_face:

3 curtidas