workato-connector-sdk 1.3.1 → 1.3.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2a456929ee155b6a048f547defcb4f3ccfcdd2172c1e0539ca601d8268bc0060
4
- data.tar.gz: 588a1bae54828aa7fb750aaa53ca57336c14693478ac096b810b441008186fde
3
+ metadata.gz: 3fe38da4979356285b7bd535a889ce87324c0c9e79af94ab64bbfbabff03f104
4
+ data.tar.gz: 12ae318a25eaf1fddc7c31f22f9870d4af28e736781ef32ff766c32ae14876d2
5
5
  SHA512:
6
- metadata.gz: 5ab021777798644396d5d910c6d3c6f6ebf7ef23956ca7c3b5e79ec2d01d9f59776ea7afa4cbf8c9d501d18c4fc8142e1d4794e15bb3ade22692a3a95c94e4f4
7
- data.tar.gz: e101977c93f1d878cd27c7170e143fbaf7f1221b52d80c489c5ca37915783662bd8571041bae0d4ad75094851ad74f00e6434c331da902d580e9e13098eb21a5
6
+ metadata.gz: 2737cef0c57c48dc215dba1f3077669935fceb940be5484469e3901f6d848bee8af5bc408595a14a330bc96e3e553f088c25323867dc8d43d1b95930275c79af
7
+ data.tar.gz: 066b30f5e052e1dbd91c697b3e978ec548f0ffc76db9298168758e4b60f8ada8f1a13c1a603e0603d347e22fcca2e945fa3eeaedaa74139cef07b09b98b7c9ea
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.3.1
1
+ 1.3.2
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
@@ -1,6 +1,7 @@
1
1
  # typed: false
2
2
  # frozen_string_literal: true
3
3
 
4
+ require 'thor'
4
5
  require 'securerandom'
5
6
  require 'workato/web/app'
6
7
  require_relative './multi_auth_selected_fallback'
@@ -70,7 +71,7 @@ module Workato
70
71
  end
71
72
 
72
73
  def require_gems
73
- require 'oauth2'
74
+ require 'rest-client'
74
75
  require 'launchy'
75
76
  require 'rack'
76
77
  end
@@ -79,7 +80,7 @@ module Workato
79
80
  @thread = Thread.start do
80
81
  Rack::Handler::WEBrick.run(
81
82
  Workato::Web::App.new,
82
- {
83
+ **{
83
84
  Port: port,
84
85
  BindAddress: options[:ip] || DEFAULT_ADDRESS,
85
86
  SSLEnable: https,
@@ -107,7 +108,7 @@ module Workato
107
108
  unless connector.connection.authorization.oauth2?
108
109
  raise 'Authorization type is not OAuth2. ' \
109
110
  'For multi-auth connector ensure correct auth type was used. ' \
110
- "Expected: 'oauth2', got: '#{connector.connection.authorization.type}''"
111
+ "Expected: 'oauth2', got: '#{connector.connection.authorization.type}'"
111
112
  end
112
113
  rescue Workato::Connector::Sdk::InvalidMultiAuthDefinition => e
113
114
  raise "#{e.message}. Please ensure:\n" \
@@ -116,16 +117,6 @@ module Workato
116
117
  'See more: https://docs.workato.com/developing-connectors/sdk/guides/authentication/multi_auth.html'
117
118
  end
118
119
 
119
- def client
120
- @client ||= OAuth2::Client.new(
121
- connector.connection.authorization.client_id,
122
- connector.connection.authorization.client_secret,
123
- site: connector.connection.base_uri,
124
- token_url: connector.connection.authorization.token_url,
125
- redirect_uri: redirect_url
126
- )
127
- end
128
-
129
120
  def authorize_url
130
121
  return @authorize_url if defined?(@authorize_url)
131
122
 
@@ -193,7 +184,15 @@ module Workato
193
184
  extra_settings ||= {}
194
185
  extra_settings.merge(tokens)
195
186
  else
196
- client.auth_code.get_token(code).to_hash
187
+ response = RestClient.post(
188
+ connector.connection.authorization.token_url,
189
+ code: code,
190
+ grant_type: :authorization_code,
191
+ client_id: connector.connection.authorization.client_id,
192
+ client_secret: connector.connection.authorization.client_secret,
193
+ redirect_uri: redirect_url
194
+ )
195
+ JSON.parse(response.body).to_hash
197
196
  end
198
197
  end
199
198
 
@@ -117,7 +117,7 @@ module Workato
117
117
  retry_on_response.each { |m| m.is_a?(::Integer) ? @retry_codes << m : @retry_matchers << m }
118
118
  @retry_codes = RETRY_DEFAULT_CODES if @retry_codes.empty?
119
119
  @retry_methods = (retry_on_request.presence || RETRY_DEFAULT_METHODS).map(&:to_s).map(&:downcase)
120
- @retries_left = [[(max_retries.is_a?(::Integer) && max_retries) || MAX_RETRIES, MAX_RETRIES].min, 0].max
120
+ @retries_left = ((max_retries.is_a?(::Integer) && max_retries) || MAX_RETRIES).clamp(0, MAX_RETRIES)
121
121
  end
122
122
 
123
123
  sig { params(exception: RequestFailedError).returns(T::Boolean) }
@@ -6,7 +6,7 @@ require 'csv'
6
6
  module Workato
7
7
  module Connector
8
8
  module Sdk
9
- CsvError = Class.new(Sdk::RuntimeError)
9
+ CsvError = Class.new(Sdk::Error)
10
10
 
11
11
  CsvFormatError = Class.new(CsvError)
12
12
 
@@ -89,7 +89,7 @@ module Workato
89
89
  rescue CSV::MalformedCSVError => e
90
90
  raise CsvFormatError, e
91
91
  rescue ArgumentError => e
92
- raise Sdk::RuntimeError, e.message
92
+ raise Sdk::ArgumentError, e.message
93
93
  end
94
94
 
95
95
  sig do
@@ -112,7 +112,7 @@ module Workato
112
112
 
113
113
  ::CSV.generate(str || String.new, **options, &blk)
114
114
  rescue ArgumentError => e
115
- raise Sdk::RuntimeError, e.message
115
+ raise Sdk::ArgumentError, e.message
116
116
  end
117
117
 
118
118
  private
@@ -10,14 +10,28 @@ using Workato::Extension::HashWithIndifferentAccess
10
10
  module Workato
11
11
  module Connector
12
12
  module Sdk
13
+ JSONParsingError = Class.new(Error)
14
+
13
15
  module Dsl
14
16
  class WorkatoPackage
15
- JWT_ALGORITHMS = %w[RS256 RS384 RS512].freeze
16
- private_constant :JWT_ALGORITHMS
17
+ JWT_RSA_ALGORITHMS = %w[RS256 RS384 RS512].freeze
18
+ private_constant :JWT_RSA_ALGORITHMS
17
19
 
18
20
  JWT_RSA_KEY_MIN_LENGTH = 2048
19
21
  private_constant :JWT_RSA_KEY_MIN_LENGTH
20
22
 
23
+ JWT_HMAC_ALGORITHMS = %w[HS256].freeze
24
+ private_constant :JWT_HMAC_ALGORITHMS
25
+
26
+ JWT_ECDSA_ALGORITHMS = %w[ES256 ES384 ES512].freeze
27
+ private_constant :JWT_ECDSA_ALGORITHMS
28
+
29
+ JWT_ECDSA_KEY_LENGTH_MAPPING = { 'ES256' => 256, 'ES384' => 384, 'ES512' => 521 }.freeze
30
+ private_constant :JWT_ECDSA_KEY_LENGTH_MAPPING
31
+
32
+ JWT_ALGORITHMS = (JWT_RSA_ALGORITHMS + JWT_HMAC_ALGORITHMS + JWT_ECDSA_ALGORITHMS).freeze
33
+ private_constant :JWT_ALGORITHMS
34
+
21
35
  VERIFY_RCA_ALGORITHMS = %w[SHA SHA1 SHA224 SHA256 SHA384 SHA512].freeze
22
36
  private_constant :VERIFY_RCA_ALGORITHMS
23
37
 
@@ -39,37 +53,52 @@ module Workato
39
53
  def jwt_encode(payload, key, algorithm, header_fields = {})
40
54
  algorithm = algorithm.to_s.upcase
41
55
  unless JWT_ALGORITHMS.include?(algorithm)
42
- raise "Unsupported signing method. Supports only #{JWT_ALGORITHMS.join(', ')}. Got: '#{algorithm}'"
56
+ raise Sdk::ArgumentError,
57
+ "Unsupported signing method. Supports only #{JWT_ALGORITHMS.join(', ')}. Got: '#{algorithm}'"
43
58
  end
44
59
 
45
- rsa_private = OpenSSL::PKey::RSA.new(key)
46
- if rsa_private.n.num_bits < JWT_RSA_KEY_MIN_LENGTH
47
- raise "A RSA key of size #{JWT_RSA_KEY_MIN_LENGTH} bits or larger MUST be used with JWT."
60
+ if JWT_RSA_ALGORITHMS.include?(algorithm)
61
+ key = OpenSSL::PKey::RSA.new(key)
62
+ if key.n.num_bits < JWT_RSA_KEY_MIN_LENGTH
63
+ raise Sdk::ArgumentError,
64
+ "A RSA key of size #{JWT_RSA_KEY_MIN_LENGTH} bits or larger MUST be used with JWT"
65
+ end
66
+ elsif JWT_ECDSA_ALGORITHMS.include?(algorithm)
67
+ key = OpenSSL::PKey::EC.new(key)
68
+ if key.group.order.num_bits != JWT_ECDSA_KEY_LENGTH_MAPPING[algorithm]
69
+ raise Sdk::ArgumentError,
70
+ "An ECDSA key of size #{JWT_ECDSA_KEY_LENGTH_MAPPING[algorithm]} bits MUST be used with JWT"
71
+ end
48
72
  end
49
73
 
50
74
  header_fields = HashWithIndifferentAccess.wrap(header_fields).except(:typ, :alg)
51
- ::JWT.encode(payload, rsa_private, algorithm, header_fields)
75
+ ::JWT.encode(payload, key, algorithm, header_fields)
76
+ rescue JWT::IncorrectAlgorithm
77
+ raise Sdk::ArgumentError, 'Mismatched algorithm and key'
78
+ rescue OpenSSL::PKey::PKeyError
79
+ raise Sdk::ArgumentError, 'Invalid key'
52
80
  end
53
81
 
54
82
  def verify_rsa(payload, certificate, signature, algorithm = 'SHA256')
55
83
  algorithm = algorithm.to_s.upcase
56
84
  unless VERIFY_RCA_ALGORITHMS.include?(algorithm)
57
- raise "Unsupported signing method. Supports only #{VERIFY_RCA_ALGORITHMS.join(', ')}. Got: '#{algorithm}'"
85
+ raise Sdk::ArgumentError,
86
+ "Unsupported signing method. Supports only #{VERIFY_RCA_ALGORITHMS.join(', ')}. Got: '#{algorithm}'"
58
87
  end
59
88
 
60
89
  cert = OpenSSL::X509::Certificate.new(certificate)
61
90
  digest = OpenSSL::Digest.new(algorithm)
62
91
  cert.public_key.verify(digest, signature, payload)
63
92
  rescue OpenSSL::PKey::PKeyError
64
- raise 'An error occurred during signature verification. Check arguments'
93
+ raise Sdk::ArgumentError, 'An error occurred during signature verification. Check arguments'
65
94
  rescue OpenSSL::X509::CertificateError
66
- raise 'Invalid certificate format'
95
+ raise Sdk::ArgumentError, 'Invalid certificate format'
67
96
  end
68
97
 
69
98
  def parse_yaml(yaml)
70
99
  ::Psych.safe_load(yaml)
71
- rescue ::Psych::DisallowedClass => e
72
- raise e.message
100
+ rescue ::Psych::Exception => e
101
+ raise Sdk::ArgumentError, "YAML Parsing error. #{e}"
73
102
  end
74
103
 
75
104
  def render_yaml(obj)
@@ -79,7 +108,7 @@ module Workato
79
108
  def parse_json(source)
80
109
  JSON.parse(source)
81
110
  rescue JSON::ParserError => e
82
- raise JSONResponseFormatError, e
111
+ raise JSONParsingError, e
83
112
  end
84
113
 
85
114
  def uuid
@@ -88,7 +117,7 @@ module Workato
88
117
 
89
118
  def random_bytes(len)
90
119
  unless (len.is_a? ::Integer) && (len <= RANDOM_SIZE)
91
- raise "The requested length or random bytes sequence should be <= #{RANDOM_SIZE}"
120
+ raise Sdk::ArgumentError, "The requested length or random bytes sequence should be <= #{RANDOM_SIZE}"
92
121
  end
93
122
 
94
123
  Types::Binary.new(::OpenSSL::Random.random_bytes(len))
@@ -97,7 +126,7 @@ module Workato
97
126
  def aes_cbc_encrypt(string, key, init_vector = nil)
98
127
  key_size = key.bytesize * 8
99
128
  unless ALLOWED_KEY_SIZES.include?(key_size)
100
- raise 'Incorrect key size for AES'
129
+ raise Sdk::ArgumentError, 'Incorrect key size for AES'
101
130
  end
102
131
 
103
132
  cipher = ::OpenSSL::Cipher.new("AES-#{key_size}-CBC")
@@ -110,7 +139,7 @@ module Workato
110
139
  def aes_cbc_decrypt(string, key, init_vector = nil)
111
140
  key_size = key.bytesize * 8
112
141
  unless ALLOWED_KEY_SIZES.include?(key_size)
113
- raise 'Incorrect key size for AES'
142
+ raise Sdk::ArgumentError, 'Incorrect key size for AES'
114
143
  end
115
144
 
116
145
  cipher = ::OpenSSL::Cipher.new("AES-#{key_size}-CBC")
@@ -10,6 +10,8 @@ module Workato
10
10
 
11
11
  RuntimeError = Class.new(Error)
12
12
 
13
+ ArgumentError = Class.new(Error)
14
+
13
15
  InvalidDefinitionError = Class.new(Error)
14
16
 
15
17
  class UnexpectedMethodDefinitionError < InvalidDefinitionError
@@ -212,7 +212,7 @@ module Workato
212
212
  attr_reader :input
213
213
 
214
214
  class Chunk < T::Struct
215
- const :data, T.untyped
215
+ const :data, T.untyped # rubocop:disable Sorbet/ForbidUntypedStructProps
216
216
  const :from, Integer
217
217
  const :eof, T::Boolean
218
218
  const :next_from, T.nilable(Integer)
@@ -17,7 +17,7 @@ module Workato
17
17
  map { |r| r.to_csv(options) }.join
18
18
  else
19
19
  options.delete(:multi_line)
20
- super(options)
20
+ super(**options)
21
21
  end
22
22
  end
23
23
 
@@ -45,8 +45,6 @@ module Enumerable
45
45
  nil
46
46
  end
47
47
 
48
- private
49
-
50
48
  def transform_select(&block)
51
49
  map do |*items|
52
50
  result = block.call(*items)
@@ -12,10 +12,10 @@ module Workato
12
12
  attr_accessor :extra_chain_cert
13
13
 
14
14
  def self.included(base)
15
- ssl_ivnames = base.const_get('SSL_IVNAMES', false)
15
+ ssl_ivnames = base.const_get('SSL_IVNAMES', false) # rubocop:disable Sorbet/ConstantsFromStrings
16
16
  ssl_ivnames << :@extra_chain_cert unless ssl_ivnames.include?(:@extra_chain_cert)
17
17
 
18
- ssl_attributes = base.const_get('SSL_ATTRIBUTES', false)
18
+ ssl_attributes = base.const_get('SSL_ATTRIBUTES', false) # rubocop:disable Sorbet/ConstantsFromStrings
19
19
  ssl_attributes << :extra_chain_cert unless ssl_attributes.include?(:extra_chain_cert)
20
20
  end
21
21
  end
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  # frozen_string_literal: true
2
3
 
3
4
  require 'active_support/messages/metadata'
@@ -45,8 +45,7 @@ module Workato
45
45
  end
46
46
 
47
47
  def strip_tags
48
- @html_full_sanitizer ||= Rails::Html::Sanitizer.full_sanitizer.new
49
- @html_full_sanitizer.sanitize(self)
48
+ Rails::Html::Sanitizer.full_sanitizer.new.sanitize(self)
50
49
  end
51
50
 
52
51
  def to_time(form = :local, format: nil)
@@ -1,3 +1,4 @@
1
+ # typed: false
1
2
  # frozen_string_literal: true
2
3
 
3
4
  module Workato
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workato-connector-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Abolmasov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-02-09 00:00:00.000000000 Z
11
+ date: 2023-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -164,20 +164,6 @@ dependencies:
164
164
  - - '='
165
165
  - !ruby/object:Gem::Version
166
166
  version: 1.13.10
167
- - !ruby/object:Gem::Dependency
168
- name: oauth2
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - "~>"
172
- - !ruby/object:Gem::Version
173
- version: '1.0'
174
- type: :runtime
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - "~>"
179
- - !ruby/object:Gem::Version
180
- version: '1.0'
181
167
  - !ruby/object:Gem::Dependency
182
168
  name: rack
183
169
  requirement: !ruby/object:Gem::Requirement