logstash-input-okta_system_log 0.9.1 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 2057148c528cf4a3379996d138d25279324d4f49
4
- data.tar.gz: 3f82e07a5676108103b9e136b5f8c58673054193
2
+ SHA256:
3
+ metadata.gz: ac642acfaa84ac1de1ea468f54a8569e1707ba799e70f311cc05800108b96a20
4
+ data.tar.gz: 0e40ff8755bc942a86246c36a412db806d794bca56174a9c3bb7e36829994fb3
5
5
  SHA512:
6
- metadata.gz: 2d5363d850f9b6567f229a2e9d15fbe99a1cb0a4182cadb69e4ce599cd4cbe1caa1ee712304270d2ab4426883de4bc89ac85ae5761b38889affcbffac0d0797e
7
- data.tar.gz: b1dfc1ced00b797b42233ae2c74d8643128d26d3979d53903b23d88362f6158e968d6f5757bf160ee4daea601b35a21343855dbad3707d682abb31cb02983399
6
+ metadata.gz: 3fc3c400b5e20f86f2de968c8fcc996af4924017f8c9dbcf33d611249444cfba8fc7f5a038be57f3c10b8bf94c7c1baa54ef8b39bb1ffa6f30ded61df1ec975e
7
+ data.tar.gz: 6d3c67ccf03cf06f81f6057e324e757fecbb583918cf74f4f41bb0f92fd31ead55b9214803eb546c19378feb627c9aca8d54f68e8de296cf6a9dd6f8a71398d6
@@ -1,3 +1,5 @@
1
+ ## 0.10.0
2
+ - Use the new rate limit API headers
1
3
  ## 0.9.1
2
4
  - Updates dependencies to standard
3
5
  ## 0.9.0
@@ -18,6 +18,7 @@ class LogStash::Inputs::OktaSystemLog < LogStash::Inputs::Base
18
18
  HTTP_OK_200 = 200
19
19
  HTTP_BAD_REQUEST_400 = 400
20
20
  HTTP_UNAUTHORIZED_401 = 401
21
+ HTTP_TOO_MANY_REQUESTS_429 = 429
21
22
 
22
23
  # Sleep Timers
23
24
  SLEEP_API_RATE_LIMIT = 1
@@ -86,6 +87,24 @@ class LogStash::Inputs::OktaSystemLog < LogStash::Inputs::Base
86
87
  # Ex. ["new", "york"]
87
88
  config :q, :validate => :string, :list => true
88
89
 
90
+ # rate_limit will set the pace of collection to the desired limit
91
+ # Based on: https://developer.okta.com/docs/reference/api/system-log/#system-events
92
+ # It supports three convenience parameters of RATE_SLOW, RATE_MEDIUM and RATE_FAST
93
+ # A user can also set a value of 0.1 -> 1.0, the plugin will automatically _floor_
94
+ # the value to the tenths place
95
+ # This value represents the percentage of the allocated rate limit to consume
96
+ # Defaults to RATE_MEDIUM
97
+ # The default and slower (e.g. lower) parameters will not generate errors
98
+ # RATE_FAST and faster (e.g. higher) parameters _may_ generate warnings and errors
99
+ # RATE_SLOW: 0.4
100
+ # RATE_MEDIUM: 0.5
101
+ # RATE_FAST: 0.6
102
+ #
103
+ # Format: Either the convenience or a string with the decimal of 0.1 -> 1.0
104
+ # Ex. "RATE_MEDIUM"
105
+ # Ex. "0.3"
106
+ config :rate_limit, :validate => :string, :default => "RATE_MEDIUM"
107
+
89
108
  # The file in which the auth_token for Okta will be contained.
90
109
  # This will contain the auth_token which can have a lot access to your Okta instance.
91
110
  # It cannot be stressed enough how important it is to protect this file.
@@ -117,7 +136,7 @@ class LogStash::Inputs::OktaSystemLog < LogStash::Inputs::Base
117
136
  # This option will reverse that paradigm and exit if a failure occurs
118
137
  #
119
138
  # Format: Boolean
120
- config :state_file_fatal_falure, :validate => :boolean, :default => false
139
+ config :state_file_fatal_failure, :validate => :boolean, :default => false
121
140
 
122
141
  # If you'd like to work with the request/response metadata.
123
142
  # Set this value to the name of the field you'd like to store a nested
@@ -201,6 +220,11 @@ class LogStash::Inputs::OktaSystemLog < LogStash::Inputs::Base
201
220
  config :state_file_base, :validate => :string,
202
221
  :obsolete => "state_file_base is obsolete, use state_file_path instead"
203
222
 
223
+ # Based on data from here: https://developer.okta.com/docs/reference/api/system-log/#system-events
224
+ # -- For One App and Enterprise orgs, the warning is sent when the org is at 60% of its limit.
225
+ RATE_OPTIONS = {"RATE_SLOW" => 0.4, "RATE_MEDIUM" => 0.5, "RATE_FAST" => 0.6}
226
+ RATE_OPTIONS.default = false
227
+
204
228
  public
205
229
  Schedule_types = %w(cron every at in)
206
230
  def register
@@ -239,6 +263,12 @@ class LogStash::Inputs::OktaSystemLog < LogStash::Inputs::Base
239
263
  # Cast to string helps with that
240
264
  # Really only happens during tests and not during normal operations
241
265
  url_obj = URI.parse(@custom_url.to_s)
266
+ unless (url_obj.kind_of? URI::HTTP or url_obj.kind_of? URI::HTTPS)
267
+ raise LogStash::ConfigurationError, "Invalid custom_url, " +
268
+ "please verify the URL. custom_url = #{@custom_url}"
269
+ @logger.fatal("Invalid custom_url, " +
270
+ "please verify the URL. custom_url = #{@custom_url}")
271
+ end
242
272
  rescue URI::InvalidURIError
243
273
  @logger.fatal("Invalid custom_url, " +
244
274
  "please verify the URL. custom_url = #{@custom_url}")
@@ -358,6 +388,19 @@ class LogStash::Inputs::OktaSystemLog < LogStash::Inputs::Base
358
388
  end
359
389
  end
360
390
 
391
+ if (RATE_OPTIONS[@rate_limit] != false)
392
+ @rate_limit = RATE_OPTIONS[@rate_limit]
393
+ else
394
+ @rate_limit = @rate_limit.to_f.floor 1
395
+ end
396
+
397
+ if (@rate_limit < 0.1 or @rate_limit > 1.0)
398
+ raise LogStash::ConfigurationError, "rate_limit should be between " +
399
+ "'0.1' and '1.0' or 'RATE_SLOW', 'RATE_MEDIUM' or 'RATE_FAST'"
400
+ end
401
+
402
+ @rate_limit_factor = 1.0 - @rate_limit
403
+
361
404
  params_event = Hash.new
362
405
  params_event[:limit] = @limit if @limit > 0
363
406
  params_event[:since] = @since if @since
@@ -488,7 +531,7 @@ class LogStash::Inputs::OktaSystemLog < LogStash::Inputs::Base
488
531
  @metadata_function = method(:noop)
489
532
  end
490
533
 
491
- if (@state_file_fatal_falure)
534
+ if (@state_file_fatal_failure)
492
535
  @state_file_failure_function = method(:fatal_state_file)
493
536
  else
494
537
  @state_file_failure_function = method(:error_state_file)
@@ -633,7 +676,11 @@ class LogStash::Inputs::OktaSystemLog < LogStash::Inputs::Base
633
676
  # x.report { n.times { str.match(/<([^>]+)>/).captures[0] } } # (2) 262.166085sec @50000000 times
634
677
  # x.report { n.times { str.split(';')[0][1...-1] } } # (1) 31.673270sec @50000000 times
635
678
  #end
636
-
679
+
680
+
681
+ @logger.debug("Response headers", :headers => response.headers)
682
+ @trace_log_method.call("Response body", :body => response.body)
683
+
637
684
  # Store the next URL to call from the header
638
685
  next_url = nil
639
686
  Array(response.headers["link"]).each do |link_header|
@@ -644,7 +691,7 @@ class LogStash::Inputs::OktaSystemLog < LogStash::Inputs::Base
644
691
 
645
692
  if (response.body.length > 0)
646
693
  @codec.decode(response.body) do |decoded|
647
- @logger.debug("Pushing event to queue")
694
+ @trace_log_method.call("Pushing event to queue")
648
695
  event = @target ? LogStash::Event.new(@target => decoded.to_hash) : decoded
649
696
  @metadata_function.call(event, requested_url, response, exec_time)
650
697
  decorate(event)
@@ -659,15 +706,16 @@ class LogStash::Inputs::OktaSystemLog < LogStash::Inputs::Base
659
706
  end
660
707
  end
661
708
 
709
+
662
710
  if (!next_url.nil? and next_url != @url)
663
711
  @url = next_url
664
- @continue = true
665
- @logger.debug("Continue status", :continue => @continue )
666
- # Add a sleep since we're gonna hit the API again
667
- sleep SLEEP_API_RATE_LIMIT
712
+ if (response.headers['x-rate-limit-remaining'].to_i > response.headers['x-rate-limit-limit'].to_i * @rate_limit_factor and response.headers['x-rate-limit-remaining'].to_i > 0)
713
+ @continue = true
714
+ @trace_log_method.call("Rate Limit Status", :remaining => response.headers['x-rate-limit-remaining'].to_i, :limit => response.headers['x-rate-limit-limit'].to_i)
715
+ end
668
716
  end
717
+ @logger.debug("Continue status", :continue => @continue )
669
718
 
670
- @trace_log_method.call("Response body", :body => response.body)
671
719
 
672
720
  when HTTP_UNAUTHORIZED_401
673
721
  @codec.decode(response.body) do |decoded|
@@ -739,12 +787,50 @@ class LogStash::Inputs::OktaSystemLog < LogStash::Inputs::Base
739
787
  else
740
788
  handle_unknown_okta_code(queue,response,requested_url,exec_time)
741
789
  end
790
+ when HTTP_TOO_MANY_REQUESTS_429
791
+ @codec.decode(response.body) do |decoded|
792
+ event = @target ? LogStash::Event.new(@target => decoded.to_hash) : decoded
793
+ @metadata_function.call(event, requested_url, response, exec_time)
794
+ event.set("okta_response_error", {
795
+ "okta_plugin_status" => "rate limit exceeded; sleeping.",
796
+ "http_code" => 429,
797
+ "okta_error" => "E0000047",
798
+ "reset_time" => response.headers['x-rate-limit-reset']
799
+ })
800
+ event.tag("_okta_response_error")
801
+ decorate(event)
802
+ queue << event
803
+ end
804
+
805
+ now = get_epoch
806
+ sleep_time = (now - response.headers['x-rate-limit-reset'].to_i > 60) ? 60 : now - response.headers['x-rate-limit-reset'].to_i
807
+ @logger.error("Rate limited exceeded",
808
+ :response_code => response.code,
809
+ :okta_error => "E0000047",
810
+ :sleep_time => sleep_time,
811
+ :reset_time => response.headers['x-rate-limit-reset'])
812
+
813
+ @logger.debug("rate limit error response",
814
+ :response_body => response.body,
815
+ :response_headers => response.headers)
816
+
817
+ # Use a local function so the test can override it
818
+ local_sleep sleep_time
742
819
  else
743
820
  handle_unknown_http_code(queue,response,requested_url,exec_time)
744
821
  end
745
822
 
746
823
  end # def handle_success
747
824
 
825
+ private
826
+ def get_epoch()
827
+ return Time.now.to_i
828
+ end
829
+
830
+ private
831
+ def local_sleep(time)
832
+ sleep time
833
+ end
748
834
  private
749
835
  def handle_unknown_okta_code(queue,response,requested_url,exec_time)
750
836
  @codec.decode(response.body) do |decoded|
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-input-okta_system_log'
3
- s.version = '0.9.1'
3
+ s.version = '0.10.0'
4
4
  s.licenses = ['Apache-2.0']
5
5
  s.summary = 'This plugin fetches log events from Okta using the System Log API'
6
6
  s.homepage = 'https://github.com/SecurityRiskAdvisors/logstash-input-okta_system_log'
@@ -31,7 +31,5 @@ Gem::Specification.new do |s|
31
31
  s.add_development_dependency 'logstash-devutils', '>= 0.0.16'
32
32
  s.add_development_dependency 'flores'
33
33
  s.add_development_dependency 'timecop'
34
- s.add_development_dependency 'rake', "~> 12.1.0"
35
-
36
34
 
37
35
  end
@@ -15,6 +15,8 @@ describe LogStash::Inputs::OktaSystemLog do
15
15
  let(:default_host) { "localhost" }
16
16
  let(:metadata_target) { "_http_poller_metadata" }
17
17
  let(:default_state_file_path) { "/dev/null" }
18
+ let(:default_header) { {"x-rate-limit-remaining" => 3, "x-rate-limit-limit" => 4} }
19
+ let(:default_rate_limit) { "RATE_MEDIUM" }
18
20
 
19
21
  let(:default_opts) {
20
22
  {
@@ -24,6 +26,7 @@ describe LogStash::Inputs::OktaSystemLog do
24
26
  "auth_token_key" => default_auth_token_key,
25
27
  "metadata_target" => metadata_target,
26
28
  "state_file_path" => default_state_file_path,
29
+ "rate_limit" => default_rate_limit,
27
30
  "codec" => "json"
28
31
  }
29
32
  }
@@ -68,7 +71,7 @@ describe LogStash::Inputs::OktaSystemLog do
68
71
 
69
72
  context "custom_url is in an incorrect format" do
70
73
  let(:opts) {
71
- opts = default_opts.merge({"custom_url" => "http://___/foo/bar"}).clone
74
+ opts = default_opts.merge({"custom_url" => "htp://___/foo/bar"}).clone
72
75
  opts.delete("hostname")
73
76
  opts
74
77
  }
@@ -105,6 +108,21 @@ describe LogStash::Inputs::OktaSystemLog do
105
108
  include_examples("configuration errors")
106
109
  end
107
110
 
111
+ context "the rate_limit parameter is too large" do
112
+ let(:opts) { default_opts.merge({"rate_limit" => "1.5"}) }
113
+ include_examples("configuration errors")
114
+ end
115
+
116
+ context "the rate_limit parameter is too small" do
117
+ let(:opts) { default_opts.merge({"rate_limit" => "-0.5"}) }
118
+ include_examples("configuration errors")
119
+ end
120
+
121
+ context "the rate_limit parameter uses a non-standard stand-in" do
122
+ let(:opts) { default_opts.merge({"rate_limit" => "RATE_CRAWL"}) }
123
+ include_examples("configuration errors")
124
+ end
125
+
108
126
  context "the metadata target is not set" do
109
127
  let(:opts) {
110
128
  opts = default_opts.clone
@@ -184,7 +202,8 @@ describe LogStash::Inputs::OktaSystemLog do
184
202
  before do
185
203
  subject.client.stub("https://#{default_opts["hostname"]+klass::OKTA_EVENT_LOG_PATH+klass::AUTH_TEST_URL}",
186
204
  :body => "{}",
187
- :code => klass::HTTP_OK_200
205
+ :code => klass::HTTP_OK_200,
206
+ :headers => default_header
188
207
  )
189
208
  allow(File).to receive(:directory?).with(default_state_file_path) { false }
190
209
  allow(File).to receive(:exist?).with(default_state_file_path) { true }
@@ -220,7 +239,8 @@ describe LogStash::Inputs::OktaSystemLog do
220
239
  before do
221
240
  instance.client.stub("https://#{default_opts["hostname"]+klass::OKTA_EVENT_LOG_PATH+klass::AUTH_TEST_URL}",
222
241
  :body => "{}",
223
- :code => klass::HTTP_OK_200
242
+ :code => klass::HTTP_OK_200,
243
+ :headers => default_header
224
244
  )
225
245
  allow(File).to receive(:directory?).and_call_original
226
246
  allow(File).to receive(:directory?).with(default_state_file_path) { false }
@@ -341,7 +361,8 @@ describe LogStash::Inputs::OktaSystemLog do
341
361
  unless (custom_settings)
342
362
  poller.client.stub("https://#{settings["hostname"]+klass::OKTA_EVENT_LOG_PATH+klass::AUTH_TEST_URL}",
343
363
  :body => "{}",
344
- :code => klass::HTTP_OK_200
364
+ :code => klass::HTTP_OK_200,
365
+ :headers => default_header
345
366
  )
346
367
  end
347
368
  allow(File).to receive(:directory?).with(default_state_file_path) { false }
@@ -429,6 +450,7 @@ describe LogStash::Inputs::OktaSystemLog do
429
450
  let(:code) { klass::HTTP_OK_200 }
430
451
  let(:hostname) { default_host }
431
452
  let(:custom_settings) { false }
453
+ let(:headers) { default_header }
432
454
 
433
455
  let(:opts) { default_opts }
434
456
  let(:instance) {
@@ -442,7 +464,8 @@ describe LogStash::Inputs::OktaSystemLog do
442
464
  before do
443
465
  instance.client.stub("https://#{opts["hostname"]+klass::OKTA_EVENT_LOG_PATH+klass::AUTH_TEST_URL}",
444
466
  :body => "{}",
445
- :code => klass::HTTP_OK_200
467
+ :code => klass::HTTP_OK_200,
468
+ :headers => headers
446
469
  )
447
470
  allow(File).to receive(:directory?).with(default_state_file_path) { false }
448
471
  allow(File).to receive(:exist?).with(default_state_file_path) { true }
@@ -456,9 +479,12 @@ describe LogStash::Inputs::OktaSystemLog do
456
479
  allow(instance).to receive(:decorate)
457
480
  instance.client.stub(%r{#{opts["hostname"]}.*},
458
481
  :body => response_body,
459
- :code => code
482
+ :code => code,
483
+ :headers => headers
460
484
  )
461
485
 
486
+ allow(instance).to receive(:get_epoch) { 1 }
487
+ allow(instance).to receive(:local_sleep).with(1) { 1 }
462
488
  instance.send(:run_once, queue)
463
489
  end
464
490
 
@@ -475,7 +501,6 @@ describe LogStash::Inputs::OktaSystemLog do
475
501
  context "with an empty body" do
476
502
  let(:response_body) { "" }
477
503
  it "should return an empty event" do
478
- instance.send(:run_once, queue)
479
504
  expect(event.get("[_http_poller_metadata][response_headers][content-length]")).to eql("0")
480
505
  end
481
506
  end
@@ -488,7 +513,6 @@ describe LogStash::Inputs::OktaSystemLog do
488
513
  }
489
514
 
490
515
  it "should not have any metadata on the event" do
491
- instance.send(:run_once, queue)
492
516
  expect(event.get(metadata_target)).to be_nil
493
517
  end
494
518
  end
@@ -510,23 +534,31 @@ describe LogStash::Inputs::OktaSystemLog do
510
534
  let(:response_body) { "{}" }
511
535
 
512
536
  it "responds to a 500 code", :http_code => 500 do
513
- instance.send(:run_once, queue)
514
537
  expect(event.to_hash).to include("http_response_error")
515
538
  expect(event.to_hash["http_response_error"]).to include({"http_code" => code})
516
539
  expect(event.get("tags")).to include('_http_response_error')
517
540
  end
518
541
  it "responds to a 401/Unauthorized code", :http_code => 401 do
519
- instance.send(:run_once, queue)
520
542
  expect(event.to_hash).to include("okta_response_error")
521
543
  expect(event.to_hash["okta_response_error"]).to include({"http_code" => code})
522
544
  expect(event.get("tags")).to include('_okta_response_error')
523
545
  end
524
546
  it "responds to a 400 code", :http_code => 400 do
525
- instance.send(:run_once, queue)
526
547
  expect(event.to_hash).to include("okta_response_error")
527
548
  expect(event.to_hash["okta_response_error"]).to include({"http_code" => code})
528
549
  expect(event.get("tags")).to include('_okta_response_error')
529
550
  end
551
+ context "when the request rate limit is reached" do
552
+ let(:headers) { {"x-rate-limit-remaining" => 0, "x-rate-limit-reset" => 0} }
553
+ it "reports and sleeps for the designated time", :http_code => 429 do
554
+ expect(instance).to have_received(:get_epoch)
555
+ expect(instance).to have_received(:local_sleep).with(1)
556
+ expect(event.to_hash).to include("okta_response_error")
557
+ expect(event.to_hash["okta_response_error"]).to include({"http_code" => code})
558
+ expect(event.to_hash["okta_response_error"]).to include({"reset_time" => 0})
559
+ expect(event.get("tags")).to include('_okta_response_error')
560
+ end
561
+ end
530
562
  context "specific okta errors" do
531
563
  let(:payload) { {:okta_error => "E0000031" } }
532
564
  let(:response_body) { LogStash::Json.dump(payload) }
@@ -588,7 +620,8 @@ describe LogStash::Inputs::OktaSystemLog do
588
620
  before(:each) do
589
621
  subject.client.stub("https://#{opts["hostname"]+klass::OKTA_EVENT_LOG_PATH+klass::AUTH_TEST_URL}",
590
622
  :body => "{}",
591
- :code => klass::HTTP_OK_200
623
+ :code => klass::HTTP_OK_200,
624
+ :headers => default_header
592
625
  )
593
626
  end
594
627
 
@@ -672,7 +705,7 @@ describe LogStash::Inputs::OktaSystemLog do
672
705
 
673
706
  let(:url_initial) { "https://#{opts["hostname"]+klass::OKTA_EVENT_LOG_PATH}?after=1" }
674
707
  let(:url_final) { "https://#{opts["hostname"]+klass::OKTA_EVENT_LOG_PATH}?after=2" }
675
- let(:headers) { {"link" => ["<#{url_initial}>; rel=\"self\"", "<#{url_final}>; rel=\"next\""]} }
708
+ let(:headers) { default_header.merge({"link" => ["<#{url_initial}>; rel=\"self\"", "<#{url_final}>; rel=\"next\""]}).clone }
676
709
  let(:code) { klass::HTTP_OK_200 }
677
710
  let(:file_path) { opts['state_file_dir'] + opts["state_file_prefix"] }
678
711
  let(:file_obj) { double("file") }
@@ -690,7 +723,8 @@ describe LogStash::Inputs::OktaSystemLog do
690
723
 
691
724
  instance.client.stub("https://#{opts["hostname"]+klass::OKTA_EVENT_LOG_PATH+klass::AUTH_TEST_URL}",
692
725
  :body => "{}",
693
- :code => code
726
+ :code => code,
727
+ :headers => default_header
694
728
  )
695
729
  instance.register
696
730
  instance.client.stub( url_initial,
@@ -707,7 +741,7 @@ describe LogStash::Inputs::OktaSystemLog do
707
741
  expect(IO).to receive(:open).with(fd).and_yield(file_obj)
708
742
  expect(file_obj).to receive(:write).with("#{url_final}\n") { url_final.length + 1 }
709
743
  instance.client.stub( url_final,
710
- :headers => {:link => "<#{url_final}>; rel=\"self\""},
744
+ :headers => default_header.merge({:link => "<#{url_final}>; rel=\"self\""}).clone,
711
745
  :body => "{}",
712
746
  :code => code )
713
747
  instance.send(:run_once, queue)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-okta_system_log
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Security Risk Advisors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-15 00:00:00.000000000 Z
11
+ date: 2020-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -20,8 +20,8 @@ dependencies:
20
20
  - !ruby/object:Gem::Version
21
21
  version: '2.99'
22
22
  name: logstash-core-plugin-api
23
- prerelease: false
24
23
  type: :runtime
24
+ prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - ">="
@@ -37,8 +37,8 @@ dependencies:
37
37
  - !ruby/object:Gem::Version
38
38
  version: '0'
39
39
  name: logstash-codec-plain
40
- prerelease: false
41
40
  type: :runtime
41
+ prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - ">="
@@ -51,8 +51,8 @@ dependencies:
51
51
  - !ruby/object:Gem::Version
52
52
  version: 0.0.22
53
53
  name: stud
54
- prerelease: false
55
54
  type: :runtime
55
+ prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
@@ -68,8 +68,8 @@ dependencies:
68
68
  - !ruby/object:Gem::Version
69
69
  version: 8.0.0
70
70
  name: logstash-mixin-http_client
71
- prerelease: false
72
71
  type: :runtime
72
+ prerelease: false
73
73
  version_requirements: !ruby/object:Gem::Requirement
74
74
  requirements:
75
75
  - - ">="
@@ -85,8 +85,8 @@ dependencies:
85
85
  - !ruby/object:Gem::Version
86
86
  version: 3.0.9
87
87
  name: rufus-scheduler
88
- prerelease: false
89
88
  type: :runtime
89
+ prerelease: false
90
90
  version_requirements: !ruby/object:Gem::Requirement
91
91
  requirements:
92
92
  - - "~>"
@@ -99,8 +99,8 @@ dependencies:
99
99
  - !ruby/object:Gem::Version
100
100
  version: '0'
101
101
  name: logstash-codec-json
102
- prerelease: false
103
102
  type: :development
103
+ prerelease: false
104
104
  version_requirements: !ruby/object:Gem::Requirement
105
105
  requirements:
106
106
  - - ">="
@@ -113,8 +113,8 @@ dependencies:
113
113
  - !ruby/object:Gem::Version
114
114
  version: '0'
115
115
  name: logstash-codec-line
116
- prerelease: false
117
116
  type: :development
117
+ prerelease: false
118
118
  version_requirements: !ruby/object:Gem::Requirement
119
119
  requirements:
120
120
  - - ">="
@@ -127,8 +127,8 @@ dependencies:
127
127
  - !ruby/object:Gem::Version
128
128
  version: 0.0.16
129
129
  name: logstash-devutils
130
- prerelease: false
131
130
  type: :development
131
+ prerelease: false
132
132
  version_requirements: !ruby/object:Gem::Requirement
133
133
  requirements:
134
134
  - - ">="
@@ -141,8 +141,8 @@ dependencies:
141
141
  - !ruby/object:Gem::Version
142
142
  version: '0'
143
143
  name: flores
144
- prerelease: false
145
144
  type: :development
145
+ prerelease: false
146
146
  version_requirements: !ruby/object:Gem::Requirement
147
147
  requirements:
148
148
  - - ">="
@@ -155,27 +155,13 @@ dependencies:
155
155
  - !ruby/object:Gem::Version
156
156
  version: '0'
157
157
  name: timecop
158
- prerelease: false
159
158
  type: :development
159
+ prerelease: false
160
160
  version_requirements: !ruby/object:Gem::Requirement
161
161
  requirements:
162
162
  - - ">="
163
163
  - !ruby/object:Gem::Version
164
164
  version: '0'
165
- - !ruby/object:Gem::Dependency
166
- requirement: !ruby/object:Gem::Requirement
167
- requirements:
168
- - - "~>"
169
- - !ruby/object:Gem::Version
170
- version: 12.1.0
171
- name: rake
172
- prerelease: false
173
- type: :development
174
- version_requirements: !ruby/object:Gem::Requirement
175
- requirements:
176
- - - "~>"
177
- - !ruby/object:Gem::Version
178
- version: 12.1.0
179
165
  description:
180
166
  email: security@securityriskadvisors.com
181
167
  executables: []
@@ -212,8 +198,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
212
198
  - !ruby/object:Gem::Version
213
199
  version: '0'
214
200
  requirements: []
215
- rubyforge_project:
216
- rubygems_version: 2.4.8
201
+ rubygems_version: 3.0.6
217
202
  signing_key:
218
203
  specification_version: 4
219
204
  summary: This plugin fetches log events from Okta using the System Log API