dnsruby 1.60.2 → 1.61.1

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
2
  SHA1:
3
- metadata.gz: 286d5426865cf680082a434f91ceb9004ef616ca
4
- data.tar.gz: b6dfef1f6420e1246c074c86de4ddac5260ba02a
3
+ metadata.gz: 809b0ba42057c7e1dbec1239f295b2766b345c08
4
+ data.tar.gz: fdcd08cf292f773ac6e1423acdbee6d810ffd1c5
5
5
  SHA512:
6
- metadata.gz: d447b1b997edfad80524e859f7088143e6b48dc3da6fdbf942777ff8d1f8ad40d09944b8679965ea1623804ecc92c54814d271d7faec73e858a5836d14196173
7
- data.tar.gz: 5f4c06324994a7c07b2257cfaef48b2f482305189fad014a846cf88ccd91988e480949c3279f824e401724a1be7fd83d8427fc766a2b486f898c04430bcdab51
6
+ metadata.gz: ec0a38bb9fb0c517736727579606fa82bf04d03b81a918a19e1f660da746e6333c136f7fd9bb51f804d84d4132a6f9ea73a7dab7e3b2235b3c0aa4562efe4fa4
7
+ data.tar.gz: 2445c9aa9154a253a9c32c300d11b4166eaa2366be18dc8d6732f6ac3b4df5a5e64afa724ca59155ab8b425023239ac86ab309042b19b6d84d0cdd4a4508bdd1
@@ -2,13 +2,13 @@ language: ruby
2
2
  cache: bundler
3
3
  sudo: false
4
4
 
5
+ before_install: gem install bundler
6
+
5
7
  script: "bundle exec rake test"
6
8
 
7
9
  rvm:
8
10
  - 2.0.0
9
- - 2.1.4
11
+ - 2.4.1
10
12
  - 2.3.0
11
- # - rbx-2
12
- - ruby-head
13
- # - jruby-head
14
- # - ree
13
+ - 2.5.1
14
+
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
+
5
+ gem "addressable", "~> 2.5"
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  [![Build Status](https://travis-ci.org/alexdalitz/dnsruby.svg?branch=master)](https://travis-ci.org/alexdalitz/dnsruby)
2
2
  [![Coverage Status](https://img.shields.io/coveralls/alexdalitz/dnsruby.svg)](https://coveralls.io/r/alexdalitz/dnsruby?branch=master)
3
3
 
4
+ <img src="http://caerkettontech.com/dnsruby/DNSRuby-colour-mid.png" width="200" height="200" />
5
+
4
6
  Dnsruby
5
7
  =======
6
8
 
@@ -16,10 +18,10 @@ queries. It is therefore suitable for high volume DNS applications.
16
18
 
17
19
  The following is a (non-exhaustive) list of features :
18
20
 
19
- - Implemented RRs : A, AAAA, AFSDB, ANY, CERT, CNAME, DNAME, GPOS,
20
- HINFO, ISDN, LOC, MB, MG, MINFO, MR, MX, NAPTR, NS, NSAP, NXT,
21
- OPT, PTR, PX, RP, RT, SOA, SPF, SRV, TKEY, TSIG, TXT, WKS,
22
- X25, DNSKEY, RRSIG, NSEC, NSEC3, NSEC3PARAM, DS, DLV
21
+ - Implemented RRs : A, AAAA, AFSDB, ANY, CAA, CERT, CNAME, DNAME,
22
+ GPOS, HINFO, ISDN, LOC, MB, MG, MINFO, MR, MX, NAPTR, NS, NSAP,
23
+ NXT, OPT, PTR, PX, RP, RT, SOA, SPF, SRV, TKEY, TSIG, TXT,
24
+ WKS, X25, DNSKEY, RRSIG, NSEC, NSEC3, NSEC3PARAM, DS, DLV
23
25
 
24
26
  - Generic RR types supported (RFC3597)
25
27
 
@@ -1,5 +1,25 @@
1
1
  # Release Notes
2
2
 
3
+ ## v1.61.1
4
+
5
+ * Add Addressable as a gem runtime dependency
6
+
7
+ ## v1.61.0
8
+
9
+ * Add URI, CDS and CDNSKEY records
10
+ * Supply port to DNS.new as optiona parameter
11
+ * Supply timeout to zone transfer connect
12
+ * Fix multi-line strings
13
+ * Try absolute name as candidate in DNS even if not dot supplied
14
+ * Do not try to generate candidates if no domain is given
15
+ * Handle new OpenSSL interface as well as old
16
+ * Handle new DSA interface
17
+ * fix encode error select thread issue
18
+ * handle encoding errors
19
+ * add punycode support
20
+ * Make sure dnssec is enabled in verifier and also in digroot demo
21
+ * Other minor fixes and changes to test code and infrastructure
22
+
3
23
  ## v1.60.2
4
24
 
5
25
  * Fix deletion of TXT records with spaces in dynamic updates (thanks Sean Dilda)
@@ -51,7 +51,9 @@ end
51
51
 
52
52
  inner_resolver = Dnsruby::Resolver.new
53
53
  inner_resolver.do_validation = true
54
+ inner_resolver.dnssec = true
54
55
  resolver = Dnsruby::Recursor.new(inner_resolver)
56
+ resolver.dnssec = true
55
57
 
56
58
  # Dnsruby::TheLog.level=Logger::DEBUG
57
59
 
@@ -40,5 +40,7 @@ DNSSEC NSEC3 support.'
40
40
  if RUBY_VERSION >= "1.9.3"
41
41
  s.add_development_dependency 'coveralls', '~> 0.7'
42
42
  end
43
+
44
+ s.add_runtime_dependency 'addressable', '~> 2.5'
43
45
  end
44
46
 
@@ -162,6 +162,8 @@ module Dnsruby
162
162
  NSEC3PARAM= 51 # RFC still pending at time of writing
163
163
  TLSA = 52 # RFC 6698
164
164
  HIP = 55 # RFC 5205
165
+ CDS = 59 # RFC 7344
166
+ CDNSKEY = 60 # RFC 7344
165
167
  SPF = 99 # RFC 4408
166
168
  UINFO = 100 # non-standard
167
169
  UID = 101 # non-standard
@@ -174,6 +176,7 @@ module Dnsruby
174
176
  MAILB = 253 # RFC 1035 (MB, MG, MR)
175
177
  MAILA = 254 # RFC 1035 (obsolete - see MX)
176
178
  ANY = 255 # RFC 1035
179
+ URI = 256 # RFC 7553
177
180
  CAA = 257 # RFC 6844
178
181
  DLV = 32769 # RFC 4431 (informational)
179
182
  update()
@@ -101,6 +101,7 @@ module Dnsruby
101
101
  dom=""
102
102
  nd = 1
103
103
  @ndots = 1
104
+ @port = 53
104
105
  @apply_search_list = true
105
106
  @apply_domain = true
106
107
  config_hash = Config.default_config_hash
@@ -122,6 +123,7 @@ module Dnsruby
122
123
  ns = config_hash[:nameserver] if config_hash.include? :nameserver
123
124
  s = config_hash[:search] if config_hash.include? :search
124
125
  nd = config_hash[:ndots] if config_hash.include? :ndots
126
+ p = config_hash[:port] if config_hash.include? :port
125
127
  @apply_search_list = config_hash[:apply_search_list] if config_hash.include? :apply_search_list
126
128
  @apply_domain= config_hash[:apply_domain] if config_hash.include? :apply_domain
127
129
  dom = config_hash[:domain] if config_hash.include? :domain
@@ -132,6 +134,7 @@ module Dnsruby
132
134
  @configured = true
133
135
  send("search=",s)
134
136
  send("ndots=",nd)
137
+ send("port=",p)
135
138
  send("domain=",dom)
136
139
  }
137
140
  Dnsruby.log.info{to_s}
@@ -159,6 +162,15 @@ module Dnsruby
159
162
  end
160
163
  end
161
164
 
165
+ # Set port
166
+ def port=(p)
167
+ @configured = true
168
+ @port=p
169
+ if !@port.kind_of?(Integer)
170
+ raise ArgumentError.new("invalid port config: #{@port.inspect}")
171
+ end
172
+ end
173
+
162
174
  # Set the default search path
163
175
  def search=(s)
164
176
  @configured = true
@@ -303,6 +315,7 @@ module Dnsruby
303
315
  search = nil
304
316
  domain = nil
305
317
  ndots = 1
318
+ port = 53
306
319
  open(filename) {|f|
307
320
  f.each {|line|
308
321
  line.sub!(/[#;].*/, '')
@@ -312,6 +325,8 @@ module Dnsruby
312
325
  }
313
326
  next unless keyword
314
327
  case keyword
328
+ when 'port'
329
+ port = args[0].to_i
315
330
  when 'nameserver'
316
331
  nameserver += args
317
332
  when 'domain'
@@ -337,7 +352,7 @@ module Dnsruby
337
352
  end
338
353
  }
339
354
  }
340
- return { :nameserver => nameserver, :domain => domain, :search => search, :ndots => ndots }
355
+ return { :nameserver => nameserver, :domain => domain, :search => search, :ndots => ndots, :port => port }
341
356
  end
342
357
 
343
358
  def inspect #:nodoc: all
@@ -357,6 +372,7 @@ module Dnsruby
357
372
  ret += " domain : #{domain_string}, search : "
358
373
  search.each {|s| ret += s + ", " }
359
374
  ret += " ndots : #{@ndots}"
375
+ ret += " port : #{@port}"
360
376
  return ret
361
377
  end
362
378
 
@@ -423,18 +439,21 @@ module Dnsruby
423
439
  end
424
440
  end
425
441
 
426
- def generate_candidates(name) #:nodoc: all
442
+ def generate_candidates(name_in) #:nodoc: all
427
443
  if !@configured
428
444
  parse_config
429
445
  end
430
446
  candidates = []
431
- name = Name.create(name)
447
+ name = Name.create(name_in)
432
448
  if name.absolute?
433
449
  candidates = [name]
434
450
  else
451
+ candidates.push(Name.create(name_in.to_s + "."))
435
452
  if (@apply_domain)
436
453
  if @ndots > name.length - 1
437
- candidates.push(Name.create(name.to_a+@domain))
454
+ if (@domain != nil)
455
+ candidates.push(Name.create(name.to_a+@domain))
456
+ end
438
457
  end
439
458
  end
440
459
  if (!@apply_search_list)
@@ -18,7 +18,7 @@ class MessageEncoder #:nodoc: all
18
18
  begin
19
19
  @data << d.pack(template)
20
20
  rescue Encoding::CompatibilityError => e
21
- raise Dnsruby::OtherResolvError.new("IDN support currently requires punycode string")
21
+ raise Dnsruby::EncodeError.new("IDN support currently requires punycode string")
22
22
  end
23
23
  end
24
24
 
@@ -36,7 +36,7 @@ class MessageEncoder #:nodoc: all
36
36
  self.put_pack("C", d.length)
37
37
  @data << d
38
38
  rescue Encoding::CompatibilityError => e
39
- raise Dnsruby::OtherResolvError.new("IDN support currently requires punycode string")
39
+ raise Dnsruby::EncodeError.new("IDN support currently requires punycode string")
40
40
  end
41
41
  end
42
42
 
@@ -190,29 +190,29 @@ class Header
190
190
  retval = ";; id = #{@id}\n"
191
191
 
192
192
  if (@opcode == OpCode::Update)
193
- retval += ";; qr = #{@qr} " +\
194
- "opcode = #{@opcode.string} "+\
193
+ retval += ";; qr = #{@qr} " \
194
+ "opcode = #{@opcode.string} "\
195
195
  "rcode = #{@rcode.string}\n"
196
196
 
197
- retval += ";; zocount = #{@qdcount} "+\
198
- "prcount = #{@ancount} " +\
199
- "upcount = #{@nscount} " +\
197
+ retval += ";; zocount = #{@qdcount} "\
198
+ "prcount = #{@ancount} " \
199
+ "upcount = #{@nscount} " \
200
200
  "adcount = #{@arcount}\n"
201
201
  else
202
- retval += ";; qr = #{@qr} " +\
203
- "opcode = #{@opcode.string} " +\
204
- "aa = #{@aa} " +\
205
- "tc = #{@tc} " +\
202
+ retval += ";; qr = #{@qr} " \
203
+ "opcode = #{@opcode.string} " \
204
+ "aa = #{@aa} " \
205
+ "tc = #{@tc} " \
206
206
  "rd = #{@rd}\n"
207
207
 
208
- retval += ";; ra = #{@ra} " +\
209
- "ad = #{@ad} " +\
210
- "cd = #{@cd} " +\
208
+ retval += ";; ra = #{@ra} " \
209
+ "ad = #{@ad} " \
210
+ "cd = #{@cd} " \
211
211
  "rcode = #{rcode.string}\n"
212
212
 
213
- retval += ";; qdcount = #{@qdcount} " +\
214
- "ancount = #{@ancount} " +\
215
- "nscount = #{@nscount} " +\
213
+ retval += ";; qdcount = #{@qdcount} " \
214
+ "ancount = #{@ancount} " \
215
+ "nscount = #{@nscount} " \
216
216
  "arcount = #{@arcount}\n"
217
217
  end
218
218
 
@@ -26,7 +26,8 @@ module Dnsruby
26
26
  # * Name#wild?
27
27
  # * Name#subdomain_of?(other)
28
28
  # * Name#labels
29
- #
29
+ #
30
+ require 'addressable'
30
31
  class Name
31
32
  include Comparable
32
33
  MaxNameLength=255
@@ -52,6 +53,7 @@ module Dnsruby
52
53
  if (arg=="")
53
54
  return Name.new([],false)
54
55
  end
56
+ arg = punycode(arg)
55
57
  return Name.new(split_escaped(arg), /\.\z/ =~ arg ? true : false)
56
58
  # return Name.new(Label.split(arg), /\.\z/ =~ arg ? true : false)
57
59
  when Array
@@ -61,6 +63,22 @@ module Dnsruby
61
63
  end
62
64
  end
63
65
 
66
+ def self.punycode(d)
67
+ begin
68
+ c = Addressable::URI.parse("http://" + d.to_s)
69
+ ret = c.normalized_host.sub("http://", "")
70
+ if (!d.end_with?".")
71
+ return ret.chomp(".")
72
+ end
73
+ if (!ret.end_with?".")
74
+ return ret + "."
75
+ end
76
+ return ret
77
+ rescue Exception => e
78
+ return d
79
+ end
80
+ end
81
+
64
82
  def self.split_escaped(arg) #:nodoc: all
65
83
  encodedlabels = name2encodedlabels(arg)
66
84
  return encodedlabels
@@ -317,7 +335,7 @@ module Dnsruby
317
335
  i=0;
318
336
 
319
337
  while (i < length )
320
- c=presentation.unpack("x#{i}C1") [0]
338
+ c=presentation.unpack("x#{i}C1")[0]
321
339
  if (c == 46) # ord('.')
322
340
  endstring = presentation[i+1, presentation.length-(i+1)]
323
341
  return Label.new(wire),endstring
@@ -331,7 +331,14 @@ module Dnsruby
331
331
  client_query_id = Time.now + rand(10000) # is this safe?!
332
332
  end
333
333
 
334
- query_packet = make_query_packet(msg, use_tcp)
334
+ begin
335
+ query_packet = make_query_packet(msg, use_tcp)
336
+ rescue EncodeError => err
337
+ Dnsruby.log.error { "#{err}" }
338
+ st = SelectThread.instance
339
+ st.push_exception_to_select(client_query_id, client_queue, err, nil)
340
+ return
341
+ end
335
342
 
336
343
  if (msg.do_caching && (msg.class != Update))
337
344
  # Check the cache!!
@@ -622,6 +629,11 @@ module Dnsruby
622
629
  # Should send error back up to Resolver here, and then NOT QUERY AGAIN!!!
623
630
  return sig_value
624
631
  end
632
+ if ((response.header.get_header_rcode == RCode.FORMERR) &&
633
+ (query.header.arcount == 0))
634
+ # Raise an error
635
+ return true
636
+ end
625
637
  # Should check that question section is same as question that was sent! RFC 5452
626
638
  # If it's not an update...
627
639
  if (query.class == Update)
@@ -153,7 +153,7 @@ module Dnsruby
153
153
  end
154
154
  end
155
155
  attr_accessor :nameservers, :callback, :recurse, :ipv6_ok
156
- attr_reader :hints
156
+ attr_reader :hints, :dnssec
157
157
  # The resolver to use for the queries
158
158
  attr_accessor :resolver
159
159
 
@@ -164,6 +164,11 @@ module Dnsruby
164
164
  @@zones_cache = nil
165
165
  @@nameservers = nil
166
166
 
167
+ def dnssec=(dnssec_on)
168
+ @dnssec = dnssec_on
169
+ @resolver.dnssec = dnssec_on
170
+ end
171
+
167
172
  def initialize(res = nil)
168
173
  if (res)
169
174
  @resolver = res
@@ -174,6 +179,7 @@ module Dnsruby
174
179
  @resolver = Resolver.new
175
180
  end
176
181
  end
182
+ @resolver.dnssec = @dnssec
177
183
  @ipv6_ok = false
178
184
  end
179
185
  # Initialize the hint servers. Recursive queries need a starting name
@@ -196,6 +202,7 @@ module Dnsruby
196
202
  @resolver = resolver
197
203
  if (resolver.single_resolvers.length == 0)
198
204
  resolver = Resolver.new()
205
+ resolver.dnssec = @dnssec
199
206
  end
200
207
  if (hints && hints.length > 0)
201
208
  resolver.nameservers=hints
@@ -372,6 +379,7 @@ module Dnsruby
372
379
  end
373
380
 
374
381
  def Recursor.clear_caches(resolver = Resolver.new)
382
+ resolver.dnssec = @dnssec
375
383
  Recursor.set_hints(Hash.new, resolver)
376
384
  @@zones_cache = Hash.new # key zone_name, values Hash of servers and AddressCaches
377
385
  @@zones_cache["."] = @@hints
@@ -613,6 +621,7 @@ module Dnsruby
613
621
  }
614
622
  end
615
623
  resolver = Resolver.new({:nameserver=>nameservers})
624
+ resolver.dnssec = @dnssec
616
625
  servers = []
617
626
  resolver.single_resolvers.each {|s|
618
627
  servers.push(s.server)
@@ -891,6 +891,14 @@ module Dnsruby
891
891
  return
892
892
  end
893
893
 
894
+ begin
895
+ msg.encode
896
+ rescue EncodeError => err
897
+ Dnsruby.log.error { "Can't encode " + msg.to_s + " : #{err}" }
898
+ client_queue.push([client_query_id, err])
899
+ return
900
+ end
901
+
894
902
  tick_needed = false
895
903
  # add to our data structures
896
904
  # @mutex.synchronize{
@@ -1124,6 +1132,9 @@ module Dnsruby
1124
1132
  increment_resolver_priority(resolver) unless response.cached
1125
1133
  stop_querying(client_query_id)
1126
1134
  # @TODO@ Does the client want notified at this point?
1135
+ elsif error.kind_of?(EncodeError)
1136
+ Dnsruby.log.debug{'Encode error - sending to client'}
1137
+ send_result_and_stop_querying(client_queue, client_query_id, select_queue, response, error)
1127
1138
  else
1128
1139
  # - if it was any other error, then remove that server from the list for that query
1129
1140
  # If a Too Many Open Files error, then don't remove, but let retry work.
@@ -0,0 +1,17 @@
1
+ module Dnsruby
2
+ class RR
3
+ # RFC4034, section 2
4
+ # DNSSEC uses public key cryptography to sign and authenticate DNS
5
+ # resource record sets (RRsets). The public keys are stored in DNSKEY
6
+ # resource records and are used in the DNSSEC authentication process
7
+ # described in [RFC4035]: A zone signs its authoritative RRsets by
8
+ # using a private key and stores the corresponding public key in a
9
+ # DNSKEY RR. A resolver can then use the public key to validate
10
+ # signatures covering the RRsets in the zone, and thus to authenticate
11
+ # them.
12
+ class CDNSKEY < DNSKEY
13
+ ClassValue = nil #:nodoc: all
14
+ TypeValue = Types::CDNSKEY #:nodoc: all
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,35 @@
1
+ # --
2
+ # Copyright 2018 Caerketton Tech Ltd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ # ++
16
+ module Dnsruby
17
+ class RR
18
+ # RFC4034, section 4
19
+ # The DS Resource Record refers to a DNSKEY RR and is used in the DNS
20
+ # DNSKEY authentication process. A DS RR refers to a DNSKEY RR by
21
+ # storing the key tag, algorithm number, and a digest of the DNSKEY RR.
22
+ # Note that while the digest should be sufficient to identify the
23
+ # public key, storing the key tag and key algorithm helps make the
24
+ # identification process more efficient. By authenticating the DS
25
+ # record, a resolver can authenticate the DNSKEY RR to which the DS
26
+ # record points. The key authentication process is described in
27
+ # [RFC4035].
28
+
29
+ class CDS < DS
30
+
31
+ ClassValue = nil #:nodoc: all
32
+ TypeValue = Types::CDS #:nodoc: all
33
+ end
34
+ end
35
+ end
@@ -340,8 +340,12 @@ module Dnsruby
340
340
  @key_length = (@key.length - pos) * 8
341
341
 
342
342
  pkey = OpenSSL::PKey::RSA.new
343
- pkey.e = exponent
344
- pkey.n = modulus
343
+ begin
344
+ pkey.set_key(modulus, exponent, nil) # use set_key, present in later versions of openssl gem
345
+ rescue NoMethodError
346
+ pkey.e = exponent # set_key not available in earlier versions, use this approach instead
347
+ pkey.n = modulus
348
+ end
345
349
  return pkey
346
350
  end
347
351
 
@@ -361,10 +365,15 @@ module Dnsruby
361
365
  @key_length = (pgy_len * 8)
362
366
 
363
367
  pkey = OpenSSL::PKey::DSA.new
364
- pkey.p = p
365
- pkey.q = q
366
- pkey.g = g
367
- pkey.pub_key = y
368
+ begin
369
+ pkey.set_pgq(p,g,q)
370
+ pkey.set_key(y, nil) # use set_pgq and set_key, present in later versions of openssl gem
371
+ rescue NoMethodError
372
+ pkey.p = p # set_key not available in earlier versions, use this approach instead
373
+ pkey.q = q
374
+ pkey.g = g
375
+ pkey.pub_key = y
376
+ end
368
377
 
369
378
  pkey
370
379
  end
@@ -19,7 +19,11 @@ module Dnsruby
19
19
  Types::NS => NS,
20
20
  Types::CNAME => CNAME,
21
21
  Types::DNAME => DNAME,
22
+ Types::URI => URI,
23
+ Types::DS => DS,
24
+ Types::CDS => CDS,
22
25
  Types::DNSKEY => DNSKEY,
26
+ Types::CDNSKEY => CDNSKEY,
23
27
  Types::SOA => SOA,
24
28
  Types::PTR => PTR,
25
29
  Types::HINFO => HINFO,
@@ -45,7 +49,6 @@ module Dnsruby
45
49
  Types::ANY => ANY,
46
50
  Types::RRSIG => RRSIG,
47
51
  Types::NSEC => NSEC,
48
- Types::DS => DS,
49
52
  Types::NSEC3 => NSEC3,
50
53
  Types::NSEC3PARAM => NSEC3PARAM,
51
54
  Types::DLV => DLV,
@@ -0,0 +1,57 @@
1
+ module Dnsruby
2
+ class RR
3
+ class URI < RR
4
+ ClassValue = nil #:nodoc: all
5
+ TypeValue= Types::URI #:nodoc: all
6
+
7
+ # The NAPTR RR order field
8
+ attr_accessor :priority
9
+
10
+ # The NAPTR RR order field
11
+ attr_accessor :weight
12
+
13
+ # The NAPTR RR order field
14
+ attr_accessor :target
15
+
16
+ def from_hash(hash) #:nodoc: all
17
+ @priority = hash[:priority]
18
+ @weight = hash[:weight]
19
+ @target = hash[:target]
20
+ end
21
+
22
+ def from_data(data) #:nodoc: all
23
+ @priority, @weight, @target = data
24
+ end
25
+
26
+ def from_string(input) #:nodoc: all
27
+ if (input.strip.length > 0)
28
+ values = input.split(" ")
29
+ @priority = values [0].to_i
30
+ @weight = values [1].to_i
31
+ @target = values [2].gsub!("\"", "")
32
+ end
33
+ end
34
+
35
+ def rdata_to_string #:nodoc: all
36
+ "#{@priority} #{@weight} \"#{@target}\""
37
+ end
38
+
39
+ def encode_rdata(msg, canonical=false) #:nodoc: all
40
+ if (@priority != nil)
41
+ msg.put_pack('n', @priority)
42
+ msg.put_pack('n', @weight)
43
+ msg.put_bytes(@target)
44
+ end
45
+ end
46
+
47
+ def self.decode_rdata(msg) #:nodoc: all
48
+ priority, = msg.get_unpack('n')
49
+ weight, = msg.get_unpack('n')
50
+ target = msg.get_bytes
51
+ return self.new([priority, weight, target])
52
+ end
53
+
54
+
55
+ end
56
+ end
57
+ end
@@ -152,9 +152,12 @@ require 'dnsruby/resource/OPT'
152
152
  require 'dnsruby/resource/TSIG'
153
153
  require 'dnsruby/resource/TKEY'
154
154
  require 'dnsruby/resource/DNSKEY'
155
+ require 'dnsruby/resource/CDNSKEY'
155
156
  require 'dnsruby/resource/RRSIG'
156
157
  require 'dnsruby/resource/NSEC'
157
158
  require 'dnsruby/resource/DS'
159
+ require 'dnsruby/resource/CDS'
160
+ require 'dnsruby/resource/URI'
158
161
  require 'dnsruby/resource/NSEC3'
159
162
  require 'dnsruby/resource/NSEC3PARAM'
160
163
  require 'dnsruby/resource/DLV'
@@ -194,7 +194,7 @@ module Dnsruby
194
194
  rescue SelectWakeup
195
195
  # If SelectWakeup, then just restart this loop - the select call will be made with the new data
196
196
  next
197
- rescue IOError => e
197
+ rescue IOError, EncodeError => e
198
198
  # print "IO Error =: #{e}\n"
199
199
  exceptions = clean_up_closed_sockets
200
200
  exceptions.each { |exception| send_exception_to_client(*exception) }
@@ -65,6 +65,7 @@ module Dnsruby
65
65
  @@recursor = Recursor.new
66
66
  end
67
67
  end
68
+ @@recursor.dnssec = true
68
69
  return @@recursor
69
70
  end
70
71
 
@@ -72,12 +73,15 @@ module Dnsruby
72
73
  # if (Dnssec.do_validation_with_recursor?)
73
74
  # return Recursor.new
74
75
  # else
76
+ resolver = nil
75
77
  if (Dnssec.default_resolver)
76
- return Dnssec.default_resolver
78
+ resolver = Dnssec.default_resolver
77
79
  else
78
- return Resolver.new
80
+ resolver = Resolver.new
79
81
  end
80
82
  # end
83
+ resolver.dnssec = true
84
+ return resolver
81
85
  end
82
86
  def add_dlv_key(key)
83
87
  # Is this a ZSK or a KSK?
@@ -848,6 +852,7 @@ module Dnsruby
848
852
  end
849
853
  end
850
854
  end
855
+ res.dnssec = true
851
856
  # query = Message.new(name, Types.DNSKEY)
852
857
  # query.do_validation = false
853
858
  ret = nil
@@ -1011,6 +1016,7 @@ module Dnsruby
1011
1016
  end
1012
1017
  end
1013
1018
  end
1019
+ parent_res.dnssec = true
1014
1020
  end
1015
1021
  # Use that Resolver to query for DS record and NS for children
1016
1022
  ds_rrset = current_anchor
@@ -1068,6 +1074,7 @@ module Dnsruby
1068
1074
  child_res = Resolver.new
1069
1075
  end
1070
1076
  end
1077
+ child_res.dnssec = true
1071
1078
  end
1072
1079
  end
1073
1080
  # Query for DNSKEY record, and verify against DS in parent.
@@ -1143,11 +1150,14 @@ module Dnsruby
1143
1150
  if (Dnssec.do_validation_with_recursor?)
1144
1151
  return get_recursor
1145
1152
  else
1153
+ resolver = nil
1146
1154
  if (Dnssec.default_resolver)
1147
- return Dnssec.default_resolver
1155
+ resolver = Dnssec.default_resolver
1148
1156
  else
1149
- return Resolver.new
1157
+ resolver = Resolver.new
1150
1158
  end
1159
+ resolver.dnssec = true
1160
+ return resolver
1151
1161
  end
1152
1162
  end
1153
1163
 
@@ -1,3 +1,3 @@
1
1
  module Dnsruby
2
- VERSION = '1.60.2'
2
+ VERSION = '1.61.1'
3
3
  end
@@ -33,6 +33,8 @@ module Dnsruby
33
33
  attr_reader :tsig
34
34
  # Returns the tsigstate of the last transfer (nil if no TSIG signed transfer has occurred)
35
35
  attr_reader :last_tsigstate
36
+ # Sets the connect timeout in seconds
37
+ attr_accessor :connect_timeout
36
38
 
37
39
  # Sets the TSIG to sign the zone transfer with.
38
40
  # Pass in either a Dnsruby::RR::TSIG, or a key_name and key (or just a key)
@@ -54,6 +56,7 @@ module Dnsruby
54
56
  @tsig = nil
55
57
  @axfr = nil
56
58
  @src_address = nil
59
+ @connect_timeout = 5
57
60
  end
58
61
 
59
62
  # Perform a zone transfer (RFC1995)
@@ -107,7 +110,8 @@ module Dnsruby
107
110
  def do_transfer(zone, server) #:nodoc: all
108
111
  @transfer_type = Types.new(@transfer_type)
109
112
  @state = :InitialSoa
110
- socket = TCPSocket.new(server, @port, @src_address)
113
+ socket = Socket.tcp(server, @port, @src_address, connect_timeout: @connect_timeout)
114
+ # socket = TCPSocket.new(server, @port, @src_address)
111
115
  begin
112
116
  # Send an initial query
113
117
  msg = Message.new(zone, @transfer_type, @klass)
@@ -248,5 +248,10 @@ class TestDNS < Minitest::Test
248
248
  # assert_equal(a[0].name.to_s, 'a.t.dnsruby.validation-test-servers.nominet.org.uk',"Correct name (with persistent socket and #{method})")
249
249
  end
250
250
 
251
+ def test_port
252
+ d = DNS.new({:port => 5353})
253
+ assert_true(d.to_s.include?"5353")
254
+ end
255
+
251
256
  end
252
257
  end
@@ -374,5 +374,31 @@ class TestRawQuery < Minitest::Test
374
374
  assert_equal KEY, options[:key]
375
375
  assert_equal ALGO, options[:algorithm]
376
376
  end
377
+
378
+ def test_threads
379
+ resolver = Dnsruby::Resolver.new(nameserver: ["8.8.8.8", "8.8.4.4"])
380
+ resolver.query("google.com", "MX")
381
+ resolver.query("google.com", "MX")
382
+ resolver.query("google.com", "MX")
383
+ begin
384
+ resolver.query("googlöe.com", "MX")
385
+ rescue Dnsruby::ResolvError => e
386
+ # fine
387
+ end
388
+ resolver.query("google.com", "MX")
389
+ resolver.query("google.com", "MX")
390
+ begin
391
+ resolver.query("googlöe.com", "MX")
392
+ rescue Dnsruby::ResolvError => e
393
+ # fine
394
+ end
395
+ begin
396
+ resolver.query("googlöe.com", "MX")
397
+ rescue Dnsruby::ResolvError => e
398
+ # fine
399
+ end
400
+ # Dnsruby::Cache.delete("googlöe.com", "MX")
401
+
402
+ end
377
403
  end
378
404
 
@@ -285,6 +285,39 @@ class TestRR < Minitest::Test
285
285
  update.encode
286
286
  end
287
287
 
288
+ def test_uri
289
+ rrString = "_ftp._tcp.\t300\tIN\tURI\t10\ 1 \"ftp://ftp1.example.com/public\""
290
+ rr = RR.create(rrString)
291
+ assert(rrString.to_s == rr.to_s)
292
+ m = Dnsruby::Message.new
293
+ m.add_additional(rr)
294
+ m2 = Message.decode(m.encode)
295
+ rr2 = m2.additional()[0]
296
+ assert(rr == rr2)
297
+ end
298
+
299
+ def test_cds
300
+ rrString = "dskey.example.com.\t86400\tIN\tCDS\t60485 RSASHA1 1 ( 2BB183AF5F22588179A53B0A98631FAD1A292118 )"
301
+ rr = RR.create(rrString)
302
+ assert(rrString.to_s == rr.to_s)
303
+ m = Dnsruby::Message.new
304
+ m.add_additional(rr)
305
+ m2 = Message.decode(m.encode)
306
+ rr2 = m2.additional()[0]
307
+ assert(rr.to_s == rr2.to_s)
308
+ end
309
+
310
+ def test_cdnskey
311
+ rrString = "tjeb.nl.\t3600\tIN\tCDNSKEY\t256 3 RSASHA1-NSEC3-SHA1 ( AwEAAcglEOS7bECRK5fqTuGTMJycmDhTzmUu/EQbAhKJOYJxDb5SG/RYqsJgzG7wgtGy0W1aP7I4k6SPtHmwcqjLaZLVUwRNWCGr2adjb9JTFyBR7F99Ngi11lEGM6Uiw/eDRk66lhoSGzohjj/rmhRTV6gN2+0ADPnafv3MBkPgryA3 ) ; key_tag=53177"
312
+ rr = RR.create(rrString)
313
+ assert(rrString.to_s == rr.to_s)
314
+ m = Dnsruby::Message.new
315
+ m.add_additional(rr)
316
+ m2 = Message.decode(m.encode)
317
+ rr2 = m2.additional()[0]
318
+ assert(rr.to_s == rr2.to_s)
319
+ end
320
+
288
321
  def test_cert
289
322
  rr = RR.create("test.kht.se. 60 IN CERT PGP 0 0 mQGiBDnY2vERBAD3cOxqoAYHYzS+xttvuyN9wZS8CrgwLIlT8Ewo/CCFI11PEO+gJyNPvWPRQsyt1SE60reaIsie2bQTg3DYIg0PmH+ZOlNkpKesPULzdlw4Rx3dD/M3Lkrm977h4Y70ZKC+tbvoYKCCOIkUVevny1PVZ+mB94rb0mMgawSTrct03QCg/w6aHNJFQV7O9ZQ1Fir85M3RS8cEAOo4/1ASVudz3qKZQEhU2Z9O2ydXqpEanHfGirjWYi5RelVsQ9IfBSPFaPAWzQ24nvQ18NU7TgdDQhP4meZXiVXcLBR5Mee2kByf2KAnBUF9aah5s8wZbSrC6u8xEZLuiauvWmCUIWe0Ylc1/L37XeDjrBI2pT+k183X119d6Fr1BACGfZVGsot5rxBUEFPPSrBqYXG/0hRYv9Eq8a4rJAHK2IUWYfivZgL4DtrJnHlha+H5EPQVYkIAN3nGjXoHmosY+J3Sk+GyR+dCBHEwCkoHMKph3igczCEfxAWgqKeYd5mf+QQq2JKrkn2jceiIO7s3CrepeEFAjDSGuxhZjPJVm7QoRGFuaWVsIFAuIE1haG9uZXkgPGRhbm1AcHJpbWUuZ3VzaGkub3JnPohOBBARAgAOBQI52NrxBAsDAQICGQEACgkQ+75aMGJLskn6LgCbBXUD7UmGla5e1zyhuY667hP3F+UAoJIeDZJyRFkQAmb+u8KekRyLD1MLtDJEYW5pZWwgTWFob25leSAoU2Vjb25kYXJ5IEVtYWlsKSA8Z3VzaGlAZ3VzaGkub3JnPohgBBMRAgAgBQJF1J/XAhsjBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQ+75aMGJLskkVhACggsivQ9qLhfdA1rGm6f8LRJBSC4wAoI930h+/hshClj6AkNwGRtHdf5XJuQINBDnY2vQQCAD2Qle3CH8IF3KiutapQvMF6PlTETlPtvFuuUs4INoBp1ajFOmPQFXz0AfGy0OplK33TGSGSfgMg71l6RfUodNQ+PVZX9x2Uk89PY3bzpnhV5JZzf24rnRPxfx2vIPFRzBhznzJZv8V+bv9kV7HAarTW56NoKVyOtQa8L9GAFgr5fSI/VhOSdvNILSd5JEHNmszbDgNRR0PfIizHHxbLY7288kjwEPwpVsYjY67VYy4XTjTNP18F1dDox0YbN4zISy1Kv884bEpQBgRjXyEpwpy1obEAxnIByl6ypUM2Zafq9AKUJsCRtMIPWakXUGfnHy9iUsiGSa6q6Jew1XpMgs7AAICB/9eGjzF2gDh6U7I72x/6bSdlExx2LvIF92OZKc0S55IOS4Lgzs7Hbfm1aOL4oJt7wBg94xkF4cerxz7y8R9J+k3GNl14KOjbYaMAh1rdxdAzikYMH1p1hS78GMtwxky6jE5en87BGGMmnbC84JlxwN+MD7diu8D0Gkgjj/pxOp32D5jEe02wBPVjFTpFLJjpFniLUY6AohRDEdSuZwWPuoKVWhpeWkasNn5qgwGyDREbXpyPsU02BkwE4JiGs+JMMdOn9KMh5dxiuwsMM9gHiQZS3mSNBBKPWI5ZXsdStVFvapjf2FUFDXLUbTROPv1Xhqf0u7YYORFnWeVtvzKIxVaiEYEGBECAAYFAjnY2vQACgkQ+75aMGJLsklBWgCeN7z9xk52y/aoaCuF6hYb0d+3k98AoMRxvHuXI1Nc2FXY/x65PwHiUbaY")
290
323
  rr = RR.create("all.rr.org. IN CERT 6 0 0 FFsAyW1dVK7hIGuvhN56r26UwJx/")
@@ -76,6 +76,10 @@ class TestSingleResolverSoak < Minitest::Test
76
76
  end
77
77
  end
78
78
 
79
+ def teardown
80
+ Celluloid.shutdown
81
+ end
82
+
79
83
  SINGLE_RESOLVER_QUERY_TIMES = 63
80
84
 
81
85
  def setup
@@ -63,6 +63,13 @@ class TestTCPPipelining < Minitest::Test
63
63
  end
64
64
  end
65
65
 
66
+ def teardown
67
+ if @initialized
68
+ Celluloid.shutdown
69
+ @initialized = false
70
+ end
71
+ end
72
+
66
73
  def setup
67
74
  self.class.init
68
75
 
metadata CHANGED
@@ -1,14 +1,14 @@
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.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Dalitz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-10 00:00:00.000000000 Z
11
+ date: 2018-07-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pry
@@ -128,6 +128,20 @@ dependencies:
128
128
  - - "~>"
129
129
  - !ruby/object:Gem::Version
130
130
  version: '0.7'
131
+ - !ruby/object:Gem::Dependency
132
+ name: addressable
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '2.5'
138
+ type: :runtime
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '2.5'
131
145
  description: |-
132
146
  Dnsruby is a pure Ruby DNS client library which implements a
133
147
  stub resolver. It aims to comply with all DNS RFCs, including
@@ -194,6 +208,8 @@ files:
194
208
  - lib/dnsruby/resource/AFSDB.rb
195
209
  - lib/dnsruby/resource/APL.rb
196
210
  - lib/dnsruby/resource/CAA.rb
211
+ - lib/dnsruby/resource/CDNSKEY.rb
212
+ - lib/dnsruby/resource/CDS.rb
197
213
  - lib/dnsruby/resource/CERT.rb
198
214
  - lib/dnsruby/resource/DHCID.rb
199
215
  - lib/dnsruby/resource/DLV.rb
@@ -230,6 +246,7 @@ files:
230
246
  - lib/dnsruby/resource/TLSA.rb
231
247
  - lib/dnsruby/resource/TSIG.rb
232
248
  - lib/dnsruby/resource/TXT.rb
249
+ - lib/dnsruby/resource/URI.rb
233
250
  - lib/dnsruby/resource/X25.rb
234
251
  - lib/dnsruby/resource/domain_name.rb
235
252
  - lib/dnsruby/resource/generic.rb