logstash-input-okta_system_log 0.9.1 → 0.10.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
- 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