surbl_client 0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 979f763eb53d72f16d63ae605fe1c3dc25b3ee88
4
+ data.tar.gz: 49583ef0e17874f74b932e7c4d406ceb6ab1a650
5
+ SHA512:
6
+ metadata.gz: 864f33bf0b726ede4bd3e4593a93aa9ed9bbfb8cb954e691d99481669890e06861e1b6f4aa0a4964c81835b9cbee7cc863f32daa08016a03a0b4c7e262486979
7
+ data.tar.gz: dfd9223bb297bdd49b0e95ddc7167815a03a0580eb0f22ea2987429b9a223939b695504fba735c940b282925db286a3b1a16920b3d1b59a95d2d8a786e365efe
@@ -0,0 +1,236 @@
1
+ # SURBL checker (http://www.surbl.org/)
2
+ #
3
+ # Example usage:
4
+ # 0> require "surbl_client"
5
+ # => true
6
+ # 0> surbl = SurblClient.new()
7
+ # => #<SurblClient:0x007fb6181216c0 @cache=[nil, nil]>
8
+ # 0> domain = "foo.bar.test.surbl.org"
9
+ # => "foo.bar.test.surbl.org"
10
+ # 0> surbl.include? domain
11
+ # => true
12
+ # 0> surbl.lookup(domain)
13
+ # => ["test.surbl.org", ["sc", "ws", "ph", "ob", "ab", "jp"]]
14
+ # 0> if surbl.include? domain then
15
+ # 1* results = surbl.lookup(domain)
16
+ # 1> puts "#{results[0]} blacklisted in #{results[1]}"
17
+ # 1> end
18
+ # test.surbl.org blacklisted in ["sc", "ws", "ph", "ob", "ab", "jp"]
19
+ # => nil
20
+ #
21
+ # This is a ruby port of https://github.com/byfilip/surblclient.
22
+ #
23
+ # Author:: George Perry (mailto:perrygeorget.public@gmail.com)
24
+ # License:: MIT
25
+
26
+ require 'resolv'
27
+
28
+ class SurblClient
29
+ @@flags = [[2, "sc"], [4, "ws"], [8, "ph"], [16, "ob"], [32, "ab"], [64, "jp"]]
30
+ @@two_level_tlds = %r{(?:^|\.)
31
+ (?:(?:com|edu|gov|net|mil|org)\.ac
32
+ |(?:com|net|org|gov|ac|co|sch|pro)\.ae
33
+ |(?:com|org|edu|gov)\.ai
34
+ |(?:com|net|org|gov|mil|edu|int)\.ar
35
+ |(?:co|ac|or|gv|priv)\.at
36
+ |(?:com|gov|org|edu|id|oz|info|net|asn|csiro|telememo|conf|otc|id)\.au
37
+ |(?:com|net|org)\.az
38
+ |(?:com|net|org)\.bb
39
+ |(?:ac|belgie|dns|fgov)\.be
40
+ |(?:com|gov|net|edu|org)\.bh
41
+ |(?:com|edu|gov|org|net)\.bm
42
+ |(?:adm|adv|agr|am|arq|art|ato|bio|bmd|cim|cng|cnt|com|coop|ecn|edu|eng|esp|etc|eti|far|fm|fnd|fot|fst|g12|ggf|gov|imb|ind|inf|jor|lel|mat|med|mil|mus|net|nom|not|ntr|odo|org|ppg|pro|psc|psi|qsl|rec|slg|srv|tmp|trd|tur|tv|vet|zlg)\.br
43
+ |(?:com|net|org)\.bs
44
+ |(?:com|net|org)\.bz
45
+ |(?:ab|bc|mb|nb|nf|nl|ns|nt|nu|on|pe|qc|sk|yk|gc)\.ca
46
+ |(?:co|net|org|edu|gov)\.ck
47
+ |(?:com|edu|gov|net|org|ac|ah|bj|cq|gd|gs|gx|gz|hb|he|hi|hk|hl|hn|jl|js|ln|mo|nm|nx|qh|sc|sn|sh|sx|tj|tw|xj|xz|yn|zj)\.cn
48
+ |(?:arts|com|edu|firm|gov|info|int|nom|mil|org|rec|store|web)\.co
49
+ |(?:ac|co|ed|fi|go|or|sa)\.cr
50
+ |(?:com|net|org)\.cu
51
+ |(?:ac|com|gov|net|org)\.cy
52
+ |(?:co)\.dk
53
+ |(?:art|com|edu|gov|gob|org|mil|net|sld|web)\.do
54
+ |(?:com|org|net|gov|edu|ass|pol|art)\.dz
55
+ |(?:com|k12|edu|fin|med|gov|mil|org|net)\.ec
56
+ |(?:com|pri|fie|org|med)\.ee
57
+ |(?:com|edu|eun|gov|net|org|sci)\.eg
58
+ |(?:com|net|org|edu|mil|gov|ind)\.er
59
+ |(?:com|org|gob|edu|nom)\.es
60
+ |(?:com|gov|org|edu|net|biz|name|info)\.et
61
+ |(?:ac|com|gov|id|org|school)\.fj
62
+ |(?:com|ac|gov|net|nom|org)\.fk
63
+ |(?:asso|nom|barreau|com|prd|presse|tm|aeroport|assedic|avocat|avoues|cci|chambagri|chirurgiens-dentistes|experts-comptables|geometre-expert|gouv|greta|huissier-justice|medecin|notaires|pharmacien|port|veterinaire)\.fr
64
+ |(?:com|edu|gov|mil|net|org|pvt)\.ge
65
+ |(?:co|org|sch|ac|gov|ltd|ind|net|alderney|guernsey|sark)\.gg
66
+ |(?:com|edu|gov|net|org)\.gr
67
+ |(?:com|edu|net|gob|org|mil|ind)\.gt
68
+ |(?:com|edu|net|org|gov|mil)\.gu
69
+ |(?:com|net|org|idv|gov|edu)\.hk
70
+ |(?:co|2000|erotika|jogasz|sex|video|info|agrar|film|konyvelo|shop|org|bolt|forum|lakas|suli|priv|casino|games|media|szex|sport|city|hotel|news|tozsde|tm|erotica|ingatlan|reklam|utazas)\.hu
71
+ |(?:ac|co|go|mil|net|or)\.id
72
+ |(?:co|net|org|ac|gov|k12|muni|idf)\.il
73
+ |(?:co|net|org|ac|lkd\.co|gov|nic|plc\.co)\.im
74
+ |(?:co|net|ac|ernet|gov|nic|res|gen|firm|mil|org|ind)\.in
75
+ |(?:ac|co|gov|id|net|org|sch)\.ir
76
+ |(?:ac|co|net|org|gov|ind|jersey|ltd|sch)\.je
77
+ |(?:com|org|net|gov|edu|mil)\.jo
78
+ |(?:ad|ac|co|go|or|ne|gr|ed|lg|net|org|gov|hokkaido|aomori|iwate|miyagi|akita|yamagata|fukushima|ibaraki|tochigi|gunma|saitama|chiba|tokyo|kanagawa|niigata|toyama|ishikawa|fukui|yamanashi|nagano|gifu|shizuoka|aichi|mie|shiga|kyoto|osaka|hyogo|nara|wakayama|tottori|shimane|okayama|hiroshima|yamaguchi|tokushima|kagawa|ehime|kochi|fukuoka|saga|nagasaki|kumamoto|oita|miyazaki|kagoshima|okinawa|sapporo|sendai|yokohama|kawasaki|nagoya|kobe|kitakyushu|utsunomiya|kanazawa|takamatsu|matsuyama)\.jp
79
+ |(?:com|net|org|edu|gov|mil)\.kg
80
+ |(?:com|net|org|per|edu|gov|mil)\.kh
81
+ |(?:ac|co|go|ne|or|pe|re|seoul|kyonggi)\.kr
82
+ |(?:com|net|org|edu|gov)\.kw
83
+ |(?:com|net|org)\.la
84
+ |(?:com|org|net|edu|gov|mil)\.lb
85
+ |(?:com|edu|gov|net|org)\.lc
86
+ |(?:com|net|org|edu|gov|mil|id|asn|conf)\.lv
87
+ |(?:com|net|org)\.ly
88
+ |(?:co|net|org|press|ac)\.ma
89
+ |(?:com)\.mk
90
+ |(?:com|net|org|edu|gov)\.mm
91
+ |(?:com|org|edu|gov|museum)\.mn
92
+ |(?:com|net|org|edu|gov)\.mo
93
+ |(?:com|net|org|edu|tm|uu)\.mt
94
+ |(?:com|net|org|gob|edu)\.mx
95
+ |(?:com|org|gov|edu|net)\.my
96
+ |(?:com|org|net|alt|edu|cul|unam|telecom)\.na
97
+ |(?:com|net|org)\.nc
98
+ |(?:ac|edu|sch|com|gov|org|net)\.ng
99
+ |(?:gob|com|net|edu|nom|org)\.ni
100
+ |(?:com|net|org|gov|edu)\.np
101
+ |(?:ac|co|cri|gen|geek|govt|iwi|maori|mil|net|org|school)\.nz
102
+ |(?:com|co|edu|ac|gov|net|org|mod|museum|biz|pro|med)\.om
103
+ |(?:com|net|org|edu|ac|gob|sld)\.pa
104
+ |(?:edu|gob|nom|mil|org|com|net)\.pe
105
+ |(?:com|net|ac)\.pg
106
+ |(?:com|net|org|mil|ngo)\.ph
107
+ |(?:aid|agro|atm|auto|biz|com|edu|gmina|gsm|info|mail|miasta|media|mil|net|nieruchomosci|nom|org|pc|powiat|priv|realestate|rel|sex|shop|sklep|sos|szkola|targi|tm|tourism|travel|turystyka)\.pl
108
+ |(?:com|net|edu|org|fam|biz|web|gov|gob|gok|gon|gop|gos)\.pk
109
+ |(?:edu|gov|plo|sec)\.ps
110
+ |(?:com|edu|gov|int|net|nome|org|publ)\.pt
111
+ |(?:com|net|org|edu)\.py
112
+ |(?:com|net|org|edu|gov)\.qa
113
+ |(?:asso|com|nom)\.re
114
+ |(?:com|org|tm|nt|nom|info|rec|arts|firm|store|www)\.ro
115
+ |(?:ac|adygeya|altai|amur|amursk|arkhangelsk|astrakhan|baikal|bashkiria|belgorod|bir|bryansk|buryatia|cbg|chel|chelyabinsk|chita|chukotka|chuvashia|cmw|com|dagestan|dudinka|e-burg|edu|fareast|gov|grozny|int|irkutsk|ivanovo|izhevsk|jamal|jar|joshkar-ola|k-uralsk|kalmykia|kaluga|kamchatka|karelia|kazan|kchr|kemerovo|khabarovsk|khakassia|khv|kirov|kms|koenig|komi|kostroma|krasnoyarsk|kuban|kurgan|kursk|kustanai|kuzbass|lipetsk|magadan|magnitka|mari-el|mari|marine|mil|mordovia|mosreg|msk|murmansk|mytis|nakhodka|nalchik|net|nkz|nnov|norilsk|nov|novosibirsk|nsk|omsk|orenburg|org|oryol|oskol|palana|penza|perm|pp|pskov|ptz|pyatigorsk|rnd|rubtsovsk|ryazan|sakhalin|samara|saratov|simbirsk|smolensk|snz|spb|stavropol|stv|surgut|syzran|tambov|tatarstan|test|tom|tomsk|tsaritsyn|tsk|tula|tuva|tver|tyumen|udm|udmurtia|ulan-ude|vdonsk|vladikavkaz|vladimir|vladivostok|volgograd|vologda|voronezh|vrn|vyatka|yakutia|yamal|yaroslavl|yekaterinburg|yuzhno-sakhalinsk|zgrad)\.ru
116
+ |(?:com|edu|sch|med|gov|net|org|pub)\.sa
117
+ |(?:com|net|org|edu|gov)\.sb
118
+ |(?:com|net|org|edu|sch|med|gov)\.sd
119
+ |(?:tm|press|parti|brand|fh|fhsk|fhv|komforb|kommunalforbund|komvux|lanarb|lanbib|naturbruksgymn|sshn|org|pp)\.se
120
+ |(?:com|net|org|edu|gov|per)\.sg
121
+ |(?:com|net|org|edu|gov|mil)\.sh
122
+ |(?:gov|saotome|principe|consulado|embaixada|org|edu|net|com|store|mil|co)\.st
123
+ |(?:com|org|edu|gob|red)\.sv
124
+ |(?:com|net|org|gov)\.sy
125
+ |(?:ac|co|go|net|or)\.th
126
+ |(?:com|net|org|edunet|gov|ens|fin|nat|ind|info|intl|rnrt|rnu|rns|tourism)\.tn
127
+ |(?:com|net|org|edu|gov|mil|bbs|k12|gen)\.tr
128
+ |(?:co|com|org|net|biz|info|pro|int|coop|jobs|mobi|travel|museum|aero|name|gov|edu|nic|us|uk|ca|eu|es|fr|it|se|dk|be|de|at|au)\.tt
129
+ |(?:co)\.tv
130
+ |(?:com|net|org|edu|idv|gov)\.tw
131
+ |(?:com|gov|net|edu|org|in|cherkassy|ck|chernigov|cn|chernovtsy|cv|crimea|dnepropetrovsk|dp|donetsk|dn|ivano-frankivsk|if|kharkov|kh|kherson|ks|khmelnitskiy|km|kiev|kv|kirovograd|kr|lugansk|lg|lutsk|lviv|nikolaev|mk|odessa|od|poltava|pl|rovno|rv|sebastopol|sumy|ternopil|te|uzhgorod|vinnica|vn|zaporizhzhe|zp|zhitomir|zt)\.ua
132
+ |(?:ac|co|or|go)\.ug
133
+ |(?:co|me|org|edu|ltd|plc|net|sch|nic|ac|gov|nhs|police|mod)\.uk
134
+ |(?:dni|fed)\.us
135
+ |(?:com|edu|net|org|gub|mil)\.uy
136
+ |(?:com|net|org|co|edu|gov|mil|arts|bib|firm|info|int|nom|rec|store|tec|web)\.ve
137
+ |(?:co|net|org)\.vi
138
+ |(?:com|biz|edu|gov|net|org|int|ac|pro|info|health|name)\.vn
139
+ |(?:com|edu|net|org|de|ch|fr)\.vu
140
+ |(?:com|net|org|gov|edu)\.ws
141
+ |(?:ac|co|edu|org)\.yu
142
+ |(?:com|net|org|gov|edu|mil)\.ye
143
+ |(?:ac|alt|bourse|city|co|edu|gov|law|mil|net|ngo|nom|org|school|tm|web)\.za
144
+ |(?:co|ac|org|gov)\.zw
145
+ |(?:eu)\.org
146
+ |(?:au|br|cn|de)\.com
147
+ |(?:de)\.net
148
+ |(?:eu|gb)\.com
149
+ |(?:gb)\.net
150
+ |(?:hu|no|qc|ru|sa|se|uk)\.com
151
+ |(?:uk)\.net
152
+ |(?:us|uy|za)\.com
153
+ |(?:dk)\.org
154
+ |(?:tel)\.no
155
+ |(?:fax|mob|mobil|mobile|tel|tlf)\.nr
156
+ |(?:e164)\.arpa)$
157
+ |(?:surbl)\.org}ix
158
+
159
+ def initialize
160
+ @cache = [nil, nil]
161
+ end
162
+
163
+ private
164
+ def _get_base_domain(domain)
165
+ # Remove userinfo
166
+ if domain.include? "@" then
167
+ domain = domain[domain.index("@") + 1, domain.length]
168
+ end
169
+ # Remove port
170
+ if domain.include? ":" then
171
+ domain = domain[0, domain.index(":")]
172
+ end
173
+ # Choose the right "depth"...
174
+ if @@two_level_tlds =~ domain then
175
+ n = 3
176
+ else
177
+ n = 2
178
+ end
179
+ split_domain = domain.split(".")
180
+ return split_domain[-n, split_domain.length].join(".")
181
+ end
182
+
183
+ # Like 'lookup', but checks the exact domain name given.
184
+ # Not for direct use.
185
+ def _lookup_exact(domain)
186
+ cached_domain = nil
187
+ flags = @cache
188
+ if cached_domain != domain then
189
+ begin
190
+ ip = Resolv.getaddress(domain + ".multi.surbl.org")
191
+ flags = ip.split(".")[-1].to_i
192
+ rescue Resolv::ResolvError => e
193
+ if e.message == "no address for #{domain}" then
194
+ # No record found
195
+ flags = nil
196
+ @cache = [domain, flags]
197
+ return False
198
+ else
199
+ # Unhandled error, pass test for now
200
+ return nil
201
+ end
202
+ rescue
203
+ # Not sure if this can happen. Timeouts?
204
+ return nil
205
+ end
206
+ @cache = [domain, flags]
207
+ end
208
+ if flags then
209
+ matches = []
210
+ @@flags.each do |n,s|
211
+ matches.push(s) if flags & n != 0
212
+ end
213
+ return [domain, matches]
214
+ else
215
+ return False
216
+ end
217
+ end
218
+
219
+ public
220
+ # Extract base domain and check it against SURBL.
221
+ # Return [basedomain, lists] array, where basedomain is the
222
+ # base domain and lists is a list of strings indicating which
223
+ # blacklists the domain was found in.
224
+ # If there was no match, return false.
225
+ # If unsure (temporary error), return nil.
226
+ def lookup(domain)
227
+ domain = _get_base_domain(domain)
228
+ return _lookup_exact(domain)
229
+ end
230
+
231
+ # Return true if base domain is listed in SURBL.
232
+ # Returns false otherwise.
233
+ def include?(domain)
234
+ return lookup(domain) != nil
235
+ end
236
+ end
@@ -0,0 +1,26 @@
1
+ require_relative "../lib/surbl_client"
2
+ require "test/unit"
3
+
4
+ class TestSurblClient < Test::Unit::TestCase
5
+ def testPass
6
+ surbl = SurblClient.new()
7
+ domains = ["google.com", "yahoo.com", "apple.com"]
8
+ domains.each do |domain|
9
+ assert_equal(false, surbl.include?(domain))
10
+ assert_nil(surbl.lookup(domain))
11
+ end
12
+ end
13
+
14
+ def testSurblTestPoints
15
+ surbl = SurblClient.new()
16
+ domains = ["test.surbl.org", "surbl-org-permanent-test-point.com"]
17
+ all = ['sc', 'ws', 'ph', 'ob', 'ab', 'jp']
18
+ domains.each do |domain|
19
+ subdomain = "foo.bar.baz.#{domain}"
20
+ assert_equal(true, surbl.include?(domain))
21
+ assert_equal(surbl.lookup(domain), [domain, all])
22
+ assert_equal(true, surbl.include?(subdomain))
23
+ assert_equal(surbl.lookup(subdomain), [domain, all])
24
+ end
25
+ end
26
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: surbl_client
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ platform: ruby
6
+ authors:
7
+ - George Perry
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-21 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A gem to check whether or not a domain has been blacklisted by SURBL
14
+ email: perrygeorget.public@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/surbl_client.rb
20
+ - test/tc_surbl_client.rb
21
+ homepage: https://github.com/perrygeorget/surbl_client
22
+ licenses:
23
+ - MIT
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubyforge_project:
41
+ rubygems_version: 2.5.1
42
+ signing_key:
43
+ specification_version: 4
44
+ summary: SURBL checker (http://www.surbl.org/)
45
+ test_files: []