oso-cloud 1.7.0 → 1.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 747cf1fda61eae9e9a96076e782a503e3c440a3aa7049a6b8f74ce8d0c697273
4
- data.tar.gz: 5a3fcbb8574c21416fa81dbf8e1054dfef59337da6c72ff686c06304b3c27711
3
+ metadata.gz: aa3ca5a542cd09609eab342416030091943a7e777e6fdccd8b6caf1b1b6a5a99
4
+ data.tar.gz: 34c40e85594b08ef91ead85505c1488d42fc1291bcf1f3583dacce49abb47446
5
5
  SHA512:
6
- metadata.gz: 1f0a4732c2f76b499f1dc962a0ee806fd6d2c17abdb734d2a1ce448c35eff4781dafce6aec90f39ede78e06fac44bcdbbb11033949867d562007c3f15a3fcee7
7
- data.tar.gz: 41b95a2e852e431e1e1598277abeaad8b76bb174ea562d52a6e9c1d9c644f12a5799e1cde75063bf1d6757eb4cd62be0463c369192f8644353bb791a69391e43
6
+ metadata.gz: e950c324bbb312688fe5b2e119d761fb5e7189ac087386ef232d632b1179d7ad2db0a3f7c63ea468088fd3a4d1b4953d4837f8462b6582bb3f09f4c0ed93eb9e
7
+ data.tar.gz: 24bed9cfb7b77c0fa77867166188e55e2811e63c5ed0fedb111d013338b8a8fdd59c0edf084169ad58d11c1988f4fb53a0e14d882aa8d827a195afc12f1129e7
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- oso-cloud (1.7.0)
4
+ oso-cloud (1.8.0)
5
5
  faraday (~> 2.5.2)
6
6
  faraday-net_http_persistent (~> 2.0)
7
7
  faraday-retry (~> 2.0.0)
data/lib/oso/api.rb CHANGED
@@ -3,6 +3,7 @@ require 'uri'
3
3
  require 'faraday'
4
4
  require 'faraday/retry'
5
5
  require 'faraday/net_http_persistent'
6
+ require 'securerandom'
6
7
 
7
8
  require 'oso/helpers'
8
9
  require 'oso/version'
@@ -79,10 +80,10 @@ module OsoCloud
79
80
 
80
81
  def initialize(metadata:)
81
82
  @metadata = if metadata.is_a? PolicyMetadata
82
- metadata
83
- else
84
- PolicyMetadata.new(**metadata)
85
- end
83
+ metadata
84
+ else
85
+ PolicyMetadata.new(**metadata)
86
+ end
86
87
  end
87
88
  end
88
89
 
@@ -292,7 +293,7 @@ module OsoCloud
292
293
  faraday.response :raise_error
293
294
  faraday.response :json, parser_options: { symbolize_names: true }
294
295
  faraday.request :retry, {
295
- max: (options && options[:max_retries]) || 10,
296
+ max: (options && options[:max_retries]) || 3,
296
297
  interval: 0.01,
297
298
  interval_randomness: 0.005,
298
299
  max_interval: 1,
@@ -300,7 +301,7 @@ module OsoCloud
300
301
  retry_statuses: [429, 500, 502, 503, 504],
301
302
  # This is the default set of methods plus POST.
302
303
  # ref: https://github.com/lostisland/faraday-retry#specify-which-methods-will-be-retried
303
- methods: %i[delete get head options post put],
304
+ methods: %i[delete get head options post put]
304
305
  }
305
306
 
306
307
  if options && options[:test_adapter]
@@ -332,14 +333,26 @@ module OsoCloud
332
333
  @user_agent = "Oso Cloud (ruby #{RUBY_VERSION}p#{RUBY_PATCHLEVEL}; rv:#{VERSION})"
333
334
  @last_offset = nil
334
335
  @data_bindings = IO.read(data_bindings) unless data_bindings.nil?
336
+ @client_id = SecureRandom.uuid
335
337
  end
336
338
 
337
- def fallback_eligible(path)
338
- !@fallback_connection.nil? && ['/authorize',
339
- '/authorize_resources',
340
- '/list',
341
- '/actions',
342
- '/query'].include?(path)
339
+ def fallback_eligible(path, method:)
340
+ path_eligible = if method == 'get'
341
+ ['/facts', '/policy_metadata'].include?(path)
342
+ elsif method == 'post'
343
+ ['/authorize',
344
+ '/authorize_resources',
345
+ '/list',
346
+ '/actions',
347
+ '/query',
348
+ '/authorize_query',
349
+ '/list_query',
350
+ '/actions_query'].include?(path)
351
+ else
352
+ false
353
+ end
354
+
355
+ !@fallback_connection.nil? && path_eligible
343
356
  end
344
357
 
345
358
  def get_policy
@@ -484,6 +497,8 @@ module OsoCloud
484
497
  Accept: 'application/json',
485
498
  'Content-Type': 'application/json',
486
499
  'X-OsoApiVersion': '0',
500
+ 'X-Request-ID' => SecureRandom.uuid,
501
+ 'X-Oso-Instance-Id' => @client_id
487
502
  }
488
503
  # set OsoOffset is last_offset is not nil
489
504
  default_headers[:OsoOffset] = @last_offset unless @last_offset.nil?
@@ -492,13 +507,14 @@ module OsoCloud
492
507
 
493
508
  def GET(path, params)
494
509
  begin
495
- response = @connection.get("api#{path}") do |req|
510
+ response = @connection.get("api#{path}") do |req|
496
511
  req.params = params unless params.nil?
497
512
  req.headers = headers
498
513
  end
499
514
  response.body
500
- rescue Faraday::ServerError, Faraday::ConnectionFailed, Faraday::TimeoutError, Faraday::SSLError => e
501
- raise e unless fallback_eligible(path)
515
+ rescue Faraday::BadRequestError, Faraday::ServerError, Faraday::ConnectionFailed, Faraday::TimeoutError,
516
+ Faraday::SSLError => e
517
+ raise e unless fallback_eligible(path, method: 'get')
502
518
 
503
519
  response = @fallback_connection.get("api#{path}") do |req|
504
520
  req.params = params unless params.nil?
@@ -511,6 +527,14 @@ module OsoCloud
511
527
  end
512
528
 
513
529
  def POST(path, params, body, isMutation)
530
+ max_body_size = 10 * 1024 * 1024
531
+ hash = OsoCloud::Helpers.to_hash(body) unless body.nil?
532
+ json_str = JSON.generate(hash)
533
+ body_size_bytes = json_str&.bytesize || 0
534
+ if body_size_bytes > max_body_size
535
+ raise ApiError.new(message: "Request payload too large (body_size_bytes: #{body_size_bytes}, max_body_size #{max_body_size})")
536
+ end
537
+
514
538
  begin
515
539
  response = @connection.post("api#{path}") do |req|
516
540
  req.params = params unless params.nil?
@@ -518,13 +542,12 @@ module OsoCloud
518
542
  req.headers = headers
519
543
  end
520
544
 
521
- if isMutation
522
- @last_offset = response.headers[:OsoOffset]
523
- end
545
+ @last_offset = response.headers[:OsoOffset] if isMutation
524
546
  response.body
525
547
  # only attempt fallback on 5xx, and connection failure conditions
526
- rescue Faraday::ServerError, Faraday::ConnectionFailed, Faraday::TimeoutError, Faraday::SSLError => e
527
- raise e unless fallback_eligible(path)
548
+ rescue Faraday::BadRequestError, Faraday::ServerError, Faraday::ConnectionFailed, Faraday::TimeoutError,
549
+ Faraday::SSLError => e
550
+ raise e unless fallback_eligible(path, method: 'post')
528
551
 
529
552
  response = @fallback_connection.post("api#{path}") do |req|
530
553
  req.params = params unless params.nil?
@@ -538,6 +561,14 @@ module OsoCloud
538
561
  end
539
562
 
540
563
  def DELETE(path, body)
564
+ max_body_size = 10 * 1024 * 1024
565
+ hash = OsoCloud::Helpers.to_hash(body) unless body.nil?
566
+ json_str = JSON.generate(hash)
567
+ body_size_bytes = json_str&.bytesize || 0
568
+ if body_size_bytes > max_body_size
569
+ raise ApiError.new(message: "Request payload too large (body_size_bytes: #{body_size_bytes}, max_body_size #{max_body_size})")
570
+ end
571
+
541
572
  response = @connection.delete("api#{path}") do |req|
542
573
  req.headers = headers
543
574
  req.body = OsoCloud::Helpers.to_hash(body) unless body.nil?
@@ -549,12 +580,18 @@ module OsoCloud
549
580
 
550
581
  def handle_faraday_error(error)
551
582
  resp = error.response
583
+ formatted_request_id = if resp.nil? || resp[:headers].nil? || resp[:headers]['X-Request-ID'].nil?
584
+ ''
585
+ else
586
+ ' (Request ID: ' + resp[:headers]['X-Request-ID'] + ')'
587
+ end
588
+
552
589
  err = if resp.nil? || resp[:body].nil? || resp[:body][:message].nil?
553
- error.message
554
- else
555
- resp[:body][:message]
556
- end
557
- raise ApiError.new(message: err)
590
+ error.message
591
+ else
592
+ resp[:body][:message]
593
+ end
594
+ raise ApiError.new(message: err + formatted_request_id)
558
595
  end
559
596
  end
560
597
  end
data/lib/oso/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module OsoCloud
2
- VERSION = '1.7.0'.freeze
2
+ VERSION = '1.8.0'.freeze
3
3
  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.7.0
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oso Security, Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-05-24 00:00:00.000000000 Z
11
+ date: 2024-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday