dnsbl-client 1.0.1 → 1.0.6
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 +5 -5
- data/bin/dnsbl-client +1 -1
- data/data/dnsbl.yaml +5 -5
- data/data/three-level-tlds +2026 -124
- data/data/two-level-tlds +1952 -0
- data/lib/dnsbl/client.rb +89 -59
- data/lib/dnsbl/client/version.rb +3 -2
- data/test/helper.rb +4 -2
- data/test/test_dnsbl-client.rb +183 -176
- metadata +3 -10
- data/.gitignore +0 -17
- data/Gemfile +0 -4
- data/LICENSE.txt +0 -22
- data/README.md +0 -37
- data/Rakefile +0 -12
- data/dnsbl-client.gemspec +0 -26
data/lib/dnsbl/client.rb
CHANGED
@@ -5,10 +5,13 @@ require 'resolv'
|
|
5
5
|
require 'socket'
|
6
6
|
require 'thread'
|
7
7
|
require 'yaml'
|
8
|
+
require 'ipaddr'
|
8
9
|
|
10
|
+
# This is a monkeypatch for the built-in Ruby DNS resolver to specify nameservers
|
9
11
|
class Resolv::DNS::Config
|
12
|
+
# Monkeypatch the nameservers to set a default if there are no defined nameservers
|
10
13
|
def nameservers
|
11
|
-
return @nameservers if @
|
14
|
+
return @nameservers if defined?(@nameservers)
|
12
15
|
|
13
16
|
lazy_initialize
|
14
17
|
if self.respond_to? :nameserver_port
|
@@ -21,7 +24,7 @@ class Resolv::DNS::Config
|
|
21
24
|
end
|
22
25
|
end
|
23
26
|
|
24
|
-
module DNSBL
|
27
|
+
module DNSBL # :nodoc:
|
25
28
|
# DNSBLResult holds the result of a DNSBL lookup
|
26
29
|
# dnsbl: name of the DNSBL that returned the answer
|
27
30
|
# item: the item queried, an IP or a domain
|
@@ -39,6 +42,8 @@ module DNSBL
|
|
39
42
|
two_level_tldfile = File.expand_path('../../../data', __FILE__)+"/two-level-tlds",
|
40
43
|
three_level_tldfile = File.expand_path('../../../data', __FILE__)+"/three-level-tlds")
|
41
44
|
@dnsbls = config
|
45
|
+
@timeout = 1.5
|
46
|
+
@first_only = false
|
42
47
|
@two_level_tld = []
|
43
48
|
@three_level_tld = []
|
44
49
|
File.open(two_level_tldfile).readlines.each do |l|
|
@@ -57,7 +62,16 @@ module DNSBL
|
|
57
62
|
end
|
58
63
|
@socket_index = 0
|
59
64
|
end
|
60
|
-
|
65
|
+
|
66
|
+
def timeout=(timeout_seconds)
|
67
|
+
@timeout = timeout_seconds
|
68
|
+
end
|
69
|
+
|
70
|
+
def first_only=(first_only_boolean)
|
71
|
+
@first_only = first_only_boolean
|
72
|
+
end
|
73
|
+
|
74
|
+
# sets the nameservers used for performing DNS lookups in round-robin fashion
|
61
75
|
def nameservers=(ns=Resolv::DNS::Config.new.nameservers)
|
62
76
|
@sockets.each do |s|
|
63
77
|
s.close
|
@@ -105,7 +119,8 @@ module DNSBL
|
|
105
119
|
def _encode_query(item,itemtype,domain,apikey=nil)
|
106
120
|
label = nil
|
107
121
|
if itemtype == 'ip'
|
108
|
-
|
122
|
+
ip = IPAddr.new(item)
|
123
|
+
label = ip.reverse.gsub('.ip6.arpa', '').gsub('.in-addr.arpa', '')
|
109
124
|
elsif itemtype == 'domain'
|
110
125
|
label = normalize(item)
|
111
126
|
end
|
@@ -120,6 +135,75 @@ module DNSBL
|
|
120
135
|
message.encode
|
121
136
|
end
|
122
137
|
|
138
|
+
|
139
|
+
# lookup performs the sending of DNS queries for the given items
|
140
|
+
# returns an array of DNSBLResult
|
141
|
+
def lookup(item)
|
142
|
+
# if item is an array, use it, otherwise make it one
|
143
|
+
items = item
|
144
|
+
if item.is_a? String
|
145
|
+
items = [item]
|
146
|
+
end
|
147
|
+
# place the results in the results array
|
148
|
+
results = []
|
149
|
+
# for each ip or hostname
|
150
|
+
items.each do |item|
|
151
|
+
# sent is used to determine when we have all the answers
|
152
|
+
sent = 0
|
153
|
+
# record the start time
|
154
|
+
@starttime = Time.now.to_f
|
155
|
+
# determine the type of query
|
156
|
+
itemtype = (item =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) ? 'ip' : 'domain'
|
157
|
+
itemtype = (item =~ /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/) ? 'ip' : itemtype
|
158
|
+
|
159
|
+
# for each dnsbl that supports our type, create the DNS query packet and send it
|
160
|
+
# rotate across our configured name servers and increment sent
|
161
|
+
@dnsbls.each do |name,config|
|
162
|
+
next if config['disabled']
|
163
|
+
next unless config['type'] == itemtype
|
164
|
+
begin
|
165
|
+
msg = _encode_query(item,itemtype,config['domain'],config['apikey'])
|
166
|
+
@sockets[@socket_index].send(msg,0)
|
167
|
+
@socket_index += 1
|
168
|
+
@socket_index %= @sockets.length
|
169
|
+
sent += 1
|
170
|
+
rescue Exception => e
|
171
|
+
puts e
|
172
|
+
puts e.backtrace.join("\n")
|
173
|
+
end
|
174
|
+
end
|
175
|
+
# while we still expect answers
|
176
|
+
while sent > 0
|
177
|
+
# wait on the socket for maximally @timeout seconds
|
178
|
+
r,_,_ = IO.select(@sockets,nil,nil,@timeout)
|
179
|
+
# if we time out, break out of the loop
|
180
|
+
break unless r
|
181
|
+
# for each reply, decode it and receive results, decrement the pending answers
|
182
|
+
first_only = false
|
183
|
+
r.each do |s|
|
184
|
+
begin
|
185
|
+
response = _decode_response(s.recv(4096))
|
186
|
+
results += response
|
187
|
+
rescue Exception => e
|
188
|
+
puts e
|
189
|
+
puts e.backtrace.join("\n")
|
190
|
+
end
|
191
|
+
sent -= 1
|
192
|
+
if @first_only
|
193
|
+
first_only = true
|
194
|
+
break
|
195
|
+
end
|
196
|
+
end
|
197
|
+
if first_only
|
198
|
+
break
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
results
|
203
|
+
end
|
204
|
+
|
205
|
+
private
|
206
|
+
|
123
207
|
# takes a DNS response and converts it into a DNSBLResult
|
124
208
|
def _decode_response(buf)
|
125
209
|
reply = Resolv::DNS::Message.decode(buf)
|
@@ -156,6 +240,7 @@ module DNSBL
|
|
156
240
|
results
|
157
241
|
end
|
158
242
|
|
243
|
+
# decodes the response from Project Honey Pot's service
|
159
244
|
def __phpot_decoder(ip)
|
160
245
|
octets = ip.split(/\./)
|
161
246
|
if octets.length != 4 or octets[0] != "127"
|
@@ -188,60 +273,5 @@ module DNSBL
|
|
188
273
|
return "days=#{days},score=#{threatscore},type=#{type}"
|
189
274
|
end
|
190
275
|
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
276
|
end
|
247
277
|
end
|
data/lib/dnsbl/client/version.rb
CHANGED
data/test/helper.rb
CHANGED
data/test/test_dnsbl-client.rb
CHANGED
@@ -1,196 +1,203 @@
|
|
1
1
|
unless Kernel.respond_to?(:require_relative)
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
module Kernel
|
3
|
+
def require_relative(path)
|
4
|
+
require File.join(File.dirname(caller[0]), path.to_str)
|
5
|
+
end
|
6
|
+
end
|
7
7
|
end
|
8
8
|
|
9
9
|
require_relative 'helper'
|
10
10
|
|
11
11
|
$nameservers = [['4.2.2.2',53]]
|
12
12
|
|
13
|
-
class TestDNSBLClient < Test
|
14
|
-
|
15
|
-
|
16
|
-
|
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
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
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
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("---
|
37
44
|
PROJECTHONEYPOT:
|
38
45
|
domain: dnsbl.httpbl.org
|
39
46
|
type: ip
|
40
47
|
apikey: #{apikey}
|
41
48
|
decoder: phpot_decoder")
|
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
|
-
|
167
|
-
|
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
|
168
175
|
|
169
|
-
|
170
|
-
|
171
|
-
|
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
|
172
179
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
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
|
177
184
|
|
178
|
-
|
179
|
-
|
180
|
-
|
185
|
+
def test_normaize_domains_to_three_levels_if_it_s_in_two_level_list
|
186
|
+
c = DNSBL::Client.new
|
187
|
+
c.nameservers = $nameservers
|
181
188
|
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
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
|
187
194
|
|
188
|
-
|
189
|
-
|
190
|
-
|
195
|
+
def test_normalize_domains_to_four_levels_if_it_s_in_three_level_list
|
196
|
+
c = DNSBL::Client.new
|
197
|
+
c.nameservers = $nameservers
|
191
198
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
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
|
196
203
|
end
|