svergeylen / collector

Collector : site de gestion des BD, films, DVD, jeux de société, ...
2 stars 0 forks source link

Mettre le téléchargement des images derrière un controlleur #75

Closed dvergeylen closed 6 years ago

dvergeylen commented 6 years ago

Coucou,

Je viens de voir que les images sont stockées dans public/ ..., ce qui fait que tout le monde y a accès sans être loggé 🙁.

Par exemple: https://collector.vergeylen.eu/system/attachments/images/000/000/212/medium/20171202_162916.jpg 😢 Il y a déjà beaucoup d'images:

$ tree -f public/system/attachments/ | grep jpg | wc -l
1077

(à diviser par 3, il y a original + medium + thumb pour chacune)

Je propose de déplacer les attachements vers une directory uploaded_files à la racine du projet et de créer un controller d'attachment comme ceci:

class AttachmentsController < ApplicationController
  before_action :check_access

  def download
    if params[:attachment_id].nil?
      send_file "uploaded_files/default/avatar/missing.png"
    else
      attachment = Attachment.find_by(id: params[:upload_id])
      if attachment.nil?
        send_file "uploaded_files/default/avatar/missing.png"
      else
        send_file attachment.src.path, filename: "#{attachment.element.id}#{File.extname(attachment.src.path)}", disposition: "inline"
      end
    end
  end
end

l'intérêt étant évidemment check_access.

Il faut configurer le nouveau path dans app/models/attachement.rb:

path: ":rails_root/uploaded_files/:owner_path/:id.:extension",

voir la doc complète sur le path ici

dvergeylen commented 6 years ago

Je vais essayer de proposer une pull request si j'arrive à comprendre comment le path actuel est calculé pr le moment ☺