dnsruby 1.41 → 1.42
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.
- data/lib/Dnsruby/Recursor.rb +1 -1
- data/lib/Dnsruby/Resolver.rb +13 -3
- data/lib/Dnsruby/dnssec.rb +3 -1
- data/lib/Dnsruby/message.rb +6 -4
- data/lib/Dnsruby/name.rb +2 -2
- data/lib/Dnsruby/resource/NAPTR.rb +17 -5
- data/lib/Dnsruby/resource/TXT.rb +117 -15
- data/lib/Dnsruby/resource/resource.rb +8 -2
- data/lib/Dnsruby/single_verifier.rb +2 -2
- data/lib/Dnsruby/zone_reader.rb +66 -11
- data/lib/dnsruby.rb +7 -0
- data/test/tc_misc.rb +2 -2
- data/test/tc_naptr.rb +6 -0
- data/test/tc_rr-txt.rb +5 -0
- data/test/tc_verifier.rb +65 -3
- metadata +2 -2
data/lib/Dnsruby/Recursor.rb
CHANGED
data/lib/Dnsruby/Resolver.rb
CHANGED
@@ -98,6 +98,9 @@ module Dnsruby
|
|
98
98
|
|
99
99
|
# The current Config
|
100
100
|
attr_reader :config
|
101
|
+
|
102
|
+
# Does this Resolver cache answers, and attempt to retrieve answer from the cache?
|
103
|
+
attr_reader :do_caching
|
101
104
|
|
102
105
|
# The array of SingleResolvers used for sending query messages
|
103
106
|
# attr_accessor :single_resolvers # :nodoc:
|
@@ -331,7 +334,7 @@ module Dnsruby
|
|
331
334
|
if (@single_resolvers.length == 0)
|
332
335
|
Thread.start {
|
333
336
|
sleep(@query_timeout == 0 ? 1 : @query_timeout)
|
334
|
-
args[1].push([client_query_id, nil, ResolvTimeout.new])
|
337
|
+
args[1].push([client_query_id, nil, ResolvTimeout.new("Query timed out - no nameservers configured")])
|
335
338
|
}
|
336
339
|
end
|
337
340
|
return client_query_id
|
@@ -625,7 +628,8 @@ module Dnsruby
|
|
625
628
|
#Pass in either a Dnsruby::RR::TSIG, or a key_name and key (or just a key)
|
626
629
|
#Pass in nil to stop tsig signing.
|
627
630
|
#* res.tsig=(tsig_rr)
|
628
|
-
#* res.tsig=(key_name, key)
|
631
|
+
#* res.tsig=(key_name, key) # defaults to hmac-md5
|
632
|
+
#* res.tsig=(key_name, key, alg) # e.g. alg = "hmac-sha1"
|
629
633
|
#* res.tsig=nil # Stop the resolver from signing
|
630
634
|
def tsig=(t)
|
631
635
|
@tsig=t
|
@@ -639,7 +643,11 @@ module Dnsruby
|
|
639
643
|
if (args[0].instance_of?RR::TSIG)
|
640
644
|
tsig = args[0]
|
641
645
|
elsif (args[0].instance_of?Array)
|
642
|
-
|
646
|
+
if (args[0].length > 2)
|
647
|
+
tsig = RR.new_from_hash({:type => Types.TSIG, :klass => Classes.ANY, :name => args[0][0], :key => args[0][1], :algorithm => args[0][2]})
|
648
|
+
else
|
649
|
+
tsig = RR.new_from_hash({:type => Types.TSIG, :klass => Classes.ANY, :name => args[0][0], :key => args[0][1]})
|
650
|
+
end
|
643
651
|
end
|
644
652
|
else
|
645
653
|
# Dnsruby.log.debug{"TSIG signing switched off"}
|
@@ -647,6 +655,8 @@ module Dnsruby
|
|
647
655
|
end
|
648
656
|
elsif (args.length ==2)
|
649
657
|
tsig = RR.new_from_hash({:type => Types.TSIG, :klass => Classes.ANY, :name => args[0], :key => args[1]})
|
658
|
+
elsif (args.length ==3)
|
659
|
+
tsig = RR.new_from_hash({:type => Types.TSIG, :klass => Classes.ANY, :name => args[0], :key => args[1], :algorithm => args[2]})
|
650
660
|
else
|
651
661
|
raise ArgumentError.new("Wrong number of arguments to tsig=")
|
652
662
|
end
|
data/lib/Dnsruby/dnssec.rb
CHANGED
@@ -210,7 +210,8 @@ module Dnsruby
|
|
210
210
|
msg.security_level = Message::SecurityLevel.SECURE
|
211
211
|
return true
|
212
212
|
end
|
213
|
-
rescue VerifyError
|
213
|
+
rescue VerifyError => e
|
214
|
+
msg.security_error = e
|
214
215
|
end
|
215
216
|
end
|
216
217
|
|
@@ -254,6 +255,7 @@ module Dnsruby
|
|
254
255
|
end
|
255
256
|
# Set the message security level!
|
256
257
|
msg.security_level = last_level
|
258
|
+
msg.security_error = last_error
|
257
259
|
raise VerifyError.new(last_error) if (last_level < 0)
|
258
260
|
return (msg.security_level.code > Message::SecurityLevel::UNCHECKED)
|
259
261
|
end
|
data/lib/Dnsruby/message.rb
CHANGED
@@ -323,13 +323,15 @@ module Dnsruby
|
|
323
323
|
|
324
324
|
# Return the rrsets of the specified type in the message
|
325
325
|
def rrsets(type, klass=Classes::IN)
|
326
|
-
|
326
|
+
rrsetss = []
|
327
327
|
[@answer, @authority, @additional].each do |section|
|
328
|
-
if ((
|
329
|
-
rrsets.
|
328
|
+
if ((rrsets = section.rrsets(type, klass)).length > 0)
|
329
|
+
rrsets.each {|rrset|
|
330
|
+
rrsetss.push(rrset)
|
331
|
+
}
|
330
332
|
end
|
331
333
|
end
|
332
|
-
return
|
334
|
+
return rrsetss
|
333
335
|
end
|
334
336
|
|
335
337
|
# Return a hash, with the section as key, and the RRSets in that
|
data/lib/Dnsruby/name.rb
CHANGED
@@ -240,7 +240,7 @@ module Dnsruby
|
|
240
240
|
# sect 5.1)
|
241
241
|
# out: an array of labels in wire format.
|
242
242
|
def self.name2encodedlabels (dName) #:nodoc: all
|
243
|
-
# Check for "
|
243
|
+
# Check for "\" in the name : If there, then decode properly - otherwise, cheat and split on "."
|
244
244
|
if (dName.index("\\"))
|
245
245
|
names=[]
|
246
246
|
j=0;
|
@@ -311,7 +311,7 @@ module Dnsruby
|
|
311
311
|
length=presentation.length;
|
312
312
|
|
313
313
|
i=0;
|
314
|
-
|
314
|
+
|
315
315
|
while (i < length )
|
316
316
|
c=presentation.unpack("x#{i}C1") [0]
|
317
317
|
if (c == 46) # ord('.')
|
@@ -54,14 +54,26 @@ module Dnsruby
|
|
54
54
|
@preference = values [1].to_i
|
55
55
|
@flags = values [2].gsub!("\"", "")
|
56
56
|
@service = values [3].gsub!("\"", "")
|
57
|
-
|
57
|
+
re = values [4].gsub!("\"", "")
|
58
|
+
re.gsub!("\\\\", "\\")
|
59
|
+
@regexp = re
|
58
60
|
@replacement = Name.create(values[5])
|
59
61
|
end
|
60
62
|
end
|
61
|
-
|
63
|
+
|
62
64
|
def rdata_to_string #:nodoc: all
|
63
65
|
if (@order!=nil)
|
64
|
-
|
66
|
+
ret = "#{@order} #{@preference} \"#{@flags}\" \"#{@service}\" \""
|
67
|
+
##{@regexp}
|
68
|
+
@regexp.each_byte {|b|
|
69
|
+
c = b.chr
|
70
|
+
if (c == "\\")
|
71
|
+
ret += "\\"
|
72
|
+
end
|
73
|
+
ret += c
|
74
|
+
}
|
75
|
+
ret += "\" #{@replacement}"
|
76
|
+
return ret
|
65
77
|
else
|
66
78
|
return ""
|
67
79
|
end
|
@@ -73,7 +85,7 @@ module Dnsruby
|
|
73
85
|
msg.put_string(@flags)
|
74
86
|
msg.put_string(@service)
|
75
87
|
msg.put_string(@regexp)
|
76
|
-
msg.put_name(@replacement,
|
88
|
+
msg.put_name(@replacement, true)
|
77
89
|
end
|
78
90
|
|
79
91
|
def self.decode_rdata(msg) #:nodoc: all
|
@@ -85,6 +97,6 @@ module Dnsruby
|
|
85
97
|
replacement = msg.get_name
|
86
98
|
return self.new([order, preference, flags, service, regexp, replacement])
|
87
99
|
end
|
88
|
-
end
|
100
|
+
end
|
89
101
|
end
|
90
102
|
end
|
data/lib/Dnsruby/resource/TXT.rb
CHANGED
@@ -13,7 +13,10 @@
|
|
13
13
|
#See the License for the specific language governing permissions and
|
14
14
|
#limitations under the License.
|
15
15
|
#++
|
16
|
-
|
16
|
+
begin
|
17
|
+
require 'jcode'
|
18
|
+
rescue LoadError => e
|
19
|
+
end
|
17
20
|
module Dnsruby
|
18
21
|
class RR
|
19
22
|
#Class for DNS Text (TXT) resource records.
|
@@ -38,28 +41,127 @@ module Dnsruby
|
|
38
41
|
from_string(hash[:strings])
|
39
42
|
end
|
40
43
|
end
|
44
|
+
|
45
|
+
ESCAPE_CHARS = {"b" => 8, "t" => 9, "n" => 10, "v" => 11, "f" => 12, "r" => 13}
|
46
|
+
ESCAPE_CODES = ESCAPE_CHARS.invert
|
41
47
|
|
42
48
|
def from_string(input)
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
49
|
+
# Need to look out for special characters.
|
50
|
+
# Need to split the input up into strings (which are defined by non-escaped " characters)
|
51
|
+
# Then need to fix up any \ escape characters (should just be " and ; and binary?)
|
52
|
+
# Sadly, it's going to be easiest just to scan through this character by character...
|
53
|
+
in_escaped = false
|
54
|
+
in_string = false
|
55
|
+
count = -1
|
56
|
+
strings = []
|
57
|
+
current_binary = ""
|
58
|
+
current_quote_char = '"'
|
59
|
+
unquoted = false
|
60
|
+
seen_strings = false
|
61
|
+
pos = 0
|
62
|
+
input.each_char {|c|
|
63
|
+
if (((c == "'") || (c == '"')) && (!in_escaped) && (!unquoted))
|
64
|
+
if (!in_string)
|
65
|
+
seen_strings = true
|
66
|
+
current_quote_char = c
|
67
|
+
in_string = true
|
68
|
+
count+=1
|
69
|
+
strings[count] = ""
|
70
|
+
else
|
71
|
+
if (c == current_quote_char)
|
72
|
+
in_string = false
|
73
|
+
else
|
74
|
+
strings[count]+=c
|
75
|
+
end
|
76
|
+
end
|
77
|
+
else
|
78
|
+
if (seen_strings && !in_string)
|
79
|
+
next
|
80
|
+
end
|
81
|
+
if (pos == 0)
|
82
|
+
unquoted = true
|
83
|
+
count+=1
|
84
|
+
strings[count] = ""
|
85
|
+
elsif (unquoted)
|
86
|
+
if (c == " ")
|
87
|
+
count+=1
|
88
|
+
strings[count] = ""
|
89
|
+
pos += 1
|
90
|
+
next
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
if (c == "\\")
|
95
|
+
if (in_escaped)
|
96
|
+
in_escaped = false
|
97
|
+
strings[count]+=(c)
|
98
|
+
else
|
99
|
+
in_escaped = true
|
100
|
+
end
|
101
|
+
else
|
102
|
+
if (in_escaped)
|
103
|
+
# Build up the binary
|
104
|
+
if (c == ";") || (c == '"')
|
105
|
+
strings[count]+=c
|
106
|
+
in_escaped = false
|
107
|
+
elsif (ESCAPE_CHARS[c])
|
108
|
+
in_escaped=false
|
109
|
+
strings[count]+=ESCAPE_CHARS[c].chr
|
110
|
+
elsif (c<"0" || c>"9")
|
111
|
+
in_escaped = false
|
112
|
+
strings[count]+=c
|
113
|
+
else
|
114
|
+
# Must be building up three digit string to identify binary value?
|
115
|
+
current_binary += c
|
116
|
+
if (current_binary.length == 3)
|
117
|
+
strings[count]+=current_binary.to_i.chr
|
118
|
+
in_escaped = false
|
119
|
+
current_binary = ""
|
120
|
+
end
|
121
|
+
end
|
122
|
+
else
|
123
|
+
strings[count]+=(c)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
pos += 1
|
128
|
+
}
|
129
|
+
@strings=strings
|
53
130
|
end
|
54
131
|
|
55
132
|
def rdata_to_string
|
56
133
|
if (defined?@strings)
|
57
|
-
temp =
|
58
|
-
|
59
|
-
|
134
|
+
temp = []
|
135
|
+
@strings.each {|str|
|
136
|
+
output = "\""
|
137
|
+
# Probably need to scan through each string manually
|
138
|
+
# Make sure to remember to escape binary characters.
|
139
|
+
# Go through copying to output, and adding "\" characters as necessary?
|
140
|
+
str.each_byte {|c|
|
141
|
+
if (c == 34) || (c == 92) # || (c == 59)
|
142
|
+
output+='\\'
|
143
|
+
output+=c.chr
|
144
|
+
elsif (c < 32) # c is binary
|
145
|
+
if (ESCAPE_CODES[c])
|
146
|
+
output += c.chr
|
147
|
+
else
|
148
|
+
output+= '\\'
|
149
|
+
num = c.to_i.to_s
|
150
|
+
(3-num.length).times {|i|
|
151
|
+
num="0"+num
|
152
|
+
}
|
153
|
+
output+= num # Need a 3 digit number here.
|
154
|
+
end
|
155
|
+
|
156
|
+
else
|
157
|
+
output += c.chr
|
158
|
+
end
|
159
|
+
}
|
160
|
+
output+="\""
|
161
|
+
temp.push(output)
|
60
162
|
}
|
61
163
|
return temp.join(' ')
|
62
|
-
end
|
164
|
+
end
|
63
165
|
return ''
|
64
166
|
end
|
65
167
|
|
@@ -386,8 +386,6 @@ module Dnsruby
|
|
386
386
|
|
387
387
|
if rdata
|
388
388
|
rdata.gsub!(/\s+$/o, "")
|
389
|
-
rdata.gsub!("(", "")
|
390
|
-
rdata.gsub!(")", "")
|
391
389
|
end
|
392
390
|
|
393
391
|
# RFC3597 tweaks
|
@@ -410,6 +408,14 @@ module Dnsruby
|
|
410
408
|
if (rrtype == '')
|
411
409
|
rrtype = 'ANY';
|
412
410
|
end
|
411
|
+
|
412
|
+
if ((rrtype == "NAPTR") || (rrtype == "TXT"))
|
413
|
+
else
|
414
|
+
if (rdata)
|
415
|
+
rdata.gsub!("(", "")
|
416
|
+
rdata.gsub!(")", "")
|
417
|
+
end
|
418
|
+
end
|
413
419
|
|
414
420
|
if (implemented_rrs.include?(rrtype) && rdata !~/^\s*\\#/o )
|
415
421
|
subclass = _get_subclass(name, rrtype, rrclass, ttl, rdata)
|
@@ -275,10 +275,10 @@ module Dnsruby
|
|
275
275
|
if ((msg.answer.size == 0) && (!dsrrset) && (rrset.type == Types.NS)) # (isDelegation)
|
276
276
|
# Now check NSEC(3) records for absence of DS and SOA
|
277
277
|
nsec = msg.authority.rrsets('NSEC')[0]
|
278
|
-
if (nsec.length == 0)
|
278
|
+
if (!nsec || (nsec.length == 0))
|
279
279
|
nsec = msg.authority.rrsets('NSEC3')[0]
|
280
280
|
end
|
281
|
-
if (nsec.rrs.length > 0)
|
281
|
+
if (nsec && (nsec.rrs.length > 0))
|
282
282
|
if (!(nsec.rrs()[0].types.include?'DS') || !(nsec.rrs()[0].types.include?'SOA'))
|
283
283
|
next # delegation which we expect to be unsigned - so don't verify it!
|
284
284
|
end
|
data/lib/Dnsruby/zone_reader.rb
CHANGED
@@ -49,14 +49,15 @@ module Dnsruby
|
|
49
49
|
zone = nil
|
50
50
|
IO.foreach(file) { |line|
|
51
51
|
begin
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
zone
|
52
|
+
|
53
|
+
ret = process_line(line)
|
54
|
+
if (ret)
|
55
|
+
rr = RR.create(ret)
|
56
|
+
if (!zone)
|
57
|
+
zone = []
|
58
|
+
end
|
59
|
+
zone.push(rr)
|
57
60
|
end
|
58
|
-
zone.push(rr)
|
59
|
-
end
|
60
61
|
rescue Exception => e
|
61
62
|
raise ParseException.new("Error reading line #{line_num} of #{file} : [#{line}]")
|
62
63
|
end
|
@@ -124,6 +125,10 @@ module Dnsruby
|
|
124
125
|
# Does a quoted section begin or end in this line?
|
125
126
|
# Are there any semi-colons?
|
126
127
|
# Ary any of the semi-colons inside a quoted section?
|
128
|
+
# Handle escape characters
|
129
|
+
if (line.index"\\")
|
130
|
+
return strip_comments_meticulously(line)
|
131
|
+
end
|
127
132
|
while (next_index = line.index(";", last_index + 1))
|
128
133
|
# Have there been any quotes since we last looked?
|
129
134
|
process_quotes(line[last_index, next_index - last_index])
|
@@ -141,6 +146,44 @@ module Dnsruby
|
|
141
146
|
return line
|
142
147
|
end
|
143
148
|
|
149
|
+
def strip_comments_meticulously(line)
|
150
|
+
# We have escape characters in the text. Go through it character by
|
151
|
+
# character and work out what's escaped and quoted and what's not
|
152
|
+
escaped = false
|
153
|
+
quoted = false
|
154
|
+
pos = 0
|
155
|
+
line.each_char {|c|
|
156
|
+
if (c == "\\")
|
157
|
+
if (!escaped)
|
158
|
+
escaped = true
|
159
|
+
else
|
160
|
+
escaped = false
|
161
|
+
end
|
162
|
+
else
|
163
|
+
if (escaped)
|
164
|
+
escaped = false
|
165
|
+
next
|
166
|
+
else
|
167
|
+
if (c == "\"")
|
168
|
+
if (quoted)
|
169
|
+
quoted = false
|
170
|
+
else
|
171
|
+
quoted = true
|
172
|
+
end
|
173
|
+
else
|
174
|
+
if (c == ";")
|
175
|
+
if (!quoted)
|
176
|
+
return line[0, pos]
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
pos +=1
|
183
|
+
}
|
184
|
+
return line
|
185
|
+
end
|
186
|
+
|
144
187
|
def process_quotes(section)
|
145
188
|
# Look through the section of text and set the @in_quoted_section
|
146
189
|
# as it should be at the end of the given section
|
@@ -161,16 +204,23 @@ module Dnsruby
|
|
161
204
|
line = @last_name + " " + line
|
162
205
|
end
|
163
206
|
line.chomp!
|
164
|
-
line.sub!("
|
165
|
-
line.sub!("
|
166
|
-
line.sub!(
|
167
|
-
line.sub!("@\t", "#{@origin} ")
|
207
|
+
line.sub!(/\s+@$/, " #{@origin}") # IN CNAME @
|
208
|
+
line.sub!(/^@\s+/, "#{@origin} ") # IN CNAME @
|
209
|
+
line.sub!(/\s+@\s+/, " #{@origin} ")
|
168
210
|
line.strip!
|
169
211
|
|
170
212
|
|
171
213
|
# o We need to identify the domain name in the record, and then
|
172
214
|
split = line.split(' ') # split on whitespace
|
173
215
|
name = split[0].strip
|
216
|
+
if (name.index"\\")
|
217
|
+
old_name = name
|
218
|
+
name = Name.create(name).to_s
|
219
|
+
if (/\.\z/ =~ old_name)
|
220
|
+
name += "."
|
221
|
+
end
|
222
|
+
line.sub!(old_name, name)
|
223
|
+
end
|
174
224
|
# o add $ORIGIN to it if it is not absolute
|
175
225
|
if !(/\.\z/ =~ name)
|
176
226
|
new_name = name + "." + @origin
|
@@ -240,6 +290,11 @@ module Dnsruby
|
|
240
290
|
type_string=prefix_for_rrset_order(type, type_was)
|
241
291
|
@last_name = name
|
242
292
|
|
293
|
+
if !([Types::NAPTR, Types::TXT].include?type_was)
|
294
|
+
line.sub!("(", "")
|
295
|
+
line.sub!(")", "")
|
296
|
+
end
|
297
|
+
|
243
298
|
if (is_soa)
|
244
299
|
if (@soa_ttl)
|
245
300
|
# Replace the %MISSING_TTL% text with the SOA TTL from the config
|
data/lib/dnsruby.rb
CHANGED
@@ -102,6 +102,12 @@ require 'Dnsruby/TheLog'
|
|
102
102
|
#* /etc/nsswitch.conf is not supported.
|
103
103
|
#* NSEC3 validation still TBD
|
104
104
|
module Dnsruby
|
105
|
+
|
106
|
+
# @TODO@ Remember to update version in dnsruby.gemspec!
|
107
|
+
VERSION = 1.42
|
108
|
+
def Dnsruby.version
|
109
|
+
return VERSION
|
110
|
+
end
|
105
111
|
|
106
112
|
@@logger = Logger.new(STDOUT)
|
107
113
|
@@logger.level = Logger::FATAL
|
@@ -260,6 +266,7 @@ module Dnsruby
|
|
260
266
|
CERT = 37 # RFC 2538
|
261
267
|
DNAME = 39 # RFC 2672
|
262
268
|
OPT = 41 # RFC 2671
|
269
|
+
# APL = 42 # RFC 3123
|
263
270
|
DS = 43 # RFC 4034
|
264
271
|
SSHFP = 44 # RFC 4255
|
265
272
|
IPSECKEY = 45 # RFC 4025
|
data/test/tc_misc.rb
CHANGED
@@ -125,9 +125,9 @@ class TestMisc < Test::Unit::TestCase
|
|
125
125
|
assert_equal("736f7274206f66202220746578743b20616e642062696e61727920002064617461", temp,"Second Char string in TXT RR read from wireformat")
|
126
126
|
|
127
127
|
|
128
|
-
txtRr2=Dnsruby::RR.create('txt2.t.dnsruby.validation-test-servers.nominet.org.uk. 60 IN TXT "Test1 \"
|
128
|
+
txtRr2=Dnsruby::RR.create('txt2.t.dnsruby.validation-test-servers.nominet.org.uk. 60 IN TXT "Test1 \" \; more stuff" "Test2"')
|
129
129
|
|
130
|
-
assert_equal((txtRr2.strings)[0],'Test1 "
|
130
|
+
assert_equal((txtRr2.strings)[0],'Test1 " ; more stuff', "First arg string in TXT RR read from zonefileformat")
|
131
131
|
assert_equal((txtRr2.strings)[1],'Test2',"Second Char string in TXT RR read from zonefileformat")
|
132
132
|
|
133
133
|
|
data/test/tc_naptr.rb
CHANGED
@@ -45,4 +45,10 @@ class TestNAPTR < Test::Unit::TestCase
|
|
45
45
|
naptr.flags = "u"
|
46
46
|
end
|
47
47
|
|
48
|
+
def test_string
|
49
|
+
txt = 'all.rr.org. 7200 IN NAPTR 100 10 "" "" "/urn:cid:.+@([^\\.]+\\.)(.*)$/\\2/i" .'
|
50
|
+
rr = RR.create(txt)
|
51
|
+
assert(rr.to_s.index('"/urn:cid:.+@([^\\\\.]+\\\\.)(.*)$/\\\\2/i"'), '"/urn:cid:.+@([^\\\\.]+\\\\.)(.*)$/\\\\2/i"' + "\n" + rr.to_s)
|
52
|
+
end
|
53
|
+
|
48
54
|
end
|
data/test/tc_rr-txt.rb
CHANGED
@@ -134,4 +134,9 @@ class TestRrTest < Test::Unit::TestCase
|
|
134
134
|
|
135
135
|
|
136
136
|
end
|
137
|
+
|
138
|
+
def test_nasty_txt
|
139
|
+
t = RR.create('txt2.t.net-dns.org. 60 IN TXT "Net-DNS\; complicated $tuff" "sort of \" text\; and binary \000 data"')
|
140
|
+
assert(t.rdata.to_s == '"Net-DNS\; complicated $tuff" "sort of \" text\; and binary \000 data"', t.to_s)
|
141
|
+
end
|
137
142
|
end
|
data/test/tc_verifier.rb
CHANGED
@@ -20,7 +20,7 @@ require 'dnsruby'
|
|
20
20
|
class VerifierTest < Test::Unit::TestCase
|
21
21
|
|
22
22
|
def test_sha2
|
23
|
-
#
|
23
|
+
# Check if OpenSSL supports SHA2
|
24
24
|
have_sha2 = false
|
25
25
|
begin
|
26
26
|
OpenSSL::Digest::SHA256.new
|
@@ -35,7 +35,7 @@ class VerifierTest < Test::Unit::TestCase
|
|
35
35
|
print "OpenSSL doesn't support SHA2 - disabling SHA256/SHA512 tests. DNSSEC validation will not work with these type of signatures.\n"
|
36
36
|
end
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
def do_test_sha256
|
40
40
|
key256 = Dnsruby::RR.create("example.net. 3600 IN DNSKEY (256 3 8 AwEAAcFcGsaxxdgiuuGmCkVI
|
41
41
|
my4h99CqT7jwY3pexPGcnUFtR2Fh36BponcwtkZ4cAgtvd4Qs8P
|
@@ -69,7 +69,7 @@ class VerifierTest < Test::Unit::TestCase
|
|
69
69
|
verifier = Dnsruby::SingleVerifier.new(nil)
|
70
70
|
verifier.verify_rrset(rrset, key512)
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
def test_se_query
|
74
74
|
# Run some queries on the .se zone
|
75
75
|
Dnsruby::Dnssec.clear_trusted_keys
|
@@ -243,4 +243,66 @@ class VerifierTest < Test::Unit::TestCase
|
|
243
243
|
# }
|
244
244
|
assert(verified > 0)
|
245
245
|
end
|
246
|
+
|
247
|
+
def test_naptr
|
248
|
+
key = Dnsruby::RR.create("all.rr.org. 2678400 IN DNSKEY 256 3 7 AwEAAcW1ZJxnMxZAAfsQ0JJQPHOlVNeGzs/AWVSGXiIYsg9UUSsvRTiK/Wy2wD7XC6osZpgy4Blhm846wktPbCwHpkxxbjxpaMABjbhH14gRol1Gpzf+gOr8vpdii8c2y6VMN9kIXZyaZUWcshLii19ysSGlqY1a1g2XZjogFtvzDHjH ;{id = 43068 (zsk), size = 1024b}")
|
249
|
+
verifier = Dnsruby::SingleVerifier.new(Dnsruby::SingleVerifier::VerifierType::ANCHOR)
|
250
|
+
key_rrset = Dnsruby::RRSet.new(key)
|
251
|
+
verifier.add_trusted_key(key_rrset);
|
252
|
+
sig = Dnsruby::RR.create("all.rr.org. 86400 IN RRSIG NAPTR 7 3 86400 20100727230632 20090919145743 43068 all.rr.org. RpyBsaLiaZ/OqX5twE0SoMhlVZVAHuAlS4FZqmnAg+udF3EwrY6N/POt3nPCtgwf7tczaxrMK6zWkOldfv37iyIgXIxDQvhoCb7IoffI5TsBL5CWl5n7pg8BNAMpLxd8HIu1DShWvlplpFbBWIaC6tZCR6ft/iP+uhU7dYcqTHg= ;{id = 43068}")
|
253
|
+
naptr = Dnsruby::RR.create('all.rr.org. 86400 IN NAPTR 100 10 "" "" "!^urn:cid:.+@([^\\\\.]+\\\\.)(.*)$!\\\\2!i" .')
|
254
|
+
rrset = Dnsruby::RRSet.new(naptr)
|
255
|
+
rrset.add(sig)
|
256
|
+
verifier.verify_rrset(rrset, key_rrset)
|
257
|
+
end
|
258
|
+
|
259
|
+
def test_txt_rr
|
260
|
+
txt = 'txt2.all.rr.org. 86400 IN TXT "Net-DNS\\\\; complicated $tuff" "sort of \\" text\\\\; and binary \\000 data"'
|
261
|
+
rr = Dnsruby::RR.create(txt)
|
262
|
+
assert(rr.to_s.index('"Net-DNS\\\\; complicated $tuff" "sort of \\" text\\\\; and binary \\000 data"'), rr.to_s)
|
263
|
+
|
264
|
+
key = Dnsruby::RR.create("all.rr.org. 2678400 IN DNSKEY 256 3 7 AwEAAcW1ZJxnMxZAAfsQ0JJQPHOlVNeGzs/AWVSGXiIYsg9UUSsvRTiK/Wy2wD7XC6osZpgy4Blhm846wktPbCwHpkxxbjxpaMABjbhH14gRol1Gpzf+gOr8vpdii8c2y6VMN9kIXZyaZUWcshLii19ysSGlqY1a1g2XZjogFtvzDHjH ;{id = 43068 (zsk), size = 1024b}")
|
265
|
+
verifier = Dnsruby::SingleVerifier.new(Dnsruby::SingleVerifier::VerifierType::ANCHOR)
|
266
|
+
key_rrset = Dnsruby::RRSet.new(key)
|
267
|
+
verifier.add_trusted_key(key_rrset);
|
268
|
+
sig = Dnsruby::RR.create("txt2.all.rr.org. 86400 IN RRSIG TXT 7 4 86400 20100813002344 20091006093439 43068 all.rr.org. LJv/ccd2JHyT6TK74Dtu/zH4jdeR4ScyrB8cGwaqeCjwxG4H5FY88Sk/U0JUQyxnUificnyZQwcyXAItn7QjBMHQO4ftVxl/gDCyt6MEXy9JKK/rfvXcAceo5prmlVrb8WxT5YnvPha3CxjK7f+YIs5cqppRVaZTQTxsAsJyJ20= ;{id = 43068}")
|
269
|
+
txt = Dnsruby::RR.create('txt2.all.rr.org. 86400 IN TXT "Net-DNS\\\\; complicated $tuff" "sort of \\" text\\\\; and binary \\000 data"')
|
270
|
+
rrset = Dnsruby::RRSet.new(txt)
|
271
|
+
rrset.add(sig)
|
272
|
+
verifier.verify_rrset(rrset, key_rrset)
|
273
|
+
end
|
274
|
+
|
275
|
+
# def test_txt_from_zone
|
276
|
+
# reader = Dnsruby::ZoneReader.new("all.rr.org.")
|
277
|
+
# zone = reader.process_file("zone.txt")
|
278
|
+
# rrset = Dnsruby::RRSet.new
|
279
|
+
# key_rrset = Dnsruby::RRSet.new
|
280
|
+
# zone.each {|rr|
|
281
|
+
# if ( (rr.type == Dnsruby::Types.TXT) || ((rr.type == Dnsruby::Types.RRSIG) && (rr.type_covered == Dnsruby::Types.TXT)))
|
282
|
+
# rrset.add(rr)
|
283
|
+
# end
|
284
|
+
# if (rr.type == Dnsruby::Types.DNSKEY)
|
285
|
+
# key_rrset.add(rr)
|
286
|
+
# end
|
287
|
+
# }
|
288
|
+
# verifier = Dnsruby::SingleVerifier.new(Dnsruby::SingleVerifier::VerifierType::ANCHOR)
|
289
|
+
# verifier.verify_rrset(rrset, key_rrset)
|
290
|
+
# end
|
291
|
+
|
292
|
+
# def test_naptr_from_zone
|
293
|
+
# reader = Dnsruby::ZoneReader.new("all.rr.org.")
|
294
|
+
# zone = reader.process_file("zone.txt")
|
295
|
+
# rrset = Dnsruby::RRSet.new
|
296
|
+
# key_rrset = Dnsruby::RRSet.new
|
297
|
+
# zone.each {|rr|
|
298
|
+
# if ((rr.type == Dnsruby::Types.NAPTR) || ((rr.type == Dnsruby::Types.RRSIG) && (rr.type_covered == Dnsruby::Types.NAPTR)))
|
299
|
+
# rrset.add(rr)
|
300
|
+
# end
|
301
|
+
# if (rr.type == Dnsruby::Types.DNSKEY)
|
302
|
+
# key_rrset.add(rr)
|
303
|
+
# end
|
304
|
+
# }
|
305
|
+
# verifier = Dnsruby::SingleVerifier.new(Dnsruby::SingleVerifier::VerifierType::ANCHOR)
|
306
|
+
# verifier.verify_rrset(rrset, key_rrset)
|
307
|
+
# end
|
246
308
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dnsruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "1.
|
4
|
+
version: "1.42"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AlexD
|
@@ -9,7 +9,7 @@ autorequire: dnsruby
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-08 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|