net-dns 0.9.0 → 0.20.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +29 -16
- data/README.md +1 -1
- data/lib/net/dns/header.rb +48 -64
- data/lib/net/dns/names.rb +8 -10
- data/lib/net/dns/packet.rb +46 -53
- data/lib/net/dns/question.rb +5 -3
- data/lib/net/dns/resolver/socks.rb +5 -7
- data/lib/net/dns/resolver/timeouts.rb +3 -5
- data/lib/net/dns/resolver.rb +54 -69
- data/lib/net/dns/rr/a.rb +3 -4
- data/lib/net/dns/rr/aaaa.rb +3 -5
- data/lib/net/dns/rr/classes.rb +6 -8
- data/lib/net/dns/rr/cname.rb +3 -5
- data/lib/net/dns/rr/hinfo.rb +9 -13
- data/lib/net/dns/rr/mr.rb +3 -5
- data/lib/net/dns/rr/mx.rb +5 -7
- data/lib/net/dns/rr/ns.rb +3 -5
- data/lib/net/dns/rr/null.rb +3 -5
- data/lib/net/dns/rr/ptr.rb +3 -5
- data/lib/net/dns/rr/soa.rb +11 -7
- data/lib/net/dns/rr/srv.rb +5 -2
- data/lib/net/dns/rr/txt.rb +4 -6
- data/lib/net/dns/rr/types.rb +90 -79
- data/lib/net/dns/rr.rb +2 -2
- data/lib/net/dns/version.rb +1 -1
- data/lib/net/dns.rb +3 -1
- metadata +11 -104
- data/.gitignore +0 -8
- data/.rubocop.yml +0 -3
- data/.rubocop_defaults.yml +0 -364
- data/.rubocop_todo.yml +0 -207
- data/Gemfile +0 -8
- data/Rakefile +0 -38
- data/bin/console +0 -14
- data/lib/net/dns/core_ext.rb +0 -45
- data/net-dns.gemspec +0 -23
- data/spec/fixtures/resolv.conf +0 -4
- data/spec/spec_helper.rb +0 -14
- data/spec/unit/resolver/dns_timeout_spec.rb +0 -36
- data/spec/unit/resolver/tcp_timeout_spec.rb +0 -46
- data/spec/unit/resolver/udp_timeout_spec.rb +0 -46
- data/test/test_helper.rb +0 -13
- data/test/unit/header_test.rb +0 -164
- data/test/unit/names_test.rb +0 -21
- data/test/unit/packet_test.rb +0 -47
- data/test/unit/question_test.rb +0 -81
- data/test/unit/resolver_test.rb +0 -114
- data/test/unit/rr/a_test.rb +0 -106
- data/test/unit/rr/aaaa_test.rb +0 -102
- data/test/unit/rr/classes_test.rb +0 -83
- data/test/unit/rr/cname_test.rb +0 -90
- data/test/unit/rr/hinfo_test.rb +0 -111
- data/test/unit/rr/mr_test.rb +0 -99
- data/test/unit/rr/mx_test.rb +0 -106
- data/test/unit/rr/ns_test.rb +0 -80
- data/test/unit/rr/types_test.rb +0 -71
- data/test/unit/rr_test.rb +0 -127
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fec69b4a6e824defa6fb7a25a020a67d0dba5340f2f42b1c489e3b73027b6577
|
4
|
+
data.tar.gz: bd9fcd575cb009fa14ce0443ea3b415f0924a04c3a63be620b350c913b93fe39
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ba5ecc052ddd89bfc5bb264ce0a11edb2aa791b1d6285075f0f96245634b1b73bb69e29e883bd4656a85d6c82e6f331e11cfb66b55a10da27b90221ad61f8d6
|
7
|
+
data.tar.gz: 0ff1b210ef56b91a7dc3d914039bedb7e08803c8838a0eefe1233fef4c97a7e817b06387e45bc6b77354a3efe7f9fc885499efff0aabacb07ac24c3eb75aca15
|
data/CHANGELOG.md
CHANGED
@@ -1,33 +1,46 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
3
|
|
4
|
-
## Release 0.
|
4
|
+
## Release 0.20.0
|
5
5
|
|
6
|
-
-
|
6
|
+
- CHANGED: Minimum Ruby version is now 2.7
|
7
|
+
|
8
|
+
- CHANGED: Merged changes from gitlab-net-dns @stanhu
|
9
|
+
|
10
|
+
- FIXED: Fixed undefined method 'size' errors (GH-46, GH-81) @stanhu
|
11
|
+
|
12
|
+
- FIXED: uninitialized constant Net::DNS::Resolver::TimeoutError (GH-82, GH-83, GH-84)
|
13
|
+
|
14
|
+
- ADDED: Added URI/SPF/CAA type code
|
7
15
|
|
8
|
-
|
16
|
+
|
17
|
+
## Release 0.9.0
|
9
18
|
|
10
19
|
- CHANGED: Major code cleanup.
|
11
20
|
|
12
21
|
- CHANGED: Minimum Ruby version is now 2.1
|
13
22
|
|
23
|
+
- FIXED: Fixed CI run (GH-77).
|
24
|
+
|
25
|
+
- FIXED: Fixed deprecated references to Fixnum.
|
14
26
|
|
15
|
-
## Release 0.8.0
|
16
27
|
|
17
|
-
|
28
|
+
## Release 0.8.0
|
18
29
|
|
19
|
-
- FIXED:
|
30
|
+
- FIXED: undefined local variable or method `source_address_inet6' (GH-40). @simsicon
|
20
31
|
|
21
|
-
-
|
32
|
+
- FIXED: Fixed bug on parsing multiple nameservers on different lines (GH-45). @nicholasren
|
33
|
+
|
34
|
+
- CHANGED: Dropped duplicate query ID filter. Query ID is now randomically generated but it's not guaranteed to be unique (GH-39). @ebroder
|
22
35
|
|
23
|
-
- CHANGED: require 'net/dns' is now the preferred way to load the library (GH-37).
|
36
|
+
- CHANGED: require 'net/dns' is now the preferred way to load the library (GH-37). @johnroa
|
24
37
|
|
25
38
|
- CHANGED: Removed setup.rb installation script.
|
26
39
|
|
27
40
|
|
28
41
|
## Release 0.7.1
|
29
42
|
|
30
|
-
- FIXED: Invalid file permissions on several files (GH-35)
|
43
|
+
- FIXED: Invalid file permissions on several files (GH-35) @jamespharaoh
|
31
44
|
|
32
45
|
|
33
46
|
## Release 0.7.0
|
@@ -38,15 +51,15 @@
|
|
38
51
|
|
39
52
|
- FIXED: Cleaned up require dependency and recursive require statements.
|
40
53
|
|
41
|
-
- FIXED: Use RbConfig instead of obsolete and deprecated Config (GH-28, GH-33)
|
54
|
+
- FIXED: Use RbConfig instead of obsolete and deprecated Config (GH-28, GH-33) @shadowbq, @eik3
|
42
55
|
|
43
|
-
- FIXED: SRV record not required by Net::DNS::RR (GH-27)
|
56
|
+
- FIXED: SRV record not required by Net::DNS::RR (GH-27) @sebastian
|
44
57
|
|
45
|
-
- FIXED: Resolver now supports IPv6 (GH-32)
|
58
|
+
- FIXED: Resolver now supports IPv6 (GH-32) @jamesotron
|
46
59
|
|
47
|
-
- FIXED: Net::DNS::RR::PTR references an invalid parameter (GH-19)
|
60
|
+
- FIXED: Net::DNS::RR::PTR references an invalid parameter (GH-19) @dd23
|
48
61
|
|
49
|
-
- FIXED: Net::DNS::Question changes input arguments (GH-7)
|
62
|
+
- FIXED: Net::DNS::Question changes input arguments (GH-7) @gfarfl
|
50
63
|
|
51
64
|
- CHANGED: Refactoring unit test to follow most used Ruby conventions.
|
52
65
|
|
@@ -67,9 +80,9 @@
|
|
67
80
|
|
68
81
|
- ADDED: Net::DNS::Packet#to_s method (alias of #inspect)
|
69
82
|
|
70
|
-
- FIXED: typo in lib/net/dns/rr/ptr.rb
|
83
|
+
- FIXED: typo in lib/net/dns/rr/ptr.rb. Thanks Chris Lundquist.
|
71
84
|
|
72
|
-
- FIXED: warning: method redefined; discarding old inspect (GH-3)
|
85
|
+
- FIXED: warning: method redefined; discarding old inspect (GH-3). Thanks Kevin Baker.
|
73
86
|
|
74
87
|
- FIXED: issue with rescue ArgumentError (GH-5) and with IPAddr handling (GH-6)
|
75
88
|
|
data/README.md
CHANGED
data/lib/net/dns/header.rb
CHANGED
@@ -128,16 +128,16 @@ module Net
|
|
128
128
|
"",
|
129
129
|
"",].freeze
|
130
130
|
|
131
|
-
attr_reader :code
|
131
|
+
attr_reader :code
|
132
|
+
attr_reader :type
|
133
|
+
attr_reader :explanation
|
132
134
|
|
133
135
|
def initialize(code)
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
raise ArgumentError, "RCode `#{code}' out of range"
|
140
|
-
end
|
136
|
+
raise ArgumentError, "RCode `#{code}' out of range" unless (0..10).cover? code
|
137
|
+
|
138
|
+
@code = code
|
139
|
+
@type = RCodeType[code]
|
140
|
+
@explanation = RCodeErrorString[code]
|
141
141
|
end
|
142
142
|
|
143
143
|
def to_s
|
@@ -205,11 +205,9 @@ module Net
|
|
205
205
|
# See also each option for a detailed explanation of usage.
|
206
206
|
#
|
207
207
|
def initialize(arg = {})
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
raise ArgumentError, "Wrong argument class `#{arg.class}'"
|
212
|
-
end
|
208
|
+
raise ArgumentError, "Wrong argument class `#{arg.class}'" unless arg.is_a? Hash
|
209
|
+
|
210
|
+
new_from_hash(arg)
|
213
211
|
end
|
214
212
|
|
215
213
|
# Creates a new Net::DNS::Header object from binary data, which is
|
@@ -225,13 +223,11 @@ module Net
|
|
225
223
|
# #=> "true" if it comes from authoritative name server
|
226
224
|
#
|
227
225
|
def self.parse(arg)
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
raise ArgumentError, "Wrong argument class `#{arg.class}'"
|
234
|
-
end
|
226
|
+
raise ArgumentError, "Wrong argument class `#{arg.class}'" unless arg.is_a? String
|
227
|
+
|
228
|
+
o = allocate
|
229
|
+
o.send(:new_from_binary, arg)
|
230
|
+
o
|
235
231
|
end
|
236
232
|
|
237
233
|
# Inspect method, prints out all the options and relative values.
|
@@ -251,18 +247,18 @@ module Net
|
|
251
247
|
# do stuff
|
252
248
|
else
|
253
249
|
";; qr = #{@qr}\t" \
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
250
|
+
"opCode: #{opCode_str}\t" \
|
251
|
+
"aa = #{@aa}\t" \
|
252
|
+
"tc = #{@tc}\t" \
|
253
|
+
"rd = #{@rd}\n" \
|
254
|
+
";; ra = #{@ra}\t" \
|
255
|
+
"ad = #{@ad}\t" \
|
256
|
+
"cd = #{@cd}\t" \
|
257
|
+
"rcode = #{@rCode.type}\n" \
|
258
|
+
";; qdCount = #{@qdCount}\t" \
|
259
|
+
"anCount = #{@anCount}\t" \
|
260
|
+
"nsCount = #{@nsCount}\t" \
|
261
|
+
"arCount = #{@arCount}\n"
|
266
262
|
end
|
267
263
|
end
|
268
264
|
|
@@ -329,11 +325,9 @@ module Net
|
|
329
325
|
# performing security tests.
|
330
326
|
#
|
331
327
|
def id=(val)
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
raise ArgumentError, "ID `#{val}' out of range"
|
336
|
-
end
|
328
|
+
raise ArgumentError, "ID `#{val}' out of range" unless (0..65_535).cover? val
|
329
|
+
|
330
|
+
@id = val
|
337
331
|
end
|
338
332
|
|
339
333
|
# Checks whether the header is a query (+qr+ bit set to 0)
|
@@ -392,11 +386,9 @@ module Net
|
|
392
386
|
# header.opCode = Header::STATUS
|
393
387
|
#
|
394
388
|
def opCode=(val)
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
raise WrongOpcodeError, "Wrong opCode value (#{val}), must be QUERY, IQUERY or STATUS"
|
399
|
-
end
|
389
|
+
raise WrongOpcodeError, "Wrong opCode value (#{val}), must be QUERY, IQUERY or STATUS" unless (0..2).cover? val
|
390
|
+
|
391
|
+
@opCode = val
|
400
392
|
end
|
401
393
|
|
402
394
|
# Checks whether the response is authoritative
|
@@ -620,41 +612,33 @@ module Net
|
|
620
612
|
# Sets the number of entries in a question section
|
621
613
|
#
|
622
614
|
def qdCount=(val)
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
raise WrongCountError, "Wrong number of count (#{val}), must be 0-65535"
|
627
|
-
end
|
615
|
+
raise WrongCountError, "Wrong number of count (#{val}), must be 0-65535" unless (0..65_535).cover? val
|
616
|
+
|
617
|
+
@qdCount = val
|
628
618
|
end
|
629
619
|
|
630
620
|
# Sets the number of RRs in an answer section
|
631
621
|
#
|
632
622
|
def anCount=(val)
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
raise WrongCountError, "Wrong number of count (#{val}), must be 0-65535"
|
637
|
-
end
|
623
|
+
raise WrongCountError, "Wrong number of count (#{val}), must be 0-65535" unless (0..65_535).cover? val
|
624
|
+
|
625
|
+
@anCount = val
|
638
626
|
end
|
639
627
|
|
640
628
|
# Sets the number of RRs in an authority section
|
641
629
|
#
|
642
630
|
def nsCount=(val)
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
raise WrongCountError, "Wrong number of count (#{val}), must be 0-65535"
|
647
|
-
end
|
631
|
+
raise WrongCountError, "Wrong number of count (#{val}), must be 0-65535" unless (0..65_535).cover? val
|
632
|
+
|
633
|
+
@nsCount = val
|
648
634
|
end
|
649
635
|
|
650
636
|
# Sets the number of RRs in an addictional section
|
651
637
|
#
|
652
638
|
def arCount=(val)
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
raise WrongCountError, "Wrong number of count: `#{val}' must be 0-65535"
|
657
|
-
end
|
639
|
+
raise WrongCountError, "Wrong number of count: `#{val}' must be 0-65535" unless (0..65_535).cover? val
|
640
|
+
|
641
|
+
@arCount = val
|
658
642
|
end
|
659
643
|
|
660
644
|
private
|
@@ -674,12 +658,12 @@ module Net
|
|
674
658
|
end
|
675
659
|
|
676
660
|
arr = str.unpack("n C2 n4")
|
677
|
-
@id
|
661
|
+
@id = arr[0]
|
678
662
|
@qr = (arr[1] >> 7) & 0x01
|
679
663
|
@opCode = (arr[1] >> 3) & 0x0F
|
680
664
|
@aa = (arr[1] >> 2) & 0x01
|
681
665
|
@tc = (arr[1] >> 1) & 0x01
|
682
|
-
@rd
|
666
|
+
@rd = arr[1] & 0x1
|
683
667
|
@ra = (arr[2] >> 7) & 0x01
|
684
668
|
@ad = (arr[2] >> 5) & 0x01
|
685
669
|
@cd = (arr[2] >> 4) & 0x01
|
data/lib/net/dns/names.rb
CHANGED
@@ -12,7 +12,7 @@ module Net # :nodoc:
|
|
12
12
|
INT16SZ = 2
|
13
13
|
|
14
14
|
# Expand a compressed name in a DNS Packet object. Please
|
15
|
-
# see
|
15
|
+
# see RFC1035 for an explanation of how the compression
|
16
16
|
# in DNS packets works, how may it be useful and how should
|
17
17
|
# be handled.
|
18
18
|
#
|
@@ -24,9 +24,9 @@ module Net # :nodoc:
|
|
24
24
|
name = ""
|
25
25
|
packetlen = packet.size
|
26
26
|
loop do
|
27
|
-
raise ExpandError, "Offset is greater than packet
|
27
|
+
raise ExpandError, "Offset is greater than packet length!" if packetlen < (offset + 1)
|
28
28
|
|
29
|
-
len = packet.
|
29
|
+
len = packet.unpack1("@#{offset} C")
|
30
30
|
|
31
31
|
if len == 0
|
32
32
|
offset += 1
|
@@ -34,7 +34,7 @@ module Net # :nodoc:
|
|
34
34
|
elsif (len & 0xC0) == 0xC0
|
35
35
|
raise ExpandError, "Packet ended before offset expand" if packetlen < (offset + INT16SZ)
|
36
36
|
|
37
|
-
ptr = packet.
|
37
|
+
ptr = packet.unpack1("@#{offset} n")
|
38
38
|
ptr &= 0x3FFF
|
39
39
|
name2 = dn_expand(packet, ptr)[0]
|
40
40
|
raise ExpandError, "Packet is malformed!" if name2.nil?
|
@@ -98,7 +98,7 @@ module Net # :nodoc:
|
|
98
98
|
offset += INT16SZ
|
99
99
|
break
|
100
100
|
else
|
101
|
-
len = entry.
|
101
|
+
len = entry.unpack1("C")
|
102
102
|
elem = entry[1..len]
|
103
103
|
str += [len, elem].pack("Ca*")
|
104
104
|
names.update(entry.to_s => offset)
|
@@ -109,11 +109,9 @@ module Net # :nodoc:
|
|
109
109
|
end
|
110
110
|
|
111
111
|
def valid?(name)
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
raise ArgumentError, "Invalid FQDN: #{name}"
|
116
|
-
end
|
112
|
+
raise ArgumentError, "Invalid FQDN: #{name}" unless name =~ /^([a-z0-9]([-a-z0-9]*[a-z0-9])?\.)+((a[cdefgilmnoqrstuwxz]|aero|arpa)|(b[abdefghijmnorstvwyz]|biz)|(c[acdfghiklmnorsuvxyz]|cat|com|coop)|d[ejkmoz]|(e[ceghrstu]|edu)|f[ijkmor]|(g[abdefghilmnpqrstuwy]|gov)|h[kmnrtu]|(i[delmnoqrst]|info|int)|(j[emop]|jobs)|k[eghimnprwyz]|l[abcikrstuvy]|(m[acdghklmnopqrstuvwxyz]|mil|mobi|museum)|(n[acefgilopruz]|name|net)|(om|org)|(p[aefghklmnrstwy]|pro)|qa|r[eouw]|s[abcdeghijklmnortvyz]|(t[cdfghjklmnoprtvwz]|travel)|u[agkmsyz]|v[aceginu]|w[fs]|y[etu]|z[amw])$/i
|
113
|
+
|
114
|
+
name
|
117
115
|
end
|
118
116
|
end
|
119
117
|
end
|
data/lib/net/dns/packet.rb
CHANGED
@@ -90,8 +90,13 @@ module Net
|
|
90
90
|
class PacketError < Error
|
91
91
|
end
|
92
92
|
|
93
|
-
attr_reader :header
|
94
|
-
attr_reader :
|
93
|
+
attr_reader :header
|
94
|
+
attr_reader :question
|
95
|
+
attr_reader :answer
|
96
|
+
attr_reader :authority
|
97
|
+
attr_reader :additional
|
98
|
+
attr_reader :answerfrom
|
99
|
+
attr_reader :answersize
|
95
100
|
|
96
101
|
# Creates a new instance of <tt>Net::DNS::Packet</tt> class. Arguments are the
|
97
102
|
# canonical name of the resource, an optional type field and an optional
|
@@ -261,11 +266,9 @@ module Net
|
|
261
266
|
# Assigns a <tt>Net::DNS::Header</tt> <tt>object</tt>
|
262
267
|
# to this <tt>Net::DNS::Packet</tt> instance.
|
263
268
|
def header=(object)
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
raise ArgumentError, "Argument must be a Net::DNS::Header object"
|
268
|
-
end
|
269
|
+
raise ArgumentError, "Argument must be a Net::DNS::Header object" unless object.is_a? Net::DNS::Header
|
270
|
+
|
271
|
+
@header = object
|
269
272
|
end
|
270
273
|
|
271
274
|
# Assigns a <tt>Net::DNS::Question</tt> <tt>object</tt>
|
@@ -273,11 +276,10 @@ module Net
|
|
273
276
|
def question=(object)
|
274
277
|
case object
|
275
278
|
when Array
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
end
|
279
|
+
raise ArgumentError, "Some of the elements is not an Net::DNS::Question object" unless object.all? { |x| x.is_a? Net::DNS::Question }
|
280
|
+
|
281
|
+
@question = object
|
282
|
+
|
281
283
|
when Net::DNS::Question
|
282
284
|
@question = [object]
|
283
285
|
else
|
@@ -290,11 +292,10 @@ module Net
|
|
290
292
|
def answer=(object)
|
291
293
|
case object
|
292
294
|
when Array
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
end
|
295
|
+
raise ArgumentError, "Some of the elements is not an Net::DNS::RR object" unless object.all? { |x| x.is_a? Net::DNS::RR }
|
296
|
+
|
297
|
+
@answer = object
|
298
|
+
|
298
299
|
when Net::DNS::RR
|
299
300
|
@answer = [object]
|
300
301
|
else
|
@@ -307,11 +308,10 @@ module Net
|
|
307
308
|
def additional=(object)
|
308
309
|
case object
|
309
310
|
when Array
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
end
|
311
|
+
raise ArgumentError, "Some of the elements is not an Net::DNS::RR object" unless object.all? { |x| x.is_a? Net::DNS::RR }
|
312
|
+
|
313
|
+
@additional = object
|
314
|
+
|
315
315
|
when Net::DNS::RR
|
316
316
|
@additional = [object]
|
317
317
|
else
|
@@ -324,11 +324,10 @@ module Net
|
|
324
324
|
def authority=(object)
|
325
325
|
case object
|
326
326
|
when Array
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
end
|
327
|
+
raise ArgumentError, "Some of the elements is not an Net::DNS::RR object" unless object.all? { |x| x.is_a? Net::DNS::RR }
|
328
|
+
|
329
|
+
@authority = object
|
330
|
+
|
332
331
|
when Net::DNS::RR
|
333
332
|
@authority = [object]
|
334
333
|
else
|
@@ -345,7 +344,7 @@ module Net
|
|
345
344
|
#
|
346
345
|
# As you can see in the documentation for the <tt>Net::DNS::RR::A</tt> class,
|
347
346
|
# the address returned is an instance of <tt>IPAddr</tt> class.
|
348
|
-
def each_address
|
347
|
+
def each_address
|
349
348
|
@answer.each do |elem|
|
350
349
|
next unless elem.class == Net::DNS::RR::A
|
351
350
|
|
@@ -360,7 +359,7 @@ module Net
|
|
360
359
|
# puts "Nameserver found: #{ns}"
|
361
360
|
# end
|
362
361
|
#
|
363
|
-
def each_nameserver
|
362
|
+
def each_nameserver
|
364
363
|
@answer.each do |elem|
|
365
364
|
next unless elem.class == Net::DNS::RR::NS
|
366
365
|
|
@@ -375,7 +374,7 @@ module Net
|
|
375
374
|
# puts "Mail exchange #{name} has preference #{pref}"
|
376
375
|
# end
|
377
376
|
#
|
378
|
-
def each_mx
|
377
|
+
def each_mx
|
379
378
|
@answer.each do |elem|
|
380
379
|
next unless elem.class == Net::DNS::RR::MX
|
381
380
|
|
@@ -390,7 +389,7 @@ module Net
|
|
390
389
|
# puts "Canonical name: #{cname}"
|
391
390
|
# end
|
392
391
|
#
|
393
|
-
def each_cname
|
392
|
+
def each_cname
|
394
393
|
@answer.each do |elem|
|
395
394
|
next unless elem.class == Net::DNS::RR::CNAME
|
396
395
|
|
@@ -405,7 +404,7 @@ module Net
|
|
405
404
|
# puts "Pointer for resource: #{ptr}"
|
406
405
|
# end
|
407
406
|
#
|
408
|
-
def each_ptr
|
407
|
+
def each_ptr
|
409
408
|
@answer.each do |elem|
|
410
409
|
next unless elem.class == Net::DNS::RR::PTR
|
411
410
|
|
@@ -505,13 +504,11 @@ module Net
|
|
505
504
|
|
506
505
|
@answer = []
|
507
506
|
@header.anCount.times do
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
warn "Net::DNS unsupported record type: #{e.message}"
|
514
|
-
end
|
507
|
+
rrobj, offset = Net::DNS::RR.parse_packet(data, offset)
|
508
|
+
@answer << rrobj
|
509
|
+
@logger.debug rrobj.inspect
|
510
|
+
rescue NameError => e
|
511
|
+
warn "Net::DNS unsupported record type: #{e.message}"
|
515
512
|
end
|
516
513
|
|
517
514
|
#------------------------------------------------------------
|
@@ -522,13 +519,11 @@ module Net
|
|
522
519
|
|
523
520
|
@authority = []
|
524
521
|
@header.nsCount.times do
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
warn "Net::DNS unsupported record type: #{e.message}"
|
531
|
-
end
|
522
|
+
rrobj, offset = Net::DNS::RR.parse_packet(data, offset)
|
523
|
+
@authority << rrobj
|
524
|
+
@logger.debug rrobj.inspect
|
525
|
+
rescue NameError => e
|
526
|
+
warn "Net::DNS unsupported record type: #{e.message}"
|
532
527
|
end
|
533
528
|
|
534
529
|
#------------------------------------------------------------
|
@@ -538,13 +533,11 @@ module Net
|
|
538
533
|
|
539
534
|
@additional = []
|
540
535
|
@header.arCount.times do
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
warn "Net::DNS unsupported record type: #{e.message}"
|
547
|
-
end
|
536
|
+
rrobj, offset = Net::DNS::RR.parse_packet(data, offset)
|
537
|
+
@additional << rrobj
|
538
|
+
@logger.debug rrobj.inspect
|
539
|
+
rescue NameError => e
|
540
|
+
warn "Net::DNS unsupported record type: #{e.message}"
|
548
541
|
end
|
549
542
|
end
|
550
543
|
|
data/lib/net/dns/question.rb
CHANGED
@@ -152,7 +152,7 @@ module Net
|
|
152
152
|
result = ""
|
153
153
|
offset = 0
|
154
154
|
loop do
|
155
|
-
len = str.
|
155
|
+
len = str.unpack1("@#{offset} C")
|
156
156
|
break if len == 0
|
157
157
|
|
158
158
|
offset += 1
|
@@ -165,7 +165,7 @@ module Net
|
|
165
165
|
|
166
166
|
def check_name(input)
|
167
167
|
name = input.to_s.strip
|
168
|
-
if name =~ /[^\w\.\-_]/
|
168
|
+
if name =~ /[^\w\.\-_\*]/
|
169
169
|
raise NameInvalid, "Invalid Question Name `#{name}'"
|
170
170
|
end
|
171
171
|
|
@@ -173,11 +173,13 @@ module Net
|
|
173
173
|
end
|
174
174
|
|
175
175
|
def new_from_binary(data)
|
176
|
+
raise NameInvalid if data.size <= 4
|
177
|
+
|
176
178
|
str, type, cls = data.unpack("a#{data.size - 4}nn")
|
177
179
|
@qName = build_qName(str)
|
178
180
|
@qType = Net::DNS::RR::Types.new type
|
179
181
|
@qClass = Net::DNS::RR::Classes.new cls
|
180
|
-
rescue StandardError
|
182
|
+
rescue StandardError
|
181
183
|
raise ArgumentError, "Invalid data: #{data.inspect}"
|
182
184
|
end
|
183
185
|
end
|
@@ -50,7 +50,7 @@ class RawSocket # :nodoc:
|
|
50
50
|
[@protocol, 'C'], # protocol
|
51
51
|
[0, 'n'], # checksum
|
52
52
|
[@src_addr.to_i, 'N'], # source
|
53
|
-
[@dest_addr.to_i, 'N'],
|
53
|
+
[@dest_addr.to_i, 'N'], # destination
|
54
54
|
])
|
55
55
|
packet << make_transport_header(payload.size)
|
56
56
|
packet << [payload].pack("a*")
|
@@ -71,11 +71,9 @@ class RawSocket # :nodoc:
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def check_port(port)
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
raise ArgumentError, "Port #{port} not valid"
|
78
|
-
end
|
74
|
+
raise ArgumentError, "Port #{port} not valid" unless (1..65_535).cover?(port) && port.is_a?(Integer)
|
75
|
+
|
76
|
+
port
|
79
77
|
end
|
80
78
|
|
81
79
|
def genID
|
@@ -142,7 +140,7 @@ class UdpRawSocket < RawSocket # :nodoc:
|
|
142
140
|
[@src_port, 'n'], # source port
|
143
141
|
[@dest_port, 'n'], # destination port
|
144
142
|
[8 + pay_size, 'n'], # len
|
145
|
-
[0, 'n']
|
143
|
+
[0, 'n'], # checksum (mandatory)
|
146
144
|
])
|
147
145
|
end
|
148
146
|
end
|
@@ -7,11 +7,9 @@ module Net # :nodoc:
|
|
7
7
|
attr_reader :seconds
|
8
8
|
|
9
9
|
def initialize(seconds)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
raise ArgumentError, "Invalid value for tcp timeout"
|
14
|
-
end
|
10
|
+
raise ArgumentError, "Invalid value for tcp timeout" unless seconds.is_a?(Numeric) && seconds >= 0
|
11
|
+
|
12
|
+
@seconds = seconds
|
15
13
|
end
|
16
14
|
|
17
15
|
# Returns a string representation of the timeout corresponding
|