dnsruby 1.55 → 1.56.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 (158) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +96 -0
  3. data/Rakefile +30 -29
  4. data/demo/axfr.rb +93 -93
  5. data/demo/check_soa.rb +99 -99
  6. data/demo/check_zone.rb +59 -59
  7. data/demo/digdlv.rb +43 -43
  8. data/demo/digroot.rb +34 -34
  9. data/demo/example_recurse.rb +14 -14
  10. data/demo/mresolv.rb +30 -30
  11. data/demo/mx.rb +31 -31
  12. data/demo/rubydig.rb +37 -37
  13. data/demo/to_resolve.txt +3088 -3088
  14. data/demo/trace_dns.rb +46 -46
  15. data/lib/dnsruby.rb +161 -526
  16. data/lib/dnsruby/DNS.rb +305 -0
  17. data/lib/{Dnsruby/Cache.rb → dnsruby/cache.rb} +152 -152
  18. data/lib/{Dnsruby → dnsruby}/code_mapper.rb +48 -52
  19. data/lib/dnsruby/code_mappers.rb +295 -0
  20. data/lib/{Dnsruby/Config.rb → dnsruby/config.rb} +454 -454
  21. data/lib/{Dnsruby → dnsruby}/dnssec.rb +91 -91
  22. data/lib/{Dnsruby/Hosts.rb → dnsruby/hosts.rb} +125 -125
  23. data/lib/{Dnsruby → dnsruby}/ipv4.rb +26 -26
  24. data/lib/{Dnsruby → dnsruby}/ipv6.rb +42 -42
  25. data/lib/{Dnsruby → dnsruby}/key_cache.rb +29 -29
  26. data/lib/dnsruby/message/decoder.rb +164 -0
  27. data/lib/dnsruby/message/encoder.rb +75 -0
  28. data/lib/dnsruby/message/header.rb +249 -0
  29. data/lib/dnsruby/message/message.rb +629 -0
  30. data/lib/dnsruby/message/question.rb +86 -0
  31. data/lib/dnsruby/message/section.rb +96 -0
  32. data/lib/{Dnsruby → dnsruby}/name.rb +141 -141
  33. data/lib/dnsruby/packet_sender.rb +661 -0
  34. data/lib/{Dnsruby/Recursor.rb → dnsruby/recursor.rb} +235 -233
  35. data/lib/dnsruby/resolv.rb +113 -0
  36. data/lib/dnsruby/resolver.rb +1192 -0
  37. data/lib/dnsruby/resource/A.rb +56 -0
  38. data/lib/dnsruby/resource/AAAA.rb +54 -0
  39. data/lib/{Dnsruby → dnsruby}/resource/AFSDB.rb +68 -68
  40. data/lib/{Dnsruby → dnsruby}/resource/CERT.rb +105 -105
  41. data/lib/{Dnsruby → dnsruby}/resource/DHCID.rb +54 -54
  42. data/lib/dnsruby/resource/DLV.rb +27 -0
  43. data/lib/{Dnsruby → dnsruby}/resource/DNSKEY.rb +372 -372
  44. data/lib/{Dnsruby → dnsruby}/resource/DS.rb +255 -255
  45. data/lib/{Dnsruby → dnsruby}/resource/HINFO.rb +71 -71
  46. data/lib/{Dnsruby → dnsruby}/resource/HIP.rb +29 -29
  47. data/lib/{Dnsruby → dnsruby}/resource/IN.rb +30 -30
  48. data/lib/{Dnsruby → dnsruby}/resource/IPSECKEY.rb +31 -31
  49. data/lib/{Dnsruby → dnsruby}/resource/ISDN.rb +62 -62
  50. data/lib/{Dnsruby → dnsruby}/resource/KX.rb +65 -65
  51. data/lib/{Dnsruby → dnsruby}/resource/LOC.rb +263 -263
  52. data/lib/{Dnsruby → dnsruby}/resource/MINFO.rb +69 -69
  53. data/lib/{Dnsruby → dnsruby}/resource/MX.rb +65 -65
  54. data/lib/{Dnsruby → dnsruby}/resource/NAPTR.rb +98 -98
  55. data/lib/{Dnsruby → dnsruby}/resource/NSAP.rb +171 -171
  56. data/lib/dnsruby/resource/NSEC.rb +275 -0
  57. data/lib/dnsruby/resource/NSEC3.rb +332 -0
  58. data/lib/dnsruby/resource/NSEC3PARAM.rb +135 -0
  59. data/lib/dnsruby/resource/OPT.rb +272 -0
  60. data/lib/{Dnsruby → dnsruby}/resource/PX.rb +70 -70
  61. data/lib/{Dnsruby → dnsruby}/resource/RP.rb +75 -75
  62. data/lib/dnsruby/resource/RR.rb +421 -0
  63. data/lib/dnsruby/resource/RRSIG.rb +275 -0
  64. data/lib/dnsruby/resource/RRSet.rb +190 -0
  65. data/lib/{Dnsruby → dnsruby}/resource/RT.rb +67 -67
  66. data/lib/{Dnsruby → dnsruby}/resource/SOA.rb +94 -94
  67. data/lib/dnsruby/resource/SPF.rb +29 -0
  68. data/lib/dnsruby/resource/SRV.rb +112 -0
  69. data/lib/{Dnsruby → dnsruby}/resource/SSHFP.rb +14 -14
  70. data/lib/dnsruby/resource/TKEY.rb +163 -0
  71. data/lib/dnsruby/resource/TSIG.rb +593 -0
  72. data/lib/{Dnsruby → dnsruby}/resource/TXT.rb +191 -191
  73. data/lib/dnsruby/resource/X25.rb +55 -0
  74. data/lib/{Dnsruby → dnsruby}/resource/domain_name.rb +25 -25
  75. data/lib/{Dnsruby → dnsruby}/resource/generic.rb +80 -80
  76. data/lib/dnsruby/resource/resource.rb +25 -0
  77. data/lib/{Dnsruby → dnsruby}/select_thread.rb +148 -148
  78. data/lib/{Dnsruby/SingleResolver.rb → dnsruby/single_resolver.rb} +60 -60
  79. data/lib/{Dnsruby → dnsruby}/single_verifier.rb +344 -344
  80. data/lib/dnsruby/the_log.rb +44 -0
  81. data/lib/dnsruby/update.rb +278 -0
  82. data/lib/dnsruby/validator_thread.rb +124 -0
  83. data/lib/dnsruby/version.rb +3 -0
  84. data/lib/{Dnsruby → dnsruby}/zone_reader.rb +93 -93
  85. data/lib/{Dnsruby → dnsruby}/zone_transfer.rb +377 -377
  86. data/test/spec_helper.rb +16 -0
  87. data/test/tc_axfr.rb +31 -34
  88. data/test/tc_cache.rb +32 -32
  89. data/test/tc_dlv.rb +28 -28
  90. data/test/tc_dns.rb +73 -76
  91. data/test/tc_dnskey.rb +31 -32
  92. data/test/tc_dnsruby.rb +50 -44
  93. data/test/tc_ds.rb +36 -36
  94. data/test/tc_escapedchars.rb +252 -255
  95. data/test/tc_hash.rb +17 -21
  96. data/test/tc_header.rb +48 -57
  97. data/test/tc_hip.rb +19 -22
  98. data/test/tc_ipseckey.rb +18 -21
  99. data/test/tc_keith.rb +300 -0
  100. data/test/tc_message.rb +87 -0
  101. data/test/tc_misc.rb +83 -87
  102. data/test/tc_name.rb +81 -84
  103. data/test/tc_naptr.rb +18 -21
  104. data/test/tc_nsec.rb +55 -55
  105. data/test/tc_nsec3.rb +23 -24
  106. data/test/tc_nsec3param.rb +20 -21
  107. data/test/tc_packet.rb +90 -93
  108. data/test/tc_packet_unique_push.rb +48 -51
  109. data/test/tc_question.rb +30 -33
  110. data/test/tc_queue.rb +16 -17
  111. data/test/tc_recur.rb +16 -17
  112. data/test/tc_res_config.rb +38 -41
  113. data/test/tc_res_env.rb +29 -32
  114. data/test/tc_res_file.rb +26 -29
  115. data/test/tc_res_opt.rb +62 -65
  116. data/test/tc_resolver.rb +287 -242
  117. data/test/tc_rr-opt.rb +70 -63
  118. data/test/tc_rr-txt.rb +68 -71
  119. data/test/tc_rr-unknown.rb +45 -48
  120. data/test/tc_rr.rb +76 -70
  121. data/test/tc_rrset.rb +21 -22
  122. data/test/tc_rrsig.rb +19 -20
  123. data/test/tc_single_resolver.rb +294 -297
  124. data/test/tc_soak.rb +199 -202
  125. data/test/tc_soak_base.rb +29 -34
  126. data/test/tc_sshfp.rb +20 -23
  127. data/test/tc_tcp.rb +32 -35
  128. data/test/tc_tkey.rb +41 -44
  129. data/test/tc_tsig.rb +81 -84
  130. data/test/tc_update.rb +108 -111
  131. data/test/tc_validator.rb +29 -29
  132. data/test/tc_verifier.rb +81 -82
  133. data/test/ts_dnsruby.rb +16 -15
  134. data/test/ts_offline.rb +62 -63
  135. data/test/ts_online.rb +115 -115
  136. metadata +155 -90
  137. data/README +0 -59
  138. data/lib/Dnsruby/DNS.rb +0 -305
  139. data/lib/Dnsruby/PacketSender.rb +0 -656
  140. data/lib/Dnsruby/Resolver.rb +0 -1189
  141. data/lib/Dnsruby/TheLog.rb +0 -44
  142. data/lib/Dnsruby/message.rb +0 -1230
  143. data/lib/Dnsruby/resource/A.rb +0 -56
  144. data/lib/Dnsruby/resource/AAAA.rb +0 -54
  145. data/lib/Dnsruby/resource/DLV.rb +0 -27
  146. data/lib/Dnsruby/resource/NSEC.rb +0 -298
  147. data/lib/Dnsruby/resource/NSEC3.rb +0 -340
  148. data/lib/Dnsruby/resource/NSEC3PARAM.rb +0 -135
  149. data/lib/Dnsruby/resource/OPT.rb +0 -213
  150. data/lib/Dnsruby/resource/RRSIG.rb +0 -275
  151. data/lib/Dnsruby/resource/SPF.rb +0 -29
  152. data/lib/Dnsruby/resource/SRV.rb +0 -112
  153. data/lib/Dnsruby/resource/TKEY.rb +0 -163
  154. data/lib/Dnsruby/resource/TSIG.rb +0 -593
  155. data/lib/Dnsruby/resource/X25.rb +0 -55
  156. data/lib/Dnsruby/resource/resource.rb +0 -678
  157. data/lib/Dnsruby/update.rb +0 -278
  158. data/lib/Dnsruby/validator_thread.rb +0 -124
@@ -0,0 +1,86 @@
1
+ # A Dnsruby::Question object represents a record in the
2
+ # question section of a DNS packet.
3
+ #
4
+ # RFC 1035 Section 4.1.2
5
+ module Dnsruby
6
+ class Question
7
+
8
+ # The Question name
9
+ attr_reader :qname
10
+ # The Question type
11
+ attr_reader :qtype
12
+ # The Question class
13
+ attr_reader :qclass
14
+
15
+ # Creates a question object from the domain, type, and class passed
16
+ # as arguments.
17
+ #
18
+ # If a String is passed in, a Name, IPv4 or IPv6 object is created.
19
+ #
20
+ # If an IPv4 or IPv6 object is used then the type is set to PTR.
21
+ def initialize(qname, qtype = :not_provided, qclass = :not_provided)
22
+
23
+ raise ArgumentError.new('qname must not be nil') if qname.nil?
24
+
25
+ @qtype = (qtype == :not_provided) ? Types::A : Types.new(qtype)
26
+ @qclass = (qclass == :not_provided) ? Classes::IN : Classes.new(qclass)
27
+ set_qname(qname, qtype == :not_provided)
28
+ end
29
+
30
+ def qtype=(qtype)
31
+ @qtype = Types.new(qtype)
32
+ end
33
+
34
+ def qclass=(qclass)
35
+ @qclass = Classes.new(qclass)
36
+ end
37
+
38
+ def set_qname(qname, write_PTR_to_qtype_if_ip = true)
39
+ is_ipv4_addr_string = qname.is_a?(String) && IPv4::Regex.match(qname)
40
+ is_ipv6_addr_string = qname.is_a?(String) && IPv6::Regex.match(qname)
41
+ is_ip_addr_string = is_ipv4_addr_string || is_ipv6_addr_string
42
+
43
+ is_ip_addr = [IPv4, IPv6].any? { |klass| qname.is_a?(klass) }
44
+
45
+ if is_ipv4_addr_string
46
+ @qname = IPv4.create(qname).to_name
47
+ elsif is_ipv6_addr_string
48
+ @qname = IPv6.create(qname).to_name
49
+ else
50
+ @qname = Name.create(qname)
51
+ end
52
+
53
+ # If the name looks like an IP address then do an appropriate
54
+ # PTR query, unless the user specified the qtype
55
+ if write_PTR_to_qtype_if_ip && (is_ip_addr || is_ip_addr_string)
56
+ @qtype = Types.PTR
57
+ end
58
+ @qname.absolute = true
59
+ end
60
+
61
+ def qname=(qname)
62
+ set_qname(qname, true)
63
+ end
64
+
65
+ def ==(other)
66
+ other.is_a?(Question) &&
67
+ self.qname == other.qname &&
68
+ self.qtype == other.qtype &&
69
+ self.qclass == other.qclass
70
+ end
71
+
72
+ # Returns a string representation of the question record.
73
+ def to_s
74
+ "#{@qname}.\t#{@qclass.string}\t#{@qtype.string}"
75
+ end
76
+
77
+ # For Updates, the qname field is redefined to zname (RFC2136, section 2.3)
78
+ alias zname qname
79
+ # For Updates, the qtype field is redefined to ztype (RFC2136, section 2.3)
80
+ alias ztype qtype
81
+ # For Updates, the qclass field is redefined to zclass (RFC2136, section 2.3)
82
+ alias zclass qclass
83
+
84
+ alias type qtype
85
+ end
86
+ end
@@ -0,0 +1,96 @@
1
+ module Dnsruby
2
+ class Section < Array
3
+
4
+ def initialize(msg = nil)
5
+ @msg = msg
6
+ super(0)
7
+ end
8
+
9
+ # Return the rrset of the specified type in this section
10
+ def rrset(name, type=Types.A, klass=Classes::IN)
11
+ rrs = select{|rr|
12
+ type_ok = (rr.type==type)
13
+ if rr.type == Types::RRSIG
14
+ type_ok = (rr.type_covered == type)
15
+ end
16
+ unless /\.\z/ =~ name.to_s
17
+ name = name.to_s + '.'
18
+ end
19
+ type_ok && (rr.klass == klass) && (rr.name.to_s(true).downcase == name.to_s().downcase)
20
+ }
21
+ rrset = RRSet.new()
22
+ rrs.each do |rr|
23
+ rrset.add(rr)
24
+ end
25
+ rrset
26
+ end
27
+
28
+ # Return an array of all the rrsets in the section
29
+ def rrsets(type = nil, include_opt = false)
30
+ if type && !(Types === type)
31
+ type = Types.new(type)
32
+ end
33
+ ret = []
34
+ each do |rr|
35
+ next if (!include_opt && (rr.type == Types::OPT))
36
+ # if (type)
37
+ # next if ((rr.type == Types.RRSIG) && (type != Types.RRSIG) && (rr.type_covered != type))
38
+ # next if (rr.type != type)
39
+ # end
40
+ if (type)
41
+ # if this is an rrsig type, then :
42
+ # only include it if the type_covered is the type requested,
43
+ # OR if the type requested is an RRSIG
44
+ if rr.type == Types::RRSIG
45
+ if (rr.type_covered == type) || (type == Types::RRSIG)
46
+ else
47
+ next
48
+ end
49
+ # next if ((rr.type_covered != type) || (type != Types.RRSIG))
50
+ elsif rr.type != type
51
+ next
52
+ end
53
+ end
54
+
55
+ found_rrset = false
56
+ ret.each do |rrset|
57
+ found_rrset = rrset.add(rr)
58
+ break if found_rrset
59
+ end
60
+ unless found_rrset
61
+ ret.push(RRSet.new(rr))
62
+ end
63
+ end
64
+ ret
65
+ end
66
+
67
+ def ==(other)
68
+ return false unless (other.instance_of?(Message::Section))
69
+ return false if other.rrsets(nil, true).length != self.rrsets(nil, true).length
70
+
71
+ otherrrsets = other.rrsets(nil, true)
72
+ self.rrsets(nil, true).each {|rrset|
73
+ return false unless otherrrsets.include?(rrset)
74
+ }
75
+
76
+ true
77
+ end
78
+
79
+ def remove_rrset(name, type)
80
+ # Remove all RRs with the name and type from the section.
81
+ # Need to worry about header counts here - can we get Message to
82
+ # update the counts itself, rather than the section worrying about it?
83
+ rrs_to_delete = []
84
+ each do |rr|
85
+ next if rr.rr_type == Types::OPT
86
+ if (rr.name.to_s.downcase == name.to_s.downcase) &&
87
+ ((rr.type == type) ||
88
+ ((rr.type == Types::RRSIG) && (rr.type_covered == type)))
89
+ rrs_to_delete.push(rr)
90
+ end
91
+ end
92
+ rrs_to_delete.each { |rr| delete(rr) }
93
+ @msg.update_counts if @msg
94
+ end
95
+ end
96
+ end
@@ -1,51 +1,51 @@
1
- #--
2
- #Copyright 2007 Nominet UK
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
- #++
1
+ # --
2
+ # Copyright 2007 Nominet UK
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
16
  module Dnsruby
17
- #== Dnsruby::Name class
18
- #
19
- #A representation of a DNS name
20
- #(RFC1035, section 3.1)
21
- #
22
- #== methods
23
- #
24
- #* Name::create(namestring)
25
- #* Name#absolute?
26
- #* Name#wild?
27
- #* Name#subdomain_of?(other)
28
- #* Name#labels
29
- #
17
+ # == Dnsruby::Name class
18
+ #
19
+ # A representation of a DNS name
20
+ # (RFC1035, section 3.1)
21
+ #
22
+ # == methods
23
+ #
24
+ # * Name::create(namestring)
25
+ # * Name#absolute?
26
+ # * Name#wild?
27
+ # * Name#subdomain_of?(other)
28
+ # * Name#labels
29
+ #
30
30
  class Name
31
31
  include Comparable
32
32
  MaxNameLength=255
33
- #--
34
- # A Name is a collection of Labels. Each label is presentation-formatted
35
- # When a Name is wire-encoded, the label array is walked, and each label is wire-encoded.
36
- # When a Name is unencoded, each label is unencoded, and added to the Name collection of labels.
37
- # When a Name is made from a string, the Name is split into Labels.
38
- #++
39
- #Creates a new Dnsruby::Name from +arg+. +arg+ can be :
40
- #
41
- #* Name:: returns +arg+
42
- #* String:: returns a new Name
33
+ # --
34
+ # A Name is a collection of Labels. Each label is presentation-formatted
35
+ # When a Name is wire-encoded, the label array is walked, and each label is wire-encoded.
36
+ # When a Name is unencoded, each label is unencoded, and added to the Name collection of labels.
37
+ # When a Name is made from a string, the Name is split into Labels.
38
+ # ++
39
+ # Creates a new Dnsruby::Name from +arg+. +arg+ can be :
40
+ #
41
+ # * Name:: returns +arg+
42
+ # * String:: returns a new Name
43
43
  def self.create(arg)
44
44
  case arg
45
45
  when Name
46
46
  return Name.new(arg.labels, arg.absolute?)
47
47
  when String
48
- # arg.gsub!(/\.$/o, "")
48
+ # arg.gsub!(/\.$/o, "")
49
49
  if (arg==".")
50
50
  return Name.new([],true)
51
51
  end
@@ -53,14 +53,14 @@ module Dnsruby
53
53
  return Name.new([],false)
54
54
  end
55
55
  return Name.new(split_escaped(arg), /\.\z/ =~ arg ? true : false)
56
- # return Name.new(Label.split(arg), /\.\z/ =~ arg ? true : false)
56
+ # return Name.new(Label.split(arg), /\.\z/ =~ arg ? true : false)
57
57
  when Array
58
58
  return Name.new(arg, /\.\z/ =~ (arg.last ? ((arg.last.kind_of?String)?arg.last : arg.last.string) : arg.last) ? true : false)
59
- else
59
+ else
60
60
  raise ArgumentError.new("cannot interpret as DNS name: #{arg.inspect}")
61
61
  end
62
62
  end
63
-
63
+
64
64
  def self.split_escaped(arg) #:nodoc: all
65
65
  encodedlabels = name2encodedlabels(arg)
66
66
  return encodedlabels
@@ -71,37 +71,37 @@ module Dnsruby
71
71
  labels = encodedlabels.each {|el| Name.decode(el.to_s)}
72
72
  return labels
73
73
  end
74
-
74
+
75
75
  attr_accessor :labels
76
-
77
- #This method should only be called internally.
78
- #Use Name::create to create a new Name
76
+
77
+ # This method should only be called internally.
78
+ # Use Name::create to create a new Name
79
79
  def initialize(labels, absolute=true) #:nodoc: all
80
80
  total_length=labels.length-1
81
- labels.each do |l|
81
+ labels.each do |l|
82
82
  if (!l.kind_of?Label)
83
83
  raise ArgumentError.new("Name::new called with non-labels. Use Name::create instead?")
84
84
  end
85
- total_length+=l.length
85
+ total_length+=l.length
86
86
  end
87
- if (total_length > MaxNameLength)
87
+ if (total_length > MaxNameLength)
88
88
  raise ResolvError.new("Name length is #{total_length}, greater than max of #{MaxNameLength} octets!")
89
89
  end
90
90
  @labels = labels
91
91
  @absolute = absolute
92
92
  end
93
-
93
+
94
94
  def downcase
95
95
  labels = []
96
96
  @labels.each do |label| labels << Label.new(label.downcase) end
97
97
  return Name.new(labels)
98
98
  end
99
-
99
+
100
100
  def inspect # :nodoc:
101
101
  "#<#{self.class}: #{self.to_s}#{@absolute ? '.' : ''}>"
102
102
  end
103
-
104
- #Returns true if this Name is absolute
103
+
104
+ # Returns true if this Name is absolute
105
105
  def absolute?
106
106
  return @absolute
107
107
  end
@@ -114,8 +114,8 @@ module Dnsruby
114
114
  n = Name.new(self.labels()[1, self.labels.length-1], self.absolute?)
115
115
  return n
116
116
  end
117
-
118
- #Is this name a wildcard?
117
+
118
+ # Is this name a wildcard?
119
119
  def wild?
120
120
  if (labels.length == 0)
121
121
  return false
@@ -123,9 +123,9 @@ module Dnsruby
123
123
  return (labels[0].string == '*')
124
124
  end
125
125
 
126
- # Return the canonical form of this name (RFC 4034 section 6.2)
126
+ # Return the canonical form of this name (RFC 4034 section 6.2)
127
127
  def canonical
128
- #
128
+ #
129
129
  return MessageEncoder.new {|msg|
130
130
  msg.put_name(self, true)
131
131
  }.to_s
@@ -133,7 +133,7 @@ module Dnsruby
133
133
  end
134
134
 
135
135
  def <=>(other)
136
- # return -1 if other less than us, +1 if greater than us
136
+ # return -1 if other less than us, +1 if greater than us
137
137
  return 0 if (canonical == other.canonical)
138
138
  if (canonically_before(other))
139
139
  return +1
@@ -145,20 +145,20 @@ module Dnsruby
145
145
  if (!(Name === n))
146
146
  n = Name.create(n)
147
147
  end
148
- # Work out whether this name is canonically before the passed Name
149
- # RFC 4034 section 6.1
150
- # For the purposes of DNS security, owner names are ordered by treating
151
- #individual labels as unsigned left-justified octet strings. The
152
- #absence of a octet sorts before a zero value octet, and uppercase
153
- #US-ASCII letters are treated as if they were lowercase US-ASCII
154
- #letters.
155
- #To compute the canonical ordering of a set of DNS names, start by
156
- #sorting the names according to their most significant (rightmost)
157
- #labels. For names in which the most significant label is identical,
158
- #continue sorting according to their next most significant label, and
159
- #so forth.
160
-
161
- # Get the list of labels for both names, and then swap them
148
+ # Work out whether this name is canonically before the passed Name
149
+ # RFC 4034 section 6.1
150
+ # For the purposes of DNS security, owner names are ordered by treating
151
+ # individual labels as unsigned left-justified octet strings. The
152
+ # absence of a octet sorts before a zero value octet, and uppercase
153
+ # US-ASCII letters are treated as if they were lowercase US-ASCII
154
+ # letters.
155
+ # To compute the canonical ordering of a set of DNS names, start by
156
+ # sorting the names according to their most significant (rightmost)
157
+ # labels. For names in which the most significant label is identical,
158
+ # continue sorting according to their next most significant label, and
159
+ # so forth.
160
+
161
+ # Get the list of labels for both names, and then swap them
162
162
  my_labels = @labels.reverse
163
163
  other_labels = n.labels.reverse
164
164
  my_labels.each_index {|i|
@@ -170,23 +170,23 @@ module Dnsruby
170
170
  }
171
171
  return true
172
172
  end
173
-
173
+
174
174
  def ==(other) # :nodoc:
175
175
  return false if other.class != Name
176
176
  return @labels == other.labels && @absolute == other.absolute?
177
177
  end
178
178
  alias eql? == # :nodoc:
179
-
180
- # Tests subdomain-of relation : returns true if this name
181
- # is a subdomain of +other+.
182
- #
183
- # domain = Resolv::Name.create("y.z")
184
- # p Resolv::Name.create("w.x.y.z").subdomain_of?(domain) #=> true
185
- # p Resolv::Name.create("x.y.z").subdomain_of?(domain) #=> true
186
- # p Resolv::Name.create("y.z").subdomain_of?(domain) #=> false
187
- # p Resolv::Name.create("z").subdomain_of?(domain) #=> false
188
- # p Resolv::Name.create("x.y.z.").subdomain_of?(domain) #=> false
189
- # p Resolv::Name.create("w.z").subdomain_of?(domain) #=> false
179
+
180
+ # Tests subdomain-of relation : returns true if this name
181
+ # is a subdomain of +other+.
182
+ #
183
+ # domain = Resolv::Name.create("y.z")
184
+ # p Resolv::Name.create("w.x.y.z").subdomain_of?(domain) #=> true
185
+ # p Resolv::Name.create("x.y.z").subdomain_of?(domain) #=> true
186
+ # p Resolv::Name.create("y.z").subdomain_of?(domain) #=> false
187
+ # p Resolv::Name.create("z").subdomain_of?(domain) #=> false
188
+ # p Resolv::Name.create("x.y.z.").subdomain_of?(domain) #=> false
189
+ # p Resolv::Name.create("w.z").subdomain_of?(domain) #=> false
190
190
  def subdomain_of?(other)
191
191
  raise ArgumentError, "not a domain name: #{other.inspect}" unless Name === other
192
192
  return false if @absolute != other.absolute?
@@ -194,33 +194,33 @@ module Dnsruby
194
194
  return false if @labels.length <= other_len
195
195
  return @labels[-other_len, other_len] == other.to_a
196
196
  end
197
-
197
+
198
198
  def hash # :nodoc:
199
199
  return @labels.hash ^ @absolute.hash
200
200
  end
201
-
201
+
202
202
  def to_a #:nodoc: all
203
203
  return @labels
204
204
  end
205
-
205
+
206
206
  def length #:nodoc: all
207
207
  return @labels.length
208
208
  end
209
-
209
+
210
210
  def [](i) #:nodoc: all
211
211
  return @labels[i]
212
212
  end
213
-
214
- # returns the domain name as a string.
215
- #
216
- # The domain name doesn't have a trailing dot even if the name object is
217
- # absolute.
213
+
214
+ # returns the domain name as a string.
215
+ #
216
+ # The domain name doesn't have a trailing dot even if the name object is
217
+ # absolute.
218
+ #
219
+ # Example :
220
+ #
221
+ # p Resolv::Name.create("x.y.z.").to_s #=> "x.y.z"
222
+ # p Resolv::Name.create("x.y.z").to_s #=> "x.y.z"
218
223
  #
219
- # Example :
220
- #
221
- # p Resolv::Name.create("x.y.z.").to_s #=> "x.y.z"
222
- # p Resolv::Name.create("x.y.z").to_s #=> "x.y.z"
223
- #
224
224
  def to_s(include_absolute=false)
225
225
  ret = to_str(@labels)
226
226
  if (@absolute && include_absolute)
@@ -233,18 +233,18 @@ module Dnsruby
233
233
  ls =[]
234
234
  labels.each {|el| ls.push(Name.decode(el.to_s))}
235
235
  return ls.join('.')
236
- # return @labels.collect{|l| (l.kind_of?String) ? l : l.string}.join('.')
236
+ # return @labels.collect{|l| (l.kind_of?String) ? l : l.string}.join('.')
237
237
  end
238
-
239
- # Utility function
240
- #
241
- # name2labels to translate names from presentation format into an
242
- # array of "wire-format" labels.
243
- # in: dName a string with a domain name in presentation format (1035
244
- # sect 5.1)
245
- # out: an array of labels in wire format.
238
+
239
+ # Utility function
240
+ #
241
+ # name2labels to translate names from presentation format into an
242
+ # array of "wire-format" labels.
243
+ # in: dName a string with a domain name in presentation format (1035
244
+ # sect 5.1)
245
+ # out: an array of labels in wire format.
246
246
  def self.name2encodedlabels (dName) #:nodoc: all
247
- # Check for "\" in the name : If there, then decode properly - otherwise, cheat and split on "."
247
+ # Check for "\" in the name : If there, then decode properly - otherwise, cheat and split on "."
248
248
  if (dName.index("\\"))
249
249
  names=[]
250
250
  j=0;
@@ -252,7 +252,7 @@ module Dnsruby
252
252
  names[j],dName = encode(dName)
253
253
  j+=1
254
254
  end
255
-
255
+
256
256
  return names
257
257
  else
258
258
  labels = []
@@ -262,14 +262,14 @@ module Dnsruby
262
262
  return labels
263
263
  end
264
264
  end
265
-
265
+
266
266
  def self.decode(wire) #:nodoc: all
267
267
  presentation=""
268
268
  length=wire.length
269
- # There must be a nice regexp to do this.. but since I failed to
270
- # find one I scan the name string until I find a '\', at that time
271
- # I start looking forward and do the magic.
272
-
269
+ # There must be a nice regexp to do this.. but since I failed to
270
+ # find one I scan the name string until I find a '\', at that time
271
+ # I start looking forward and do the magic.
272
+
273
273
  i=0;
274
274
 
275
275
  unpacked = wire.unpack("C*")
@@ -300,20 +300,20 @@ module Dnsruby
300
300
  end
301
301
 
302
302
  return presentation
303
- # return Label.new(presentation)
303
+ # return Label.new(presentation)
304
304
  end
305
-
306
-
307
-
308
- # wire,leftover=presentation2wire(leftover)
309
- # Will parse the input presentation format and return everything before
310
- # the first non-escaped "." in the first element of the return array and
311
- # all that has not been parsed yet in the 2nd argument.
305
+
306
+
307
+
308
+ # wire,leftover=presentation2wire(leftover)
309
+ # Will parse the input presentation format and return everything before
310
+ # the first non-escaped "." in the first element of the return array and
311
+ # all that has not been parsed yet in the 2nd argument.
312
312
  def self.encode(presentation) #:nodoc: all
313
313
  presentation=presentation.to_s
314
314
  wire="";
315
315
  length=presentation.length;
316
-
316
+
317
317
  i=0;
318
318
 
319
319
  while (i < length )
@@ -323,9 +323,9 @@ module Dnsruby
323
323
  return Label.new(wire),endstring
324
324
  end
325
325
  if (c == 92) # ord'\\'
326
- #backslash found
326
+ # backslash found
327
327
  pos = i+1
328
- # pos sets where next pattern matching should start
328
+ # pos sets where next pattern matching should start
329
329
  if (presentation.index(/\G(\d\d\d)/o, pos))
330
330
  wire=wire+[$1.to_i].pack("C")
331
331
  i=i+3
@@ -353,30 +353,30 @@ module Dnsruby
353
353
  end
354
354
  i=i+1
355
355
  end
356
-
356
+
357
357
  return Label.new(wire)
358
358
  end
359
-
360
- # end
361
-
362
-
363
- #== Dnsruby::Label class
364
- #
365
- #(RFC1035, section 3.1)
366
- #
359
+
360
+ # end
361
+
362
+
363
+ # == Dnsruby::Label class
364
+ #
365
+ # (RFC1035, section 3.1)
366
+ #
367
367
  class Label
368
368
  include Comparable
369
369
  MaxLabelLength = 63
370
370
  @@max_length=MaxLabelLength
371
- # Split a Name into its component Labels
371
+ # Split a Name into its component Labels
372
372
  def self.split(arg)
373
373
  return Name.split(arg)
374
374
  end
375
-
375
+
376
376
  def self.set_max_length(l)
377
377
  @@max_length=l
378
378
  end
379
-
379
+
380
380
  def initialize(string)
381
381
  if (string.length > @@max_length)
382
382
  raise ResolvError.new("Label too long (#{string.length}, max length=#{MaxLabelLength}). Label = #{string}")
@@ -386,15 +386,15 @@ module Dnsruby
386
386
  @string_length = string.length
387
387
  end
388
388
  attr_reader :string, :downcase
389
-
389
+
390
390
  def to_s
391
391
  return @string.to_s # + "."
392
392
  end
393
-
393
+
394
394
  def length
395
395
  return @string_length
396
396
  end
397
-
397
+
398
398
  def inspect
399
399
  return "#<#{self.class} #{self.to_s}>"
400
400
  end
@@ -403,7 +403,7 @@ module Dnsruby
403
403
  return (@downcase <=> other.downcase)
404
404
  end
405
405
 
406
-
406
+
407
407
  def ==(other)
408
408
  return @downcase == other.downcase
409
409
  end