dnsbl-client 1.0.0 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/dnsbl-client +0 -1
- data/data/dnsbl.yaml +5 -34
- data/data/three-level-tlds +2026 -124
- data/data/two-level-tlds +1952 -0
- data/lib/dnsbl/client.rb +66 -58
- data/lib/dnsbl/client/version.rb +3 -2
- data/test/helper.rb +4 -2
- data/test/test_dnsbl-client.rb +179 -171
- metadata +14 -62
- data.tar.gz.sig +0 -0
- data/.gitignore +0 -17
- data/Gemfile +0 -4
- data/LICENSE.txt +0 -22
- data/README.md +0 -35
- data/Rakefile +0 -12
- data/dnsbl-client.gemspec +0 -26
- metadata.gz.sig +0 -1
data/lib/dnsbl/client.rb
CHANGED
@@ -6,9 +6,11 @@ require 'socket'
|
|
6
6
|
require 'thread'
|
7
7
|
require 'yaml'
|
8
8
|
|
9
|
+
# This is a monkeypatch for the built-in Ruby DNS resolver to specify nameservers
|
9
10
|
class Resolv::DNS::Config
|
11
|
+
# Monkeypatch the nameservers to set a default if there are no defined nameservers
|
10
12
|
def nameservers
|
11
|
-
return @nameservers if @
|
13
|
+
return @nameservers if @nameservers
|
12
14
|
|
13
15
|
lazy_initialize
|
14
16
|
if self.respond_to? :nameserver_port
|
@@ -21,7 +23,7 @@ class Resolv::DNS::Config
|
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
24
|
-
module DNSBL
|
26
|
+
module DNSBL # :nodoc:
|
25
27
|
# DNSBLResult holds the result of a DNSBL lookup
|
26
28
|
# dnsbl: name of the DNSBL that returned the answer
|
27
29
|
# item: the item queried, an IP or a domain
|
@@ -57,7 +59,8 @@ module DNSBL
|
|
57
59
|
end
|
58
60
|
@socket_index = 0
|
59
61
|
end
|
60
|
-
|
62
|
+
|
63
|
+
# sets the nameservers used for performing DNS lookups in round-robin fashion
|
61
64
|
def nameservers=(ns=Resolv::DNS::Config.new.nameservers)
|
62
65
|
@sockets.each do |s|
|
63
66
|
s.close
|
@@ -120,6 +123,65 @@ module DNSBL
|
|
120
123
|
message.encode
|
121
124
|
end
|
122
125
|
|
126
|
+
|
127
|
+
# lookup performs the sending of DNS queries for the given items
|
128
|
+
# returns an array of DNSBLResult
|
129
|
+
def lookup(item)
|
130
|
+
# if item is an array, use it, otherwise make it one
|
131
|
+
items = item
|
132
|
+
if item.is_a? String
|
133
|
+
items = [item]
|
134
|
+
end
|
135
|
+
# place the results in the results array
|
136
|
+
results = []
|
137
|
+
# for each ip or hostname
|
138
|
+
items.each do |item|
|
139
|
+
# sent is used to determine when we have all the answers
|
140
|
+
sent = 0
|
141
|
+
# record the start time
|
142
|
+
@starttime = Time.now.to_f
|
143
|
+
# determine the type of query
|
144
|
+
itemtype = (item =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) ? 'ip' : 'domain'
|
145
|
+
# for each dnsbl that supports our type, create the DNS query packet and send it
|
146
|
+
# rotate across our configured name servers and increment sent
|
147
|
+
@dnsbls.each do |name,config|
|
148
|
+
next if config['disabled']
|
149
|
+
next unless config['type'] == itemtype
|
150
|
+
begin
|
151
|
+
msg = _encode_query(item,itemtype,config['domain'],config['apikey'])
|
152
|
+
@sockets[@socket_index].send(msg,0)
|
153
|
+
@socket_index += 1
|
154
|
+
@socket_index %= @sockets.length
|
155
|
+
sent += 1
|
156
|
+
rescue Exception => e
|
157
|
+
puts e
|
158
|
+
puts e.backtrace.join("\n")
|
159
|
+
end
|
160
|
+
end
|
161
|
+
# while we still expect answers
|
162
|
+
while sent > 0
|
163
|
+
# wait on the socket for maximally 1.5 seconds
|
164
|
+
r,_,_ = IO.select(@sockets,nil,nil,1.5)
|
165
|
+
# if we time out, break out of the loop
|
166
|
+
break unless r
|
167
|
+
# for each reply, decode it and receive results, decrement the pending answers
|
168
|
+
r.each do |s|
|
169
|
+
begin
|
170
|
+
response = _decode_response(s.recv(4096))
|
171
|
+
results += response
|
172
|
+
rescue Exception => e
|
173
|
+
puts e
|
174
|
+
puts e.backtrace.join("\n")
|
175
|
+
end
|
176
|
+
sent -= 1
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
results
|
181
|
+
end
|
182
|
+
|
183
|
+
private
|
184
|
+
|
123
185
|
# takes a DNS response and converts it into a DNSBLResult
|
124
186
|
def _decode_response(buf)
|
125
187
|
reply = Resolv::DNS::Message.decode(buf)
|
@@ -156,6 +218,7 @@ module DNSBL
|
|
156
218
|
results
|
157
219
|
end
|
158
220
|
|
221
|
+
# decodes the response from Project Honey Pot's service
|
159
222
|
def __phpot_decoder(ip)
|
160
223
|
octets = ip.split(/\./)
|
161
224
|
if octets.length != 4 or octets[0] != "127"
|
@@ -188,60 +251,5 @@ module DNSBL
|
|
188
251
|
return "days=#{days},score=#{threatscore},type=#{type}"
|
189
252
|
end
|
190
253
|
end
|
191
|
-
|
192
|
-
# the main method of this class, lookup performs the sending of DNS queries for the items
|
193
|
-
def lookup(item)
|
194
|
-
# if item is an array, use it, otherwise make it one
|
195
|
-
items = item
|
196
|
-
if item.is_a? String
|
197
|
-
items = [item]
|
198
|
-
end
|
199
|
-
# place the results in the results array
|
200
|
-
results = []
|
201
|
-
# for each ip or hostname
|
202
|
-
items.each do |item|
|
203
|
-
# sent is used to determine when we have all the answers
|
204
|
-
sent = 0
|
205
|
-
# record the start time
|
206
|
-
@starttime = Time.now.to_f
|
207
|
-
# determine the type of query
|
208
|
-
itemtype = (item =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) ? 'ip' : 'domain'
|
209
|
-
# for each dnsbl that supports our type, create the DNS query packet and send it
|
210
|
-
# rotate across our configured name servers and increment sent
|
211
|
-
@dnsbls.each do |name,config|
|
212
|
-
next if config['disabled']
|
213
|
-
next unless config['type'] == itemtype
|
214
|
-
begin
|
215
|
-
msg = _encode_query(item,itemtype,config['domain'],config['apikey'])
|
216
|
-
@sockets[@socket_index].send(msg,0)
|
217
|
-
@socket_index += 1
|
218
|
-
@socket_index %= @sockets.length
|
219
|
-
sent += 1
|
220
|
-
rescue Exception => e
|
221
|
-
puts e
|
222
|
-
puts e.backtrace.join("\n")
|
223
|
-
end
|
224
|
-
end
|
225
|
-
# while we still expect answers
|
226
|
-
while sent > 0
|
227
|
-
# wait on the socket for maximally 1.5 seconds
|
228
|
-
r,_,_ = IO.select(@sockets,nil,nil,1.5)
|
229
|
-
# if we time out, break out of the loop
|
230
|
-
break unless r
|
231
|
-
# for each reply, decode it and receive results, decrement the pending answers
|
232
|
-
r.each do |s|
|
233
|
-
begin
|
234
|
-
response = _decode_response(s.recv(4096))
|
235
|
-
results += response
|
236
|
-
rescue Exception => e
|
237
|
-
puts e
|
238
|
-
puts e.backtrace.join("\n")
|
239
|
-
end
|
240
|
-
sent -= 1
|
241
|
-
end
|
242
|
-
end
|
243
|
-
end
|
244
|
-
results
|
245
|
-
end
|
246
254
|
end
|
247
255
|
end
|
data/lib/dnsbl/client/version.rb
CHANGED
data/test/helper.rb
CHANGED
data/test/test_dnsbl-client.rb
CHANGED
@@ -10,186 +10,194 @@ require_relative 'helper'
|
|
10
10
|
|
11
11
|
$nameservers = [['4.2.2.2',53]]
|
12
12
|
|
13
|
-
class TestDNSBLClient < Test
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
13
|
+
class TestDNSBLClient < Minitest::Test
|
14
|
+
def test_return_no_hits_for_0_0_0_254
|
15
|
+
c = DNSBL::Client.new
|
16
|
+
c.nameservers = $nameservers
|
17
|
+
# for some reason DRONEBL returns 127.0.0.255 when queried for 127.0.0.255, so I'll use 127.0.0.254
|
18
|
+
# spfbl started returning 127.0.0.254 for 127.0.0.254, so I'll try 0.0.0.254
|
19
|
+
res = c.lookup("0.0.0.254")
|
20
|
+
if res.length > 0
|
21
|
+
puts(res)
|
22
|
+
end
|
23
|
+
assert_equal(0,res.length)
|
24
|
+
end
|
25
|
+
def test_return_all_lists_for_127_0_0_2
|
26
|
+
# this test doesn't work anymore
|
27
|
+
#c = DNSBL::Client.new
|
28
|
+
#c.nameservers = $nameservers
|
29
|
+
#res = c.lookup("127.0.0.2")
|
30
|
+
#puts res
|
31
|
+
#puts c.dnsbls
|
32
|
+
#assert(res.length >= c.dnsbls.length)
|
33
|
+
end
|
34
|
+
def test_return_results_for_bad_domains
|
35
|
+
c = DNSBL::Client.new
|
36
|
+
c.nameservers = $nameservers
|
37
|
+
res = c.lookup("pfizer.viagra.aqybasej.gurdoctor.com")
|
38
|
+
assert(res.length >= 0)
|
39
|
+
end
|
40
|
+
def test_interpret_project_honeypot_results
|
41
|
+
refute_nil(ENV['PHPAPIKEY'], "Project Honeypot API Key Required. Please set PHPAPIKEY.")
|
42
|
+
apikey = ENV['PHPAPIKEY']
|
43
|
+
config = YAML.load("---
|
36
44
|
PROJECTHONEYPOT:
|
37
45
|
domain: dnsbl.httpbl.org
|
38
46
|
type: ip
|
39
47
|
apikey: #{apikey}
|
40
48
|
decoder: phpot_decoder")
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
49
|
+
c = DNSBL::Client.new(config)
|
50
|
+
c.nameservers = $nameservers
|
51
|
+
res = c.lookup("127.0.0.1")
|
52
|
+
assert_equal(0,res.length)
|
53
|
+
res = c.lookup("127.1.1.0")
|
54
|
+
assert_equal(1,res.length)
|
55
|
+
assert_equal("#{apikey}.0.1.1.127.dnsbl.httpbl.org",res[0].query)
|
56
|
+
assert_equal("127.1.1.0",res[0].result)
|
57
|
+
assert_equal("type=search engine,engine=AltaVista",res[0].meaning)
|
58
|
+
res = c.lookup("127.1.1.1")
|
59
|
+
assert_equal(1,res.length)
|
60
|
+
assert_equal("#{apikey}.1.1.1.127",res[0].item)
|
61
|
+
assert_equal("#{apikey}.1.1.1.127.dnsbl.httpbl.org",res[0].query)
|
62
|
+
assert_equal("127.1.1.1",res[0].result)
|
63
|
+
assert_equal("days=1,score=1,type=suspicious",res[0].meaning)
|
64
|
+
res = c.lookup("127.1.1.2")
|
65
|
+
assert_equal(1,res.length)
|
66
|
+
assert_equal("#{apikey}.2.1.1.127",res[0].item)
|
67
|
+
assert_equal("#{apikey}.2.1.1.127.dnsbl.httpbl.org",res[0].query)
|
68
|
+
assert_equal("127.1.1.2",res[0].result)
|
69
|
+
assert_equal("days=1,score=1,type=harvester",res[0].meaning)
|
70
|
+
res = c.lookup("127.1.1.3")
|
71
|
+
assert_equal(1,res.length)
|
72
|
+
assert_equal("#{apikey}.3.1.1.127",res[0].item)
|
73
|
+
assert_equal("#{apikey}.3.1.1.127.dnsbl.httpbl.org",res[0].query)
|
74
|
+
assert_equal("127.1.1.3",res[0].result)
|
75
|
+
assert_equal("days=1,score=1,type=suspicious,harvester",res[0].meaning)
|
76
|
+
res = c.lookup("127.1.1.4")
|
77
|
+
assert_equal(1,res.length)
|
78
|
+
assert_equal("#{apikey}.4.1.1.127",res[0].item)
|
79
|
+
assert_equal("#{apikey}.4.1.1.127.dnsbl.httpbl.org",res[0].query)
|
80
|
+
assert_equal("127.1.1.4",res[0].result)
|
81
|
+
assert_equal("days=1,score=1,type=comment spammer",res[0].meaning)
|
82
|
+
res = c.lookup("127.1.1.5")
|
83
|
+
assert_equal(1,res.length)
|
84
|
+
assert_equal("#{apikey}.5.1.1.127",res[0].item)
|
85
|
+
assert_equal("#{apikey}.5.1.1.127.dnsbl.httpbl.org",res[0].query)
|
86
|
+
assert_equal("127.1.1.5",res[0].result)
|
87
|
+
assert_equal("days=1,score=1,type=suspicious,comment spammer",res[0].meaning)
|
88
|
+
res = c.lookup("127.1.1.6")
|
89
|
+
assert_equal(1,res.length)
|
90
|
+
assert_equal("#{apikey}.6.1.1.127",res[0].item)
|
91
|
+
assert_equal("#{apikey}.6.1.1.127.dnsbl.httpbl.org",res[0].query)
|
92
|
+
assert_equal("127.1.1.6",res[0].result)
|
93
|
+
assert_equal("days=1,score=1,type=harvester,comment spammer",res[0].meaning)
|
94
|
+
res = c.lookup("127.1.1.7")
|
95
|
+
assert_equal(1,res.length)
|
96
|
+
assert_equal("#{apikey}.7.1.1.127",res[0].item)
|
97
|
+
assert_equal("#{apikey}.7.1.1.127.dnsbl.httpbl.org",res[0].query)
|
98
|
+
assert_equal("127.1.1.7",res[0].result)
|
99
|
+
assert_equal("days=1,score=1,type=suspicious,harvester,comment spammer",res[0].meaning)
|
100
|
+
res = c.lookup("127.1.10.1")
|
101
|
+
assert_equal(1,res.length)
|
102
|
+
assert_equal("#{apikey}.1.10.1.127",res[0].item)
|
103
|
+
assert_equal("#{apikey}.1.10.1.127.dnsbl.httpbl.org",res[0].query)
|
104
|
+
assert_equal("127.1.10.1",res[0].result)
|
105
|
+
assert_equal("days=1,score=10,type=suspicious",res[0].meaning)
|
106
|
+
res = c.lookup("127.1.20.1")
|
107
|
+
assert_equal(1,res.length)
|
108
|
+
assert_equal("#{apikey}.1.20.1.127",res[0].item)
|
109
|
+
assert_equal("#{apikey}.1.20.1.127.dnsbl.httpbl.org",res[0].query)
|
110
|
+
assert_equal("127.1.20.1",res[0].result)
|
111
|
+
assert_equal("days=1,score=20,type=suspicious",res[0].meaning)
|
112
|
+
res = c.lookup("127.1.40.1")
|
113
|
+
assert_equal(1,res.length)
|
114
|
+
assert_equal("#{apikey}.1.40.1.127",res[0].item)
|
115
|
+
assert_equal("#{apikey}.1.40.1.127.dnsbl.httpbl.org",res[0].query)
|
116
|
+
assert_equal("127.1.40.1",res[0].result)
|
117
|
+
assert_equal("days=1,score=40,type=suspicious",res[0].meaning)
|
118
|
+
res = c.lookup("127.1.80.1")
|
119
|
+
assert_equal(1,res.length)
|
120
|
+
assert_equal("#{apikey}.1.80.1.127",res[0].item)
|
121
|
+
assert_equal("#{apikey}.1.80.1.127.dnsbl.httpbl.org",res[0].query)
|
122
|
+
assert_equal("127.1.80.1",res[0].result)
|
123
|
+
assert_equal("days=1,score=80,type=suspicious",res[0].meaning)
|
124
|
+
res = c.lookup("127.10.1.1")
|
125
|
+
assert_equal(1,res.length)
|
126
|
+
assert_equal("#{apikey}.1.1.10.127",res[0].item)
|
127
|
+
assert_equal("#{apikey}.1.1.10.127.dnsbl.httpbl.org",res[0].query)
|
128
|
+
assert_equal("127.10.1.1",res[0].result)
|
129
|
+
assert_equal("days=10,score=1,type=suspicious",res[0].meaning)
|
130
|
+
res = c.lookup("127.20.1.1")
|
131
|
+
assert_equal(1,res.length)
|
132
|
+
assert_equal("#{apikey}.1.1.20.127",res[0].item)
|
133
|
+
assert_equal("#{apikey}.1.1.20.127.dnsbl.httpbl.org",res[0].query)
|
134
|
+
assert_equal("127.20.1.1",res[0].result)
|
135
|
+
assert_equal("days=20,score=1,type=suspicious",res[0].meaning)
|
136
|
+
res = c.lookup("127.40.1.1")
|
137
|
+
assert_equal(1,res.length)
|
138
|
+
assert_equal("#{apikey}.1.1.40.127",res[0].item)
|
139
|
+
assert_equal("#{apikey}.1.1.40.127.dnsbl.httpbl.org",res[0].query)
|
140
|
+
assert_equal("127.40.1.1",res[0].result)
|
141
|
+
assert_equal("days=40,score=1,type=suspicious",res[0].meaning)
|
142
|
+
res = c.lookup("127.80.1.1")
|
143
|
+
assert_equal(1,res.length)
|
144
|
+
assert_equal("#{apikey}.1.1.80.127",res[0].item)
|
145
|
+
assert_equal("#{apikey}.1.1.80.127.dnsbl.httpbl.org",res[0].query)
|
146
|
+
assert_equal("127.80.1.1", res[0].result)
|
147
|
+
assert_equal("days=80,score=1,type=suspicious",res[0].meaning)
|
148
|
+
res = c.__phpot_decoder("127.0.0.0")
|
149
|
+
assert_equal("type=search engine,engine=undocumented",res)
|
150
|
+
res = c.__phpot_decoder("127.0.1.0")
|
151
|
+
assert_equal("type=search engine,engine=AltaVista",res)
|
152
|
+
res = c.__phpot_decoder("127.0.2.0")
|
153
|
+
assert_equal("type=search engine,engine=Ask",res)
|
154
|
+
res = c.__phpot_decoder("127.0.3.0")
|
155
|
+
assert_equal("type=search engine,engine=Baidu",res)
|
156
|
+
res = c.__phpot_decoder("127.0.4.0")
|
157
|
+
assert_equal("type=search engine,engine=Excite",res)
|
158
|
+
res = c.__phpot_decoder("127.0.5.0")
|
159
|
+
assert_equal("type=search engine,engine=Google",res)
|
160
|
+
res = c.__phpot_decoder("127.0.6.0")
|
161
|
+
assert_equal("type=search engine,engine=Looksmart",res)
|
162
|
+
res = c.__phpot_decoder("127.0.7.0")
|
163
|
+
assert_equal("type=search engine,engine=Lycos",res)
|
164
|
+
res = c.__phpot_decoder("127.0.8.0")
|
165
|
+
assert_equal("type=search engine,engine=MSN",res)
|
166
|
+
res = c.__phpot_decoder("127.0.9.0")
|
167
|
+
assert_equal("type=search engine,engine=Yahoo",res)
|
168
|
+
res = c.__phpot_decoder("127.0.10.0")
|
169
|
+
assert_equal("type=search engine,engine=Cuil",res)
|
170
|
+
res = c.__phpot_decoder("127.0.11.0")
|
171
|
+
assert_equal("type=search engine,engine=InfoSeek",res)
|
172
|
+
res = c.__phpot_decoder("127.0.12.0")
|
173
|
+
assert_equal("type=search engine,engine=Miscellaneous",res)
|
174
|
+
end
|
167
175
|
|
168
|
-
|
169
|
-
|
170
|
-
|
176
|
+
def test_normalize_domains_to_two_levels_if_it_s_neither_in_two_level_nor_three_level_list
|
177
|
+
c = DNSBL::Client.new
|
178
|
+
c.nameservers = $nameservers
|
171
179
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
180
|
+
assert_equal("example.org", c.normalize("example.org"))
|
181
|
+
assert_equal("example.org", c.normalize("www.example.org"))
|
182
|
+
assert_equal("example.org", c.normalize("foo.bar.baz.example.org"))
|
183
|
+
end
|
176
184
|
|
177
|
-
|
178
|
-
|
179
|
-
|
185
|
+
def test_normaize_domains_to_three_levels_if_it_s_in_two_level_list
|
186
|
+
c = DNSBL::Client.new
|
187
|
+
c.nameservers = $nameservers
|
180
188
|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
189
|
+
assert_equal("example.co.uk", c.normalize("example.co.uk"))
|
190
|
+
assert_equal("example.co.uk", c.normalize("www.example.co.uk"))
|
191
|
+
assert_equal("example.co.uk", c.normalize("foo.bar.baz.example.co.uk"))
|
192
|
+
assert_equal("example.blogspot.com", c.normalize("example.blogspot.com"))
|
193
|
+
end
|
186
194
|
|
187
|
-
|
188
|
-
|
189
|
-
|
195
|
+
def test_normalize_domains_to_four_levels_if_it_s_in_three_level_list
|
196
|
+
c = DNSBL::Client.new
|
197
|
+
c.nameservers = $nameservers
|
190
198
|
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
199
|
+
assert_equal("example.act.edu.au", c.normalize("example.act.edu.au"))
|
200
|
+
assert_equal("example.act.edu.au", c.normalize("www.example.act.edu.au"))
|
201
|
+
assert_equal("example.act.edu.au", c.normalize("foo.bar.example.act.edu.au"))
|
202
|
+
end
|
195
203
|
end
|