dnsruby 1.73.1 → 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 +314 -1
  7. data/Rakefile +0 -3
  8. data/demo/axfr.rb +24 -6
  9. data/dnsruby.gemspec +6 -4
  10. data/lib/dnsruby/cache.rb +279 -49
  11. data/lib/dnsruby/code_mapper.rb +35 -8
  12. data/lib/dnsruby/code_mappers.rb +63 -49
  13. data/lib/dnsruby/config.rb +77 -4
  14. data/lib/dnsruby/deadline_queue.rb +75 -0
  15. data/lib/dnsruby/dnssec.rb +148 -45
  16. data/lib/dnsruby/ipv6.rb +45 -5
  17. data/lib/dnsruby/key_cache.rb +202 -35
  18. data/lib/dnsruby/message/decoder.rb +85 -19
  19. data/lib/dnsruby/message/encoder.rb +27 -16
  20. data/lib/dnsruby/message/header.rb +8 -12
  21. data/lib/dnsruby/message/message.rb +53 -22
  22. data/lib/dnsruby/message/section.rb +12 -34
  23. data/lib/dnsruby/name.rb +5 -2
  24. data/lib/dnsruby/packet_sender.rb +664 -207
  25. data/lib/dnsruby/presentation.rb +147 -0
  26. data/lib/dnsruby/query_control.rb +132 -0
  27. data/lib/dnsruby/recursor.rb +798 -341
  28. data/lib/dnsruby/resolver.rb +472 -176
  29. data/lib/dnsruby/resource/CAA.rb +67 -16
  30. data/lib/dnsruby/resource/DLV.rb +6 -0
  31. data/lib/dnsruby/resource/DNSKEY.rb +108 -16
  32. data/lib/dnsruby/resource/DS.rb +27 -28
  33. data/lib/dnsruby/resource/HTTPS.rb +16 -0
  34. data/lib/dnsruby/resource/IN.rb +21 -2
  35. data/lib/dnsruby/resource/MX.rb +2 -2
  36. data/lib/dnsruby/resource/NSEC.rb +6 -10
  37. data/lib/dnsruby/resource/NSEC3.rb +55 -19
  38. data/lib/dnsruby/resource/NSEC3PARAM.rb +4 -6
  39. data/lib/dnsruby/resource/OPT.rb +2 -3
  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 +986 -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 +53 -2
  122. data/test/tc_res_opt.rb +21 -1
  123. data/test/tc_resolver.rb +34 -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 +127 -14
  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,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dnsruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.73.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Dalitz
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-11-05 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: rake
@@ -80,6 +79,26 @@ dependencies:
80
79
  - - ">="
81
80
  - !ruby/object:Gem::Version
82
81
  version: 0.3.1
82
+ - !ruby/object:Gem::Dependency
83
+ name: rdoc
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '6.5'
89
+ - - "<"
90
+ - !ruby/object:Gem::Version
91
+ version: '8.0'
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '6.5'
99
+ - - "<"
100
+ - !ruby/object:Gem::Version
101
+ version: '8.0'
83
102
  - !ruby/object:Gem::Dependency
84
103
  name: yard
85
104
  requirement: !ruby/object:Gem::Requirement
@@ -95,19 +114,19 @@ dependencies:
95
114
  - !ruby/object:Gem::Version
96
115
  version: '0.9'
97
116
  - !ruby/object:Gem::Dependency
98
- name: coveralls
117
+ name: simplecov
99
118
  requirement: !ruby/object:Gem::Requirement
100
119
  requirements:
101
120
  - - "~>"
102
121
  - !ruby/object:Gem::Version
103
- version: 0.8.23
122
+ version: 0.22.0
104
123
  type: :development
105
124
  prerelease: false
106
125
  version_requirements: !ruby/object:Gem::Requirement
107
126
  requirements:
108
127
  - - "~>"
109
128
  - !ruby/object:Gem::Version
110
- version: 0.8.23
129
+ version: 0.22.0
111
130
  - !ruby/object:Gem::Dependency
112
131
  name: base64
113
132
  requirement: !ruby/object:Gem::Requirement
@@ -140,16 +159,22 @@ dependencies:
140
159
  name: simpleidn
141
160
  requirement: !ruby/object:Gem::Requirement
142
161
  requirements:
143
- - - "~>"
162
+ - - ">="
144
163
  - !ruby/object:Gem::Version
145
164
  version: 0.2.1
165
+ - - "<"
166
+ - !ruby/object:Gem::Version
167
+ version: 0.4.0
146
168
  type: :runtime
147
169
  prerelease: false
148
170
  version_requirements: !ruby/object:Gem::Requirement
149
171
  requirements:
150
- - - "~>"
172
+ - - ">="
151
173
  - !ruby/object:Gem::Version
152
174
  version: 0.2.1
175
+ - - "<"
176
+ - !ruby/object:Gem::Version
177
+ version: 0.4.0
153
178
  description: |-
154
179
  Dnsruby is a pure Ruby DNS client library which implements a
155
180
  stub resolver. It aims to comply with all DNS RFCs, including
@@ -159,11 +184,10 @@ executables: []
159
184
  extensions: []
160
185
  extra_rdoc_files:
161
186
  - DNSSEC
187
+ - EVENTMACHINE
162
188
  - EXAMPLES
163
189
  - README.md
164
- - EVENTMACHINE
165
190
  files:
166
- - ".coveralls.yml"
167
191
  - ".github/FUNDING.yml"
168
192
  - ".github/dependabot.yml"
169
193
  - ".github/workflows/ci.yml"
@@ -200,6 +224,7 @@ files:
200
224
  - lib/dnsruby/code_mapper.rb
201
225
  - lib/dnsruby/code_mappers.rb
202
226
  - lib/dnsruby/config.rb
227
+ - lib/dnsruby/deadline_queue.rb
203
228
  - lib/dnsruby/dnssec.rb
204
229
  - lib/dnsruby/hosts.rb
205
230
  - lib/dnsruby/ipv4.rb
@@ -213,6 +238,8 @@ files:
213
238
  - lib/dnsruby/message/section.rb
214
239
  - lib/dnsruby/name.rb
215
240
  - lib/dnsruby/packet_sender.rb
241
+ - lib/dnsruby/presentation.rb
242
+ - lib/dnsruby/query_control.rb
216
243
  - lib/dnsruby/recursor.rb
217
244
  - lib/dnsruby/resolv.rb
218
245
  - lib/dnsruby/resolver.rb
@@ -231,6 +258,7 @@ files:
231
258
  - lib/dnsruby/resource/GPOS.rb
232
259
  - lib/dnsruby/resource/HINFO.rb
233
260
  - lib/dnsruby/resource/HIP.rb
261
+ - lib/dnsruby/resource/HTTPS.rb
234
262
  - lib/dnsruby/resource/IN.rb
235
263
  - lib/dnsruby/resource/IPSECKEY.rb
236
264
  - lib/dnsruby/resource/ISDN.rb
@@ -255,6 +283,7 @@ files:
255
283
  - lib/dnsruby/resource/SPF.rb
256
284
  - lib/dnsruby/resource/SRV.rb
257
285
  - lib/dnsruby/resource/SSHFP.rb
286
+ - lib/dnsruby/resource/SVCB.rb
258
287
  - lib/dnsruby/resource/TKEY.rb
259
288
  - lib/dnsruby/resource/TLSA.rb
260
289
  - lib/dnsruby/resource/TSIG.rb
@@ -263,42 +292,75 @@ files:
263
292
  - lib/dnsruby/resource/X25.rb
264
293
  - lib/dnsruby/resource/domain_name.rb
265
294
  - lib/dnsruby/resource/generic.rb
295
+ - lib/dnsruby/resource/generic_cache.rb
296
+ - lib/dnsruby/resource/generic_constants.rb
266
297
  - lib/dnsruby/resource/resource.rb
267
298
  - lib/dnsruby/resource/type_bitmap.rb
268
299
  - lib/dnsruby/select_thread.rb
300
+ - lib/dnsruby/serial_time.rb
269
301
  - lib/dnsruby/single_resolver.rb
270
302
  - lib/dnsruby/single_verifier.rb
271
303
  - lib/dnsruby/the_log.rb
304
+ - lib/dnsruby/transport_clock.rb
272
305
  - lib/dnsruby/update.rb
306
+ - lib/dnsruby/validation_budget.rb
273
307
  - lib/dnsruby/validator_thread.rb
274
308
  - lib/dnsruby/version.rb
275
309
  - lib/dnsruby/zone_reader.rb
276
310
  - lib/dnsruby/zone_transfer.rb
311
+ - test/ci_watchdog.rb
277
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
278
317
  - test/localdns.rb
279
318
  - test/resolv.conf
280
319
  - test/run-tests-individually
320
+ - test/soak_server.rb
321
+ - test/socket_helpers.rb
281
322
  - test/spec_helper.rb
323
+ - test/tc_attempt_configuration.rb
282
324
  - test/tc_axfr.rb
283
325
  - test/tc_caa.rb
284
326
  - test/tc_cache.rb
327
+ - test/tc_cache_keys.rb
328
+ - test/tc_cancelled_send_capacity.rb
285
329
  - test/tc_dlv.rb
286
330
  - test/tc_dns.rb
287
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
288
342
  - test/tc_ds.rb
289
343
  - test/tc_ecdsa.rb
344
+ - test/tc_edns_retry_regressions.rb
290
345
  - test/tc_encoding.rb
291
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
292
350
  - test/tc_gpos.rb
293
351
  - test/tc_hash.rb
294
352
  - test/tc_header.rb
295
353
  - test/tc_hip.rb
296
354
  - test/tc_hs.rb
297
355
  - test/tc_ipseckey.rb
356
+ - test/tc_ipv6.rb
357
+ - test/tc_key_cache_identity.rb
298
358
  - test/tc_long_labels.rb
359
+ - test/tc_malformed_tcp.rb
299
360
  - test/tc_message.rb
300
361
  - test/tc_misc.rb
301
362
  - test/tc_name.rb
363
+ - test/tc_nameserver_bootstrap.rb
302
364
  - test/tc_naptr.rb
303
365
  - test/tc_nsec.rb
304
366
  - test/tc_nsec3.rb
@@ -306,35 +368,87 @@ files:
306
368
  - test/tc_nxt.rb
307
369
  - test/tc_packet.rb
308
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
309
375
  - test/tc_ptrin.rb
376
+ - test/tc_query_control.rb
310
377
  - test/tc_question.rb
311
378
  - test/tc_queue.rb
379
+ - test/tc_record_codec_contracts.rb
380
+ - test/tc_record_regressions.rb
312
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
313
396
  - test/tc_res_config.rb
314
397
  - test/tc_res_env.rb
315
398
  - test/tc_res_file.rb
316
399
  - test/tc_res_opt.rb
317
400
  - test/tc_resolv.rb
318
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
319
415
  - test/tc_rr-opt.rb
320
416
  - test/tc_rr-txt.rb
321
417
  - test/tc_rr-unknown.rb
322
418
  - test/tc_rr.rb
323
419
  - test/tc_rrset.rb
420
+ - test/tc_rrset_grouping.rb
421
+ - test/tc_rrset_review_fixes.rb
324
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
325
427
  - test/tc_single_resolver.rb
326
428
  - test/tc_soak.rb
327
429
  - test/tc_soak_base.rb
430
+ - test/tc_socket_helpers.rb
328
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
329
436
  - test/tc_tcp.rb
330
437
  - test/tc_tcp_pipelining.rb
331
438
  - test/tc_tkey.rb
332
439
  - test/tc_tlsa.rb
440
+ - test/tc_transport_fork.rb
333
441
  - test/tc_tsig.rb
442
+ - test/tc_tsig_api.rb
443
+ - test/tc_tsig_rfc8945.rb
334
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
335
448
  - test/tc_validator.rb
336
449
  - test/tc_verifier.rb
337
450
  - test/tc_zone_reader.rb
451
+ - test/tcp_pipelining_server.rb
338
452
  - test/test_dnsserver.rb
339
453
  - test/test_utils.rb
340
454
  - test/ts_dnsruby.rb
@@ -342,7 +456,7 @@ files:
342
456
  - test/ts_online.rb
343
457
  homepage: https://github.com/alexdalitz/dnsruby
344
458
  licenses:
345
- - Apache License, Version 2.0
459
+ - Apache-2.0
346
460
  metadata:
347
461
  yard.run: yard
348
462
  bug_tracker_uri: https://github.com/alexdalitz/dnsruby/issues
@@ -361,15 +475,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
361
475
  requirements:
362
476
  - - ">="
363
477
  - !ruby/object:Gem::Version
364
- version: 2.8.0
478
+ version: 3.0.0
365
479
  required_rubygems_version: !ruby/object:Gem::Requirement
366
480
  requirements:
367
481
  - - ">="
368
482
  - !ruby/object:Gem::Version
369
483
  version: '0'
370
484
  requirements: []
371
- rubygems_version: 3.5.16
372
- signing_key:
485
+ rubygems_version: 4.0.19
373
486
  specification_version: 4
374
487
  summary: Ruby DNS(SEC) implementation
375
488
  test_files:
data/.coveralls.yml DELETED
@@ -1,2 +0,0 @@
1
- service_name: travis-ci
2
- repo_token: 99b5l6CKFt3CC4rxYUetvDQvKtaTgCJW2