uploadcare-ruby 4.4.2 → 5.0.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.env.example +7 -0
- data/.github/workflows/gem-push.yml +1 -1
- data/.github/workflows/ruby.yml +10 -13
- data/.gitignore +9 -0
- data/.rubocop.yml +95 -8
- data/CHANGELOG.md +78 -0
- data/Gemfile +23 -6
- data/MIGRATING_V5.md +290 -0
- data/README.md +422 -671
- data/Rakefile +5 -1
- data/api_examples/README.md +77 -0
- data/api_examples/rest_api/delete_files_storage.rb +3 -5
- data/api_examples/rest_api/delete_files_uuid_metadata_key.rb +3 -4
- data/api_examples/rest_api/delete_files_uuid_storage.rb +3 -4
- data/api_examples/rest_api/delete_groups_uuid.rb +3 -4
- data/api_examples/rest_api/delete_webhooks_unsubscribe.rb +3 -4
- data/api_examples/rest_api/get_addons_aws_rekognition_detect_labels_execute_status.rb +3 -6
- data/api_examples/rest_api/get_addons_aws_rekognition_detect_moderation_labels_execute_status.rb +3 -6
- data/api_examples/rest_api/get_addons_remove_bg_execute_status.rb +3 -6
- data/api_examples/rest_api/get_addons_uc_clamav_virus_scan_execute_status.rb +3 -6
- data/api_examples/rest_api/get_convert_document_status_token.rb +3 -5
- data/api_examples/rest_api/get_convert_document_uuid.rb +3 -5
- data/api_examples/rest_api/get_convert_video_status_token.rb +3 -5
- data/api_examples/rest_api/get_files.rb +3 -5
- data/api_examples/rest_api/get_files_uuid.rb +3 -5
- data/api_examples/rest_api/get_files_uuid_metadata.rb +3 -5
- data/api_examples/rest_api/get_files_uuid_metadata_key.rb +3 -5
- data/api_examples/rest_api/get_groups.rb +3 -5
- data/api_examples/rest_api/get_groups_uuid.rb +3 -5
- data/api_examples/rest_api/get_project.rb +3 -5
- data/api_examples/rest_api/get_webhooks.rb +3 -5
- data/api_examples/rest_api/post_addons_aws_rekognition_detect_labels_execute.rb +3 -5
- data/api_examples/rest_api/post_addons_aws_rekognition_detect_moderation_labels_execute.rb +3 -5
- data/api_examples/rest_api/post_addons_remove_bg_execute.rb +3 -5
- data/api_examples/rest_api/post_addons_uc_clamav_virus_scan_execute.rb +3 -5
- data/api_examples/rest_api/post_convert_document.rb +3 -6
- data/api_examples/rest_api/post_convert_video.rb +3 -10
- data/api_examples/rest_api/post_files_local_copy.rb +3 -6
- data/api_examples/rest_api/post_files_remote_copy.rb +3 -7
- data/api_examples/rest_api/post_webhooks.rb +3 -9
- data/api_examples/rest_api/put_files_storage.rb +3 -8
- data/api_examples/rest_api/put_files_uuid_metadata_key.rb +3 -7
- data/api_examples/rest_api/put_files_uuid_storage.rb +3 -5
- data/api_examples/rest_api/put_webhooks_id.rb +3 -11
- data/api_examples/support/example_helper.rb +250 -0
- data/api_examples/support/run_rest_example.rb +161 -0
- data/api_examples/support/run_upload_example.rb +88 -0
- data/api_examples/upload_api/get_from_url_status.rb +3 -5
- data/api_examples/upload_api/get_group_info.rb +3 -6
- data/api_examples/upload_api/get_info.rb +3 -6
- data/api_examples/upload_api/post_base.rb +3 -5
- data/api_examples/upload_api/post_from_url.rb +3 -5
- data/api_examples/upload_api/post_group.rb +3 -8
- data/api_examples/upload_api/post_multipart_complete.rb +3 -7
- data/api_examples/upload_api/post_multipart_start.rb +3 -7
- data/api_examples/upload_api/put_multipart_part.rb +4 -0
- data/bin/console +1 -1
- data/docs/release-notes-5.0.0.rc1.md +34 -0
- data/examples/README.md +39 -0
- data/examples/batch_upload.rb +54 -0
- data/examples/group_creation.rb +88 -0
- data/examples/large_file_upload.rb +88 -0
- data/examples/simple_upload.rb +39 -0
- data/examples/upload_with_progress.rb +84 -0
- data/examples/url_upload.rb +56 -0
- data/lib/uploadcare/api/rest/addons.rb +107 -0
- data/lib/uploadcare/api/rest/document_conversions.rb +65 -0
- data/lib/uploadcare/api/rest/file_metadata.rb +71 -0
- data/lib/uploadcare/api/rest/files.rb +112 -0
- data/lib/uploadcare/api/rest/groups.rb +49 -0
- data/lib/uploadcare/api/rest/project.rb +23 -0
- data/lib/uploadcare/api/rest/video_conversions.rb +52 -0
- data/lib/uploadcare/api/rest/webhooks.rb +74 -0
- data/lib/uploadcare/api/rest.rb +254 -0
- data/lib/uploadcare/api/upload/files.rb +313 -0
- data/lib/uploadcare/api/upload/groups.rb +72 -0
- data/lib/uploadcare/api/upload.rb +272 -0
- data/lib/uploadcare/client/addons_accessor.rb +85 -0
- data/lib/uploadcare/client/api.rb +33 -0
- data/lib/uploadcare/client/conversions_accessor.rb +33 -0
- data/lib/uploadcare/client/document_conversions_accessor.rb +41 -0
- data/lib/uploadcare/client/file_metadata_accessor.rb +46 -0
- data/lib/uploadcare/client/files_accessor.rb +82 -0
- data/lib/uploadcare/client/groups_accessor.rb +35 -0
- data/lib/uploadcare/client/project_accessor.rb +17 -0
- data/lib/uploadcare/client/video_conversions_accessor.rb +33 -0
- data/lib/uploadcare/client/webhooks_accessor.rb +42 -0
- data/lib/uploadcare/client.rb +127 -0
- data/lib/uploadcare/cname_generator.rb +68 -0
- data/lib/uploadcare/collections/batch_result.rb +35 -0
- data/lib/uploadcare/collections/paginated.rb +165 -0
- data/lib/uploadcare/configuration.rb +81 -0
- data/lib/uploadcare/exception/auth_error.rb +2 -6
- data/lib/uploadcare/exception/configuration_error.rb +4 -0
- data/lib/uploadcare/exception/conversion_error.rb +2 -6
- data/lib/uploadcare/exception/invalid_request_error.rb +4 -0
- data/lib/uploadcare/exception/multipart_upload_error.rb +4 -0
- data/lib/uploadcare/exception/not_found_error.rb +4 -0
- data/lib/uploadcare/exception/request_error.rb +2 -6
- data/lib/uploadcare/exception/retry_error.rb +2 -6
- data/lib/uploadcare/exception/throttle_error.rb +7 -11
- data/lib/uploadcare/exception/unknown_status_error.rb +4 -0
- data/lib/uploadcare/exception/upload_error.rb +4 -0
- data/lib/uploadcare/exception/upload_timeout_error.rb +4 -0
- data/lib/uploadcare/internal/authenticator.rb +101 -0
- data/lib/uploadcare/internal/error_handler.rb +102 -0
- data/lib/uploadcare/internal/signature_generator.rb +31 -0
- data/lib/uploadcare/internal/throttle_handler.rb +36 -0
- data/lib/uploadcare/internal/upload_io.rb +110 -0
- data/lib/uploadcare/internal/upload_params_generator.rb +86 -0
- data/lib/uploadcare/internal/user_agent.rb +22 -0
- data/lib/uploadcare/operations/multipart_upload.rb +213 -0
- data/lib/uploadcare/operations/upload_router.rb +162 -0
- data/lib/uploadcare/resources/addon_execution.rb +97 -0
- data/lib/uploadcare/resources/base_resource.rb +61 -0
- data/lib/uploadcare/resources/document_conversion.rb +81 -0
- data/lib/uploadcare/resources/file.rb +366 -0
- data/lib/uploadcare/resources/file_metadata.rb +135 -0
- data/lib/uploadcare/resources/group.rb +142 -0
- data/lib/uploadcare/resources/project.rb +26 -0
- data/lib/uploadcare/resources/video_conversion.rb +59 -0
- data/lib/uploadcare/resources/webhook.rb +85 -0
- data/lib/uploadcare/result.rb +85 -0
- data/lib/uploadcare/signed_url_generators/akamai_generator.rb +60 -56
- data/lib/uploadcare/signed_url_generators/base_generator.rb +15 -15
- data/lib/uploadcare/version.rb +7 -0
- data/lib/uploadcare/webhook_signature_verifier.rb +60 -0
- data/lib/uploadcare.rb +84 -50
- data/mise.toml +2 -0
- data/uploadcare-ruby.gemspec +8 -7
- metadata +102 -74
- data/api_examples/upload_api/put_presigned_url_x.rb +0 -8
- data/lib/uploadcare/api/api.rb +0 -25
- data/lib/uploadcare/client/addons_client.rb +0 -69
- data/lib/uploadcare/client/conversion/base_conversion_client.rb +0 -59
- data/lib/uploadcare/client/conversion/document_conversion_client.rb +0 -45
- data/lib/uploadcare/client/conversion/video_conversion_client.rb +0 -46
- data/lib/uploadcare/client/file_client.rb +0 -48
- data/lib/uploadcare/client/file_list_client.rb +0 -46
- data/lib/uploadcare/client/file_metadata_client.rb +0 -36
- data/lib/uploadcare/client/group_client.rb +0 -45
- data/lib/uploadcare/client/multipart_upload/chunks_client.rb +0 -58
- data/lib/uploadcare/client/multipart_upload_client.rb +0 -64
- data/lib/uploadcare/client/project_client.rb +0 -20
- data/lib/uploadcare/client/rest_client.rb +0 -77
- data/lib/uploadcare/client/rest_group_client.rb +0 -43
- data/lib/uploadcare/client/upload_client.rb +0 -46
- data/lib/uploadcare/client/uploader_client.rb +0 -128
- data/lib/uploadcare/client/webhook_client.rb +0 -49
- data/lib/uploadcare/concern/error_handler.rb +0 -54
- data/lib/uploadcare/concern/throttle_handler.rb +0 -25
- data/lib/uploadcare/concern/upload_error_handler.rb +0 -32
- data/lib/uploadcare/entity/addons.rb +0 -14
- data/lib/uploadcare/entity/conversion/base_converter.rb +0 -43
- data/lib/uploadcare/entity/conversion/document_converter.rb +0 -15
- data/lib/uploadcare/entity/conversion/video_converter.rb +0 -15
- data/lib/uploadcare/entity/decorator/paginator.rb +0 -79
- data/lib/uploadcare/entity/entity.rb +0 -18
- data/lib/uploadcare/entity/file.rb +0 -103
- data/lib/uploadcare/entity/file_list.rb +0 -32
- data/lib/uploadcare/entity/file_metadata.rb +0 -30
- data/lib/uploadcare/entity/group.rb +0 -49
- data/lib/uploadcare/entity/group_list.rb +0 -24
- data/lib/uploadcare/entity/project.rb +0 -13
- data/lib/uploadcare/entity/uploader.rb +0 -93
- data/lib/uploadcare/entity/webhook.rb +0 -14
- data/lib/uploadcare/param/authentication_header.rb +0 -37
- data/lib/uploadcare/param/conversion/document/processing_job_url_builder.rb +0 -39
- data/lib/uploadcare/param/conversion/video/processing_job_url_builder.rb +0 -64
- data/lib/uploadcare/param/param.rb +0 -10
- data/lib/uploadcare/param/secure_auth_header.rb +0 -51
- data/lib/uploadcare/param/simple_auth_header.rb +0 -14
- data/lib/uploadcare/param/upload/signature_generator.rb +0 -24
- data/lib/uploadcare/param/upload/upload_params_generator.rb +0 -41
- data/lib/uploadcare/param/user_agent.rb +0 -21
- data/lib/uploadcare/param/webhook_signature_verifier.rb +0 -23
- data/lib/uploadcare/ruby/version.rb +0 -5
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Uploadcare
|
|
4
|
-
module Entity
|
|
5
|
-
# This serializer lets user upload files by various means, and usually returns an array of files
|
|
6
|
-
# @see https://uploadcare.com/api-refs/upload-api/#tag/Upload
|
|
7
|
-
class Uploader < Entity
|
|
8
|
-
client_service UploaderClient
|
|
9
|
-
client_service MultipartUploaderClient, only: :upload, prefix: :multipart
|
|
10
|
-
|
|
11
|
-
attr_entity :files
|
|
12
|
-
has_entities :files, as: Uploadcare::Entity::File
|
|
13
|
-
|
|
14
|
-
# Upload file or group of files from array, File, or url
|
|
15
|
-
#
|
|
16
|
-
# @param object [Array], [String] or [File]
|
|
17
|
-
# @param [Hash] options options for upload
|
|
18
|
-
# @option options [Boolean] :store whether to store file on servers.
|
|
19
|
-
def self.upload(object, options = {})
|
|
20
|
-
if big_file?(object)
|
|
21
|
-
multipart_upload(object, options)
|
|
22
|
-
elsif file?(object)
|
|
23
|
-
upload_file(object, options)
|
|
24
|
-
elsif object.is_a?(Array)
|
|
25
|
-
upload_files(object, options)
|
|
26
|
-
elsif object.is_a?(String)
|
|
27
|
-
upload_from_url(object, options)
|
|
28
|
-
else
|
|
29
|
-
raise ArgumentError, "Expected input to be a file/Array/URL, given: `#{object}`"
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# upload single file
|
|
34
|
-
def self.upload_file(file, options = {})
|
|
35
|
-
response = UploaderClient.new.upload_many([file], options)
|
|
36
|
-
uuid = response.success.values.first
|
|
37
|
-
if Uploadcare.config.secret_key.nil?
|
|
38
|
-
Uploadcare::Entity::File.new(file_info(uuid).success)
|
|
39
|
-
else
|
|
40
|
-
# we can get more info about the uploaded file
|
|
41
|
-
Uploadcare::Entity::File.info(uuid)
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# upload multiple files
|
|
46
|
-
def self.upload_files(arr, options = {})
|
|
47
|
-
response = UploaderClient.new.upload_many(arr, options)
|
|
48
|
-
response.success.map { |pair| Uploadcare::Entity::File.new(uuid: pair[1], original_filename: pair[0]) }
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# upload file of size above 10mb (involves multipart upload)
|
|
52
|
-
def self.multipart_upload(file, options = {}, &block)
|
|
53
|
-
response = MultipartUploaderClient.new.upload(file, options, &block)
|
|
54
|
-
Uploadcare::Entity::File.new(response.success)
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# upload files from url
|
|
58
|
-
# @param url [String]
|
|
59
|
-
def self.upload_from_url(url, options = {})
|
|
60
|
-
response = UploaderClient.new.upload_from_url(url, options)
|
|
61
|
-
return response.success[:token] unless response.success[:files]
|
|
62
|
-
|
|
63
|
-
response.success[:files].map { |file_data| Uploadcare::Entity::File.new(file_data) }
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
# gets a status of upload from url
|
|
67
|
-
# @param url [String]
|
|
68
|
-
def self.get_upload_from_url_status(token)
|
|
69
|
-
UploaderClient.new.get_upload_from_url_status(token)
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
# Get information about an uploaded file (without the secret key)
|
|
73
|
-
# @param uuid [String]
|
|
74
|
-
def self.file_info(uuid)
|
|
75
|
-
UploaderClient.new.file_info(uuid)
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
class << self
|
|
79
|
-
private
|
|
80
|
-
|
|
81
|
-
# check if object is a file
|
|
82
|
-
def file?(object)
|
|
83
|
-
object.respond_to?(:path) && ::File.exist?(object.path)
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
# check if object needs to be uploaded using multipart upload
|
|
87
|
-
def big_file?(object)
|
|
88
|
-
file?(object) && object.size >= Uploadcare.config.multipart_size_threshold
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
end
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Uploadcare
|
|
4
|
-
module Entity
|
|
5
|
-
# This serializer is responsible for webhook handling
|
|
6
|
-
#
|
|
7
|
-
# @see https://uploadcare.com/docs/api_reference/rest/webhooks/
|
|
8
|
-
class Webhook < Entity
|
|
9
|
-
client_service WebhookClient
|
|
10
|
-
|
|
11
|
-
attr_entity :id, :created, :updated, :event, :target_url, :project, :is_active
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'digest/md5'
|
|
4
|
-
require 'param/secure_auth_header'
|
|
5
|
-
require 'param/simple_auth_header'
|
|
6
|
-
|
|
7
|
-
module Uploadcare
|
|
8
|
-
module Param
|
|
9
|
-
# This object returns headers needed for authentication
|
|
10
|
-
# This authentication method is more secure, but more tedious
|
|
11
|
-
class AuthenticationHeader
|
|
12
|
-
# @see https://uploadcare.com/docs/api_reference/rest/requests_auth/#auth-uploadcare
|
|
13
|
-
def self.call(options = {})
|
|
14
|
-
validate_auth_config
|
|
15
|
-
case Uploadcare.config.auth_type
|
|
16
|
-
when 'Uploadcare'
|
|
17
|
-
SecureAuthHeader.call(options)
|
|
18
|
-
when 'Uploadcare.Simple'
|
|
19
|
-
SimpleAuthHeader.call
|
|
20
|
-
else
|
|
21
|
-
raise ArgumentError, "Unknown auth_scheme: '#{Uploadcare.config.auth_type}'"
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def self.validate_auth_config
|
|
26
|
-
raise Uploadcare::Exception::AuthError, 'Public Key is blank.' if is_blank?(Uploadcare.config.public_key)
|
|
27
|
-
raise Uploadcare::Exception::AuthError, 'Secret Key is blank.' if is_blank?(Uploadcare.config.secret_key)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# rubocop:disable Naming/PredicateName
|
|
31
|
-
def self.is_blank?(value)
|
|
32
|
-
value.nil? || value.empty?
|
|
33
|
-
end
|
|
34
|
-
# rubocop:enable Naming/PredicateName
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Uploadcare
|
|
4
|
-
module Param
|
|
5
|
-
module Conversion
|
|
6
|
-
module Document
|
|
7
|
-
class ProcessingJobUrlBuilder
|
|
8
|
-
class << self
|
|
9
|
-
def call(uuid:, format: nil, page: nil)
|
|
10
|
-
[
|
|
11
|
-
uuid_part(uuid),
|
|
12
|
-
format_part(format),
|
|
13
|
-
page_part(page)
|
|
14
|
-
].compact.join('-')
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
private
|
|
18
|
-
|
|
19
|
-
def uuid_part(uuid)
|
|
20
|
-
"#{uuid}/document/"
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def format_part(format)
|
|
24
|
-
return if format.nil?
|
|
25
|
-
|
|
26
|
-
"/format/#{format}/"
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def page_part(page)
|
|
30
|
-
return if page.nil?
|
|
31
|
-
|
|
32
|
-
"/page/#{page}/"
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Uploadcare
|
|
4
|
-
module Param
|
|
5
|
-
module Conversion
|
|
6
|
-
module Video
|
|
7
|
-
class ProcessingJobUrlBuilder
|
|
8
|
-
class << self
|
|
9
|
-
# rubocop:disable Metrics/ParameterLists
|
|
10
|
-
def call(uuid:, size: {}, quality: nil, format: nil, cut: {}, thumbs: {})
|
|
11
|
-
[
|
|
12
|
-
uuid_part(uuid),
|
|
13
|
-
size_part(size),
|
|
14
|
-
quality_part(quality),
|
|
15
|
-
format_part(format),
|
|
16
|
-
cut_part(cut),
|
|
17
|
-
thumbs_part(thumbs)
|
|
18
|
-
].compact.join('-')
|
|
19
|
-
end
|
|
20
|
-
# rubocop:enable Metrics/ParameterLists
|
|
21
|
-
|
|
22
|
-
private
|
|
23
|
-
|
|
24
|
-
def uuid_part(uuid)
|
|
25
|
-
"#{uuid}/video/"
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def size_part(size)
|
|
29
|
-
return if size.empty?
|
|
30
|
-
|
|
31
|
-
dimensions = "#{size[:width]}x#{size[:height]}" if size[:width] || size[:height]
|
|
32
|
-
resize_mode = (size[:resize_mode]).to_s
|
|
33
|
-
"/size/#{dimensions}/#{resize_mode}/".squeeze('/')
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def quality_part(quality)
|
|
37
|
-
return if quality.nil?
|
|
38
|
-
|
|
39
|
-
"/quality/#{quality}/"
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def format_part(format)
|
|
43
|
-
return if format.nil?
|
|
44
|
-
|
|
45
|
-
"/format/#{format}/"
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def cut_part(cut)
|
|
49
|
-
return if cut.empty?
|
|
50
|
-
|
|
51
|
-
"/cut/#{cut[:start_time]}/#{cut[:length]}/"
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def thumbs_part(thumbs)
|
|
55
|
-
return if thumbs.empty?
|
|
56
|
-
|
|
57
|
-
"/thumbs~#{thumbs[:N]}/#{thumbs[:number]}/".squeeze('/')
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
end
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Uploadcare
|
|
4
|
-
# @abstract
|
|
5
|
-
# This module is responsible for everything related to generation of request params -
|
|
6
|
-
# such as authentication headers, signatures and serialized uploads
|
|
7
|
-
module Param
|
|
8
|
-
end
|
|
9
|
-
include Param
|
|
10
|
-
end
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'digest/md5'
|
|
4
|
-
require 'addressable/uri'
|
|
5
|
-
|
|
6
|
-
module Uploadcare
|
|
7
|
-
module Param
|
|
8
|
-
# This object returns headers needed for authentication
|
|
9
|
-
# This authentication method is more secure, but more tedious
|
|
10
|
-
class SecureAuthHeader
|
|
11
|
-
class << self
|
|
12
|
-
# @see https://uploadcare.com/docs/api_reference/rest/requests_auth/#auth-uploadcare
|
|
13
|
-
def call(options = {})
|
|
14
|
-
@method = options[:method]
|
|
15
|
-
@body = options[:content] || ''
|
|
16
|
-
@content_type = options[:content_type]
|
|
17
|
-
@uri = make_uri(options)
|
|
18
|
-
|
|
19
|
-
@date_for_header = timestamp
|
|
20
|
-
{
|
|
21
|
-
Date: @date_for_header,
|
|
22
|
-
Authorization: "Uploadcare #{Uploadcare.config.public_key}:#{signature}"
|
|
23
|
-
}
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def signature
|
|
27
|
-
content_md5 = Digest::MD5.hexdigest(@body)
|
|
28
|
-
sign_string = [@method, content_md5, @content_type, @date_for_header, @uri].join("\n")
|
|
29
|
-
digest = OpenSSL::Digest.new('sha1')
|
|
30
|
-
OpenSSL::HMAC.hexdigest(digest, Uploadcare.config.secret_key, sign_string)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def timestamp
|
|
34
|
-
Time.now.gmtime.strftime('%a, %d %b %Y %H:%M:%S GMT')
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
private
|
|
38
|
-
|
|
39
|
-
def make_uri(options)
|
|
40
|
-
if options[:params] && !options[:params].empty?
|
|
41
|
-
uri = Addressable::URI.parse options[:uri]
|
|
42
|
-
uri.query_values = uri.query_values(Array).to_a.concat(options[:params].to_a)
|
|
43
|
-
uri.to_s
|
|
44
|
-
else
|
|
45
|
-
options[:uri]
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
end
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Uploadcare
|
|
4
|
-
module Param
|
|
5
|
-
# This object returns simple header for authentication
|
|
6
|
-
# Simple header is relatively unsafe, but can be useful for debug and development
|
|
7
|
-
class SimpleAuthHeader
|
|
8
|
-
# @see https://uploadcare.com/docs/api_reference/rest/requests_auth/#auth-simple
|
|
9
|
-
def self.call
|
|
10
|
-
{ Authorization: "Uploadcare.Simple #{Uploadcare.config.public_key}:#{Uploadcare.config.secret_key}" }
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'digest'
|
|
4
|
-
|
|
5
|
-
module Uploadcare
|
|
6
|
-
module Param
|
|
7
|
-
module Upload
|
|
8
|
-
# This class generates signatures for protected uploads
|
|
9
|
-
class SignatureGenerator
|
|
10
|
-
# @see https://uploadcare.com/docs/api_reference/upload/signed_uploads/
|
|
11
|
-
# @return [Hash] signature and its expiration time
|
|
12
|
-
def self.call
|
|
13
|
-
expires_at = Time.now.to_i + Uploadcare.config.upload_signature_lifetime
|
|
14
|
-
to_sign = Uploadcare.config.secret_key + expires_at.to_s
|
|
15
|
-
signature = Digest::MD5.hexdigest(to_sign)
|
|
16
|
-
{
|
|
17
|
-
signature: signature,
|
|
18
|
-
expire: expires_at
|
|
19
|
-
}
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'digest'
|
|
4
|
-
|
|
5
|
-
module Uploadcare
|
|
6
|
-
module Param
|
|
7
|
-
module Upload
|
|
8
|
-
# This class generates body params for uploads
|
|
9
|
-
class UploadParamsGenerator
|
|
10
|
-
# @see https://uploadcare.com/docs/api_reference/upload/request_based/
|
|
11
|
-
class << self
|
|
12
|
-
def call(options = {})
|
|
13
|
-
{
|
|
14
|
-
'UPLOADCARE_PUB_KEY' => Uploadcare.config.public_key,
|
|
15
|
-
'UPLOADCARE_STORE' => store_value(options[:store]),
|
|
16
|
-
'signature' => (Upload::SignatureGenerator.call if Uploadcare.config.sign_uploads)
|
|
17
|
-
}.merge(metadata(options)).compact
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
private
|
|
21
|
-
|
|
22
|
-
def store_value(store)
|
|
23
|
-
case store
|
|
24
|
-
when true, '1', 1 then '1'
|
|
25
|
-
when false, '0', 0 then '0'
|
|
26
|
-
else 'auto'
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def metadata(options = {})
|
|
31
|
-
return {} if options[:metadata].nil?
|
|
32
|
-
|
|
33
|
-
options[:metadata].each_with_object({}) do |(k, v), res|
|
|
34
|
-
res.merge!("metadata[#{k}]" => v)
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'uploadcare'
|
|
4
|
-
|
|
5
|
-
module Uploadcare
|
|
6
|
-
module Param
|
|
7
|
-
# This header is added to track libraries using Uploadcare API
|
|
8
|
-
class UserAgent
|
|
9
|
-
# Generate header from Gem's config
|
|
10
|
-
#
|
|
11
|
-
# @example Uploadcare::Param::UserAgent.call
|
|
12
|
-
# UploadcareRuby/3.0.0-dev/Pubkey_(Ruby/2.6.3;UploadcareRuby)
|
|
13
|
-
def self.call
|
|
14
|
-
framework_data = Uploadcare.config.framework_data || ''
|
|
15
|
-
framework_data_string = "; #{Uploadcare.config.framework_data}" unless framework_data.empty?
|
|
16
|
-
public_key = Uploadcare.config.public_key
|
|
17
|
-
"UploadcareRuby/#{VERSION}/#{public_key} (Ruby/#{RUBY_VERSION}#{framework_data_string})"
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'digest/md5'
|
|
4
|
-
|
|
5
|
-
module Uploadcare
|
|
6
|
-
module Param
|
|
7
|
-
# This object verifies a signature received along with webhook headers
|
|
8
|
-
class WebhookSignatureVerifier
|
|
9
|
-
# @see https://uploadcare.com/docs/security/secure-webhooks/
|
|
10
|
-
def self.valid?(options = {})
|
|
11
|
-
webhook_body_json = options[:webhook_body]
|
|
12
|
-
signing_secret = options[:signing_secret] || ENV.fetch('UC_SIGNING_SECRET', nil)
|
|
13
|
-
x_uc_signature_header = options[:x_uc_signature_header]
|
|
14
|
-
|
|
15
|
-
digest = OpenSSL::Digest.new('sha256')
|
|
16
|
-
|
|
17
|
-
calculated_signature = "v1=#{OpenSSL::HMAC.hexdigest(digest, signing_secret, webhook_body_json)}"
|
|
18
|
-
|
|
19
|
-
calculated_signature == x_uc_signature_header
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|