Ability to delete files from Cellar

This commit is contained in:
Frederic Merizen 2018-02-13 18:47:26 +01:00
parent 741100d4f5
commit 76c72bf4e0
2 changed files with 44 additions and 13 deletions

View file

@ -1,6 +1,6 @@
require 'base64'
require 'net/http'
require 'openssl'
require 'uri'
module ActiveStorage
class Service::CellarService < Service
@ -11,6 +11,16 @@ module ActiveStorage
@bucket = bucket
end
def delete(key)
instrument :delete, key: key do
Net::HTTP.start(@endpoint.host, @endpoint.port, use_ssl: true) do |http|
request = Net::HTTP::Delete.new(URI::join(@endpoint, "/#{key}"))
sign(request, key)
http.request(request)
end
end
end
def url(key, expires_in:, filename:, disposition:, content_type:)
instrument :url, key: key do |payload|
generated_url = presigned_url(
@ -45,6 +55,13 @@ module ActiveStorage
private
def sign(request, key, checksum: '')
date = Time.now.httpdate
sig = signature(method: request.method, key: key, date: date, checksum: checksum)
request['date'] = date
request['authorization'] = "AWS #{@access_key_id}:#{sig}"
end
def presigned_url(method:, key:, expires_in:, content_type: '', checksum: '', **query_params)
expires = expires_in.from_now.to_i
@ -57,10 +74,10 @@ module ActiveStorage
generated_url = URI::join(@endpoint, "/#{key}","?#{query.to_query}").to_s
end
def signature(method:, key:, expires:, content_type: '', checksum: '')
def signature(method:, key:, expires: '', date: '', content_type: '', checksum: '')
canonicalized_amz_headers = ""
canonicalized_resource = "/#{@bucket}/#{key}"
string_to_sign = "#{method}\n#{checksum}\n#{content_type}\n#{expires}\n" +
string_to_sign = "#{method}\n#{checksum}\n#{content_type}\n#{expires}#{date}\n" +
"#{canonicalized_amz_headers}#{canonicalized_resource}"
Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha1'), @secret_access_key, string_to_sign)).strip
end