dnsruby 1.74.0 → 2.0.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.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +16 -4
  3. data/DNSSEC +3 -2
  4. data/EXAMPLES +1 -1
  5. data/README.md +370 -64
  6. data/RELEASE_NOTES.md +302 -1
  7. data/Rakefile +0 -3
  8. data/demo/axfr.rb +24 -6
  9. data/demo/rubydig.rb +0 -2
  10. data/dnsruby.gemspec +5 -4
  11. data/lib/dnsruby/cache.rb +279 -47
  12. data/lib/dnsruby/code_mapper.rb +35 -8
  13. data/lib/dnsruby/code_mappers.rb +63 -49
  14. data/lib/dnsruby/config.rb +75 -4
  15. data/lib/dnsruby/deadline_queue.rb +75 -0
  16. data/lib/dnsruby/dnssec.rb +148 -45
  17. data/lib/dnsruby/ipv6.rb +45 -5
  18. data/lib/dnsruby/key_cache.rb +202 -35
  19. data/lib/dnsruby/message/decoder.rb +85 -19
  20. data/lib/dnsruby/message/encoder.rb +27 -16
  21. data/lib/dnsruby/message/header.rb +8 -12
  22. data/lib/dnsruby/message/message.rb +53 -22
  23. data/lib/dnsruby/message/section.rb +12 -34
  24. data/lib/dnsruby/name.rb +5 -2
  25. data/lib/dnsruby/packet_sender.rb +645 -203
  26. data/lib/dnsruby/presentation.rb +147 -0
  27. data/lib/dnsruby/query_control.rb +132 -0
  28. data/lib/dnsruby/recursor.rb +795 -339
  29. data/lib/dnsruby/resolver.rb +468 -186
  30. data/lib/dnsruby/resource/CAA.rb +67 -16
  31. data/lib/dnsruby/resource/DLV.rb +6 -0
  32. data/lib/dnsruby/resource/DNSKEY.rb +108 -16
  33. data/lib/dnsruby/resource/DS.rb +27 -28
  34. data/lib/dnsruby/resource/HTTPS.rb +16 -0
  35. data/lib/dnsruby/resource/IN.rb +19 -0
  36. data/lib/dnsruby/resource/MX.rb +2 -2
  37. data/lib/dnsruby/resource/NSEC.rb +6 -10
  38. data/lib/dnsruby/resource/NSEC3.rb +55 -19
  39. data/lib/dnsruby/resource/NSEC3PARAM.rb +4 -6
  40. data/lib/dnsruby/resource/RR.rb +108 -65
  41. data/lib/dnsruby/resource/RRSIG.rb +5 -5
  42. data/lib/dnsruby/resource/RRSet.rb +38 -22
  43. data/lib/dnsruby/resource/SRV.rb +2 -2
  44. data/lib/dnsruby/resource/SVCB.rb +775 -0
  45. data/lib/dnsruby/resource/TSIG.rb +266 -231
  46. data/lib/dnsruby/resource/TXT.rb +34 -42
  47. data/lib/dnsruby/resource/domain_name.rb +1 -1
  48. data/lib/dnsruby/resource/generic.rb +31 -0
  49. data/lib/dnsruby/resource/generic_cache.rb +384 -0
  50. data/lib/dnsruby/resource/generic_constants.rb +79 -0
  51. data/lib/dnsruby/select_thread.rb +979 -291
  52. data/lib/dnsruby/serial_time.rb +25 -0
  53. data/lib/dnsruby/single_resolver.rb +25 -6
  54. data/lib/dnsruby/single_verifier.rb +1620 -530
  55. data/lib/dnsruby/transport_clock.rb +9 -0
  56. data/lib/dnsruby/update.rb +8 -6
  57. data/lib/dnsruby/validation_budget.rb +143 -0
  58. data/lib/dnsruby/validator_thread.rb +139 -58
  59. data/lib/dnsruby/version.rb +1 -1
  60. data/lib/dnsruby/zone_reader.rb +196 -129
  61. data/lib/dnsruby/zone_transfer.rb +157 -25
  62. data/lib/dnsruby.rb +7 -2
  63. data/test/ci_watchdog.rb +33 -0
  64. data/test/fixtures/org-ds-2026-11-05.zone +5 -0
  65. data/test/fixtures/root-dnskey-2026-11-05.zone +7 -0
  66. data/test/fork_test_helper.rb +37 -0
  67. data/test/local_dns_server.rb +57 -0
  68. data/test/soak_server.rb +152 -0
  69. data/test/socket_helpers.rb +26 -0
  70. data/test/spec_helper.rb +8 -13
  71. data/test/tc_attempt_configuration.rb +137 -0
  72. data/test/tc_caa.rb +2 -2
  73. data/test/tc_cache_keys.rb +36 -0
  74. data/test/tc_cancelled_send_capacity.rb +158 -0
  75. data/test/tc_dnssec_alias_validation.rb +289 -0
  76. data/test/tc_dnssec_budget.rb +489 -0
  77. data/test/tc_dnssec_cache_bounds.rb +197 -0
  78. data/test/tc_dnssec_cache_lifetime.rb +615 -0
  79. data/test/tc_dnssec_denial_proofs.rb +285 -0
  80. data/test/tc_dnssec_recursion_limits.rb +186 -0
  81. data/test/tc_dnssec_recursor_review_fixes.rb +351 -0
  82. data/test/tc_dnssec_trust_anchors.rb +286 -0
  83. data/test/tc_dnssec_trust_races.rb +147 -0
  84. data/test/tc_dnssec_wildcard_proofs.rb +249 -0
  85. data/test/tc_ds.rb +5 -5
  86. data/test/tc_edns_retry_regressions.rb +255 -0
  87. data/test/tc_escapedchars.rb +8 -0
  88. data/test/tc_final_review_fixes.rb +167 -0
  89. data/test/tc_final_transport_contracts.rb +104 -0
  90. data/test/tc_generic_cache.rb +852 -0
  91. data/test/tc_header.rb +26 -0
  92. data/test/tc_ipv6.rb +120 -0
  93. data/test/tc_key_cache_identity.rb +382 -0
  94. data/test/tc_malformed_tcp.rb +712 -0
  95. data/test/tc_name.rb +99 -5
  96. data/test/tc_nameserver_bootstrap.rb +322 -0
  97. data/test/tc_nsec.rb +4 -45
  98. data/test/tc_nsec3.rb +17 -1
  99. data/test/tc_pipeline_retirement.rb +358 -0
  100. data/test/tc_pipeline_retry.rb +462 -0
  101. data/test/tc_pipeline_send.rb +663 -0
  102. data/test/tc_protocol_review_fixes.rb +95 -0
  103. data/test/tc_query_control.rb +90 -0
  104. data/test/tc_record_codec_contracts.rb +107 -0
  105. data/test/tc_record_regressions.rb +225 -0
  106. data/test/tc_recur.rb +1 -0
  107. data/test/tc_recursor_address_fallback.rb +169 -0
  108. data/test/tc_recursor_limits.rb +139 -0
  109. data/test/tc_release_auxiliary_fixes.rb +288 -0
  110. data/test/tc_release_configuration_fixes.rb +612 -0
  111. data/test/tc_release_dnssec_completion.rb +405 -0
  112. data/test/tc_release_dnssec_fixes.rb +305 -0
  113. data/test/tc_release_negative_cache.rb +327 -0
  114. data/test/tc_release_recursor_cache.rb +212 -0
  115. data/test/tc_release_review_transport.rb +372 -0
  116. data/test/tc_release_review_transport_native.rb +56 -0
  117. data/test/tc_release_transport.rb +906 -0
  118. data/test/tc_release_transport_fixes.rb +196 -0
  119. data/test/tc_release_zone_defaults.rb +157 -0
  120. data/test/tc_release_zone_ttls.rb +39 -0
  121. data/test/tc_res_config.rb +42 -20
  122. data/test/tc_res_opt.rb +21 -1
  123. data/test/tc_resolver.rb +21 -19
  124. data/test/tc_resolver_concurrency.rb +383 -0
  125. data/test/tc_resolver_configuration_contracts.rb +31 -0
  126. data/test/tc_resolver_validation.rb +211 -0
  127. data/test/tc_review_cache.rb +163 -0
  128. data/test/tc_review_code_mapper.rb +279 -0
  129. data/test/tc_review_control_deadlines.rb +169 -0
  130. data/test/tc_review_followup_transport.rb +583 -0
  131. data/test/tc_review_packet_contracts.rb +369 -0
  132. data/test/tc_review_presentation.rb +213 -0
  133. data/test/tc_review_record_compatibility.rb +101 -0
  134. data/test/tc_review_transport_fixes.rb +195 -0
  135. data/test/tc_review_transport_native.rb +415 -0
  136. data/test/tc_review_validation_priming.rb +178 -0
  137. data/test/tc_rr-opt.rb +5 -2
  138. data/test/tc_rr-unknown.rb +19 -0
  139. data/test/tc_rr.rb +14 -0
  140. data/test/tc_rrset_grouping.rb +50 -0
  141. data/test/tc_rrset_review_fixes.rb +58 -0
  142. data/test/tc_rrsig.rb +21 -1
  143. data/test/tc_scoped_ipv6.rb +153 -0
  144. data/test/tc_scoped_ipv6_select.rb +157 -0
  145. data/test/tc_scoped_ipv6_transport.rb +329 -0
  146. data/test/tc_selector_wakeup.rb +42 -0
  147. data/test/tc_soak.rb +118 -196
  148. data/test/tc_socket_helpers.rb +90 -0
  149. data/test/tc_supporting_lookup_limits.rb +252 -0
  150. data/test/tc_svcb.rb +1043 -0
  151. data/test/tc_svcb_signed_target.rb +145 -0
  152. data/test/tc_svcb_transport.rb +120 -0
  153. data/test/tc_tcp.rb +69 -43
  154. data/test/tc_tcp_pipelining.rb +95 -204
  155. data/test/tc_transport_fork.rb +179 -0
  156. data/test/tc_tsig.rb +2 -2
  157. data/test/tc_tsig_api.rb +251 -0
  158. data/test/tc_tsig_rfc8945.rb +357 -0
  159. data/test/tc_v2_release_dnssec.rb +442 -0
  160. data/test/tc_v2_release_transport.rb +304 -0
  161. data/test/tc_v2_zone_transfer_native.rb +58 -0
  162. data/test/tc_zone_reader.rb +217 -1
  163. data/test/tcp_pipelining_server.rb +150 -0
  164. data/test/ts_offline.rb +77 -6
  165. data/test/ts_online.rb +2 -1
  166. metadata +105 -10
  167. data/.coveralls.yml +0 -2
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'socket'
4
+ require 'resolv'
5
+ require 'thread'
6
+
7
+ module PipelineTest
8
+ # A deliberately small DNS-over-TCP peer. Using the stdlib codec keeps these
9
+ # transport tests independent of both Dnsruby's codec and RubyDNS's server API.
10
+ class Server
11
+ IP = '127.0.0.1'
12
+ ANSWER = '192.0.2.155'
13
+ MAX_REQUESTS = 4
14
+ IDLE_TIMEOUT = 1
15
+
16
+ attr_reader :port
17
+
18
+ def initialize
19
+ @listener = TCPServer.new(IP, 0)
20
+ @port = @listener.addr[1]
21
+ @wake_read, @wake_write = IO.pipe
22
+ @clients = {}
23
+ @mutex = Mutex.new
24
+ @stats = { accepts: 0, connections: 0, timeouts: 0, limits: 0 }
25
+ @worker = Thread.new do
26
+ Thread.current.abort_on_exception = false
27
+ Thread.current.report_on_exception = false
28
+ begin
29
+ run
30
+ rescue StandardError => error
31
+ # Other suites enable Thread.abort_on_exception globally. Capture
32
+ # errors here so those settings cannot abort the test process.
33
+ @error = error
34
+ end
35
+ end
36
+ end
37
+
38
+ def stats
39
+ # Surface fixture failures in the test thread instead of hiding them
40
+ # behind a resolver timeout or aborting the entire suite.
41
+ @worker.value unless @worker.alive?
42
+ raise @error if @error
43
+ @mutex.synchronize { @stats.dup }
44
+ end
45
+
46
+ def stop
47
+ @wake_write.close unless @wake_write.closed?
48
+ unless @worker.join(5)
49
+ @worker.kill
50
+ @worker.join
51
+ raise 'TCP pipelining server did not stop'
52
+ end
53
+ @worker.value
54
+ raise @error if @error
55
+ end
56
+
57
+ private
58
+
59
+ def now
60
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
61
+ end
62
+
63
+ def run
64
+ loop do
65
+ deadline = @clients.values.map { |client| client[:deadline] }.min
66
+ wait = deadline ? [deadline - now, 0].max : nil
67
+ readable = IO.select([@wake_read, @listener] + @clients.keys, nil, nil, wait)
68
+ if readable
69
+ break if readable.first.include?(@wake_read)
70
+ readable.first.each do |socket|
71
+ socket == @listener ? accept : receive(socket)
72
+ end
73
+ end
74
+ @clients.keys.each do |socket|
75
+ disconnect(socket, :timeouts) if @clients.fetch(socket)[:deadline] <= now
76
+ end
77
+ end
78
+ ensure
79
+ @clients.keys.each { |socket| disconnect(socket) }
80
+ @listener.close
81
+ @wake_read.close
82
+ end
83
+
84
+ def accept
85
+ socket = @listener.accept_nonblock(exception: false)
86
+ return if socket == :wait_readable
87
+
88
+ @clients[socket] = { buffer: ''.b, requests: 0, deadline: now + IDLE_TIMEOUT }
89
+ @mutex.synchronize do
90
+ @stats[:accepts] += 1
91
+ @stats[:connections] += 1
92
+ end
93
+ end
94
+
95
+ def receive(socket)
96
+ data = socket.read_nonblock(65_535, exception: false)
97
+ return if data == :wait_readable
98
+ return disconnect(socket) if data.nil?
99
+
100
+ client = @clients.fetch(socket)
101
+ client[:deadline] = now + IDLE_TIMEOUT
102
+ client[:buffer] << data
103
+
104
+ # TCP can split a length prefix or combine several DNS messages in a read.
105
+ while client[:buffer].bytesize >= 2
106
+ length = client[:buffer].unpack1('n')
107
+ break if client[:buffer].bytesize < length + 2
108
+
109
+ client[:buffer].slice!(0, 2)
110
+ query = client[:buffer].slice!(0, length)
111
+ client[:requests] += 1
112
+ if client[:requests] <= MAX_REQUESTS
113
+ response = answer(query)
114
+ socket.write([response.bytesize].pack('n') + response)
115
+ if client[:requests] == MAX_REQUESTS
116
+ @mutex.synchronize { @stats[:limits] += 1 }
117
+ end
118
+ end
119
+ # Drain excess requests before closing on timeout. Closing with unread
120
+ # input can cause a TCP reset instead of the EOF being tested.
121
+ end
122
+ rescue Errno::ECONNRESET, Errno::EPIPE
123
+ disconnect(socket)
124
+ end
125
+
126
+ def answer(bytes)
127
+ query = ::Resolv::DNS::Message.decode(bytes)
128
+ response = ::Resolv::DNS::Message.new(query.id)
129
+ response.qr = 1
130
+ response.aa = 1
131
+ response.rd = query.rd
132
+ response.ra = 1
133
+ query.each_question do |name, type|
134
+ response.add_question(name, type)
135
+ response.add_answer(name, 60, ::Resolv::DNS::Resource::IN::A.new(ANSWER))
136
+ end
137
+ response.encode
138
+ end
139
+
140
+ def disconnect(socket, reason = nil)
141
+ return unless @clients.delete(socket)
142
+
143
+ socket.close
144
+ @mutex.synchronize do
145
+ @stats[:connections] -= 1
146
+ @stats[reason] += 1 if reason
147
+ end
148
+ end
149
+ end
150
+ end
data/test/ts_offline.rb CHANGED
@@ -21,14 +21,61 @@ Dnsruby.log.level = Logger::FATAL
21
21
  # We'll prepend 'tc_' and append '.rb' to these:
22
22
  TESTS = %w(
23
23
  dnskey
24
+ cache_keys
25
+ attempt_configuration
26
+ caa
27
+ review_record_compatibility
28
+ review_validation_priming
29
+ review_cache
24
30
  escapedchars
31
+ edns_retry_regressions
25
32
  gpos
33
+ generic_cache
26
34
  hash
27
35
  header
28
36
  ipseckey
37
+ ipv6
38
+ malformed_tcp
39
+ pipeline_send
40
+ pipeline_retirement
41
+ pipeline_retry
42
+ resolver_concurrency
43
+ resolver_validation
44
+ release_transport
45
+ release_transport_fixes
46
+ v2_release_transport
47
+ v2_zone_transfer_native
48
+ release_negative_cache
49
+ release_recursor_cache
50
+ release_zone_ttls
51
+ release_zone_defaults
52
+ release_configuration_fixes
53
+ release_auxiliary_fixes
54
+ recursor_address_fallback
55
+ recursor_limits
56
+ resolver_configuration_contracts
57
+ release_review_transport
58
+ release_review_transport_native
59
+ review_transport_fixes
60
+ review_control_deadlines
61
+ review_followup_transport
62
+ review_transport_native
63
+ review_packet_contracts
64
+ final_review_fixes
65
+ final_transport_contracts
66
+ protocol_review_fixes
67
+ rrset_review_fixes
68
+ dnssec_recursor_review_fixes
69
+ cancelled_send_capacity
70
+ review_code_mapper
71
+ review_presentation
72
+ record_regressions
73
+ record_codec_contracts
74
+ selector_wakeup
29
75
  message
30
76
  misc
31
77
  name
78
+ nameserver_bootstrap
32
79
  naptr
33
80
  nsec
34
81
  nsec3
@@ -39,15 +86,27 @@ TESTS = %w(
39
86
  packet_unique_push
40
87
  ptrin
41
88
  question
89
+ query_control
42
90
  res_config
43
91
  res_file
44
92
  res_opt
93
+ scoped_ipv6
94
+ scoped_ipv6_select
95
+ scoped_ipv6_transport
45
96
  rr
46
97
  rr-txt
47
98
  rr-unknown
48
99
  rrset
100
+ rrset_grouping
49
101
  rrsig
102
+ svcb
103
+ svcb_transport
104
+ socket_helpers
105
+ tcp_pipelining
106
+ transport_fork
50
107
  tkey
108
+ tsig_api
109
+ tsig_rfc8945
51
110
  update
52
111
  zone_reader
53
112
  )
@@ -64,10 +123,8 @@ def have_open_ssl?
64
123
  have_open_ssl = true
65
124
  begin
66
125
  require "openssl"
67
- OpenSSL::HMAC.digest(OpenSSL::Digest::MD5.new, "key", "data")
68
- key = OpenSSL::PKey::RSA.new
69
- key.e = 111
70
- rescue
126
+ OpenSSL::Digest::SHA256.digest("data")
127
+ rescue LoadError, StandardError
71
128
  have_open_ssl = false
72
129
  end
73
130
  have_open_ssl
@@ -75,9 +132,23 @@ end
75
132
 
76
133
  if have_open_ssl?
77
134
  require_relative 'tc_ds.rb'
135
+ require_relative 'tc_svcb_signed_target.rb'
136
+ require_relative 'tc_dnssec_trust_anchors.rb'
137
+ require_relative 'tc_release_dnssec_fixes.rb'
138
+ require_relative 'tc_release_dnssec_completion.rb'
139
+ require_relative 'tc_v2_release_dnssec.rb'
140
+ require_relative 'tc_dnssec_trust_races.rb'
141
+ require_relative 'tc_key_cache_identity.rb'
142
+ require_relative 'tc_dnssec_budget.rb'
143
+ require_relative 'tc_dnssec_recursion_limits.rb'
144
+ require_relative 'tc_supporting_lookup_limits.rb'
145
+ require_relative 'tc_dnssec_cache_lifetime.rb'
146
+ require_relative 'tc_dnssec_cache_bounds.rb'
147
+ require_relative 'tc_dnssec_wildcard_proofs.rb'
148
+ require_relative 'tc_dnssec_alias_validation.rb'
149
+ require_relative 'tc_dnssec_denial_proofs.rb'
78
150
  else
79
151
  puts "-----------------------------------------------------------------------"
80
- puts "OpenSSL not present (with full functionality) - skipping DS digest test"
152
+ puts "OpenSSL SHA256 unavailable - skipping DS and DNSSEC trust-anchor tests"
81
153
  puts "-----------------------------------------------------------------------"
82
154
  end
83
-
data/test/ts_online.rb CHANGED
@@ -52,6 +52,7 @@ if online?
52
52
  resolver
53
53
  tcp
54
54
  tcp_pipelining
55
+ scoped_ipv6_transport
55
56
  single_resolver
56
57
  cache
57
58
  dns
@@ -114,7 +115,7 @@ if (server_up)
114
115
  have_openssl = false
115
116
  begin
116
117
  require "openssl"
117
- OpenSSL::HMAC.digest(OpenSSL::Digest::MD5.new, "key", "data")
118
+ OpenSSL::HMAC.digest('SHA256', "key", "data")
118
119
  key = OpenSSL::PKey::RSA.new
119
120
  key.e = 111
120
121
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dnsruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.74.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Dalitz
@@ -114,19 +114,19 @@ dependencies:
114
114
  - !ruby/object:Gem::Version
115
115
  version: '0.9'
116
116
  - !ruby/object:Gem::Dependency
117
- name: coveralls
117
+ name: simplecov
118
118
  requirement: !ruby/object:Gem::Requirement
119
119
  requirements:
120
120
  - - "~>"
121
121
  - !ruby/object:Gem::Version
122
- version: 0.8.23
122
+ version: 0.22.0
123
123
  type: :development
124
124
  prerelease: false
125
125
  version_requirements: !ruby/object:Gem::Requirement
126
126
  requirements:
127
127
  - - "~>"
128
128
  - !ruby/object:Gem::Version
129
- version: 0.8.23
129
+ version: 0.22.0
130
130
  - !ruby/object:Gem::Dependency
131
131
  name: base64
132
132
  requirement: !ruby/object:Gem::Requirement
@@ -159,16 +159,22 @@ dependencies:
159
159
  name: simpleidn
160
160
  requirement: !ruby/object:Gem::Requirement
161
161
  requirements:
162
- - - "~>"
162
+ - - ">="
163
163
  - !ruby/object:Gem::Version
164
164
  version: 0.2.1
165
+ - - "<"
166
+ - !ruby/object:Gem::Version
167
+ version: 0.4.0
165
168
  type: :runtime
166
169
  prerelease: false
167
170
  version_requirements: !ruby/object:Gem::Requirement
168
171
  requirements:
169
- - - "~>"
172
+ - - ">="
170
173
  - !ruby/object:Gem::Version
171
174
  version: 0.2.1
175
+ - - "<"
176
+ - !ruby/object:Gem::Version
177
+ version: 0.4.0
172
178
  description: |-
173
179
  Dnsruby is a pure Ruby DNS client library which implements a
174
180
  stub resolver. It aims to comply with all DNS RFCs, including
@@ -182,7 +188,6 @@ extra_rdoc_files:
182
188
  - EXAMPLES
183
189
  - README.md
184
190
  files:
185
- - ".coveralls.yml"
186
191
  - ".github/FUNDING.yml"
187
192
  - ".github/dependabot.yml"
188
193
  - ".github/workflows/ci.yml"
@@ -219,6 +224,7 @@ files:
219
224
  - lib/dnsruby/code_mapper.rb
220
225
  - lib/dnsruby/code_mappers.rb
221
226
  - lib/dnsruby/config.rb
227
+ - lib/dnsruby/deadline_queue.rb
222
228
  - lib/dnsruby/dnssec.rb
223
229
  - lib/dnsruby/hosts.rb
224
230
  - lib/dnsruby/ipv4.rb
@@ -232,6 +238,8 @@ files:
232
238
  - lib/dnsruby/message/section.rb
233
239
  - lib/dnsruby/name.rb
234
240
  - lib/dnsruby/packet_sender.rb
241
+ - lib/dnsruby/presentation.rb
242
+ - lib/dnsruby/query_control.rb
235
243
  - lib/dnsruby/recursor.rb
236
244
  - lib/dnsruby/resolv.rb
237
245
  - lib/dnsruby/resolver.rb
@@ -250,6 +258,7 @@ files:
250
258
  - lib/dnsruby/resource/GPOS.rb
251
259
  - lib/dnsruby/resource/HINFO.rb
252
260
  - lib/dnsruby/resource/HIP.rb
261
+ - lib/dnsruby/resource/HTTPS.rb
253
262
  - lib/dnsruby/resource/IN.rb
254
263
  - lib/dnsruby/resource/IPSECKEY.rb
255
264
  - lib/dnsruby/resource/ISDN.rb
@@ -274,6 +283,7 @@ files:
274
283
  - lib/dnsruby/resource/SPF.rb
275
284
  - lib/dnsruby/resource/SRV.rb
276
285
  - lib/dnsruby/resource/SSHFP.rb
286
+ - lib/dnsruby/resource/SVCB.rb
277
287
  - lib/dnsruby/resource/TKEY.rb
278
288
  - lib/dnsruby/resource/TLSA.rb
279
289
  - lib/dnsruby/resource/TSIG.rb
@@ -282,42 +292,75 @@ files:
282
292
  - lib/dnsruby/resource/X25.rb
283
293
  - lib/dnsruby/resource/domain_name.rb
284
294
  - lib/dnsruby/resource/generic.rb
295
+ - lib/dnsruby/resource/generic_cache.rb
296
+ - lib/dnsruby/resource/generic_constants.rb
285
297
  - lib/dnsruby/resource/resource.rb
286
298
  - lib/dnsruby/resource/type_bitmap.rb
287
299
  - lib/dnsruby/select_thread.rb
300
+ - lib/dnsruby/serial_time.rb
288
301
  - lib/dnsruby/single_resolver.rb
289
302
  - lib/dnsruby/single_verifier.rb
290
303
  - lib/dnsruby/the_log.rb
304
+ - lib/dnsruby/transport_clock.rb
291
305
  - lib/dnsruby/update.rb
306
+ - lib/dnsruby/validation_budget.rb
292
307
  - lib/dnsruby/validator_thread.rb
293
308
  - lib/dnsruby/version.rb
294
309
  - lib/dnsruby/zone_reader.rb
295
310
  - lib/dnsruby/zone_transfer.rb
311
+ - test/ci_watchdog.rb
296
312
  - test/custom.txt
313
+ - test/fixtures/org-ds-2026-11-05.zone
314
+ - test/fixtures/root-dnskey-2026-11-05.zone
315
+ - test/fork_test_helper.rb
316
+ - test/local_dns_server.rb
297
317
  - test/localdns.rb
298
318
  - test/resolv.conf
299
319
  - test/run-tests-individually
320
+ - test/soak_server.rb
321
+ - test/socket_helpers.rb
300
322
  - test/spec_helper.rb
323
+ - test/tc_attempt_configuration.rb
301
324
  - test/tc_axfr.rb
302
325
  - test/tc_caa.rb
303
326
  - test/tc_cache.rb
327
+ - test/tc_cache_keys.rb
328
+ - test/tc_cancelled_send_capacity.rb
304
329
  - test/tc_dlv.rb
305
330
  - test/tc_dns.rb
306
331
  - test/tc_dnskey.rb
332
+ - test/tc_dnssec_alias_validation.rb
333
+ - test/tc_dnssec_budget.rb
334
+ - test/tc_dnssec_cache_bounds.rb
335
+ - test/tc_dnssec_cache_lifetime.rb
336
+ - test/tc_dnssec_denial_proofs.rb
337
+ - test/tc_dnssec_recursion_limits.rb
338
+ - test/tc_dnssec_recursor_review_fixes.rb
339
+ - test/tc_dnssec_trust_anchors.rb
340
+ - test/tc_dnssec_trust_races.rb
341
+ - test/tc_dnssec_wildcard_proofs.rb
307
342
  - test/tc_ds.rb
308
343
  - test/tc_ecdsa.rb
344
+ - test/tc_edns_retry_regressions.rb
309
345
  - test/tc_encoding.rb
310
346
  - test/tc_escapedchars.rb
347
+ - test/tc_final_review_fixes.rb
348
+ - test/tc_final_transport_contracts.rb
349
+ - test/tc_generic_cache.rb
311
350
  - test/tc_gpos.rb
312
351
  - test/tc_hash.rb
313
352
  - test/tc_header.rb
314
353
  - test/tc_hip.rb
315
354
  - test/tc_hs.rb
316
355
  - test/tc_ipseckey.rb
356
+ - test/tc_ipv6.rb
357
+ - test/tc_key_cache_identity.rb
317
358
  - test/tc_long_labels.rb
359
+ - test/tc_malformed_tcp.rb
318
360
  - test/tc_message.rb
319
361
  - test/tc_misc.rb
320
362
  - test/tc_name.rb
363
+ - test/tc_nameserver_bootstrap.rb
321
364
  - test/tc_naptr.rb
322
365
  - test/tc_nsec.rb
323
366
  - test/tc_nsec3.rb
@@ -325,35 +368,87 @@ files:
325
368
  - test/tc_nxt.rb
326
369
  - test/tc_packet.rb
327
370
  - test/tc_packet_unique_push.rb
371
+ - test/tc_pipeline_retirement.rb
372
+ - test/tc_pipeline_retry.rb
373
+ - test/tc_pipeline_send.rb
374
+ - test/tc_protocol_review_fixes.rb
328
375
  - test/tc_ptrin.rb
376
+ - test/tc_query_control.rb
329
377
  - test/tc_question.rb
330
378
  - test/tc_queue.rb
379
+ - test/tc_record_codec_contracts.rb
380
+ - test/tc_record_regressions.rb
331
381
  - test/tc_recur.rb
382
+ - test/tc_recursor_address_fallback.rb
383
+ - test/tc_recursor_limits.rb
384
+ - test/tc_release_auxiliary_fixes.rb
385
+ - test/tc_release_configuration_fixes.rb
386
+ - test/tc_release_dnssec_completion.rb
387
+ - test/tc_release_dnssec_fixes.rb
388
+ - test/tc_release_negative_cache.rb
389
+ - test/tc_release_recursor_cache.rb
390
+ - test/tc_release_review_transport.rb
391
+ - test/tc_release_review_transport_native.rb
392
+ - test/tc_release_transport.rb
393
+ - test/tc_release_transport_fixes.rb
394
+ - test/tc_release_zone_defaults.rb
395
+ - test/tc_release_zone_ttls.rb
332
396
  - test/tc_res_config.rb
333
397
  - test/tc_res_env.rb
334
398
  - test/tc_res_file.rb
335
399
  - test/tc_res_opt.rb
336
400
  - test/tc_resolv.rb
337
401
  - test/tc_resolver.rb
402
+ - test/tc_resolver_concurrency.rb
403
+ - test/tc_resolver_configuration_contracts.rb
404
+ - test/tc_resolver_validation.rb
405
+ - test/tc_review_cache.rb
406
+ - test/tc_review_code_mapper.rb
407
+ - test/tc_review_control_deadlines.rb
408
+ - test/tc_review_followup_transport.rb
409
+ - test/tc_review_packet_contracts.rb
410
+ - test/tc_review_presentation.rb
411
+ - test/tc_review_record_compatibility.rb
412
+ - test/tc_review_transport_fixes.rb
413
+ - test/tc_review_transport_native.rb
414
+ - test/tc_review_validation_priming.rb
338
415
  - test/tc_rr-opt.rb
339
416
  - test/tc_rr-txt.rb
340
417
  - test/tc_rr-unknown.rb
341
418
  - test/tc_rr.rb
342
419
  - test/tc_rrset.rb
420
+ - test/tc_rrset_grouping.rb
421
+ - test/tc_rrset_review_fixes.rb
343
422
  - test/tc_rrsig.rb
423
+ - test/tc_scoped_ipv6.rb
424
+ - test/tc_scoped_ipv6_select.rb
425
+ - test/tc_scoped_ipv6_transport.rb
426
+ - test/tc_selector_wakeup.rb
344
427
  - test/tc_single_resolver.rb
345
428
  - test/tc_soak.rb
346
429
  - test/tc_soak_base.rb
430
+ - test/tc_socket_helpers.rb
347
431
  - test/tc_sshfp.rb
432
+ - test/tc_supporting_lookup_limits.rb
433
+ - test/tc_svcb.rb
434
+ - test/tc_svcb_signed_target.rb
435
+ - test/tc_svcb_transport.rb
348
436
  - test/tc_tcp.rb
349
437
  - test/tc_tcp_pipelining.rb
350
438
  - test/tc_tkey.rb
351
439
  - test/tc_tlsa.rb
440
+ - test/tc_transport_fork.rb
352
441
  - test/tc_tsig.rb
442
+ - test/tc_tsig_api.rb
443
+ - test/tc_tsig_rfc8945.rb
353
444
  - test/tc_update.rb
445
+ - test/tc_v2_release_dnssec.rb
446
+ - test/tc_v2_release_transport.rb
447
+ - test/tc_v2_zone_transfer_native.rb
354
448
  - test/tc_validator.rb
355
449
  - test/tc_verifier.rb
356
450
  - test/tc_zone_reader.rb
451
+ - test/tcp_pipelining_server.rb
357
452
  - test/test_dnsserver.rb
358
453
  - test/test_utils.rb
359
454
  - test/ts_dnsruby.rb
@@ -361,7 +456,7 @@ files:
361
456
  - test/ts_online.rb
362
457
  homepage: https://github.com/alexdalitz/dnsruby
363
458
  licenses:
364
- - Apache License, Version 2.0
459
+ - Apache-2.0
365
460
  metadata:
366
461
  yard.run: yard
367
462
  bug_tracker_uri: https://github.com/alexdalitz/dnsruby/issues
@@ -380,14 +475,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
380
475
  requirements:
381
476
  - - ">="
382
477
  - !ruby/object:Gem::Version
383
- version: 2.8.0
478
+ version: 3.0.0
384
479
  required_rubygems_version: !ruby/object:Gem::Requirement
385
480
  requirements:
386
481
  - - ">="
387
482
  - !ruby/object:Gem::Version
388
483
  version: '0'
389
484
  requirements: []
390
- rubygems_version: 3.7.2
485
+ rubygems_version: 4.0.19
391
486
  specification_version: 4
392
487
  summary: Ruby DNS(SEC) implementation
393
488
  test_files:
data/.coveralls.yml DELETED
@@ -1,2 +0,0 @@
1
- service_name: travis-ci
2
- repo_token: 99b5l6CKFt3CC4rxYUetvDQvKtaTgCJW2