logstash-mixin-validator_support 1.0.2-java → 1.1.0-java

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
2
  SHA256:
3
- metadata.gz: 13ac395ad145d01d61c2bdabe650b196c4be7acb6c368da1243b0a3631cc014b
4
- data.tar.gz: 12e1918821bb58ce03193385764288bbd947441466d7be1140f5f0722ccadb4d
3
+ metadata.gz: d4d92360f385e48ab2bd2b76d890fb2adb0fe23d0d93bbfb3e342396f3541b69
4
+ data.tar.gz: ae728708dc2ec8e9ef0781633f607ef5edb3b5621ae403ea94f9d1526f129214
5
5
  SHA512:
6
- metadata.gz: c82c7c247334d02711f10e1ff3074b10cb01dc06932b6582cfee6199171ab28619e978eaf47799e32f2e3f13fb9e3ead252490f2cf01ce8937d7e3a7ca6380dd
7
- data.tar.gz: add01c80a60310c57de1e4b0cf459ff78da4ad1f6cb97fdebbdff43757552ef2bdb897d0f0e61408b1323f79d1fd7182afdf870de65ab94288a4b076703c1792
6
+ metadata.gz: 7f08e80456c929b66a6451d7d84beb44a12b3b4b10894e961a834f3548e564f21b22bef80b0145f739208988503329039f9cb0a18cc2016f3cd769900b966559
7
+ data.tar.gz: 46fcfc6f9f888c9ab3962b540334b0e5347ac7154ef4c553e875986ce712cdf193f8c28774fe05c7f04e014b79c92258f389ac6b1960d0b36b7be9ed6e335e59
data/CHANGELOG.md CHANGED
@@ -1,7 +1,8 @@
1
- # 1.0.2
1
+ ## 1.1.0
2
+ - Introduces `:required_host_optional_port` validator [#4](https://github.com/logstash-plugins/logstash-mixin-validator_support/pull/4)
2
3
 
3
- - Fix: '' value behavior in `field_reference` validator [#2](https://github.com/logstash-plugins/logstash-mixin-validator_support/pull/2)
4
+ ## 1.0.2
5
+ - Fix: '' value behavior in `field_reference` validator [#2](https://github.com/logstash-plugins/logstash-mixin-validator_support/pull/2)
4
6
 
5
- # 1.0.1
6
-
7
- - Introduces plugin parameter validation adapters, including initial backport for `:field_reference` validator.
7
+ ## 1.0.1
8
+ - Introduces plugin parameter validation adapters, including initial backport for `:field_reference` validator.
@@ -0,0 +1,58 @@
1
+ # encoding: utf-8
2
+
3
+ require 'logstash/plugin_mixins/validator_support'
4
+
5
+ require 'resolv'
6
+
7
+ module LogStash
8
+ module PluginMixins
9
+ module ValidatorSupport
10
+
11
+
12
+ # rely on Resolv's IPv4#create and IPv6#create to validate IP addresses, but first regex to avoid most exceptions
13
+ is_valid_ipv4 = ->(candidate) { Resolv::IPv4::Regex.match?(candidate) && Resolv::IPv4.create(candidate) rescue false}
14
+ is_valid_ipv6 = ->(candidate) { Resolv::IPv6::Regex.match?(candidate) && Resolv::IPv6.create(candidate) rescue false}
15
+
16
+ is_valid_hostname = ->(candidate) { (%r{\A([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}\Z}i).match?(candidate) }
17
+
18
+ # the normalized tuple from valid values
19
+ host_port_pair = Struct.new(:host, :port)
20
+
21
+ expectation_desc = "required-host optional-port pair"
22
+
23
+ port_range = Range.new(0,65535)
24
+
25
+ ##
26
+ # When included into a Logstash plugin, adds a valiador named `required_host_optional_port`, which expects
27
+ # exactly one string matching a required host, optionally followed by a colon and a port number, and coerces
28
+ # valid values into a value with `host` and `port` attributes.
29
+ # When specifying an IPv6 address, it MUST be enclosed in square-brackets, and the address itself (without
30
+ # brackets) will be made available in the coerced value's `host` attribute
31
+ RequiredHostOptionalPortValidationAdapter = NamedValidationAdapter.new(:required_host_optional_port) do |value|
32
+ break ValidationResult.failure("Expected exactly one #{expectation_desc}, got `#{value.inspect}`") unless value.kind_of?(Array) && value.size <= 1
33
+
34
+ candidate = value.first
35
+
36
+ break ValidationResult.failure("Expected a valid #{expectation_desc}, got `#{candidate.inspect}`") unless candidate.kind_of?(String) && !candidate.empty?
37
+
38
+ # optional port
39
+ candidate_host, candidate_port = candidate.split(%r{\:(?=\d{1,5}\z)},2)
40
+ port = candidate_port&.to_i
41
+
42
+ break ValidationResult.failure("Expected a port in #{port_range.inspect}, got `#{port}`") if port && !port_range.include?(port)
43
+
44
+ # bracket-wrapped ipv6
45
+ if candidate_host.start_with?('[') && candidate_host.end_with?(']')
46
+ candidate_host = candidate_host[1...-1]
47
+ break ValidationResult.success(host_port_pair.new(candidate_host, port)) if is_valid_ipv6[candidate_host]
48
+ else
49
+ # ipv4 or hostname
50
+ break ValidationResult.success(host_port_pair.new(candidate_host, port)) if is_valid_ipv4[candidate_host]
51
+ break ValidationResult.success(host_port_pair.new(candidate_host, port)) if is_valid_hostname[candidate_host]
52
+ end
53
+
54
+ break ValidationResult.failure("Expected a valid #{expectation_desc}, got `#{candidate.inspect}`")
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,75 @@
1
+ # encoding: utf-8
2
+
3
+ require 'logstash/plugin_mixins/validator_support/required_host_optional_port_validation_adapter'
4
+
5
+ describe LogStash::PluginMixins::ValidatorSupport::RequiredHostOptionalPortValidationAdapter do
6
+
7
+ it 'is an instance of NamedValidationAdapter' do
8
+ expect(described_class).to be_a_kind_of LogStash::PluginMixins::ValidatorSupport::NamedValidationAdapter
9
+ end
10
+
11
+ context '#validate' do
12
+ {
13
+ "127.0.0.1:1234" => {:host => "127.0.0.1", :port => 1234},
14
+ "82.31.1.3:9800" => {:host => "82.31.1.3", :port => 9800},
15
+ "foo.com:1234" => {:host => "foo.com", :port => 1234},
16
+ "foo-bar-domain.com:9800" => {:host => "foo-bar-domain.com", :port => 9800},
17
+ "[::1]:1234" => {:host => "::1", :port => 1234},
18
+ "[2001:db8:3333:4444:5555:6666:7777:8888]:9800" => {:host => "2001:db8:3333:4444:5555:6666:7777:8888", :port => 9800},
19
+ "[2001:db8:3333::7777:8888]:9800" => {:host => "2001:db8:3333::7777:8888", :port => 9800},
20
+ "[::ffff:93.184.216.34]:1023" => {:host => "::ffff:93.184.216.34", :port => 1023},
21
+
22
+ "127.0.0.1" => {:host => "127.0.0.1", :port => nil},
23
+ "82.31.1.3" => {:host => "82.31.1.3", :port => nil},
24
+ "foo.com" => {:host => "foo.com", :port => nil},
25
+ "foo-bar-domain.com" => {:host => "foo-bar-domain.com", :port => nil},
26
+ "[::1]" => {:host => "::1", :port => nil},
27
+ "[2001:db8:3333:4444:5555:6666:7777:8888]" => {:host => "2001:db8:3333:4444:5555:6666:7777:8888", :port => nil},
28
+ "[2001:db8:3333::7777:8888]" => {:host => "2001:db8:3333::7777:8888", :port => nil},
29
+ "[::ffff:93.184.216.34]" => {:host => "::ffff:93.184.216.34", :port => nil},
30
+ }.each do |candidate, expected_result|
31
+ context "valid input `#{candidate.inspect}`" do
32
+ it "coerces the result to a host/port struct `#{expected_result}`" do
33
+ is_valid_result, coerced_or_error = described_class.validate([candidate])
34
+ failure = is_valid_result ? nil : coerced_or_error
35
+ coerced = is_valid_result ? coerced_or_error : nil
36
+
37
+ aggregate_failures do
38
+ expect(is_valid_result).to be true
39
+ expect(failure).to be_nil # makes spec failure output useful
40
+ end
41
+ expect(coerced).to have_attributes(expected_result.to_h)
42
+ end
43
+ end
44
+ end
45
+
46
+ [
47
+ "not an address",
48
+ "http://example.com:1234",
49
+ "tcp://example.com",
50
+ "http://example.com:1234/v1/this",
51
+ "",
52
+ ":1234", # port without host
53
+ "::1", # bare ipv6
54
+ "2001:db8:3333:4444:5555:6666:7777:8888",
55
+ "2001:db8:3333::7777:8888",
56
+ "[1:2:3:4:5:6::7:8:9:a:b:c]", # invalid compressed hex ipv6 form
57
+ "[::ffff:258.512.768.999]", # invalid compressed hex4dec ipv6 form
58
+ "example.com:98000",
59
+ ].each do |candidate|
60
+ context "invalid input `#{candidate.inspect}`" do
61
+ it "reports the input as invalid" do
62
+ is_valid_result, coerced_or_error = described_class.validate([candidate])
63
+ failure = is_valid_result ? nil : coerced_or_error
64
+ coerced = is_valid_result ? coerced_or_error : nil
65
+
66
+ aggregate_failures do
67
+ expect(is_valid_result).to be false
68
+ expect(coerced).to be_nil # makes spec failure output useful
69
+ end
70
+ expect(failure).to_not be_nil
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-mixin-validator_support
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: java
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-06 00:00:00.000000000 Z
11
+ date: 2023-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -66,7 +66,9 @@ files:
66
66
  - README.md
67
67
  - lib/logstash/plugin_mixins/validator_support.rb
68
68
  - lib/logstash/plugin_mixins/validator_support/field_reference_validation_adapter.rb
69
+ - lib/logstash/plugin_mixins/validator_support/required_host_optional_port_validation_adapter.rb
69
70
  - spec/logstash/plugin_mixins/validator_support/field_reference_validation_adapter_spec.rb
71
+ - spec/logstash/plugin_mixins/validator_support/required_host_optional_port_validation_adapter_spec.rb
70
72
  - spec/logstash/plugin_mixins/validator_support_spec.rb
71
73
  homepage: https://github.com/logstash-plugins/logstash-mixin-validator_support
72
74
  licenses:
@@ -87,11 +89,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
87
89
  - !ruby/object:Gem::Version
88
90
  version: '0'
89
91
  requirements: []
90
- rubygems_version: 3.1.6
92
+ rubygems_version: 3.2.33
91
93
  signing_key:
92
94
  specification_version: 4
93
95
  summary: Support for the plugin parameter validations introduced in recent releases
94
96
  of Logstash, for plugins wishing to use them on older Logstashes
95
97
  test_files:
96
98
  - spec/logstash/plugin_mixins/validator_support/field_reference_validation_adapter_spec.rb
99
+ - spec/logstash/plugin_mixins/validator_support/required_host_optional_port_validation_adapter_spec.rb
97
100
  - spec/logstash/plugin_mixins/validator_support_spec.rb