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.
Files changed (178) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +7 -0
  3. data/.github/workflows/gem-push.yml +1 -1
  4. data/.github/workflows/ruby.yml +10 -13
  5. data/.gitignore +9 -0
  6. data/.rubocop.yml +95 -8
  7. data/CHANGELOG.md +78 -0
  8. data/Gemfile +23 -6
  9. data/MIGRATING_V5.md +290 -0
  10. data/README.md +422 -671
  11. data/Rakefile +5 -1
  12. data/api_examples/README.md +77 -0
  13. data/api_examples/rest_api/delete_files_storage.rb +3 -5
  14. data/api_examples/rest_api/delete_files_uuid_metadata_key.rb +3 -4
  15. data/api_examples/rest_api/delete_files_uuid_storage.rb +3 -4
  16. data/api_examples/rest_api/delete_groups_uuid.rb +3 -4
  17. data/api_examples/rest_api/delete_webhooks_unsubscribe.rb +3 -4
  18. data/api_examples/rest_api/get_addons_aws_rekognition_detect_labels_execute_status.rb +3 -6
  19. data/api_examples/rest_api/get_addons_aws_rekognition_detect_moderation_labels_execute_status.rb +3 -6
  20. data/api_examples/rest_api/get_addons_remove_bg_execute_status.rb +3 -6
  21. data/api_examples/rest_api/get_addons_uc_clamav_virus_scan_execute_status.rb +3 -6
  22. data/api_examples/rest_api/get_convert_document_status_token.rb +3 -5
  23. data/api_examples/rest_api/get_convert_document_uuid.rb +3 -5
  24. data/api_examples/rest_api/get_convert_video_status_token.rb +3 -5
  25. data/api_examples/rest_api/get_files.rb +3 -5
  26. data/api_examples/rest_api/get_files_uuid.rb +3 -5
  27. data/api_examples/rest_api/get_files_uuid_metadata.rb +3 -5
  28. data/api_examples/rest_api/get_files_uuid_metadata_key.rb +3 -5
  29. data/api_examples/rest_api/get_groups.rb +3 -5
  30. data/api_examples/rest_api/get_groups_uuid.rb +3 -5
  31. data/api_examples/rest_api/get_project.rb +3 -5
  32. data/api_examples/rest_api/get_webhooks.rb +3 -5
  33. data/api_examples/rest_api/post_addons_aws_rekognition_detect_labels_execute.rb +3 -5
  34. data/api_examples/rest_api/post_addons_aws_rekognition_detect_moderation_labels_execute.rb +3 -5
  35. data/api_examples/rest_api/post_addons_remove_bg_execute.rb +3 -5
  36. data/api_examples/rest_api/post_addons_uc_clamav_virus_scan_execute.rb +3 -5
  37. data/api_examples/rest_api/post_convert_document.rb +3 -6
  38. data/api_examples/rest_api/post_convert_video.rb +3 -10
  39. data/api_examples/rest_api/post_files_local_copy.rb +3 -6
  40. data/api_examples/rest_api/post_files_remote_copy.rb +3 -7
  41. data/api_examples/rest_api/post_webhooks.rb +3 -9
  42. data/api_examples/rest_api/put_files_storage.rb +3 -8
  43. data/api_examples/rest_api/put_files_uuid_metadata_key.rb +3 -7
  44. data/api_examples/rest_api/put_files_uuid_storage.rb +3 -5
  45. data/api_examples/rest_api/put_webhooks_id.rb +3 -11
  46. data/api_examples/support/example_helper.rb +250 -0
  47. data/api_examples/support/run_rest_example.rb +161 -0
  48. data/api_examples/support/run_upload_example.rb +88 -0
  49. data/api_examples/upload_api/get_from_url_status.rb +3 -5
  50. data/api_examples/upload_api/get_group_info.rb +3 -6
  51. data/api_examples/upload_api/get_info.rb +3 -6
  52. data/api_examples/upload_api/post_base.rb +3 -5
  53. data/api_examples/upload_api/post_from_url.rb +3 -5
  54. data/api_examples/upload_api/post_group.rb +3 -8
  55. data/api_examples/upload_api/post_multipart_complete.rb +3 -7
  56. data/api_examples/upload_api/post_multipart_start.rb +3 -7
  57. data/api_examples/upload_api/put_multipart_part.rb +4 -0
  58. data/bin/console +1 -1
  59. data/docs/release-notes-5.0.0.rc1.md +34 -0
  60. data/examples/README.md +39 -0
  61. data/examples/batch_upload.rb +54 -0
  62. data/examples/group_creation.rb +88 -0
  63. data/examples/large_file_upload.rb +88 -0
  64. data/examples/simple_upload.rb +39 -0
  65. data/examples/upload_with_progress.rb +84 -0
  66. data/examples/url_upload.rb +56 -0
  67. data/lib/uploadcare/api/rest/addons.rb +107 -0
  68. data/lib/uploadcare/api/rest/document_conversions.rb +65 -0
  69. data/lib/uploadcare/api/rest/file_metadata.rb +71 -0
  70. data/lib/uploadcare/api/rest/files.rb +112 -0
  71. data/lib/uploadcare/api/rest/groups.rb +49 -0
  72. data/lib/uploadcare/api/rest/project.rb +23 -0
  73. data/lib/uploadcare/api/rest/video_conversions.rb +52 -0
  74. data/lib/uploadcare/api/rest/webhooks.rb +74 -0
  75. data/lib/uploadcare/api/rest.rb +254 -0
  76. data/lib/uploadcare/api/upload/files.rb +313 -0
  77. data/lib/uploadcare/api/upload/groups.rb +72 -0
  78. data/lib/uploadcare/api/upload.rb +272 -0
  79. data/lib/uploadcare/client/addons_accessor.rb +85 -0
  80. data/lib/uploadcare/client/api.rb +33 -0
  81. data/lib/uploadcare/client/conversions_accessor.rb +33 -0
  82. data/lib/uploadcare/client/document_conversions_accessor.rb +41 -0
  83. data/lib/uploadcare/client/file_metadata_accessor.rb +46 -0
  84. data/lib/uploadcare/client/files_accessor.rb +82 -0
  85. data/lib/uploadcare/client/groups_accessor.rb +35 -0
  86. data/lib/uploadcare/client/project_accessor.rb +17 -0
  87. data/lib/uploadcare/client/video_conversions_accessor.rb +33 -0
  88. data/lib/uploadcare/client/webhooks_accessor.rb +42 -0
  89. data/lib/uploadcare/client.rb +127 -0
  90. data/lib/uploadcare/cname_generator.rb +68 -0
  91. data/lib/uploadcare/collections/batch_result.rb +35 -0
  92. data/lib/uploadcare/collections/paginated.rb +165 -0
  93. data/lib/uploadcare/configuration.rb +81 -0
  94. data/lib/uploadcare/exception/auth_error.rb +2 -6
  95. data/lib/uploadcare/exception/configuration_error.rb +4 -0
  96. data/lib/uploadcare/exception/conversion_error.rb +2 -6
  97. data/lib/uploadcare/exception/invalid_request_error.rb +4 -0
  98. data/lib/uploadcare/exception/multipart_upload_error.rb +4 -0
  99. data/lib/uploadcare/exception/not_found_error.rb +4 -0
  100. data/lib/uploadcare/exception/request_error.rb +2 -6
  101. data/lib/uploadcare/exception/retry_error.rb +2 -6
  102. data/lib/uploadcare/exception/throttle_error.rb +7 -11
  103. data/lib/uploadcare/exception/unknown_status_error.rb +4 -0
  104. data/lib/uploadcare/exception/upload_error.rb +4 -0
  105. data/lib/uploadcare/exception/upload_timeout_error.rb +4 -0
  106. data/lib/uploadcare/internal/authenticator.rb +101 -0
  107. data/lib/uploadcare/internal/error_handler.rb +102 -0
  108. data/lib/uploadcare/internal/signature_generator.rb +31 -0
  109. data/lib/uploadcare/internal/throttle_handler.rb +36 -0
  110. data/lib/uploadcare/internal/upload_io.rb +110 -0
  111. data/lib/uploadcare/internal/upload_params_generator.rb +86 -0
  112. data/lib/uploadcare/internal/user_agent.rb +22 -0
  113. data/lib/uploadcare/operations/multipart_upload.rb +213 -0
  114. data/lib/uploadcare/operations/upload_router.rb +162 -0
  115. data/lib/uploadcare/resources/addon_execution.rb +97 -0
  116. data/lib/uploadcare/resources/base_resource.rb +61 -0
  117. data/lib/uploadcare/resources/document_conversion.rb +81 -0
  118. data/lib/uploadcare/resources/file.rb +366 -0
  119. data/lib/uploadcare/resources/file_metadata.rb +135 -0
  120. data/lib/uploadcare/resources/group.rb +142 -0
  121. data/lib/uploadcare/resources/project.rb +26 -0
  122. data/lib/uploadcare/resources/video_conversion.rb +59 -0
  123. data/lib/uploadcare/resources/webhook.rb +85 -0
  124. data/lib/uploadcare/result.rb +85 -0
  125. data/lib/uploadcare/signed_url_generators/akamai_generator.rb +60 -56
  126. data/lib/uploadcare/signed_url_generators/base_generator.rb +15 -15
  127. data/lib/uploadcare/version.rb +7 -0
  128. data/lib/uploadcare/webhook_signature_verifier.rb +60 -0
  129. data/lib/uploadcare.rb +84 -50
  130. data/mise.toml +2 -0
  131. data/uploadcare-ruby.gemspec +8 -7
  132. metadata +102 -74
  133. data/api_examples/upload_api/put_presigned_url_x.rb +0 -8
  134. data/lib/uploadcare/api/api.rb +0 -25
  135. data/lib/uploadcare/client/addons_client.rb +0 -69
  136. data/lib/uploadcare/client/conversion/base_conversion_client.rb +0 -59
  137. data/lib/uploadcare/client/conversion/document_conversion_client.rb +0 -45
  138. data/lib/uploadcare/client/conversion/video_conversion_client.rb +0 -46
  139. data/lib/uploadcare/client/file_client.rb +0 -48
  140. data/lib/uploadcare/client/file_list_client.rb +0 -46
  141. data/lib/uploadcare/client/file_metadata_client.rb +0 -36
  142. data/lib/uploadcare/client/group_client.rb +0 -45
  143. data/lib/uploadcare/client/multipart_upload/chunks_client.rb +0 -58
  144. data/lib/uploadcare/client/multipart_upload_client.rb +0 -64
  145. data/lib/uploadcare/client/project_client.rb +0 -20
  146. data/lib/uploadcare/client/rest_client.rb +0 -77
  147. data/lib/uploadcare/client/rest_group_client.rb +0 -43
  148. data/lib/uploadcare/client/upload_client.rb +0 -46
  149. data/lib/uploadcare/client/uploader_client.rb +0 -128
  150. data/lib/uploadcare/client/webhook_client.rb +0 -49
  151. data/lib/uploadcare/concern/error_handler.rb +0 -54
  152. data/lib/uploadcare/concern/throttle_handler.rb +0 -25
  153. data/lib/uploadcare/concern/upload_error_handler.rb +0 -32
  154. data/lib/uploadcare/entity/addons.rb +0 -14
  155. data/lib/uploadcare/entity/conversion/base_converter.rb +0 -43
  156. data/lib/uploadcare/entity/conversion/document_converter.rb +0 -15
  157. data/lib/uploadcare/entity/conversion/video_converter.rb +0 -15
  158. data/lib/uploadcare/entity/decorator/paginator.rb +0 -79
  159. data/lib/uploadcare/entity/entity.rb +0 -18
  160. data/lib/uploadcare/entity/file.rb +0 -103
  161. data/lib/uploadcare/entity/file_list.rb +0 -32
  162. data/lib/uploadcare/entity/file_metadata.rb +0 -30
  163. data/lib/uploadcare/entity/group.rb +0 -49
  164. data/lib/uploadcare/entity/group_list.rb +0 -24
  165. data/lib/uploadcare/entity/project.rb +0 -13
  166. data/lib/uploadcare/entity/uploader.rb +0 -93
  167. data/lib/uploadcare/entity/webhook.rb +0 -14
  168. data/lib/uploadcare/param/authentication_header.rb +0 -37
  169. data/lib/uploadcare/param/conversion/document/processing_job_url_builder.rb +0 -39
  170. data/lib/uploadcare/param/conversion/video/processing_job_url_builder.rb +0 -64
  171. data/lib/uploadcare/param/param.rb +0 -10
  172. data/lib/uploadcare/param/secure_auth_header.rb +0 -51
  173. data/lib/uploadcare/param/simple_auth_header.rb +0 -14
  174. data/lib/uploadcare/param/upload/signature_generator.rb +0 -24
  175. data/lib/uploadcare/param/upload/upload_params_generator.rb +0 -41
  176. data/lib/uploadcare/param/user_agent.rb +0 -21
  177. data/lib/uploadcare/param/webhook_signature_verifier.rb +0 -23
  178. 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
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Uploadcare
4
- VERSION = '4.4.2'
5
- end