oso-cloud 1.1.1 → 1.3.0.dev.0
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/Gemfile.lock +28 -2
- data/lib/oso/api.rb +81 -67
- data/lib/oso/oso.rb +17 -1
- data/lib/oso/version.rb +1 -1
- data/oso-cloud.gemspec +5 -0
- metadata +50 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93c11d4552281f1cbf95ec309bbbcd5e8d1289a7f0ee2000724f8d6eb4386617
|
4
|
+
data.tar.gz: 62fd22884497116c5db29b06a012b2b06ad82de78b96ed4823b0dbd22862ef37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5139439b2e01ab083c0e73827ddb520a54dc0c2606d1ca20203bad6b56fc446f747a638cc603a83584da35ae65e500ecf4354fd53065c109fa044aef6ba2950f
|
7
|
+
data.tar.gz: eac48b47137286b49a1e27197cfb7867bbcd982b6fe6523f9e50ed9d8659934ceaea9b548f3d543510e9983872c9a9859400d417f149af8ef82f9319ea7b9f3e
|
data/Gemfile.lock
CHANGED
@@ -1,22 +1,46 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
oso-cloud (1.
|
4
|
+
oso-cloud (1.2.0)
|
5
5
|
faraday (~> 2.5.2)
|
6
6
|
faraday-retry (~> 2.0.0)
|
7
|
+
faraday-typhoeus (~> 1.0.0)
|
7
8
|
|
8
9
|
GEM
|
9
10
|
remote: https://rubygems.org/
|
10
11
|
specs:
|
12
|
+
binding_of_caller (1.0.0)
|
13
|
+
debug_inspector (>= 0.0.1)
|
14
|
+
coderay (1.1.3)
|
15
|
+
debug_inspector (1.1.0)
|
16
|
+
ethon (0.16.0)
|
17
|
+
ffi (>= 1.15.0)
|
11
18
|
faraday (2.5.2)
|
12
19
|
faraday-net_http (>= 2.0, < 3.1)
|
13
20
|
ruby2_keywords (>= 0.0.4)
|
14
21
|
faraday-net_http (3.0.2)
|
15
22
|
faraday-retry (2.0.0)
|
16
23
|
faraday (~> 2.0)
|
17
|
-
|
24
|
+
faraday-typhoeus (1.0.0)
|
25
|
+
faraday (~> 2.0)
|
26
|
+
typhoeus (~> 1.4)
|
27
|
+
ffi (1.15.5)
|
28
|
+
interception (0.5)
|
29
|
+
method_source (1.0.0)
|
30
|
+
minitest (5.18.0)
|
31
|
+
pry (0.14.2)
|
32
|
+
coderay (~> 1.1)
|
33
|
+
method_source (~> 1.0)
|
34
|
+
pry-rescue (1.5.2)
|
35
|
+
interception (>= 0.5)
|
36
|
+
pry (>= 0.12.0)
|
37
|
+
pry-stack_explorer (0.6.1)
|
38
|
+
binding_of_caller (~> 1.0)
|
39
|
+
pry (~> 0.13)
|
18
40
|
rake (12.3.3)
|
19
41
|
ruby2_keywords (0.0.5)
|
42
|
+
typhoeus (1.4.0)
|
43
|
+
ethon (>= 0.9.0)
|
20
44
|
|
21
45
|
PLATFORMS
|
22
46
|
ruby
|
@@ -24,6 +48,8 @@ PLATFORMS
|
|
24
48
|
DEPENDENCIES
|
25
49
|
minitest (~> 5.15)
|
26
50
|
oso-cloud!
|
51
|
+
pry-rescue
|
52
|
+
pry-stack_explorer
|
27
53
|
rake (~> 12.0)
|
28
54
|
|
29
55
|
BUNDLED WITH
|
data/lib/oso/api.rb
CHANGED
@@ -2,6 +2,7 @@ require 'json'
|
|
2
2
|
require 'uri'
|
3
3
|
require 'faraday'
|
4
4
|
require 'faraday/retry'
|
5
|
+
require 'faraday/typhoeus'
|
5
6
|
|
6
7
|
require 'oso/helpers'
|
7
8
|
require 'oso/version'
|
@@ -203,7 +204,7 @@ module OsoCloud
|
|
203
204
|
|
204
205
|
# @!visibility private
|
205
206
|
class Api
|
206
|
-
def initialize(url: 'https://
|
207
|
+
def initialize(url: 'https://api.osohq.com', api_key: nil, options: nil)
|
207
208
|
@url = url
|
208
209
|
@connection = Faraday.new(url: url) do |faraday|
|
209
210
|
faraday.request :json
|
@@ -211,7 +212,7 @@ module OsoCloud
|
|
211
212
|
# responses are processed in reverse order; this stack implies the
|
212
213
|
# retries are attempted before an error is raised, and the json
|
213
214
|
# parser is only applied if there are no errors
|
214
|
-
faraday.response :json,
|
215
|
+
faraday.response :json, parser_options: { symbolize_names: true }
|
215
216
|
faraday.response :raise_error
|
216
217
|
faraday.request :retry, {
|
217
218
|
max: (options && options[:max_retries]) || 10,
|
@@ -246,122 +247,106 @@ module OsoCloud
|
|
246
247
|
end
|
247
248
|
end
|
248
249
|
else
|
249
|
-
faraday.adapter :net_http
|
250
|
+
# faraday.adapter :net_http
|
251
|
+
# faraday.adapter :net_http_persistent, pool_size: 5 do |http|
|
252
|
+
# # yields Net::HTTP::Persistent
|
253
|
+
# http.idle_timeout = 1000
|
254
|
+
# end
|
255
|
+
faraday.adapter :typhoeus, forbid_reuse: true, maxredirs: 1
|
250
256
|
end
|
251
257
|
end
|
252
258
|
@api_key = api_key
|
253
259
|
@user_agent = "Oso Cloud (ruby #{RUBY_VERSION}p#{RUBY_PATCHLEVEL}; rv:#{VERSION})"
|
260
|
+
@last_offset = nil
|
254
261
|
end
|
255
262
|
|
256
263
|
def get_policy
|
257
|
-
params = {}
|
258
|
-
data = nil
|
259
264
|
url = '/policy'
|
260
|
-
result = GET(url,
|
265
|
+
result = GET(url, nil)
|
261
266
|
GetPolicyResult.new(**result)
|
262
267
|
end
|
263
268
|
|
264
269
|
def post_policy(data)
|
265
|
-
params = {}
|
266
|
-
data = OsoCloud::Helpers.to_hash(data)
|
267
270
|
url = '/policy'
|
268
|
-
result = POST(url,
|
271
|
+
result = POST(url, nil, data, true)
|
269
272
|
ApiResult.new(**result)
|
270
273
|
end
|
271
274
|
|
272
275
|
def post_facts(data)
|
273
|
-
params = {}
|
274
|
-
data = OsoCloud::Helpers.to_hash(data)
|
275
276
|
url = '/facts'
|
276
|
-
result = POST(url,
|
277
|
+
result = POST(url, nil, data, true)
|
277
278
|
Fact.new(**result)
|
278
279
|
end
|
279
280
|
|
280
281
|
def delete_facts(data)
|
281
|
-
params = {}
|
282
|
-
data = OsoCloud::Helpers.to_hash(data)
|
283
282
|
url = '/facts'
|
284
|
-
result = DELETE(url,
|
283
|
+
result = DELETE(url, data)
|
285
284
|
ApiResult.new(**result)
|
286
285
|
end
|
287
286
|
|
288
287
|
def post_bulk_load(data)
|
289
|
-
params = {}
|
290
|
-
data = OsoCloud::Helpers.to_hash(data)
|
291
288
|
url = '/bulk_load'
|
292
|
-
result = POST(url,
|
289
|
+
result = POST(url, nil, data, true)
|
293
290
|
ApiResult.new(**result)
|
294
291
|
end
|
295
292
|
|
296
293
|
def post_bulk_delete(data)
|
297
|
-
params = {}
|
298
|
-
data = OsoCloud::Helpers.to_hash(data)
|
299
294
|
url = '/bulk_delete'
|
300
|
-
result = POST(url,
|
295
|
+
result = POST(url, nil, data, true)
|
301
296
|
ApiResult.new(**result)
|
302
297
|
end
|
303
298
|
|
304
299
|
def post_bulk(data)
|
305
|
-
params = {}
|
306
|
-
data = OsoCloud::Helpers.to_hash(data)
|
307
300
|
url = '/bulk'
|
308
|
-
result = POST(url,
|
301
|
+
result = POST(url, nil, data, true)
|
309
302
|
ApiResult.new(**result)
|
310
303
|
end
|
311
304
|
|
312
305
|
def post_authorize(data)
|
313
|
-
params = {}
|
314
|
-
data = OsoCloud::Helpers.to_hash(data)
|
315
306
|
url = '/authorize'
|
316
|
-
result = POST(url,
|
307
|
+
result = POST(url, nil, data, false)
|
317
308
|
AuthorizeResult.new(**result)
|
318
309
|
end
|
319
310
|
|
320
311
|
def post_authorize_resources(data)
|
321
|
-
params = {}
|
322
|
-
data = OsoCloud::Helpers.to_hash(data)
|
323
312
|
url = '/authorize_resources'
|
324
|
-
result = POST(url,
|
313
|
+
result = POST(url, nil, data, false)
|
325
314
|
AuthorizeResourcesResult.new(**result)
|
326
315
|
end
|
327
316
|
|
328
317
|
def post_list(data)
|
329
|
-
params = {}
|
330
|
-
data = OsoCloud::Helpers.to_hash(data)
|
331
318
|
url = '/list'
|
332
|
-
result = POST(url,
|
319
|
+
result = POST(url, nil, data, false)
|
333
320
|
ListResult.new(**result)
|
334
321
|
end
|
335
322
|
|
336
323
|
def post_actions(data)
|
337
|
-
params = {}
|
338
|
-
data = OsoCloud::Helpers.to_hash(data)
|
339
324
|
url = '/actions'
|
340
|
-
result = POST(url,
|
325
|
+
result = POST(url, nil, data, false)
|
341
326
|
ActionsResult.new(**result)
|
342
327
|
end
|
343
328
|
|
329
|
+
def post_actions_batch(batch_data)
|
330
|
+
url = '/actions'
|
331
|
+
results = POST_BATCH(url, nil, batch_data, false)
|
332
|
+
results.map { |result| ActionsResult.new(**result.body) }
|
333
|
+
end
|
334
|
+
|
344
335
|
def post_query(data)
|
345
|
-
params = {}
|
346
|
-
data = OsoCloud::Helpers.to_hash(data)
|
347
336
|
url = '/query'
|
348
|
-
result = POST(url,
|
337
|
+
result = POST(url, nil, data, false)
|
349
338
|
QueryResult.new(**result)
|
350
339
|
end
|
351
340
|
|
352
341
|
def get_stats
|
353
|
-
params = {}
|
354
|
-
data = nil
|
355
342
|
url = '/stats'
|
356
|
-
result = GET(url,
|
343
|
+
result = GET(url, {})
|
357
344
|
StatsResult.new(**result)
|
358
345
|
end
|
359
346
|
|
360
347
|
def clear_data
|
361
|
-
params = {}
|
362
|
-
data = nil
|
363
348
|
url = '/clear_data'
|
364
|
-
result = POST(url,
|
349
|
+
result = POST(url, nil, nil, true)
|
365
350
|
ApiResult.new(**result)
|
366
351
|
end
|
367
352
|
|
@@ -378,57 +363,86 @@ module OsoCloud
|
|
378
363
|
params["args.#{i}.id"] = arg_query.id
|
379
364
|
end
|
380
365
|
end
|
381
|
-
data = nil
|
382
366
|
url = '/facts'
|
383
|
-
result = GET(url, params
|
367
|
+
result = GET(url, params)
|
384
368
|
result.map { |v| Fact.new(**v) }
|
385
369
|
end
|
386
370
|
|
387
371
|
def headers
|
388
|
-
{
|
372
|
+
default_headers = {
|
389
373
|
'Authorization' => format('Bearer %s', @api_key),
|
390
374
|
'User-Agent' => @user_agent,
|
391
375
|
Accept: 'application/json',
|
392
376
|
'Content-Type': 'application/json',
|
393
|
-
'X-OsoApiVersion': '0'
|
377
|
+
'X-OsoApiVersion': '0',
|
394
378
|
}
|
379
|
+
# set OsoOffset is last_offset is not nil
|
380
|
+
default_headers[:OsoOffset] = @last_offset unless @last_offset.nil?
|
381
|
+
default_headers
|
395
382
|
end
|
396
383
|
|
397
|
-
def GET(path, params
|
398
|
-
response = @connection.get("api#{path}"
|
399
|
-
|
384
|
+
def GET(path, params)
|
385
|
+
response = @connection.get("api#{path}") do |req|
|
386
|
+
req.params = params unless params.nil?
|
387
|
+
req.headers = headers
|
388
|
+
end
|
389
|
+
response.body
|
400
390
|
rescue Faraday::Error => e
|
401
391
|
handle_faraday_error e
|
402
392
|
end
|
403
393
|
|
404
|
-
def
|
405
|
-
|
406
|
-
|
394
|
+
def POST_BATCH(path, params, body_array, isMutation)
|
395
|
+
responses = []
|
396
|
+
@connection.in_parallel do
|
397
|
+
body_array.each do |body|
|
398
|
+
responses << @connection.post("api#{path}") do |req|
|
399
|
+
req.params = params unless params.nil?
|
400
|
+
req.body = OsoCloud::Helpers.to_hash(body) unless body.nil?
|
401
|
+
req.headers = headers
|
402
|
+
end
|
403
|
+
end
|
404
|
+
end
|
405
|
+
if isMutation
|
406
|
+
@last_offset = responses[-1].headers[:OsoOffset]
|
407
407
|
end
|
408
|
-
|
408
|
+
responses
|
409
409
|
rescue Faraday::Error => e
|
410
410
|
handle_faraday_error e
|
411
411
|
end
|
412
412
|
|
413
|
-
def
|
414
|
-
response = @connection.
|
415
|
-
req.
|
413
|
+
def POST(path, params, body, isMutation)
|
414
|
+
response = @connection.post("api#{path}") do |req|
|
415
|
+
req.params = params unless params.nil?
|
416
|
+
req.body = OsoCloud::Helpers.to_hash(body) unless body.nil?
|
417
|
+
req.headers = headers
|
416
418
|
end
|
417
|
-
|
419
|
+
|
420
|
+
if isMutation
|
421
|
+
@last_offset = response.headers[:OsoOffset]
|
422
|
+
end
|
423
|
+
response.body
|
418
424
|
rescue Faraday::Error => e
|
419
425
|
handle_faraday_error e
|
420
426
|
end
|
421
427
|
|
422
|
-
def
|
423
|
-
|
424
|
-
|
428
|
+
def DELETE(path, body)
|
429
|
+
response = @connection.delete("api#{path}") do |req|
|
430
|
+
req.headers = headers
|
431
|
+
req.body = OsoCloud::Helpers.to_hash(body) unless body.nil?
|
432
|
+
end
|
433
|
+
response.body
|
434
|
+
rescue Faraday::Error => e
|
435
|
+
handle_faraday_error e
|
425
436
|
end
|
426
437
|
|
427
438
|
def handle_faraday_error(error)
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
439
|
+
resp = error.response
|
440
|
+
err = if resp.respond_to? :body
|
441
|
+
resp.body[:message]
|
442
|
+
else
|
443
|
+
error.message
|
444
|
+
end
|
445
|
+
raise ApiError.new(message: err)
|
432
446
|
end
|
433
447
|
end
|
434
448
|
end
|
data/lib/oso/oso.rb
CHANGED
@@ -32,7 +32,6 @@ module OsoCloud
|
|
32
32
|
@api = OsoCloud::Core::Api.new(url: url, api_key: api_key)
|
33
33
|
end
|
34
34
|
|
35
|
-
##
|
36
35
|
# Update the active policy
|
37
36
|
#
|
38
37
|
# Updates the active policy in Oso Cloud, The string passed into
|
@@ -270,5 +269,22 @@ module OsoCloud
|
|
270
269
|
context_facts: OsoCloud::Helpers.params_to_facts(context_facts)))
|
271
270
|
OsoCloud::Helpers.facts_to_params(result.results)
|
272
271
|
end
|
272
|
+
|
273
|
+
def actions_batch(actor, resources, context_facts = [])
|
274
|
+
actor_typed_id = actor.to_api_value
|
275
|
+
data = resources.map do |r|
|
276
|
+
resource_typed_id = r.to_api_value
|
277
|
+
OsoCloud::Core::ActionsQuery.new(
|
278
|
+
actor_type: actor_typed_id.type,
|
279
|
+
actor_id: actor_typed_id.id,
|
280
|
+
resource_type: resource_typed_id.type,
|
281
|
+
resource_id: resource_typed_id.id,
|
282
|
+
context_facts: OsoCloud::Helpers.params_to_facts(context_facts)
|
283
|
+
)
|
284
|
+
end
|
285
|
+
@api.post_actions_batch(data).map { |result| result.results}
|
286
|
+
end
|
273
287
|
end
|
288
|
+
|
274
289
|
end
|
290
|
+
|
data/lib/oso/version.rb
CHANGED
data/oso-cloud.gemspec
CHANGED
@@ -22,5 +22,10 @@ Gem::Specification.new do |spec|
|
|
22
22
|
|
23
23
|
spec.add_dependency 'faraday', '~> 2.5.2'
|
24
24
|
spec.add_dependency 'faraday-retry', '~> 2.0.0'
|
25
|
+
# spec.add_dependency 'faraday-net_http_persistent', '~> 2.0'
|
26
|
+
spec.add_dependency 'faraday-typhoeus', '~> 1.0.0'
|
27
|
+
#
|
25
28
|
spec.add_development_dependency 'minitest', '~> 5.15'
|
29
|
+
spec.add_development_dependency 'pry-rescue'
|
30
|
+
spec.add_development_dependency 'pry-stack_explorer'
|
26
31
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oso-cloud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0.dev.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oso Security, Inc.
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-09-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 2.0.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: faraday-typhoeus
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.0.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.0.0
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: minitest
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,7 +66,35 @@ dependencies:
|
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '5.15'
|
55
|
-
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry-rescue
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry-stack_explorer
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description:
|
56
98
|
email:
|
57
99
|
- support@osohq.com
|
58
100
|
executables: []
|
@@ -77,7 +119,7 @@ homepage: https://www.osohq.com/
|
|
77
119
|
licenses:
|
78
120
|
- Apache-2.0
|
79
121
|
metadata: {}
|
80
|
-
post_install_message:
|
122
|
+
post_install_message:
|
81
123
|
rdoc_options: []
|
82
124
|
require_paths:
|
83
125
|
- lib
|
@@ -88,12 +130,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
88
130
|
version: 3.0.0
|
89
131
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
132
|
requirements:
|
91
|
-
- - "
|
133
|
+
- - ">"
|
92
134
|
- !ruby/object:Gem::Version
|
93
|
-
version:
|
135
|
+
version: 1.3.1
|
94
136
|
requirements: []
|
95
137
|
rubygems_version: 3.2.33
|
96
|
-
signing_key:
|
138
|
+
signing_key:
|
97
139
|
specification_version: 4
|
98
140
|
summary: Oso Cloud Ruby client
|
99
141
|
test_files: []
|