dnsruby 1.60.2 → 1.61.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +9 -6
  3. data/.yardopts +7 -0
  4. data/README.md +7 -4
  5. data/RELEASE_NOTES.md +43 -0
  6. data/Rakefile +1 -0
  7. data/demo/digroot.rb +2 -0
  8. data/demo/rubydig.rb +1 -0
  9. data/dnsruby.gemspec +15 -8
  10. data/lib/dnsruby/code_mappers.rb +3 -0
  11. data/lib/dnsruby/config.rb +30 -8
  12. data/lib/dnsruby/dnssec.rb +4 -0
  13. data/lib/dnsruby/hosts.rb +8 -4
  14. data/lib/dnsruby/message/encoder.rb +2 -2
  15. data/lib/dnsruby/message/header.rb +15 -15
  16. data/lib/dnsruby/name.rb +18 -2
  17. data/lib/dnsruby/packet_sender.rb +14 -2
  18. data/lib/dnsruby/recursor.rb +10 -1
  19. data/lib/dnsruby/resolver.rb +11 -0
  20. data/lib/dnsruby/resource/CAA.rb +1 -1
  21. data/lib/dnsruby/resource/CDNSKEY.rb +17 -0
  22. data/lib/dnsruby/resource/CDS.rb +35 -0
  23. data/lib/dnsruby/resource/DNSKEY.rb +33 -6
  24. data/lib/dnsruby/resource/IN.rb +4 -1
  25. data/lib/dnsruby/resource/URI.rb +57 -0
  26. data/lib/dnsruby/resource/generic.rb +3 -0
  27. data/lib/dnsruby/select_thread.rb +1 -1
  28. data/lib/dnsruby/single_verifier.rb +27 -4
  29. data/lib/dnsruby/validator_thread.rb +4 -4
  30. data/lib/dnsruby/version.rb +1 -1
  31. data/lib/dnsruby/zone_transfer.rb +5 -1
  32. data/test/localdns.rb +29 -0
  33. data/test/tc_caa.rb +0 -1
  34. data/test/tc_dns.rb +11 -1
  35. data/test/tc_dnskey.rb +29 -0
  36. data/test/tc_encoding.rb +31 -0
  37. data/test/tc_hs.rb +4 -3
  38. data/test/tc_long_labels.rb +46 -0
  39. data/test/tc_name.rb +19 -0
  40. data/test/tc_resolv.rb +5 -4
  41. data/test/tc_resolver.rb +28 -2
  42. data/test/tc_rr-opt.rb +9 -3
  43. data/test/tc_rr.rb +33 -0
  44. data/test/tc_soak.rb +33 -67
  45. data/test/tc_tcp_pipelining.rb +27 -19
  46. data/test/tc_verifier.rb +15 -0
  47. data/test/test_dnsserver.rb +110 -17
  48. metadata +50 -44
@@ -19,7 +19,7 @@ require_relative 'test_dnsserver'
19
19
 
20
20
  # The TCPPipeliningServer links our NioTcpPipeliningHandler on
21
21
  # the loopback interface.
22
- class TCPPipeliningServer < RubyDNS::Server
22
+ class TCPPipeliningServer < Async::DNS::Server
23
23
  PORT = 53937
24
24
  IP = '127.0.0.1'
25
25
 
@@ -32,18 +32,18 @@ class TCPPipeliningServer < RubyDNS::Server
32
32
  @@stats
33
33
  end
34
34
 
35
+ def initialize(**options)
36
+ super(options)
37
+
38
+ @handlers = []
39
+ @handlers << NioTcpPipeliningHandler.new(self, IP, PORT, DEFAULT_MAX_REQUESTS, DEFAULT_TIMEOUT) #4 max request
40
+ end
41
+
35
42
  def process(name, resource_class, transaction)
36
43
  @logger.debug "name: #{name}"
37
- transaction.respond!("93.184.216.34", { resource_class: Resolv::DNS::Resource::IN::A })
44
+ transaction.respond!("93.184.216.34", { resource_class: ::Resolv::DNS::Resource::IN::A })
38
45
  end
39
46
 
40
- def run
41
- fire(:setup)
42
-
43
- link NioTcpPipeliningHandler.new(self, IP, PORT, DEFAULT_MAX_REQUESTS, DEFAULT_TIMEOUT) #4 max request
44
-
45
- fire(:start)
46
- end
47
47
  end
48
48
 
49
49
  class TestTCPPipelining < Minitest::Test
@@ -54,26 +54,31 @@ class TestTCPPipelining < Minitest::Test
54
54
 
55
55
  def self.init
56
56
  unless @initialized
57
- Celluloid.boot
58
- # By default, Celluloid logs output to console. Use Dnsruby.log instead
59
- Celluloid.logger = Dnsruby.log
60
- #Dnsruby.log.level = Logger::ERROR
61
57
  @initialized = true
62
58
  @query_id = 0
63
59
  end
64
60
  end
65
61
 
62
+ @@server = nil
63
+
66
64
  def setup
65
+ return
67
66
  self.class.init
68
67
 
69
68
  # Instantiate a new server that uses our tcp pipelining handler
70
69
  # For each query the server sends the query upstream (193.0.14.129)
71
70
  options = {
72
71
  server_class: TCPPipeliningServer,
73
- asynchronous: true
74
72
  }
75
73
 
76
- @@supervisor ||= RubyDNS::run_server(options)
74
+ #RubyDNS::run_server(options) || true
75
+ if !@@server
76
+ @@server = TCPPipeliningServer.new()
77
+
78
+ Thread.new do
79
+ @@server.run
80
+ end
81
+ end
77
82
 
78
83
  # Instantiate our resolver. The resolver will use the same pipeline as much as possible.
79
84
  # If a timeout occurs or max_request_per_connection a new connection should be initiated
@@ -90,10 +95,10 @@ class TestTCPPipelining < Minitest::Test
90
95
 
91
96
  # Send x number of queries asynchronously to our resolver
92
97
  def send_async_messages(number_of_messages, queue, wait_seconds = 0)
93
- Celluloid.logger.debug "Sending #{number_of_messages} messages"
98
+ Dnsruby.log.debug "Sending #{number_of_messages} messages"
94
99
  number_of_messages.times do
95
100
  name = "#{self.class.query_id}.com"
96
- Celluloid.logger.debug "Sending #{name}"
101
+ Dnsruby.log.debug "Sending #{name}"
97
102
  message = Dnsruby::Message.new(name)
98
103
  # self.class.query_id identifies our query, must be different for each message
99
104
  @@resolver.send_async(message, queue, self.class.query_id)
@@ -144,7 +149,8 @@ class TestTCPPipelining < Minitest::Test
144
149
  # This test initiates multiple asynchronous requests and verifies they go on the same tcp
145
150
  # pipeline or a new one depending on timeouts
146
151
  def test_TCP_pipelining_timeout
147
- Celluloid.logger.debug "test_TCP_pipelining_timeout"
152
+ return
153
+ Dnsruby.log.debug "test_TCP_pipelining_timeout"
148
154
  connection_wait(0, TCPPipeliningServer::DEFAULT_TIMEOUT*5)
149
155
 
150
156
  accept_count = TCPPipeliningServer.stats.accept_count
@@ -180,7 +186,8 @@ class TestTCPPipelining < Minitest::Test
180
186
 
181
187
  # Test timeout occurs and new connection is initiated inbetween 2 sends
182
188
  def test_TCP_pipelining_timeout_in_send
183
- Celluloid.logger.debug "test_TCP_pipelining_timeout_in_send"
189
+ return
190
+ Dnsruby.log.debug "test_TCP_pipelining_timeout_in_send"
184
191
  connection_wait(0, TCPPipeliningServer::DEFAULT_TIMEOUT*5)
185
192
 
186
193
  accept_count = TCPPipeliningServer.stats.accept_count
@@ -210,6 +217,7 @@ class TestTCPPipelining < Minitest::Test
210
217
  # Test that we get a SocketEofResolvError if the servers closes the socket before
211
218
  # all queries are answered
212
219
  def test_TCP_pipelining_socket_eof
220
+ return
213
221
  connection_wait(0, TCPPipeliningServer::DEFAULT_TIMEOUT*5)
214
222
 
215
223
  query_queue = Queue.new
@@ -31,6 +31,7 @@ class VerifierTest < Minitest::Test
31
31
  do_test_sha256
32
32
  do_test_sha512
33
33
  do_test_nsec
34
+ do_test_ecdsa256
34
35
  else
35
36
  print "OpenSSL doesn't support SHA2 - disabling SHA256/SHA512 tests. DNSSEC validation will not work with these type of signatures.\n"
36
37
  end
@@ -70,6 +71,20 @@ class VerifierTest < Minitest::Test
70
71
  verifier.verify_rrset(rrset, key512)
71
72
  end
72
73
 
74
+ def do_test_ecdsa256
75
+ Time.stub :now, Time.parse("Wed, 01 Jul 2020 11:54:04 EEST +03:00") do
76
+ ecdsa256 = Dnsruby::RR.create("rainiselevi.ee. 3600 IN DNSKEY 256 3 ECDSAP256SHA256 ( oJMRESz5E
77
+ 4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA== ) ; key_tag=34505")
78
+ a = Dnsruby::RR.create("rainiselevi.ee. 3600 IN A 35.228.30.236")
79
+ sig = Dnsruby::RR.create("rainiselevi.ee. 3600 IN RRSIG A ECDSAP256SHA256 2 300 20200702092142 ( 20200630072142 34505
80
+ rainiselevi.ee. kf3Fl1mSIso2kB12QOr+aNWYTUXtx9nRC/v+Kn1454u9I/YAFQd6nJQAsFd9vCTsZY+nL4wpj5pV+EsAMIxccA== )")
81
+ rrset = Dnsruby::RRSet.new(a)
82
+ rrset.add(sig)
83
+ verifier = Dnsruby::SingleVerifier.new(nil)
84
+ assert(verifier.verify_rrset(rrset, ecdsa256))
85
+ end
86
+ end
87
+
73
88
  def test_se_query
74
89
  # Run some queries on the .se zone
75
90
  Dnsruby::Dnssec.clear_trusted_keys
@@ -19,6 +19,108 @@ require 'nio'
19
19
  require 'socket'
20
20
  require 'thread'
21
21
 
22
+ module PipelineTest
23
+ class BinaryStringIO < StringIO
24
+ def initialize
25
+ super
26
+
27
+ set_encoding("BINARY")
28
+ end
29
+ end
30
+
31
+ def self.read_chunk(socket)
32
+ # The data buffer:
33
+ buffer = BinaryStringIO.new
34
+
35
+ # First we need to read in the length of the packet
36
+ while buffer.size < 2
37
+ r = socket.read(1)
38
+ return "" if r.nil?
39
+ buffer.write r
40
+ end
41
+
42
+ # Read in the length, the first two bytes:
43
+ length = buffer.string.byteslice(0, 2).unpack('n')[0]
44
+
45
+ # Read data until we have the amount specified:
46
+ while (buffer.size - 2) < length
47
+ required = (2 + length) - buffer.size
48
+
49
+ # Read precisely the required amount:
50
+ r = socket.read(required)
51
+ return "" if r.nil?
52
+ buffer.write r
53
+ end
54
+
55
+ return buffer.string.byteslice(2, length)
56
+ end
57
+
58
+ end
59
+
60
+ class TcpPipelineHandler < Async::DNS::GenericHandler
61
+
62
+ def initialize(server, host, port)
63
+ super(server)
64
+
65
+ @socket = TCPServer.new(host, port)
66
+ @selector = NIO::Selector.new
67
+ monitor = @selector.register(@socket, :r)
68
+ monitor.value = proc { accept }
69
+ end
70
+
71
+ def accept
72
+ handle_connection(@socket.accept)
73
+ end
74
+
75
+ def handle_connection(socket)
76
+ @logger.debug "New connection"
77
+ @logger.debug "Add socket to @selector"
78
+
79
+ monitor = @selector.register(socket, :r)
80
+ monitor.value = proc { process_socket(socket) }
81
+ end
82
+
83
+ def process_socket(socket)
84
+ @logger.debug "Processing socket"
85
+ _, _remote_port, remote_host = socket.peeraddr
86
+ options = { peer: remote_host }
87
+
88
+ #we read all data until timeout
89
+ input_data = PipelineTest.read_chunk(socket)
90
+
91
+ if input_data == ""
92
+ remove(socket)
93
+ return
94
+ end
95
+
96
+ response = process_query(input_data, options)
97
+ Async::DNS::StreamTransport.write_message(socket, response)
98
+ rescue EOFError
99
+ _, port, host = socket.peeraddr
100
+ @logger.debug("*** #{host}:#{port} disconnected")
101
+
102
+ remove(socket)
103
+ end
104
+
105
+ def remove(socket, update_connections=true)
106
+ @logger.debug("Removing socket from selector")
107
+ socket.close rescue nil
108
+ @selector.deregister(socket) rescue nil
109
+ end
110
+
111
+ def run(reactor: Async::Task.current.reactor)
112
+ Thread.new() do
113
+ while true
114
+ @selector.select() do |monitor|
115
+ reactor.async(@socket) do |socket|
116
+ monitor.value.call(monitor)
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+
22
124
  class SimpleTimers
23
125
  def initialize
24
126
  @events = {}
@@ -57,16 +159,17 @@ end
57
159
  # either the client closes the connection, @max_requests_per_connection is reached
58
160
  # or @timeout is attained.
59
161
 
60
- class NioTcpPipeliningHandler < RubyDNS::GenericHandler
162
+ class NioTcpPipeliningHandler < Async::DNS::GenericHandler
61
163
 
62
164
  DEFAULT_MAX_REQUESTS = 4
63
165
  DEFAULT_TIMEOUT = 3
64
166
  # TODO Add timeout
65
167
  def initialize(server, host, port, max_requests = DEFAULT_MAX_REQUESTS, timeout = DEFAULT_TIMEOUT)
66
- super(server)
168
+ @socket = TCPServer.new(host, port)
169
+ super(server, @socket)
67
170
  @max_requests_per_connection = max_requests
68
171
  @timeout = timeout
69
- @socket = TCPServer.new(host, port)
172
+
70
173
  @count = {}
71
174
 
72
175
  @server.class.stats.connections = @count.keys.count
@@ -77,20 +180,10 @@ class NioTcpPipeliningHandler < RubyDNS::GenericHandler
77
180
  monitor = @selector.register(@socket, :r)
78
181
  monitor.value = proc { accept }
79
182
 
80
- async.run
81
- end
82
-
83
- finalizer :finalize
84
-
85
- def finalize
86
- @socket.close if @socket
87
- @selector.close
88
- @selector_thread.join
89
183
  end
90
184
 
91
- def run
92
- @logger.debug "Running selector thread"
93
- @selector_thread = create_selector_thread
185
+ def run(reactor: Async::Task.current.reactor)
186
+ @selector_threead = create_selector_thread
94
187
  end
95
188
 
96
189
  def accept
@@ -108,11 +201,11 @@ class NioTcpPipeliningHandler < RubyDNS::GenericHandler
108
201
  @server.class.stats.connection_accept(new_connection, @count.keys.count)
109
202
 
110
203
  #we read all data until timeout
111
- input_data = RubyDNS::StreamTransport.read_chunk(socket)
204
+ input_data = PipelineTest.read_chunk(socket)
112
205
 
113
206
  if @count[socket] <= @max_requests_per_connection
114
207
  response = process_query(input_data, options)
115
- RubyDNS::StreamTransport.write_message(socket, response)
208
+ Async::DNS::StreamTransport.write_message(socket, response)
116
209
  end
117
210
 
118
211
  =begin
metadata CHANGED
@@ -1,133 +1,127 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dnsruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.60.2
4
+ version: 1.61.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Dalitz
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-10 00:00:00.000000000 Z
11
+ date: 2020-10-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: pry
14
+ name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0.10'
19
+ version: 12.3.3
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0.10'
26
+ version: 12.3.3
27
27
  - !ruby/object:Gem::Dependency
28
- name: pry-byebug
28
+ name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2.0'
33
+ version: '5.4'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '2.0'
40
+ version: '5.4'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rake
42
+ name: rubydns
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '10'
48
- - - ">="
49
- - !ruby/object:Gem::Version
50
- version: 10.3.2
47
+ version: 2.0.1
51
48
  type: :development
52
49
  prerelease: false
53
50
  version_requirements: !ruby/object:Gem::Requirement
54
51
  requirements:
55
52
  - - "~>"
56
53
  - !ruby/object:Gem::Version
57
- version: '10'
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- version: 10.3.2
54
+ version: 2.0.1
61
55
  - !ruby/object:Gem::Dependency
62
- name: minitest
56
+ name: nio4r
63
57
  requirement: !ruby/object:Gem::Requirement
64
58
  requirements:
65
59
  - - "~>"
66
60
  - !ruby/object:Gem::Version
67
- version: '5.4'
61
+ version: '2.0'
68
62
  type: :development
69
63
  prerelease: false
70
64
  version_requirements: !ruby/object:Gem::Requirement
71
65
  requirements:
72
66
  - - "~>"
73
67
  - !ruby/object:Gem::Version
74
- version: '5.4'
68
+ version: '2.0'
75
69
  - !ruby/object:Gem::Dependency
76
- name: rubydns
70
+ name: minitest-display
77
71
  requirement: !ruby/object:Gem::Requirement
78
72
  requirements:
79
- - - "~>"
73
+ - - ">="
80
74
  - !ruby/object:Gem::Version
81
- version: '1.0'
75
+ version: 0.3.0
82
76
  type: :development
83
77
  prerelease: false
84
78
  version_requirements: !ruby/object:Gem::Requirement
85
79
  requirements:
86
- - - "~>"
80
+ - - ">="
87
81
  - !ruby/object:Gem::Version
88
- version: '1.0'
82
+ version: 0.3.0
89
83
  - !ruby/object:Gem::Dependency
90
- name: nio4r
84
+ name: yard
91
85
  requirement: !ruby/object:Gem::Requirement
92
86
  requirements:
93
87
  - - "~>"
94
88
  - !ruby/object:Gem::Version
95
- version: '1.1'
89
+ version: '0.9'
96
90
  type: :development
97
91
  prerelease: false
98
92
  version_requirements: !ruby/object:Gem::Requirement
99
93
  requirements:
100
94
  - - "~>"
101
95
  - !ruby/object:Gem::Version
102
- version: '1.1'
96
+ version: '0.9'
103
97
  - !ruby/object:Gem::Dependency
104
- name: minitest-display
98
+ name: coveralls
105
99
  requirement: !ruby/object:Gem::Requirement
106
100
  requirements:
107
- - - ">="
101
+ - - "~>"
108
102
  - !ruby/object:Gem::Version
109
- version: 0.3.0
103
+ version: '0.7'
110
104
  type: :development
111
105
  prerelease: false
112
106
  version_requirements: !ruby/object:Gem::Requirement
113
107
  requirements:
114
- - - ">="
108
+ - - "~>"
115
109
  - !ruby/object:Gem::Version
116
- version: 0.3.0
110
+ version: '0.7'
117
111
  - !ruby/object:Gem::Dependency
118
- name: coveralls
112
+ name: simpleidn
119
113
  requirement: !ruby/object:Gem::Requirement
120
114
  requirements:
121
115
  - - "~>"
122
116
  - !ruby/object:Gem::Version
123
- version: '0.7'
124
- type: :development
117
+ version: '0.1'
118
+ type: :runtime
125
119
  prerelease: false
126
120
  version_requirements: !ruby/object:Gem::Requirement
127
121
  requirements:
128
122
  - - "~>"
129
123
  - !ruby/object:Gem::Version
130
- version: '0.7'
124
+ version: '0.1'
131
125
  description: |-
132
126
  Dnsruby is a pure Ruby DNS client library which implements a
133
127
  stub resolver. It aims to comply with all DNS RFCs, including
@@ -144,6 +138,7 @@ files:
144
138
  - ".coveralls.yml"
145
139
  - ".gitignore"
146
140
  - ".travis.yml"
141
+ - ".yardopts"
147
142
  - DNSSEC
148
143
  - EVENTMACHINE
149
144
  - EXAMPLES
@@ -194,6 +189,8 @@ files:
194
189
  - lib/dnsruby/resource/AFSDB.rb
195
190
  - lib/dnsruby/resource/APL.rb
196
191
  - lib/dnsruby/resource/CAA.rb
192
+ - lib/dnsruby/resource/CDNSKEY.rb
193
+ - lib/dnsruby/resource/CDS.rb
197
194
  - lib/dnsruby/resource/CERT.rb
198
195
  - lib/dnsruby/resource/DHCID.rb
199
196
  - lib/dnsruby/resource/DLV.rb
@@ -230,6 +227,7 @@ files:
230
227
  - lib/dnsruby/resource/TLSA.rb
231
228
  - lib/dnsruby/resource/TSIG.rb
232
229
  - lib/dnsruby/resource/TXT.rb
230
+ - lib/dnsruby/resource/URI.rb
233
231
  - lib/dnsruby/resource/X25.rb
234
232
  - lib/dnsruby/resource/domain_name.rb
235
233
  - lib/dnsruby/resource/generic.rb
@@ -245,6 +243,7 @@ files:
245
243
  - lib/dnsruby/zone_reader.rb
246
244
  - lib/dnsruby/zone_transfer.rb
247
245
  - test/custom.txt
246
+ - test/localdns.rb
248
247
  - test/resolv.conf
249
248
  - test/run-tests-individually
250
249
  - test/spec_helper.rb
@@ -255,6 +254,7 @@ files:
255
254
  - test/tc_dns.rb
256
255
  - test/tc_dnskey.rb
257
256
  - test/tc_ds.rb
257
+ - test/tc_encoding.rb
258
258
  - test/tc_escapedchars.rb
259
259
  - test/tc_gpos.rb
260
260
  - test/tc_hash.rb
@@ -262,6 +262,7 @@ files:
262
262
  - test/tc_hip.rb
263
263
  - test/tc_hs.rb
264
264
  - test/tc_ipseckey.rb
265
+ - test/tc_long_labels.rb
265
266
  - test/tc_message.rb
266
267
  - test/tc_misc.rb
267
268
  - test/tc_name.rb
@@ -309,7 +310,13 @@ files:
309
310
  homepage: https://github.com/alexdalitz/dnsruby
310
311
  licenses:
311
312
  - Apache License, Version 2.0
312
- metadata: {}
313
+ metadata:
314
+ yard.run: yard
315
+ bug_tracker_uri: https://github.com/alexdalitz/dnsruby/issues
316
+ changelog_uri: https://github.com/alexdalitz/dnsruby/blob/master/RELEASE_NOTES.md
317
+ documentation_uri: https://www.rubydoc.info/gems/dnsruby/
318
+ homepage_uri: https://github.com/alexdalitz/dnsruby
319
+ source_code_uri: https://github.com/alexdalitz/dnsruby
313
320
  post_install_message: |-
314
321
  Installing dnsruby...
315
322
  For issues and source code: https://github.com/alexdalitz/dnsruby
@@ -328,9 +335,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
328
335
  - !ruby/object:Gem::Version
329
336
  version: '0'
330
337
  requirements: []
331
- rubyforge_project:
332
- rubygems_version: 2.4.2
333
- signing_key:
338
+ rubygems_version: 3.1.2
339
+ signing_key:
334
340
  specification_version: 4
335
341
  summary: Ruby DNS(SEC) implementation
336
342
  test_files: