workato-connector-sdk 1.0.1 → 1.0.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 +5 -5
- data/lib/workato/cli/edit_command.rb +4 -3
- data/lib/workato/cli/exec_command.rb +24 -35
- data/lib/workato/cli/generate_command.rb +1 -0
- data/lib/workato/cli/generators/connector_generator.rb +1 -0
- data/lib/workato/cli/generators/master_key_generator.rb +1 -0
- data/lib/workato/cli/main.rb +1 -0
- data/lib/workato/cli/oauth2_command.rb +6 -5
- data/lib/workato/cli/push_command.rb +5 -4
- data/lib/workato/cli/schema_command.rb +4 -3
- data/lib/workato/connector/sdk/account_properties.rb +1 -0
- data/lib/workato/connector/sdk/action.rb +78 -20
- data/lib/workato/connector/sdk/block_invocation_refinements.rb +1 -0
- data/lib/workato/connector/sdk/connection.rb +202 -44
- data/lib/workato/connector/sdk/connector.rb +200 -65
- data/lib/workato/connector/sdk/dsl/account_property.rb +1 -0
- data/lib/workato/connector/sdk/dsl/aws.rb +23 -27
- data/lib/workato/connector/sdk/dsl/call.rb +1 -0
- data/lib/workato/connector/sdk/dsl/error.rb +1 -0
- data/lib/workato/connector/sdk/dsl/http.rb +2 -7
- data/lib/workato/connector/sdk/dsl/lookup_table.rb +1 -0
- data/lib/workato/connector/sdk/dsl/time.rb +6 -0
- data/lib/workato/connector/sdk/dsl/workato_code_lib.rb +38 -0
- data/lib/workato/connector/sdk/dsl/workato_schema.rb +1 -0
- data/lib/workato/connector/sdk/dsl.rb +19 -4
- data/lib/workato/connector/sdk/errors.rb +4 -3
- data/lib/workato/connector/sdk/lookup_tables.rb +1 -0
- data/lib/workato/connector/sdk/object_definitions.rb +7 -8
- data/lib/workato/connector/sdk/operation.rb +127 -88
- data/lib/workato/connector/sdk/request.rb +45 -17
- data/lib/workato/connector/sdk/schema/field/array.rb +1 -0
- data/lib/workato/connector/sdk/schema/field/convertors.rb +1 -0
- data/lib/workato/connector/sdk/schema/field/date.rb +1 -0
- data/lib/workato/connector/sdk/schema/field/date_time.rb +1 -0
- data/lib/workato/connector/sdk/schema/field/integer.rb +1 -0
- data/lib/workato/connector/sdk/schema/field/number.rb +1 -0
- data/lib/workato/connector/sdk/schema/field/object.rb +1 -0
- data/lib/workato/connector/sdk/schema/field/string.rb +1 -0
- data/lib/workato/connector/sdk/schema/type/time.rb +1 -0
- data/lib/workato/connector/sdk/schema/type/unicode_string.rb +1 -0
- data/lib/workato/connector/sdk/schema.rb +1 -0
- data/lib/workato/connector/sdk/settings.rb +9 -4
- data/lib/workato/connector/sdk/summarize.rb +3 -2
- data/lib/workato/connector/sdk/trigger.rb +81 -7
- data/lib/workato/connector/sdk/version.rb +2 -1
- data/lib/workato/connector/sdk/workato_schemas.rb +1 -0
- data/lib/workato/connector/sdk/xml.rb +1 -0
- data/lib/workato/connector/sdk.rb +4 -0
- data/lib/workato/extension/array.rb +1 -0
- data/lib/workato/extension/case_sensitive_headers.rb +1 -0
- data/lib/workato/extension/currency.rb +1 -0
- data/lib/workato/extension/date.rb +1 -0
- data/lib/workato/extension/enumerable.rb +1 -0
- data/lib/workato/extension/extra_chain_cert.rb +1 -0
- data/lib/workato/extension/hash.rb +1 -0
- data/lib/workato/extension/integer.rb +1 -0
- data/lib/workato/extension/nil_class.rb +1 -0
- data/lib/workato/extension/object.rb +1 -0
- data/lib/workato/extension/phone.rb +1 -0
- data/lib/workato/extension/string.rb +2 -1
- data/lib/workato/extension/symbol.rb +1 -0
- data/lib/workato/extension/time.rb +1 -0
- data/lib/workato/testing/vcr_encrypted_cassette_serializer.rb +5 -0
- data/lib/workato/testing/vcr_multipart_body_matcher.rb +1 -0
- data/lib/workato/web/app.rb +1 -0
- data/lib/workato-connector-sdk.rb +1 -0
- metadata +64 -7
@@ -1,84 +1,109 @@
|
|
1
|
+
# typed: strict
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module Workato
|
4
5
|
module Connector
|
5
6
|
module Sdk
|
7
|
+
module SorbetTypes
|
8
|
+
SourceHash = T.type_alias { T.any(HashWithIndifferentAccess, T::Hash[T.any(Symbol, String), T.untyped]) }
|
9
|
+
end
|
10
|
+
|
6
11
|
class Connector
|
12
|
+
extend T::Sig
|
13
|
+
|
14
|
+
sig { returns(HashWithIndifferentAccess) }
|
7
15
|
attr_reader :source
|
8
16
|
|
17
|
+
sig { params(path_to_source_code: String, settings: SorbetTypes::SettingsHash).returns(Connector) }
|
9
18
|
def self.from_file(path_to_source_code = DEFAULT_CONNECTOR_PATH, settings = {})
|
10
19
|
new(eval(File.read(path_to_source_code), binding, path_to_source_code), settings) # rubocop:disable Security/Eval
|
11
20
|
end
|
12
21
|
|
22
|
+
sig { params(definition: SorbetTypes::SourceHash, settings: SorbetTypes::SettingsHash).void }
|
13
23
|
def initialize(definition, settings = {})
|
14
|
-
@source = definition.with_indifferent_access
|
15
|
-
@settings = settings.with_indifferent_access
|
16
|
-
@connection_source = @source[:connection] || {}
|
17
|
-
@methods_source = @source[:methods] || {}
|
24
|
+
@source = T.let(definition.with_indifferent_access, HashWithIndifferentAccess)
|
25
|
+
@settings = T.let(settings.with_indifferent_access, HashWithIndifferentAccess)
|
26
|
+
@connection_source = T.let(@source[:connection] || {}.with_indifferent_access, HashWithIndifferentAccess)
|
27
|
+
@methods_source = T.let(@source[:methods] || {}.with_indifferent_access, HashWithIndifferentAccess)
|
18
28
|
end
|
19
29
|
|
30
|
+
sig { params(path: String, params: T::Hash[Symbol, T.untyped]).returns(T.untyped) }
|
31
|
+
def invoke(path, params = {})
|
32
|
+
InvokePath.new(path: path, connector: self, params: params).call
|
33
|
+
end
|
34
|
+
|
35
|
+
sig { returns(T.nilable(String)) }
|
20
36
|
def title
|
21
37
|
@source[:title]
|
22
38
|
end
|
23
39
|
|
40
|
+
sig { returns(ActionsProxy) }
|
24
41
|
def actions
|
42
|
+
@actions = T.let(@actions, T.nilable(ActionsProxy))
|
25
43
|
@actions ||= ActionsProxy.new(
|
26
44
|
actions: source[:actions].presence || {},
|
27
45
|
methods: methods_source,
|
28
46
|
object_definitions: object_definitions,
|
29
|
-
connection: connection
|
30
|
-
settings: settings
|
47
|
+
connection: connection
|
31
48
|
)
|
32
49
|
end
|
33
50
|
|
51
|
+
sig { returns(MethodsProxy) }
|
34
52
|
def methods
|
53
|
+
@methods = T.let(@methods, T.nilable(MethodsProxy))
|
35
54
|
@methods ||= MethodsProxy.new(
|
36
55
|
methods: methods_source,
|
37
|
-
connection: connection
|
38
|
-
settings: settings
|
56
|
+
connection: connection
|
39
57
|
)
|
40
58
|
end
|
41
59
|
|
60
|
+
sig { params(settings: T.nilable(SorbetTypes::SettingsHash)).returns(T.untyped) }
|
42
61
|
def test(settings = nil)
|
62
|
+
@test = T.let(@test, T.nilable(Action))
|
43
63
|
@test ||= Action.new(
|
44
64
|
action: {
|
45
65
|
execute: source[:test]
|
46
66
|
},
|
47
67
|
methods: methods_source,
|
48
|
-
connection: connection
|
49
|
-
|
50
|
-
|
68
|
+
connection: connection
|
69
|
+
)
|
70
|
+
@test.execute(settings)
|
51
71
|
end
|
52
72
|
|
73
|
+
sig { returns(TriggersProxy) }
|
53
74
|
def triggers
|
75
|
+
@triggers = T.let(@triggers, T.nilable(TriggersProxy))
|
54
76
|
@triggers ||= TriggersProxy.new(
|
55
77
|
triggers: source[:triggers].presence || {},
|
56
78
|
methods: methods_source,
|
57
79
|
connection: connection,
|
58
|
-
object_definitions: object_definitions
|
59
|
-
settings: settings
|
80
|
+
object_definitions: object_definitions
|
60
81
|
)
|
61
82
|
end
|
62
83
|
|
84
|
+
sig { returns(ObjectDefinitions) }
|
63
85
|
def object_definitions
|
86
|
+
@object_definitions = T.let(@object_definitions, T.nilable(ObjectDefinitions))
|
64
87
|
@object_definitions ||= ObjectDefinitions.new(
|
65
88
|
object_definitions: source[:object_definitions].presence || {},
|
66
89
|
methods: methods_source,
|
67
|
-
connection: connection
|
68
|
-
settings: settings
|
90
|
+
connection: connection
|
69
91
|
)
|
70
92
|
end
|
71
93
|
|
94
|
+
sig { returns(PickListsProxy) }
|
72
95
|
def pick_lists
|
96
|
+
@pick_lists = T.let(@pick_lists, T.nilable(PickListsProxy))
|
73
97
|
@pick_lists ||= PickListsProxy.new(
|
74
98
|
pick_lists: source[:pick_lists].presence || {},
|
75
99
|
methods: methods_source,
|
76
|
-
connection: connection
|
77
|
-
settings: settings
|
100
|
+
connection: connection
|
78
101
|
)
|
79
102
|
end
|
80
103
|
|
104
|
+
sig { returns(Connection) }
|
81
105
|
def connection
|
106
|
+
@connection = T.let(@connection, T.nilable(Connection))
|
82
107
|
@connection ||= Connection.new(
|
83
108
|
methods: methods_source,
|
84
109
|
connection: connection_source,
|
@@ -88,100 +113,139 @@ module Workato
|
|
88
113
|
|
89
114
|
private
|
90
115
|
|
91
|
-
|
92
|
-
|
93
|
-
|
116
|
+
sig { returns(HashWithIndifferentAccess) }
|
117
|
+
attr_reader :methods_source
|
118
|
+
|
119
|
+
sig { returns(HashWithIndifferentAccess) }
|
120
|
+
attr_reader :connection_source
|
121
|
+
|
122
|
+
sig { returns(SorbetTypes::SettingsHash) }
|
123
|
+
attr_reader :settings
|
94
124
|
end
|
95
125
|
|
96
126
|
class ActionsProxy
|
97
|
-
|
127
|
+
extend T::Sig
|
128
|
+
|
129
|
+
sig do
|
130
|
+
params(
|
131
|
+
actions: HashWithIndifferentAccess,
|
132
|
+
object_definitions: ObjectDefinitions,
|
133
|
+
methods: HashWithIndifferentAccess,
|
134
|
+
connection: Connection
|
135
|
+
).void
|
136
|
+
end
|
137
|
+
def initialize(actions:, object_definitions:, methods:, connection:)
|
98
138
|
@methods = methods
|
99
139
|
@connection = connection
|
100
140
|
@object_definitions = object_definitions
|
101
|
-
@
|
141
|
+
@actions = T.let({}, T::Hash[T.any(Symbol, String), Action])
|
102
142
|
define_action_methods(actions)
|
103
143
|
end
|
104
144
|
|
145
|
+
sig { params(action: T.any(Symbol, String)).returns(T.untyped) }
|
105
146
|
def [](action)
|
106
147
|
public_send(action)
|
107
148
|
end
|
108
149
|
|
109
150
|
private
|
110
151
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
152
|
+
sig { returns(HashWithIndifferentAccess) }
|
153
|
+
attr_reader :methods
|
154
|
+
|
155
|
+
sig { returns(Connection) }
|
156
|
+
attr_reader :connection
|
157
|
+
|
158
|
+
sig { returns(ObjectDefinitions) }
|
159
|
+
attr_reader :object_definitions
|
115
160
|
|
116
|
-
|
117
|
-
|
161
|
+
sig { params(actions_source: HashWithIndifferentAccess).void }
|
162
|
+
def define_action_methods(actions_source)
|
163
|
+
actions_source.each do |action, definition|
|
118
164
|
define_singleton_method(action) do |input_ = nil|
|
119
|
-
@actions ||= {}
|
120
165
|
@actions[action] ||= Action.new(
|
121
166
|
action: definition,
|
122
167
|
object_definitions: object_definitions,
|
123
168
|
methods: methods,
|
124
|
-
connection: connection
|
125
|
-
settings: settings
|
169
|
+
connection: connection
|
126
170
|
)
|
127
171
|
return @actions[action] if input_.nil?
|
128
172
|
|
129
|
-
@actions[action].invoke(input_)
|
173
|
+
T.must(@actions[action]).invoke(input_)
|
130
174
|
end
|
131
175
|
end
|
132
176
|
end
|
133
177
|
end
|
134
178
|
|
135
179
|
class MethodsProxy
|
136
|
-
|
180
|
+
extend T::Sig
|
181
|
+
|
182
|
+
sig do
|
183
|
+
params(
|
184
|
+
methods: HashWithIndifferentAccess,
|
185
|
+
connection: Connection
|
186
|
+
).void
|
187
|
+
end
|
188
|
+
def initialize(methods:, connection:)
|
137
189
|
@methods = methods
|
138
190
|
@connection = connection
|
139
|
-
@
|
191
|
+
@actions = T.let({}, T::Hash[T.any(Symbol, String), Action])
|
140
192
|
define_action_methods
|
141
193
|
end
|
142
194
|
|
143
195
|
private
|
144
196
|
|
145
|
-
|
146
|
-
|
147
|
-
|
197
|
+
sig { returns(HashWithIndifferentAccess) }
|
198
|
+
attr_reader :methods
|
199
|
+
|
200
|
+
sig { returns(Connection) }
|
201
|
+
attr_reader :connection
|
148
202
|
|
203
|
+
sig { void }
|
149
204
|
def define_action_methods
|
150
205
|
methods.each do |method, _definition|
|
151
206
|
define_singleton_method(method) do |*args|
|
152
|
-
@actions ||= {}
|
153
207
|
@actions[method] ||= Action.new(
|
154
208
|
action: {
|
155
|
-
execute: -> { call(method, *args) }
|
209
|
+
execute: -> { T.unsafe(self).call(method, *args) }
|
156
210
|
},
|
157
211
|
methods: methods,
|
158
|
-
connection: connection
|
159
|
-
settings: settings
|
212
|
+
connection: connection
|
160
213
|
)
|
161
|
-
@actions[method].execute
|
214
|
+
T.must(@actions[method]).execute
|
162
215
|
end
|
163
216
|
end
|
164
217
|
end
|
165
218
|
end
|
166
219
|
|
167
220
|
class PickListsProxy
|
168
|
-
|
221
|
+
extend T::Sig
|
222
|
+
|
223
|
+
sig do
|
224
|
+
params(
|
225
|
+
pick_lists: HashWithIndifferentAccess,
|
226
|
+
methods: HashWithIndifferentAccess,
|
227
|
+
connection: Connection
|
228
|
+
).void
|
229
|
+
end
|
230
|
+
def initialize(pick_lists:, methods:, connection:)
|
169
231
|
@methods = methods
|
170
232
|
@connection = connection
|
171
|
-
@
|
233
|
+
@actions = T.let({}, T::Hash[T.any(Symbol, String), Action])
|
172
234
|
define_action_methods(pick_lists)
|
173
235
|
end
|
174
236
|
|
175
237
|
private
|
176
238
|
|
177
|
-
|
178
|
-
|
179
|
-
|
239
|
+
sig { returns(HashWithIndifferentAccess) }
|
240
|
+
attr_reader :methods
|
241
|
+
|
242
|
+
sig { returns(Connection) }
|
243
|
+
attr_reader :connection
|
180
244
|
|
181
|
-
|
182
|
-
|
245
|
+
sig { params(pick_lists_source: HashWithIndifferentAccess).void }
|
246
|
+
def define_action_methods(pick_lists_source)
|
247
|
+
pick_lists_source.each do |pick_list, pick_list_proc|
|
183
248
|
define_singleton_method(pick_list) do |settings = nil, args = {}|
|
184
|
-
@actions ||= {}
|
185
249
|
@actions[pick_list] ||= Action.new(
|
186
250
|
action: {
|
187
251
|
execute: lambda do |connection, input|
|
@@ -196,50 +260,121 @@ module Workato
|
|
196
260
|
end
|
197
261
|
},
|
198
262
|
methods: methods,
|
199
|
-
connection: connection
|
200
|
-
settings: send(:settings)
|
263
|
+
connection: connection
|
201
264
|
)
|
202
|
-
@actions[pick_list].execute(settings, args)
|
265
|
+
T.must(@actions[pick_list]).execute(settings, args)
|
203
266
|
end
|
204
267
|
end
|
205
268
|
end
|
206
269
|
end
|
207
270
|
|
208
271
|
class TriggersProxy
|
209
|
-
|
272
|
+
extend T::Sig
|
273
|
+
|
274
|
+
sig do
|
275
|
+
params(
|
276
|
+
triggers: HashWithIndifferentAccess,
|
277
|
+
object_definitions: ObjectDefinitions,
|
278
|
+
methods: HashWithIndifferentAccess,
|
279
|
+
connection: Connection
|
280
|
+
).void
|
281
|
+
end
|
282
|
+
def initialize(triggers:, object_definitions:, methods:, connection:)
|
210
283
|
@methods = methods
|
211
284
|
@connection = connection
|
212
285
|
@object_definitions = object_definitions
|
213
|
-
@
|
214
|
-
@triggers = {}
|
286
|
+
@triggers = T.let({}, T::Hash[T.any(Symbol, String), Trigger])
|
215
287
|
define_trigger_methods(triggers)
|
216
288
|
end
|
217
289
|
|
218
290
|
private
|
219
291
|
|
220
|
-
|
221
|
-
|
222
|
-
:object_definitions,
|
223
|
-
:settings
|
292
|
+
sig { returns(HashWithIndifferentAccess) }
|
293
|
+
attr_reader :methods
|
224
294
|
|
225
|
-
|
226
|
-
|
295
|
+
sig { returns(Connection) }
|
296
|
+
attr_reader :connection
|
297
|
+
|
298
|
+
sig { returns(ObjectDefinitions) }
|
299
|
+
attr_reader :object_definitions
|
300
|
+
|
301
|
+
sig { params(triggers_source: HashWithIndifferentAccess).void }
|
302
|
+
def define_trigger_methods(triggers_source)
|
303
|
+
triggers_source.each do |trigger, definition|
|
227
304
|
define_singleton_method(trigger) do |input_ = nil, payload = {}, headers = {}, params = {}|
|
228
305
|
@triggers[trigger] ||= Trigger.new(
|
229
306
|
trigger: definition,
|
230
307
|
object_definitions: object_definitions,
|
231
308
|
methods: methods,
|
232
|
-
connection: connection
|
233
|
-
settings: settings
|
309
|
+
connection: connection
|
234
310
|
)
|
235
311
|
|
236
312
|
return @triggers[trigger] if input_.nil?
|
237
313
|
|
238
|
-
@triggers[trigger].invoke(input_, payload, headers, params)
|
314
|
+
T.must(@triggers[trigger]).invoke(input_, payload, headers, params)
|
239
315
|
end
|
240
316
|
end
|
241
317
|
end
|
242
318
|
end
|
319
|
+
|
320
|
+
class InvokePath
|
321
|
+
extend T::Sig
|
322
|
+
|
323
|
+
sig do
|
324
|
+
params(
|
325
|
+
path: String,
|
326
|
+
connector: Connector,
|
327
|
+
params: T::Hash[Symbol, T.untyped]
|
328
|
+
).void
|
329
|
+
end
|
330
|
+
def initialize(path:, connector:, params:)
|
331
|
+
@path = T.let(path, String)
|
332
|
+
@connector = T.let(connector, Connector)
|
333
|
+
@params = T.let(params, T::Hash[Symbol, T.untyped])
|
334
|
+
end
|
335
|
+
|
336
|
+
sig { returns(T.untyped) }
|
337
|
+
def call
|
338
|
+
invoke_path
|
339
|
+
end
|
340
|
+
|
341
|
+
private
|
342
|
+
|
343
|
+
sig { returns(String) }
|
344
|
+
attr_reader :path
|
345
|
+
|
346
|
+
sig { returns(Connector) }
|
347
|
+
attr_reader :connector
|
348
|
+
|
349
|
+
sig { returns(T::Hash[Symbol, T.untyped]) }
|
350
|
+
attr_reader :params
|
351
|
+
|
352
|
+
sig { returns(T.untyped) }
|
353
|
+
def invoke_path
|
354
|
+
methods = path.split('.')
|
355
|
+
method = methods.pop
|
356
|
+
raise ArgumentError, 'path is not found' unless method
|
357
|
+
|
358
|
+
object = methods.inject(connector) { |obj, m| obj.public_send(m) }
|
359
|
+
output = invoke_method(object, method)
|
360
|
+
if output.respond_to?(:invoke)
|
361
|
+
invoke_method(output, :invoke)
|
362
|
+
else
|
363
|
+
output
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
sig { params(object: T.untyped, method: T.any(Symbol, String)).returns(T.untyped) }
|
368
|
+
def invoke_method(object, method)
|
369
|
+
parameters = object.method(method).parameters.reject { |p| p[0] == :block }.map(&:second)
|
370
|
+
args = params.values_at(*parameters)
|
371
|
+
if parameters.last == :args
|
372
|
+
args = args.take(args.length - 1) + Array.wrap(args.last).flatten(1)
|
373
|
+
end
|
374
|
+
object.public_send(method, *args)
|
375
|
+
end
|
376
|
+
end
|
377
|
+
private_constant :InvokePath
|
243
378
|
end
|
244
379
|
end
|
245
380
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# typed: false
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require 'aws-sigv4'
|
@@ -19,10 +20,14 @@ module Workato
|
|
19
20
|
WWW_FORM_CONTENT_TYPE = 'application/x-www-form-urlencoded; charset=utf-8'
|
20
21
|
|
21
22
|
def aws
|
22
|
-
|
23
|
+
@aws ||= Private.new(connection: connection)
|
23
24
|
end
|
24
25
|
|
25
|
-
class
|
26
|
+
class Private
|
27
|
+
def initialize(connection:)
|
28
|
+
@connection = connection
|
29
|
+
end
|
30
|
+
|
26
31
|
def generate_signature(connection:,
|
27
32
|
service:,
|
28
33
|
region:,
|
@@ -61,27 +66,25 @@ module Workato
|
|
61
66
|
end
|
62
67
|
|
63
68
|
def iam_external_id
|
64
|
-
settings[:aws_external_id] || DUMMY_AWS_IAM_EXTERNAL_ID
|
69
|
+
@connection.settings[:aws_external_id] || DUMMY_AWS_IAM_EXTERNAL_ID
|
65
70
|
end
|
66
71
|
|
67
72
|
def workato_account_id
|
68
|
-
settings[:aws_workato_account_id] || AMAZON_ROLE_CLIENT_ID || DUMMY_AWS_WORKATO_ACCOUNT_ID
|
73
|
+
@connection.settings[:aws_workato_account_id] || AMAZON_ROLE_CLIENT_ID || DUMMY_AWS_WORKATO_ACCOUNT_ID
|
69
74
|
end
|
70
75
|
|
71
76
|
private
|
72
77
|
|
73
|
-
def on_settings_updated
|
74
|
-
Workato::Connector::Sdk::Operation.on_settings_updated
|
75
|
-
end
|
76
|
-
|
77
78
|
def role_based_auth(settings:)
|
78
|
-
settings[:
|
79
|
-
temp_credentials = settings[:temp_credentials] || {}
|
79
|
+
temp_credentials = settings[:temp_credentials] || @connection.settings[:temp_credentials] || {}
|
80
80
|
|
81
81
|
# Refresh temp token that will expire within 60 seconds.
|
82
82
|
expiration = temp_credentials[:expiration]&.to_time(:utc)
|
83
83
|
if !expiration || expiration <= TEMP_CREDENTIALS_REFRESH_TIMEOUT.seconds.from_now
|
84
|
-
|
84
|
+
@connection.update_settings!('Refresh AWS temporary credentials') do
|
85
|
+
{ temp_credentials: refresh_temp_credentials(settings) }
|
86
|
+
end
|
87
|
+
temp_credentials = @connection.settings[:temp_credentials]
|
85
88
|
end
|
86
89
|
{
|
87
90
|
access_key_id: temp_credentials[:api_key],
|
@@ -91,6 +94,7 @@ module Workato
|
|
91
94
|
end
|
92
95
|
|
93
96
|
def refresh_temp_credentials(settings)
|
97
|
+
aws_external_id = settings[:aws_external_id] || iam_external_id
|
94
98
|
sts_credentials = {
|
95
99
|
access_key_id: amazon_role_client_key(settings),
|
96
100
|
secret_access_key: amazon_role_client_secret(settings)
|
@@ -101,7 +105,7 @@ module Workato
|
|
101
105
|
'Action' => 'AssumeRole',
|
102
106
|
'RoleSessionName' => 'workato',
|
103
107
|
'RoleArn' => settings[:aws_assume_role],
|
104
|
-
'ExternalId' =>
|
108
|
+
'ExternalId' => aws_external_id.presence
|
105
109
|
}.compact
|
106
110
|
|
107
111
|
sts_auth_url, sts_auth_headers = create_signature(
|
@@ -116,24 +120,14 @@ module Workato
|
|
116
120
|
}
|
117
121
|
)
|
118
122
|
|
119
|
-
request_temp_credentials(url: sts_auth_url, headers: sts_auth_headers)
|
120
|
-
update_settings(settings, temp_credentials)
|
121
|
-
end
|
123
|
+
request_temp_credentials(url: sts_auth_url, headers: sts_auth_headers)
|
122
124
|
rescue StandardError => e
|
123
|
-
raise e if
|
125
|
+
raise e if aws_external_id.blank?
|
124
126
|
|
125
|
-
|
127
|
+
aws_external_id = nil
|
126
128
|
retry
|
127
129
|
end
|
128
130
|
|
129
|
-
def update_settings(settings, temp_credentials)
|
130
|
-
settings.merge!(temp_credentials: temp_credentials)
|
131
|
-
Workato::Connector::Sdk::Operation.on_settings_updated&.call(
|
132
|
-
'Refresh AWS temporary credentials',
|
133
|
-
settings
|
134
|
-
)
|
135
|
-
end
|
136
|
-
|
137
131
|
def request_temp_credentials(url:, headers:)
|
138
132
|
response = RestClient::Request.execute(
|
139
133
|
url: url,
|
@@ -213,13 +207,15 @@ module Workato
|
|
213
207
|
end
|
214
208
|
|
215
209
|
def amazon_role_client_key(settings)
|
216
|
-
settings[:access_key_id] || AMAZON_ROLE_CLIENT_KEY
|
210
|
+
settings[:access_key_id] || @connection.settings[:access_key_id] || AMAZON_ROLE_CLIENT_KEY
|
217
211
|
end
|
218
212
|
|
219
213
|
def amazon_role_client_secret(settings)
|
220
|
-
settings[:secret_access_key] || AMAZON_ROLE_CLIENT_SECRET
|
214
|
+
settings[:secret_access_key] || @connection.settings[:access_key_id] || AMAZON_ROLE_CLIENT_SECRET
|
221
215
|
end
|
222
216
|
end
|
217
|
+
|
218
|
+
private_constant :Private
|
223
219
|
end
|
224
220
|
end
|
225
221
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# typed: false
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module Workato
|
@@ -64,13 +65,7 @@ module Workato
|
|
64
65
|
private
|
65
66
|
|
66
67
|
def http_request(url, method:)
|
67
|
-
Request.new(
|
68
|
-
url,
|
69
|
-
method: method,
|
70
|
-
connection: connection,
|
71
|
-
settings: settings,
|
72
|
-
action: self
|
73
|
-
)
|
68
|
+
Request.new(url, method: method, connection: connection, action: self)
|
74
69
|
end
|
75
70
|
end
|
76
71
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# typed: true
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module Workato
|
@@ -19,6 +20,11 @@ module Workato
|
|
19
20
|
end
|
20
21
|
|
21
22
|
begin
|
23
|
+
if ENV['TZ'].present? && ENV['TZ'] != 'UTC'
|
24
|
+
warn "WARNING: TZ environment variable is set to '#{ENV['TZ']}'. Set TZ=UTC for consistency with Workato platform'"
|
25
|
+
else
|
26
|
+
ENV['TZ'] = 'UTC'
|
27
|
+
end
|
22
28
|
::Time.zone = Workato::Connector::Sdk::DEFAULT_TIME_ZONE
|
23
29
|
rescue TZInfo::DataSourceNotFound
|
24
30
|
puts ''
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# typed: true
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require 'jwt'
|
@@ -20,6 +21,43 @@ module Workato
|
|
20
21
|
WorkatoCodeLib.parse_json(source)
|
21
22
|
end
|
22
23
|
|
24
|
+
def uuid
|
25
|
+
WorkatoCodeLib.uuid
|
26
|
+
end
|
27
|
+
|
28
|
+
def encrypt(text, key)
|
29
|
+
::Kernel.require('ruby_rncryptor')
|
30
|
+
|
31
|
+
enc_text = ::RubyRNCryptor.encrypt(text, key)
|
32
|
+
::Base64.strict_encode64(enc_text)
|
33
|
+
end
|
34
|
+
|
35
|
+
def decrypt(text, key)
|
36
|
+
::Kernel.require('ruby_rncryptor')
|
37
|
+
|
38
|
+
text = ::Base64.decode64(text)
|
39
|
+
dec_text = ::RubyRNCryptor.decrypt(text, key)
|
40
|
+
Workato::Extension::Binary.new(dec_text)
|
41
|
+
rescue Exception => e # rubocop:disable Lint/RescueException
|
42
|
+
message = e.message.to_s
|
43
|
+
case message
|
44
|
+
when /Password may be incorrect/
|
45
|
+
::Kernel.raise 'invalid/corrupt input or key'
|
46
|
+
when /RubyRNCryptor only decrypts version/
|
47
|
+
::Kernel.raise 'invalid/corrupt input'
|
48
|
+
else
|
49
|
+
::Kernel.raise
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def blank; end
|
54
|
+
|
55
|
+
def clear; end
|
56
|
+
|
57
|
+
def null; end
|
58
|
+
|
59
|
+
def skip; end
|
60
|
+
|
23
61
|
class << self
|
24
62
|
def jwt_encode_rs256(payload, key, header_fields = {})
|
25
63
|
jwt_encode(payload, key, 'RS256', header_fields)
|