Activestorage fix for disk storage

[SCI-3947]
This commit is contained in:
Urban Rotnik 2019-10-02 13:54:16 +02:00
parent 4b626ab2dd
commit e2a779ccfe
6 changed files with 84 additions and 7 deletions

View file

@ -0,0 +1,64 @@
# frozen_string_literal: true
module ActiveStorage
class DiskController < ActiveStorage::BaseController
skip_forgery_protection
skip_before_action :authenticate_user!, :authenticate_user_from_token!, only: :show # Skip authentication
def show
if (key = decode_verified_key)
serve_file disk_service.path_for(key[:key]), content_type: key[:content_type], disposition: key[:disposition]
else
head :not_found
end
rescue Errno::ENOENT
head :not_found
end
def update
if (token = decode_verified_token)
if acceptable_content?(token)
disk_service.upload token[:key], request.body, checksum: token[:checksum]
else
head :unprocessable_entity
end
else
head :not_found
end
rescue ActiveStorage::IntegrityError
head :unprocessable_entity
end
private
def disk_service
ActiveStorage::Blob.service
end
def decode_verified_key
ActiveStorage.verifier.verified(params[:encoded_key], purpose: :blob_key)
end
def serve_file(path, content_type:, disposition:)
Rack::File.new(nil).serving(request, path).tap do |(status, headers, body)|
self.status = status
self.response_body = body
headers.each do |name, value|
response.headers[name] = value
end
response.headers['Content-Type'] = content_type || DEFAULT_SEND_FILE_TYPE
response.headers['Content-Disposition'] = disposition || DEFAULT_SEND_FILE_DISPOSITION
end
end
def decode_verified_token
ActiveStorage.verifier.verified(params[:encoded_token], purpose: :blob_token)
end
def acceptable_content?(token)
token[:content_type] == request.content_mime_type && token[:content_length] == request.content_length
end
end
end

View file

@ -243,6 +243,12 @@ class Asset < ApplicationRecord
to_asset.post_process_file(to_asset.team)
end
def file_service_url
ActiveStorage::Current.set(host: Rails.application.secrets.mail_server_url) do
file.service_url
end
end
def extract_image_quality
return unless ['image/jpeg', 'image/pjpeg'].include? content_type

View file

@ -5,6 +5,12 @@ class TempFile < ApplicationRecord
has_one_attached :file
def file_service_url
ActiveStorage::Current.set(host: Rails.application.secrets.mail_server_url) do
file.service_url
end
end
class << self
def destroy_obsolete(temp_file_id)
temp_file = find_by_id(temp_file_id)

View file

@ -102,6 +102,12 @@ class TinyMceAsset < ApplicationRecord
image.variant(resize_to_limit: Constants::LARGE_PIC_FORMAT)
end
def file_service_url
ActiveStorage::Current.set(host: Rails.application.secrets.mail_server_url) do
image.service_url
end
end
def self.delete_unsaved_image(id)
asset = find_by(id: id)
asset.destroy if asset && !asset.saved

View file

@ -293,12 +293,7 @@ module Reports::Docx::PrivateMethods
end
def image_path(asset)
image = if asset.class == Asset
asset.file
else
asset.image
end
image.service_url
asset.file_service_url
end
def calculate_color_hsp(color)

View file

@ -8,7 +8,7 @@ class SpreadsheetParser
file_path = file.path
else
filename = file.filename.to_s
file_path = file.service_url
file_path = file.file_service_url
end
case File.extname(filename)