class FileManagerTrash include Mongoid::Document include Mongoid::Timestamps Restrict_dirs = ["/", "/home/", "/etc/", "/var/*/", "/root/", "/usr/*/"] field :is_file, type: Boolean, default: true field :module, type: String, default: "" field :path, type: String, default: "" field :trash_path, type: String, default: "" field :user_id field :is_slave, type: Boolean, default: false field :record_only, type: Boolean, default: false belongs_to :file_manager_upload, index: true belongs_to :file_manager_setting index({module: 1}, { unique: false, background: true }) index({created_at: -1}, { unique: false, background: true }) before_create do if self.trash_path.blank? self.trash_path = Pathname.new("#{FileManagerRoot::RootPath}").join(self.file_manager_setting && self.file_manager_setting.class == FileManagerSetting ? self.file_manager_setting.root_path : '').join(".trash/#{self.file_manager_setting_id}/#{self.id}/#{File.basename(self.path)}") trash_dir = File.dirname(self.trash_path) FileUtils.mkdir_p(trash_dir) upload = self.file_manager_upload if File.exist?(upload.get_real_path) FileUtils.mv(upload.get_real_path, self.trash_path) end end end before_destroy do upload = self.file_manager_upload if upload if upload.is_default upload.remove_file_callback end if self.record_only upload.destroy else FileManagerUpload.where(:path=> upload.path).destroy end end true end def get_version return (self.file_manager_upload ? self.file_manager_upload.version : 1) end def delete_file self.class.delete_file_permanent(self.path, File.dirname(self.trash_path), self.record_only) unless self.is_file self.class.where(:trash_path=>/^#{::Regexp.escape(self.trash_path)}/,:is_slave=>true).destroy end self.destroy end def self.check_restricted(path) return Restrict_dirs.map{|d| path.match("^#{d.gsub('/*/','/.*')}[^/]+(/|)$")}.compact.length > 0 end def self.delete_file_permanent(path, trash_path=nil, only_self=false) unless self.check_restricted(path) dir = File.dirname(path) basename = File.basename(path) if trash_path FileUtils.rm_rf(trash_path) else FileUtils.rm_rf(path) end unless only_self Dir.glob("#{dir}/.versions/*/#{basename}").each{|f| FileUtils.rm_rf(f)} end else puts "Path: #{path}" puts "File or Directory restricted!" end end def recover_file if File.exist?(self.trash_path) dir = File.dirname(self.path) FileUtils.mkdir_p(dir) FileUtils.mv(self.trash_path, self.path) end self.file_manager_upload.update(:is_trash=>false) if self.file_manager_upload unless self.is_file self.class.where(:trash_path=>/^#{::Regexp.escape(self.trash_path)}/,:is_slave=>true).delete end self.delete end end