pNet-DNS 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +68 -0
- data/lib/Net/DNS.rb +879 -0
- data/lib/Net/DNS/Header.rb +303 -0
- data/lib/Net/DNS/Nameserver.rb +601 -0
- data/lib/Net/DNS/Packet.rb +851 -0
- data/lib/Net/DNS/Question.rb +117 -0
- data/lib/Net/DNS/RR.rb +630 -0
- data/lib/Net/DNS/RR/A.rb +103 -0
- data/lib/Net/DNS/RR/AAAA.rb +147 -0
- data/lib/Net/DNS/RR/AFSDB.rb +114 -0
- data/lib/Net/DNS/RR/CERT.rb +191 -0
- data/lib/Net/DNS/RR/CNAME.rb +89 -0
- data/lib/Net/DNS/RR/DNAME.rb +84 -0
- data/lib/Net/DNS/RR/EID.rb +70 -0
- data/lib/Net/DNS/RR/HINFO.rb +108 -0
- data/lib/Net/DNS/RR/ISDN.rb +118 -0
- data/lib/Net/DNS/RR/LOC.rb +341 -0
- data/lib/Net/DNS/RR/MB.rb +92 -0
- data/lib/Net/DNS/RR/MG.rb +96 -0
- data/lib/Net/DNS/RR/MINFO.rb +109 -0
- data/lib/Net/DNS/RR/MR.rb +92 -0
- data/lib/Net/DNS/RR/MX.rb +124 -0
- data/lib/Net/DNS/RR/NAPTR.rb +182 -0
- data/lib/Net/DNS/RR/NIMLOC.rb +70 -0
- data/lib/Net/DNS/RR/NS.rb +100 -0
- data/lib/Net/DNS/RR/NSAP.rb +273 -0
- data/lib/Net/DNS/RR/NULL.rb +68 -0
- data/lib/Net/DNS/RR/OPT.rb +251 -0
- data/lib/Net/DNS/RR/PTR.rb +93 -0
- data/lib/Net/DNS/RR/PX.rb +131 -0
- data/lib/Net/DNS/RR/RP.rb +108 -0
- data/lib/Net/DNS/RR/RT.rb +115 -0
- data/lib/Net/DNS/RR/SOA.rb +195 -0
- data/lib/Net/DNS/RR/SPF.rb +46 -0
- data/lib/Net/DNS/RR/SRV.rb +153 -0
- data/lib/Net/DNS/RR/SSHFP.rb +190 -0
- data/lib/Net/DNS/RR/TKEY.rb +219 -0
- data/lib/Net/DNS/RR/TSIG.rb +358 -0
- data/lib/Net/DNS/RR/TXT.rb +162 -0
- data/lib/Net/DNS/RR/UNKNOWN.rb +76 -0
- data/lib/Net/DNS/RR/X25.rb +90 -0
- data/lib/Net/DNS/Resolver.rb +2090 -0
- data/lib/Net/DNS/Resolver/Recurse.rb +478 -0
- data/lib/Net/DNS/Update.rb +189 -0
- data/test/custom.txt +4 -0
- data/test/resolv.conf +4 -0
- data/test/tc_escapedchars.rb +498 -0
- data/test/tc_header.rb +91 -0
- data/test/tc_inet6.rb +169 -0
- data/test/tc_misc.rb +137 -0
- data/test/tc_online.rb +236 -0
- data/test/tc_packet.rb +174 -0
- data/test/tc_packet_unique_push.rb +126 -0
- data/test/tc_question.rb +49 -0
- data/test/tc_recurse.rb +69 -0
- data/test/tc_res_env.rb +59 -0
- data/test/tc_res_file.rb +55 -0
- data/test/tc_res_opt.rb +135 -0
- data/test/tc_resolver.rb +102 -0
- data/test/tc_rr-opt.rb +40 -0
- data/test/tc_rr-rrsort.rb +116 -0
- data/test/tc_rr-txt.rb +138 -0
- data/test/tc_rr-unknown.rb +95 -0
- data/test/tc_rr.rb +246 -0
- data/test/tc_tcp.rb +34 -0
- data/test/tc_tkey.rb +115 -0
- data/test/tc_update.rb +226 -0
- data/test/ts_netdns.rb +17 -0
- data/test/ts_offline.rb +32 -0
- data/test/ts_online.rb +33 -0
- metadata +119 -0
@@ -0,0 +1,189 @@
|
|
1
|
+
# The contents of this file are subject to the Mozilla
|
2
|
+
# Public Licence Version 1.1 (the "Licence"); you may
|
3
|
+
# not use this file except in compliance with the
|
4
|
+
# Licence. You may obtain a copy of the Licence at
|
5
|
+
# http://www.mozilla.org/MPL
|
6
|
+
# Software distributed under the Licence is distributed
|
7
|
+
# on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND,
|
8
|
+
# either express or implied. See the Licence of the
|
9
|
+
# specific language governing rights and limitations
|
10
|
+
# under the Licence.
|
11
|
+
# The Original Code is pNet::DNS.
|
12
|
+
# The Initial Developer of the Original Code is
|
13
|
+
# Nominet UK (www.nominet.org.uk). Portions created by
|
14
|
+
# Nominet UK are Copyright (c) Nominet UK 2006.
|
15
|
+
# All rights reserved.
|
16
|
+
module Net
|
17
|
+
module DNS
|
18
|
+
#= NAME
|
19
|
+
#
|
20
|
+
#Net::DNS::Update - Create a DNS update packet
|
21
|
+
#
|
22
|
+
#= DESCRIPTION
|
23
|
+
#
|
24
|
+
#Net::DNS::Update is a subclass of Net::DNS::Packet,
|
25
|
+
#to be used for making DNS dynamic updates. Programmers
|
26
|
+
#should refer to RFC 2136 for the semantics of dynamic updates.
|
27
|
+
#
|
28
|
+
#WARNING: This code is still under development. Please use with
|
29
|
+
#caution on production nameservers.
|
30
|
+
#
|
31
|
+
#
|
32
|
+
#Future versions of Net::DNS may provide a simpler interface
|
33
|
+
#for making dynamic updates.
|
34
|
+
#
|
35
|
+
#
|
36
|
+
#
|
37
|
+
#= EXAMPLES
|
38
|
+
#
|
39
|
+
#The first example below shows a complete program; subsequent examples
|
40
|
+
#show only the creation of the update packet.
|
41
|
+
#
|
42
|
+
#== Add a new host
|
43
|
+
#
|
44
|
+
# require 'Net/DNS'
|
45
|
+
#
|
46
|
+
# # Create the update packet.
|
47
|
+
# update = Net::DNS::Update.new_from_values('example.com')
|
48
|
+
#
|
49
|
+
# # Prerequisite is that no A records exist for the name.
|
50
|
+
# update.push('pre', Net::DNS.nxrrset('foo.example.com. A'))
|
51
|
+
#
|
52
|
+
# # Add two A records for the name.
|
53
|
+
# update.push('update', Net::DNS.rr_add('foo.example.com. 86400 A 192.168.1.2'))
|
54
|
+
# update.push('update', Net::DNS.rr_add('foo.example.com. 86400 A 172.16.3.4'))
|
55
|
+
#
|
56
|
+
# # Send the update to the zone's primary master.
|
57
|
+
# res = Net::DNS::Resolver.new
|
58
|
+
# res.nameservers=('primary-master.example.com')
|
59
|
+
#
|
60
|
+
# reply = res.send(update)
|
61
|
+
#
|
62
|
+
# # Did it work?
|
63
|
+
# if (reply)
|
64
|
+
# if (reply.header.rcode == 'NOERROR')
|
65
|
+
# print "Update succeeded\n"
|
66
|
+
# else
|
67
|
+
# print 'Update failed: ', reply.header.rcode, "\n"
|
68
|
+
# end
|
69
|
+
# else
|
70
|
+
# print 'Update failed: ', res.errorstring, "\n"
|
71
|
+
# end
|
72
|
+
#
|
73
|
+
#== Add an MX record for a name that already exists
|
74
|
+
#
|
75
|
+
# update = Net::DNS::Update.new_from_values('example.com')
|
76
|
+
# update.push("pre", yxdomain('example.com'))
|
77
|
+
# update.push("update", Net::DNS.rr_add('example.com MX 10 mailhost.example.com'))
|
78
|
+
#
|
79
|
+
#== Add a TXT record for a name that doesn't exist
|
80
|
+
#
|
81
|
+
# update = Net::DNS::Update.new_from_values('example.com')
|
82
|
+
# update.push("pre", nxdomain('info.example.com'))
|
83
|
+
# update.push("update", Net::DNS.rr_add('info.example.com TXT "yabba dabba doo"'))
|
84
|
+
#
|
85
|
+
#== Delete all A records for a name
|
86
|
+
#
|
87
|
+
# update = Net::DNS::Update.new_from_values('example.com')
|
88
|
+
# update.push("pre", yxrrset('foo.example.com A'))
|
89
|
+
# update.push("update", Net::DNS.rr_del('foo.example.com A'))
|
90
|
+
#
|
91
|
+
#== Delete all RRs for a name
|
92
|
+
#
|
93
|
+
# update = Net::DNS::Update.new_from_values('example.com')
|
94
|
+
# update.push("pre", yxdomain('byebye.example.com'))
|
95
|
+
# $update->push("update", Net::DNS.rr_del('byebye.example.com'))
|
96
|
+
#
|
97
|
+
#== Perform a signed update
|
98
|
+
#
|
99
|
+
# key_name = 'tsig-key'
|
100
|
+
# key = 'awwLOtRfpGE+rRKF2+DEiw=='
|
101
|
+
#
|
102
|
+
# update = Net::DNS::Update.new_from_values('example.com')
|
103
|
+
# update.push('update', Net::DNS.rr_add('foo.example.com A 10.1.2.3'))
|
104
|
+
# update.push('update', Net::DNS.rr_add('bar.example.com A 10.4.5.6'))
|
105
|
+
# update.sign_tsig(key_name, key)
|
106
|
+
#
|
107
|
+
#== Another way to perform a signed update
|
108
|
+
#
|
109
|
+
# key_name = 'tsig-key'
|
110
|
+
# key = 'awwLOtRfpGE+rRKF2+DEiw=='
|
111
|
+
#
|
112
|
+
# update = Net::DNS::Update.new_from_values('example.com')
|
113
|
+
# update.push('update', Net::DNS.rr_add('foo.example.com A 10.1.2.3'))
|
114
|
+
# update.push('update', Net::DNS.rr_add('bar.example.com A 10.4.5.6'))
|
115
|
+
# update.push('additional', Net::DNS::RR.create("#{key_name} TSIG #{key}"))
|
116
|
+
#
|
117
|
+
#== Perform a signed update with a customized TSIG record
|
118
|
+
#
|
119
|
+
# key_name = 'tsig-key'
|
120
|
+
# key = 'awwLOtRfpGE+rRKF2+DEiw=='
|
121
|
+
#
|
122
|
+
# tsig = Net::DNS::RR.create("#{key_name} TSIG #{key}")
|
123
|
+
# tsig.fudge=(60)
|
124
|
+
#
|
125
|
+
# update = Net::DNS::Update.new_from_values('example.com')
|
126
|
+
# update.push('update', Net::DNS.rr_add('foo.example.com A 10.1.2.3'))
|
127
|
+
# update.push('update', Net::DNS.rr_add('bar.example.com A 10.4.5.6'))
|
128
|
+
# update.push('additional', tsig)
|
129
|
+
#
|
130
|
+
#= BUGS
|
131
|
+
#
|
132
|
+
#This code is still under development. Please use with caution on
|
133
|
+
#production nameservers.
|
134
|
+
#
|
135
|
+
#= COPYRIGHT
|
136
|
+
#
|
137
|
+
#Copyright (c) 1997-2002 Michael Fuhr.
|
138
|
+
#
|
139
|
+
#Portions Copyright (c) 2002-2004 Chris Reinhardt.
|
140
|
+
#
|
141
|
+
#Ruby version Copyright (c) 2006 AlexD (Nominet UK)
|
142
|
+
#
|
143
|
+
#All rights reserved. This program is free software; you may redistribute
|
144
|
+
#it and/or modify it under the same terms as Perl itself.
|
145
|
+
#
|
146
|
+
#= SEE ALSO
|
147
|
+
#
|
148
|
+
#Net::DNS, Net::DNS::Resolver, Net::DNS::Header,
|
149
|
+
#Net::DNS::Packet, Net::DNS::Question, Net::DNS::RR, RFC 2136,
|
150
|
+
#RFC 2845
|
151
|
+
#
|
152
|
+
class Update < Packet
|
153
|
+
|
154
|
+
#Returns a Net::DNS::Update object suitable for performing a DNS
|
155
|
+
#dynamic update. Specifically, it creates a packet with the header
|
156
|
+
#opcode set to UPDATE and the zone record type to SOA (per RFC 2136,
|
157
|
+
#Section 2.3).
|
158
|
+
#
|
159
|
+
#Programs must use the push method to add RRs to the prerequisite,
|
160
|
+
#update, and additional sections before performing the update.
|
161
|
+
#
|
162
|
+
#Arguments are the zone name and the class. If the zone is omitted,
|
163
|
+
#the default domain will be taken from the resolver configuration.
|
164
|
+
#If the class is omitted, it defaults to IN.
|
165
|
+
# packet = Net::DNS::Update.new_from_values
|
166
|
+
# packet = Net::DNS::Update.new('example.com')
|
167
|
+
# packet = Net::DNS::Update.new('example.com', 'HS')
|
168
|
+
#
|
169
|
+
def Update.new_from_values(zone=nil, klass=nil)
|
170
|
+
|
171
|
+
if (zone==nil)
|
172
|
+
res = Net::DNS::Resolver.new
|
173
|
+
zone = (res.searchlist)[0]
|
174
|
+
return unless zone
|
175
|
+
end
|
176
|
+
|
177
|
+
type = 'SOA'
|
178
|
+
klass ||= 'IN'
|
179
|
+
|
180
|
+
packet = Packet.new_from_values(zone, type, klass) || return
|
181
|
+
|
182
|
+
packet.header.opcode=('UPDATE')
|
183
|
+
packet.header.rd=(0)
|
184
|
+
|
185
|
+
return packet
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
data/test/custom.txt
ADDED
data/test/resolv.conf
ADDED
@@ -0,0 +1,498 @@
|
|
1
|
+
# The contents of this file are subject to the Mozilla
|
2
|
+
# Public Licence Version 1.1 (the "Licence"); you may
|
3
|
+
# not use this file except in compliance with the
|
4
|
+
# Licence. You may obtain a copy of the Licence at
|
5
|
+
# http://www.mozilla.org/MPL
|
6
|
+
# Software distributed under the Licence is distributed
|
7
|
+
# on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND,
|
8
|
+
# either express or implied. See the Licence of the
|
9
|
+
# specific language governing rights and limitations
|
10
|
+
# under the Licence.
|
11
|
+
# The Original Code is pNet::DNS.
|
12
|
+
# The Initial Developer of the Original Code is
|
13
|
+
# Nominet UK (www.nominet.org.uk). Portions created by
|
14
|
+
# Nominet UK are Copyright (c) Nominet UK 2006.
|
15
|
+
# All rights reserved.
|
16
|
+
require 'test/unit'
|
17
|
+
require 'Net/DNS'
|
18
|
+
class TestEscapedChars < Test::Unit::TestCase
|
19
|
+
def test_one
|
20
|
+
#
|
21
|
+
# We test al sorts of escaped non-ascii characters.
|
22
|
+
# This is all to be protocol conform... so to speak.
|
23
|
+
|
24
|
+
#
|
25
|
+
# The collection of tests is somewhat of a hodgepodge that tried to
|
26
|
+
# assess sensitivity to combinations of characters that the regular
|
27
|
+
# expressions and perl itself are sensitive to. (like \\\\\.\..)
|
28
|
+
# Development versions of the code tried to split a domain name in
|
29
|
+
# invidual labels by a regular expression. It made no sense to remove
|
30
|
+
# the more ackward tests as they have to pass anyway ...
|
31
|
+
|
32
|
+
|
33
|
+
# @todo Net::DNS still to have this functionality
|
34
|
+
#~ message="Using the "
|
35
|
+
#~ message+= if (Net::DNS::HAVE_XS) then " XS compiled " else " perl implemented " end
|
36
|
+
#~ message+="dn_expand function "
|
37
|
+
#~ diag (message)
|
38
|
+
|
39
|
+
|
40
|
+
#~ had_xs=Net::DNS::HAVE_XS
|
41
|
+
|
42
|
+
|
43
|
+
# Note that in perl the \\ in a presentation format can only be achieved
|
44
|
+
# through \\\\ .
|
45
|
+
|
46
|
+
# The hex codes are the names in wireformat:
|
47
|
+
# length octet. content octets, length octet, content , NULL octet
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
# Below are test combos, 1st and 2nd array elements are
|
52
|
+
# representations of the name. The output of the perl functions should
|
53
|
+
# yield the 2nd presentation (eg \037 gets presented as % )
|
54
|
+
|
55
|
+
# The 3rd element is a label count.
|
56
|
+
# The 4th element represents the number of octets per label
|
57
|
+
# The 5th element is a hexdump of the domain name in wireformat
|
58
|
+
|
59
|
+
# The optional 6th element is a boolean instructing to use the perl
|
60
|
+
# based dn_expand. This because the conversion between the native
|
61
|
+
# dn_expand output to a perl varialbe provides some problems.
|
62
|
+
|
63
|
+
|
64
|
+
testcombos=[
|
65
|
+
[
|
66
|
+
'bla\255.foo.org',
|
67
|
+
'bla\255.foo.org',
|
68
|
+
3,
|
69
|
+
[4,3,3],
|
70
|
+
#Wire: 4 b l a 0xff 3 f o o 3 o r g 0
|
71
|
+
"04626c61ff03666f6f036f726700"
|
72
|
+
],
|
73
|
+
|
74
|
+
[
|
75
|
+
'bla.f\xa9oo.org',
|
76
|
+
'bla.f\169oo.org',
|
77
|
+
3,
|
78
|
+
[3,4,3] ,
|
79
|
+
#Wire: 3 b l a 4 f 0xa9 o o 3 o r g 0
|
80
|
+
"03626c610466a96f6f036f726700"
|
81
|
+
], # Note hex to decimal
|
82
|
+
['bla.fo\.o.org',
|
83
|
+
'bla.fo\.o.org',
|
84
|
+
3,
|
85
|
+
[3,4,3],
|
86
|
+
#Wire: 3 b l a 4 f o . o 3 o r g 0
|
87
|
+
"03626c6104666f2e6f036f726700"
|
88
|
+
],
|
89
|
+
|
90
|
+
['bla\0000.foo.org',
|
91
|
+
'bla\0000.foo.org',
|
92
|
+
3,
|
93
|
+
[5,3,3],
|
94
|
+
#Wire: 5 b l a 0x00 0 3 f o o 3 o r g 0
|
95
|
+
"05626c61003003666f6f036f726700" ,
|
96
|
+
],
|
97
|
+
|
98
|
+
['bla.fo\o.org',
|
99
|
+
'bla.foo.org',
|
100
|
+
3,
|
101
|
+
[3,3,3],
|
102
|
+
#Wire: 3 b l a 3 f o o 3 o r g 0 ignoring backslash on input
|
103
|
+
"03626c6103666f6f036f726700",
|
104
|
+
],
|
105
|
+
#drops the \
|
106
|
+
['bla(*.foo.org',
|
107
|
+
'bla\(*.foo.org',
|
108
|
+
3,
|
109
|
+
[5,3,3],
|
110
|
+
|
111
|
+
#Wire: 5 b l a ( * 3 f o o 3 o r g 0
|
112
|
+
"05626c61282a03666f6f036f726700"
|
113
|
+
],
|
114
|
+
|
115
|
+
[' .bla.foo.org',
|
116
|
+
'\032.bla.foo.org',
|
117
|
+
4,
|
118
|
+
[1,3,3,3],
|
119
|
+
"012003626c6103666f6f036f726700",
|
120
|
+
],
|
121
|
+
|
122
|
+
['\\\\a.foo',
|
123
|
+
'\\\\a.foo',
|
124
|
+
2,
|
125
|
+
[2,3],
|
126
|
+
#Wire: 2 \ a 3 f o o 0
|
127
|
+
"025c6103666f6f00"
|
128
|
+
],
|
129
|
+
|
130
|
+
|
131
|
+
['\\\\.foo',
|
132
|
+
'\\\\.foo',
|
133
|
+
2,
|
134
|
+
[1,3],
|
135
|
+
#Wire: 1 \ 3 f o o 0
|
136
|
+
"015c03666f6f00",
|
137
|
+
],
|
138
|
+
|
139
|
+
['a\\..foo',
|
140
|
+
'a\\..foo',
|
141
|
+
2,
|
142
|
+
[2,3],
|
143
|
+
#Wire: 2 a . 3 f o o 0
|
144
|
+
"02612e03666f6f00"
|
145
|
+
],
|
146
|
+
|
147
|
+
['a\\.foo.org',
|
148
|
+
'a\\.foo.org',
|
149
|
+
2, [5,3],
|
150
|
+
#Wire: 5 a . f o o 3 o r g 0
|
151
|
+
"05612e666f6f036f726700" ,
|
152
|
+
],
|
153
|
+
|
154
|
+
['\..foo.org',
|
155
|
+
'\..foo.org',
|
156
|
+
3,
|
157
|
+
[1,3,3],
|
158
|
+
|
159
|
+
#Wire: 1 . 3 f o o 3 o r g 0
|
160
|
+
"012e03666f6f036f726700" ,
|
161
|
+
],
|
162
|
+
|
163
|
+
[
|
164
|
+
'\046.\046',
|
165
|
+
'\..\.',
|
166
|
+
2,
|
167
|
+
[1,1],
|
168
|
+
'012e012e00',
|
169
|
+
],
|
170
|
+
|
171
|
+
[ # all non \w characters :-)
|
172
|
+
'\000\001\002\003\004\005\006\007\008\009\010\011\012\013\014\015\016\017\018\019\020\021\022\023\024\025\026\027\028\029\030\031\032.\033\034\035\036\037\038\039\040\041\042\043\044\045\046\047\048.\058\059\060\061\062\063\064\065.\091\092\093\094\095\096.\123\124\125\126\127\128\129',
|
173
|
+
'\000\001\002\003\004\005\006\007\008\009\010\011\012\013\014\015\016\017\018\019\020\021\022\023\024\025\026\027\028\029\030\031\032.!\"#\$%&\'\(\)*+,-\./0.:\<=>?\@A.[\\\\]^_`.{|}~\127\128\129',
|
174
|
+
5,
|
175
|
+
[33,16,8,6,7],
|
176
|
+
"21000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20102122232425262728292a2b2c2d2e2f30083a3b3c3d3e3f4041065b5c5d5e5f60077b7c7d7e7f808100",
|
177
|
+
],
|
178
|
+
|
179
|
+
]
|
180
|
+
|
181
|
+
|
182
|
+
#foreach my $testinput (@testcombos){
|
183
|
+
testcombos.each do |testinput|
|
184
|
+
# test back and forth
|
185
|
+
|
186
|
+
labels=Net::DNS.name2labels( testinput[0])
|
187
|
+
|
188
|
+
|
189
|
+
# assert_equal(testinput[1], Net::DNS::labels2name(labels), "consistent name2labels labels2name for " + testinput[0])
|
190
|
+
|
191
|
+
|
192
|
+
# test number of labels
|
193
|
+
assert_equal(testinput[2],labels.length(),"consistent labelcount (#{testinput[2]})")
|
194
|
+
# test number of elements within label.
|
195
|
+
i=0
|
196
|
+
# Test length of each individual label
|
197
|
+
while i<testinput[2]
|
198
|
+
assert_equal(labels[i].length, testinput[3][i],
|
199
|
+
"labellength for label #{i} equals " + testinput[3][i].to_s)
|
200
|
+
i = i + 1
|
201
|
+
end
|
202
|
+
|
203
|
+
wire=Net::DNS::RR._name2wire(testinput[0])
|
204
|
+
|
205
|
+
wireinhex=wire.unpack("H*")[0]
|
206
|
+
assert_equal( wireinhex,testinput[4], "Wireinhex for " + testinput[0] )
|
207
|
+
# And now call DN_EXPAND
|
208
|
+
|
209
|
+
if (Net::DNS::HAVE_XS)
|
210
|
+
|
211
|
+
#SKIP: {
|
212
|
+
# skip "No dn_expand_xs available", 1 unless $had_xs
|
213
|
+
name,offset=dn_expand(wire,0)
|
214
|
+
assert_equal(name,testinput[1],"DN_EXPAND (xs) consistent")
|
215
|
+
end
|
216
|
+
|
217
|
+
# }
|
218
|
+
|
219
|
+
# @todo Net::DNS does not yet have this functionality
|
220
|
+
#~ Net::DNS::HAVE_XS=0
|
221
|
+
#~ name,offset=dn_expand(wire,0)
|
222
|
+
#~ assert_equal(name,testinput[1],"DN_EXPAND (pp) consistent")
|
223
|
+
#~ Net::DNS::HAVE_XS=had_xs
|
224
|
+
end
|
225
|
+
|
226
|
+
# PERL_DN_EXPAND: {
|
227
|
+
# if ($had_xs && !$Net::DNS::DN_EXPAND_ESCAPES ){
|
228
|
+
# diag ("\ndisabling XS based dns_expand for a moment.")
|
229
|
+
# $Net::DNS::HAVE_XS=0
|
230
|
+
# }
|
231
|
+
|
232
|
+
# QUESTION SECTION
|
233
|
+
#\\.eg.secret-wg.org. IN TXT
|
234
|
+
#
|
235
|
+
# ANSWER SECTION:
|
236
|
+
#\\.eg.secret-wg.org. 10 IN TXT "WildCard Match"
|
237
|
+
#
|
238
|
+
# AUTHORITY SECTION:
|
239
|
+
#eg.secret-wg.org. 600 IN NS ns.eg.secret-wg.org.
|
240
|
+
#
|
241
|
+
# ADDITIONAL SECTION:
|
242
|
+
#ns.eg.secret-wg.org. 600 IN A 10.0.53.208
|
243
|
+
#
|
244
|
+
|
245
|
+
uuencodedPacket=%w{
|
246
|
+
c8 d5 85 00 00 01 00 01 00 01 00 01 02 5c 5c 02
|
247
|
+
65 67 09 73 65 63 72 65 74 2d 77 67 03 6f 72 67
|
248
|
+
00 00 10 00 01 c0 0c 00 10 00 01 00 00 00 0a 00
|
249
|
+
0f 0e 57 69 6c 64 43 61 72 64 20 4d 61 74 63 68
|
250
|
+
c0 0f 00 02 00 01 00 00 02 58 00 05 02 6e 73 c0
|
251
|
+
0f c0 4c 00 01 00 01 00 00 02 58 00 04 0a 00 35
|
252
|
+
d0
|
253
|
+
}
|
254
|
+
|
255
|
+
# uuEncodedPacket =~ s/\s*//g
|
256
|
+
# uuEncodedPacket =uuEncodedPacket.gsub("\s*", "")
|
257
|
+
# packetdata = [uuEncodedPacket].pack('H*')
|
258
|
+
|
259
|
+
uuencodedPacket.map!{|e| e.hex}
|
260
|
+
packetdata = uuencodedPacket.pack('c*')
|
261
|
+
packetdata = packetdata.gsub("\s*", "")
|
262
|
+
|
263
|
+
packet = Net::DNS::Packet.new_from_binary(packetdata)
|
264
|
+
assert(packet, "nil packet returned from binary data")
|
265
|
+
assert_equal( (packet.answer)[0].name,'\\\\\\\\.eg.secret-wg.org',"Correctly dealt escaped backslash from wireformat \\\\.eg.secret-wg.org")
|
266
|
+
end
|
267
|
+
|
268
|
+
def test_esoteric_stuff
|
269
|
+
# Now testing for the real esotheric stuff.
|
270
|
+
# domain names can contain NULL and space characters (on the wire)
|
271
|
+
# these should be properly expanded
|
272
|
+
|
273
|
+
# This only works if the dn_expand_XS() is NOT used.
|
274
|
+
|
275
|
+
# The UUencoded packet contains a captured packet with this content:
|
276
|
+
|
277
|
+
# QUESTION SECTION:
|
278
|
+
#\000.n\032ll.eg.secret-wg.org. IN TXT
|
279
|
+
|
280
|
+
# ANSWER SECTION:
|
281
|
+
#\000.n ll.eg.secret-wg.org. 0 IN TXT "NULL byte ownername"
|
282
|
+
# ^ SPACE !!!
|
283
|
+
# AUTHORITY SECTION:
|
284
|
+
#eg.secret-wg.org. 600 IN NS ns.eg.secret-wg.org.
|
285
|
+
|
286
|
+
# ADDITIONAL SECTION:
|
287
|
+
#ns.eg.secret-wg.org. 600 IN A 10.0.53.208
|
288
|
+
|
289
|
+
uuencodedPacket =%w{
|
290
|
+
a6 58 85 00 00 01 00 01 00 01 00 01 01 00 04 6e
|
291
|
+
20 6c 6c 02 65 67 09 73 65 63 72 65 74 2d 77 67
|
292
|
+
03 6f 72 67 00 00 10 00 01 c0 0c 00 10 00 01 00
|
293
|
+
00 00 00 00 14 13 4e 55 4c 4c 20 62 79 74 65 20
|
294
|
+
6f 77 6e 65 72 6e 61 6d 65 c0 13 00 02 00 01 00
|
295
|
+
00 02 58 00 05 02 6e 73 c0 13 c0 55 00 01 00 01
|
296
|
+
00 00 02 58 00 04 0a 00 35 d0
|
297
|
+
}
|
298
|
+
|
299
|
+
uuencodedPacket.map!{|e| e.hex}
|
300
|
+
packetdata = uuencodedPacket.pack('c*')
|
301
|
+
packetdata = packetdata.gsub("\s*", "")
|
302
|
+
packet = Net::DNS::Packet.new_from_binary(packetdata)
|
303
|
+
assert_equal( '\000.n\\032ll.eg.secret-wg.org',(packet.answer)[0].name,"Correctly dealt with NULL bytes in domain names")
|
304
|
+
|
305
|
+
|
306
|
+
#slightly modified \\ .eg.secret-wg.org instead of \\\\.eg.secret-wg.org
|
307
|
+
# That is escaped backslash space
|
308
|
+
uuencodedPacket=%w{
|
309
|
+
c8 d5 85 00 00 01 00 01 00 01 00 01 02 5c 20 02
|
310
|
+
65 67 09 73 65 63 72 65 74 2d 77 67 03 6f 72 67
|
311
|
+
00 00 10 00 01 c0 0c 00 10 00 01 00 00 00 0a 00
|
312
|
+
0f 0e 57 69 6c 64 43 61 72 64 20 4d 61 74 63 68
|
313
|
+
c0 0f 00 02 00 01 00 00 02 58 00 05 02 6e 73 c0
|
314
|
+
0f c0 4c 00 01 00 01 00 00 02 58 00 04 0a 00 35
|
315
|
+
d0
|
316
|
+
}
|
317
|
+
|
318
|
+
uuencodedPacket.map!{|e| e.hex}
|
319
|
+
packetdata = uuencodedPacket.pack('c*')
|
320
|
+
packetdata.gsub!("\s*", "")
|
321
|
+
packet = Net::DNS::Packet.new_from_binary(packetdata)
|
322
|
+
|
323
|
+
|
324
|
+
assert_equal( '\\\\\\032.eg.secret-wg.org',(packet.answer)[0].name,"Correctly dealt escaped backslash from wireformat \\e.eg.secret-wg.org")
|
325
|
+
# @todo Replace when Net::DNS does this!
|
326
|
+
# if ( had_xs && !Net::DNS::HAVE_XS )
|
327
|
+
# puts("\nContinuing to use the XS based dn_expand()\n")
|
328
|
+
# Net::DNS::HAVE_XS=1
|
329
|
+
# end
|
330
|
+
|
331
|
+
|
332
|
+
|
333
|
+
#slightly modified \\e.eg.secret-wg.org instead of \\\\.eg.secret-wg.org
|
334
|
+
uuencodedPacket=%w{
|
335
|
+
c8 d5 85 00 00 01 00 01 00 01 00 01 02 5c 65 02
|
336
|
+
65 67 09 73 65 63 72 65 74 2d 77 67 03 6f 72 67
|
337
|
+
00 00 10 00 01 c0 0c 00 10 00 01 00 00 00 0a 00
|
338
|
+
0f 0e 57 69 6c 64 43 61 72 64 20 4d 61 74 63 68
|
339
|
+
c0 0f 00 02 00 01 00 00 02 58 00 05 02 6e 73 c0
|
340
|
+
0f c0 4c 00 01 00 01 00 00 02 58 00 04 0a 00 35
|
341
|
+
d0
|
342
|
+
}
|
343
|
+
|
344
|
+
# uuEncodedPacket =~ s/\s*//g
|
345
|
+
# packetdata = uuEncodedPacket.pack('H*')
|
346
|
+
# packetdata = packetdata.gsub("\s*", "")
|
347
|
+
uuencodedPacket.map!{|e| e.hex}
|
348
|
+
packetdata = uuencodedPacket.pack('c*')
|
349
|
+
packet = Net::DNS::Packet.new_from_binary(packetdata)
|
350
|
+
|
351
|
+
|
352
|
+
assert_equal( (packet.answer)[0].name,'\\\\e.eg.secret-wg.org',"Correctly dealt escaped backslash from wireformat \\e.eg.secret-wg.org")
|
353
|
+
|
354
|
+
|
355
|
+
#slightly modified \\\..eg.secret-wg.org instead of \\e.eg.secret-wg.org
|
356
|
+
uuencodedPacket=%w{
|
357
|
+
c8 d5 85 00 00 01 00 01 00 01 00 01 02 5c 65 02
|
358
|
+
65 67 09 73 65 63 72 65 74 2d 77 67 03 6f 72 67
|
359
|
+
00 00 10 00 01 c0 0c 00 10 00 01 00 00 00 0a 00
|
360
|
+
0f 0e 57 69 6c 64 43 61 72 64 20 4d 61 74 63 68
|
361
|
+
c0 0f 00 02 00 01 00 00 02 58 00 05 02 6e 73 c0
|
362
|
+
0f c0 4c 00 01 00 01 00 00 02 58 00 04 0a 00 35
|
363
|
+
d0
|
364
|
+
}
|
365
|
+
|
366
|
+
## uuEncodedPacket =~ s/\s*//g
|
367
|
+
# packetdata = uuEncodedPacket.pack('H*')
|
368
|
+
# packetdata = packetdata.gsub("\s*", "")
|
369
|
+
uuencodedPacket.map!{|e| e.hex}
|
370
|
+
packetdata = uuencodedPacket.pack('c*')
|
371
|
+
packet = Net::DNS::Packet.new_from_binary(packetdata)
|
372
|
+
assert_equal( (packet.answer)[0].name,'\\\\e.eg.secret-wg.org',"Correctly dealt escaped backslash from wireformat \\\..eg.secret-wg.org")
|
373
|
+
|
374
|
+
testrr=Net::DNS::RR.create(
|
375
|
+
:name => '\\e.eg.secret-wg.org',
|
376
|
+
:type => 'TXT',
|
377
|
+
:txtdata => '"WildCard Match"',
|
378
|
+
:ttl => 10,
|
379
|
+
:class => "IN"
|
380
|
+
)
|
381
|
+
|
382
|
+
|
383
|
+
|
384
|
+
klass = "IN"
|
385
|
+
ttl = 43200
|
386
|
+
name = 'def0au<.example.com'
|
387
|
+
|
388
|
+
|
389
|
+
|
390
|
+
rrs = [
|
391
|
+
{ #[0]
|
392
|
+
:name => '\..bla\..example.com',
|
393
|
+
:type => 'A',
|
394
|
+
:address => '10.0.0.1',
|
395
|
+
}, { #[2]
|
396
|
+
:name => name,
|
397
|
+
:type => 'AFSDB',
|
398
|
+
:subtype => 1,
|
399
|
+
:hostname =>'afsdb-hostname.example.com',
|
400
|
+
},
|
401
|
+
{ #[3]
|
402
|
+
:name => '\\.funny.example.com',
|
403
|
+
:type => 'CNAME',
|
404
|
+
:cname => 'cname-cn\244ame.example.com',
|
405
|
+
},
|
406
|
+
{ #[4]
|
407
|
+
:name => name,
|
408
|
+
:type => 'DNAME',
|
409
|
+
:dname => 'dn\222ame.example.com',
|
410
|
+
},
|
411
|
+
{ #[9]
|
412
|
+
:name => name,
|
413
|
+
:type => 'MINFO',
|
414
|
+
:rmailbx => 'minfo\.rmailbx.example.com',
|
415
|
+
:emailbx => 'minfo\007emailbx.example.com',
|
416
|
+
},
|
417
|
+
|
418
|
+
{ #[13]
|
419
|
+
:name => name,
|
420
|
+
:type => 'NS',
|
421
|
+
:nsdname => '\001ns-nsdname.example.com',
|
422
|
+
},
|
423
|
+
|
424
|
+
{ #[19]
|
425
|
+
:name => name,
|
426
|
+
:type => 'SOA',
|
427
|
+
:mname => 'soa-mn\001ame.example.com',
|
428
|
+
:rname => 'soa\.rname.example.com',
|
429
|
+
:serial => 12345,
|
430
|
+
:refresh => 7200,
|
431
|
+
:retry => 3600,
|
432
|
+
:expire => 2592000,
|
433
|
+
:minimum => 86400,
|
434
|
+
},
|
435
|
+
|
436
|
+
]
|
437
|
+
|
438
|
+
#------------------------------------------------------------------------------
|
439
|
+
# Create the packet.
|
440
|
+
#------------------------------------------------------------------------------
|
441
|
+
packet = nil
|
442
|
+
packet = Net::DNS::Packet.new_from_values(name)
|
443
|
+
assert(packet, 'Packet created')
|
444
|
+
|
445
|
+
# foreach my $data (@rrs) {
|
446
|
+
rrs.each do |data|
|
447
|
+
|
448
|
+
data.update({:ttl => ttl,})
|
449
|
+
|
450
|
+
packet.push(:answer, Net::DNS::RR.create(data))
|
451
|
+
end
|
452
|
+
|
453
|
+
|
454
|
+
#------------------------------------------------------------------------------
|
455
|
+
# Re-create the packet from data.
|
456
|
+
#------------------------------------------------------------------------------
|
457
|
+
|
458
|
+
data = packet.data
|
459
|
+
assert(data, 'Packet has data after pushes')
|
460
|
+
|
461
|
+
packet = nil
|
462
|
+
packet = Net::DNS::Packet.new_from_binary(data)
|
463
|
+
|
464
|
+
assert(packet, 'Packet reconstructed from data')
|
465
|
+
|
466
|
+
answer = packet.answer
|
467
|
+
|
468
|
+
# assert(answer && answer == rrs, 'Packet returned correct answer section')
|
469
|
+
rrs.each do |rr|
|
470
|
+
record = nil
|
471
|
+
answer.each do |ansrec|
|
472
|
+
if (ansrec.type == rr[:type])
|
473
|
+
record = ansrec
|
474
|
+
break
|
475
|
+
end
|
476
|
+
end
|
477
|
+
assert(record!=nil, "can't find answer record for #{rr}")
|
478
|
+
rr.keys.each do |key|
|
479
|
+
assert_equal(record.send(key.to_s), rr[key], "value not right for key #{key} for rr #{rr}")
|
480
|
+
end
|
481
|
+
end
|
482
|
+
|
483
|
+
|
484
|
+
while (answer.size>0 and rrs.size>0)
|
485
|
+
data = rrs.shift
|
486
|
+
rr = answer.shift
|
487
|
+
type = data[:type]
|
488
|
+
# foreach my $meth (keys %{$data}) {
|
489
|
+
(data.keys.each do |meth|
|
490
|
+
assert_equal(rr.send(meth), data[meth], "#{type} - #meth() correct")
|
491
|
+
end)
|
492
|
+
|
493
|
+
rr2 = Net::DNS::RR.new_from_string(rr.inspect)
|
494
|
+
assert_equal(rr2.inspect, rr.inspect, "#{type} - Parsing from string works")
|
495
|
+
end
|
496
|
+
|
497
|
+
end
|
498
|
+
end
|