user agent filter now works with substrings
[mir.git] / source / mircoders / abuse / URLBlacklistFilterType.java
1 package mircoders.abuse;\r
2 \r
3 import mir.entity.Entity;\r
4 import mir.session.Request;\r
5 import org.apache.oro.text.regex.MalformedPatternException;\r
6 import org.apache.oro.text.regex.MatchResult;\r
7 import org.apache.oro.text.regex.Pattern;\r
8 import org.apache.oro.text.regex.PatternMatcherInput;\r
9 import org.apache.oro.text.regex.Perl5Compiler;\r
10 import org.apache.oro.text.regex.Perl5Matcher;\r
11 \r
12 import java.net.InetAddress;\r
13 import java.net.UnknownHostException;\r
14 import java.util.Arrays;\r
15 import java.util.Collection;\r
16 import java.util.HashSet;\r
17 import java.util.Iterator;\r
18 import java.util.Set;\r
19 \r
20 /**\r
21  * URL Blacklist filter type. Will perform a DNS request on URLs contained\r
22  * in a posting appended by the filter expression. An existing domain will\r
23  * cause in a positive filter outcome.\r
24  */\r
25 public class URLBlacklistFilterType extends AbstractFilterType {\r
26   public URLBlacklistFilterType(String aName, Collection aWhiteList) {\r
27     super(aName);\r
28 \r
29     whiteList = new HashSet(aWhiteList);\r
30   }\r
31 \r
32   /**\r
33    *\r
34    */\r
35   public boolean validate(String anExpression) {\r
36     return anExpression.trim().length() > 0;\r
37   }\r
38 \r
39   public FilterInstance constructFilterInstance(final String anExpression) throws AbuseExc {\r
40     return new FilterInstance() {\r
41       public boolean test(Entity anEntity, Request aRequest) {\r
42         Set domains = new HashSet();\r
43 \r
44         Iterator i = anEntity.getFieldNames().iterator();\r
45 \r
46         while (i.hasNext()) {\r
47           String field = anEntity.getFieldValue( (String) i.next());\r
48           if (field != null) {\r
49             harvestURLDomains(field, domains);\r
50           }\r
51         }\r
52 \r
53         domains.removeAll(whiteList);\r
54 \r
55         i = domains.iterator();\r
56         while (i.hasNext()) {\r
57           String domain = (String) i.next();\r
58 \r
59           try {\r
60             InetAddress.getByName(domain + "." + anExpression);\r
61 \r
62             return true;\r
63           }\r
64           catch (UnknownHostException e) {\r
65             // intentionally empty: the domain was not found, so the domain isn't blacklisted\r
66           }\r
67         }\r
68 \r
69         return false;\r
70       }\r
71 \r
72       public String status() {\r
73         return "";\r
74       }\r
75     };\r
76   }\r
77 \r
78   private static void harvestURLDomains(String someText, Set someResult) {\r
79     Perl5Matcher matcher = new Perl5Matcher();\r
80 \r
81     PatternMatcherInput input =\r
82         new PatternMatcherInput(someText);\r
83 \r
84     while(matcher.contains(input, URL_EXPRESSION)) {\r
85       MatchResult match = matcher.getMatch();\r
86       String domain = match.group(5);\r
87       if (domain!=null) {\r
88         someResult.add(stripDomain(domain));\r
89       }\r
90     }\r
91   }\r
92 \r
93   /**\r
94    * Turns a domain (e.g. www.indymedia.org) into its domain just above the top level (e.g. indymedia.org)\r
95    */\r
96   private static String stripDomain(String aDomain) {\r
97     String result = aDomain;\r
98     int pos = aDomain.lastIndexOf('.');\r
99     if (pos >= 0) {\r
100       pos = aDomain.lastIndexOf('.', pos-1);\r
101 \r
102       // note: pos may be -1\r
103       result = aDomain.substring(pos+1);\r
104       if (TWO_PART_TOP_LEVEL_DOMAINS.contains(result)) {\r
105         pos = aDomain.lastIndexOf('.', pos-1);\r
106 \r
107         // note: pos may be -1\r
108         result = aDomain.substring(pos+1);\r
109       }\r
110 \r
111       return result;\r
112     }\r
113 \r
114     return result;\r
115   }\r
116 \r
117   static {\r
118     Perl5Compiler compiler = new Perl5Compiler();\r
119     try {\r
120         URL_EXPRESSION =\r
121             compiler.compile("((https://)|(http://)|(ftp://)){1}([a-zA-Z0-9_-]+.[a-zA-Z0-9_.:-]+)", Perl5Compiler.READ_ONLY_MASK);\r
122     }\r
123     catch (MalformedPatternException e) {\r
124       //\r
125     }\r
126   }\r
127 \r
128   private Set whiteList;\r
129 \r
130   private static Pattern URL_EXPRESSION;\r
131   private static Set TWO_PART_TOP_LEVEL_DOMAINS = new HashSet(\r
132       Arrays.asList(new String[] {"com.ac", "edu.ac", "gov.ac", "net.ac", "mil.ac", "org.ac",\r
133 "com.ae", "net.ae", "org.ae", "gov.ae", "ac.ae", "co.ae",\r
134 "sch.ae", "pro.ae", "com.ai", "org.ai", "edu.ai", "gov.ai",\r
135 "com.ar", "net.ar", "org.ar", "gov.ar", "mil.ar", "edu.ar",\r
136 "int.ar", "co.at", "ac.at", "or.at", "gv.at", "priv.at",\r
137 "com.au", "gov.au", "org.au", "edu.au", "id.au", "oz.au",\r
138 "info.au", "net.au", "asn.au", "csiro.au", "telememo.au",\r
139 "conf.au", "otc.au", "id.au", "com.az", "net.az", "org.az",\r
140 "com.bb", "net.bb", "org.bb", "ac.be", "belgie.be",\r
141 "dns.be", "fgov.be", "com.bh", "gov.bh", "net.bh", "edu.bh",\r
142 "org.bh", "com.bm", "edu.bm", "gov.bm", "org.bm", "net.bm",\r
143 "adm.br", "adv.br", "agr.br", "am.br", "arq.br", "art.br",\r
144 "ato.br", "bio.br", "bmd.br", "cim.br", "cng.br", "cnt.br",\r
145 "com.br", "coop.br", "ecn.br", "edu.br", "eng.br", "esp.br",\r
146 "etc.br", "eti.br", "far.br", "fm.br", "fnd.br", "fot.br",\r
147 "fst.br", "g12.br", "ggf.br", "gov.br", "imb.br", "ind.br",\r
148 "inf.br", "jor.br", "lel.br", "mat.br", "med.br", "mil.br",\r
149 "mus.br", "net.br", "nom.br", "not.br", "ntr.br", "odo.br",\r
150 "org.br", "ppg.br", "pro.br", "psc.br", "psi.br", "qsl.br",\r
151 "rec.br", "slg.br", "srv.br", "tmp.br", "trd.br", "tur.br",\r
152 "tv.br", "vet.br", "zlg.br", "com.bs", "net.bs", "org.bs",\r
153 "com.bz", "net.bz", "org.bz", "ab.ca", "bc.ca", "mb.ca",\r
154 "nb.ca", "nf.ca", "nl.ca", "ns.ca", "nt.ca", "nu.ca",\r
155 "on.ca", "pe.ca", "qc.ca", "sk.ca", "yk.ca", "gc.ca",\r
156 "co.ck", "net.ck", "org.ck", "edu.ck", "gov.ck", "com.cn",\r
157 "edu.cn", "gov.cn", "net.cn", "org.cn", "ac.cn", "ah.cn",\r
158 "bj.cn", "cq.cn", "gd.cn", "gs.cn", "gx.cn", "gz.cn",\r
159 "hb.cn", "he.cn", "hi.cn", "hk.cn", "hl.cn", "hn.cn",\r
160 "jl.cn", "js.cn", "ln.cn", "mo.cn", "nm.cn", "nx.cn",\r
161 "qh.cn", "sc.cn", "sn.cn", "sh.cn", "sx.cn", "tj.cn",\r
162 "tw.cn", "xj.cn", "xz.cn", "yn.cn", "zj.cn", "arts.co",\r
163 "com.co", "edu.co", "firm.co", "gov.co", "info.co",\r
164 "int.co", "nom.co", "mil.co", "org.co", "rec.co",\r
165 "store.co", "web.co", "ac.cr", "co.cr", "ed.cr", "fi.cr",\r
166 "go.cr", "or.cr", "sa.cr", "com.cu", "net.cu", "org.cu",\r
167 "ac.cy", "com.cy", "gov.cy", "net.cy", "org.cy", "co.dk",\r
168 "art.do", "com.do", "edu.do", "gov.do", "gob.do", "org.do",\r
169 "mil.do", "net.do", "sld.do", "web.do", "com.dz", "org.dz",\r
170 "net.dz", "gov.dz", "edu.dz", "ass.dz", "pol.dz", "art.dz",\r
171 "com.ec", "k12.ec", "edu.ec", "fin.ec", "med.ec", "gov.ec",\r
172 "mil.ec", "org.ec", "net.ec", "com.ee", "pri.ee", "fie.ee",\r
173 "org.ee", "med.ee", "com.eg", "edu.eg", "eun.eg", "gov.eg",\r
174 "net.eg", "org.eg", "sci.eg", "com.er", "net.er", "org.er",\r
175 "edu.er", "mil.er", "gov.er", "ind.er", "com.es", "org.es",\r
176 "gob.es", "edu.es", "nom.es", "com.et", "gov.et", "org.et",\r
177 "edu.et", "net.et", "biz.et", "name.et", "info.et", "ac.fj",\r
178 "com.fj", "gov.fj", "id.fj", "org.fj", "school.fj",\r
179 "com.fk", "ac.fk", "gov.fk", "net.fk", "nom.fk", "org.fk",\r
180 "asso.fr", "nom.fr", "barreau.fr", "com.fr", "prd.fr",\r
181 "presse.fr", "tm.fr", "aeroport.fr", "assedic.fr",\r
182 "avocat.fr", "avoues.fr", "cci.fr", "chambagri.fr",\r
183 "chirurgiens-dentistes.fr", "experts-comptables.fr",\r
184 "geometre-expert.fr", "gouv.fr", "greta.fr",\r
185 "huissier-justice.fr", "medecin.fr", "notaires.fr", "pharmacien.fr",\r
186 "port.fr", "veterinaire.fr", "com.ge", "edu.ge", "gov.ge",\r
187 "mil.ge", "net.ge", "org.ge", "pvt.ge", "co.gg", "org.gg",\r
188 "sch.gg", "ac.gg", "gov.gg", "ltd.gg", "ind.gg", "net.gg",\r
189 "alderney.gg", "guernsey.gg", "sark.gg", "com.gr", "edu.gr",\r
190 "gov.gr", "net.gr", "org.gr", "com.gt", "edu.gt", "net.gt",\r
191 "gob.gt", "org.gt", "mil.gt", "ind.gt", "com.gu", "edu.gu",\r
192 "net.gu", "org.gu", "gov.gu", "mil.gu", "com.hk", "net.hk",\r
193 "org.hk", "idv.hk", "gov.hk", "edu.hk", "co.hu", "2000.hu",\r
194 "erotika.hu", "jogasz.hu", "sex.hu", "video.hu", "info.hu",\r
195 "agrar.hu", "film.hu", "konyvelo.hu", "shop.hu", "org.hu",\r
196 "bolt.hu", "forum.hu", "lakas.hu", "suli.hu", "priv.hu",\r
197 "casino.hu", "games.hu", "media.hu", "szex.hu", "sport.hu",\r
198 "city.hu", "hotel.hu", "news.hu", "tozsde.hu", "tm.hu",\r
199 "erotica.hu", "ingatlan.hu", "reklam.hu", "utazas.hu",\r
200 "ac.id", "co.id", "go.id", "mil.id", "net.id", "or.id",\r
201 "co.il", "net.il", "org.il", "ac.il", "gov.il", "k12.il",\r
202 "muni.il", "idf.il", "co.im", "net.im", "org.im", "ac.im",\r
203 "lkd.co.im", "gov.im", "nic.im", "plc.co.im", "co.in",\r
204 "net.in", "ac.in", "ernet.in", "gov.in", "nic.in", "res.in",\r
205 "gen.in", "firm.in", "mil.in", "org.in", "ind.in", "ac.ir",\r
206 "co.ir", "gov.ir", "id.ir", "net.ir", "org.ir", "sch.ir",\r
207 "ac.je", "co.je", "net.je", "org.je", "gov.je", "ind.je",\r
208 "jersey.je", "ltd.je", "sch.je", "com.jo", "org.jo",\r
209 "net.jo", "gov.jo", "edu.jo", "mil.jo", "ad.jp", "ac.jp",\r
210 "co.jp", "go.jp", "or.jp", "ne.jp", "gr.jp", "ed.jp",\r
211 "lg.jp", "net.jp", "org.jp", "gov.jp", "hokkaido.jp",\r
212 "aomori.jp", "iwate.jp", "miyagi.jp", "akita.jp",\r
213 "yamagata.jp", "fukushima.jp", "ibaraki.jp", "tochigi.jp",\r
214 "gunma.jp", "saitama.jp", "chiba.jp", "tokyo.jp",\r
215 "kanagawa.jp", "niigata.jp", "toyama.jp", "ishikawa.jp",\r
216 "fukui.jp", "yamanashi.jp", "nagano.jp", "gifu.jp",\r
217 "shizuoka.jp", "aichi.jp", "mie.jp", "shiga.jp", "kyoto.jp",\r
218 "osaka.jp", "hyogo.jp", "nara.jp", "wakayama.jp",\r
219 "tottori.jp", "shimane.jp", "okayama.jp", "hiroshima.jp",\r
220 "yamaguchi.jp", "tokushima.jp", "kagawa.jp", "ehime.jp",\r
221 "kochi.jp", "fukuoka.jp", "saga.jp", "nagasaki.jp",\r
222 "kumamoto.jp", "oita.jp", "miyazaki.jp", "kagoshima.jp",\r
223 "okinawa.jp", "sapporo.jp", "sendai.jp", "yokohama.jp",\r
224 "kawasaki.jp", "nagoya.jp", "kobe.jp", "kitakyushu.jp",\r
225 "utsunomiya.jp", "kanazawa.jp", "takamatsu.jp",\r
226 "matsuyama.jp", "com.kg", "net.kg", "org.kg", "edu.kg",\r
227 "gov.kg", "mil.kg", "com.kh", "net.kh", "org.kh", "per.kh",\r
228 "edu.kh", "gov.kh", "mil.kh", "ac.kr", "co.kr", "go.kr",\r
229 "ne.kr", "or.kr", "pe.kr", "re.kr", "seoul.kr",\r
230 "kyonggi.kr", "com.kw", "net.kw", "org.kw", "edu.kw",\r
231 "gov.kw", "com.la", "net.la", "org.la", "com.lb", "org.lb",\r
232 "net.lb", "edu.lb", "gov.lb", "mil.lb", "com.lc", "edu.lc",\r
233 "gov.lc", "net.lc", "org.lc", "com.lv", "net.lv", "org.lv",\r
234 "edu.lv", "gov.lv", "mil.lv", "id.lv", "asn.lv", "conf.lv",\r
235 "com.ly", "net.ly", "org.ly", "co.ma", "net.ma", "org.ma",\r
236 "press.ma", "ac.ma", "com.mk", "com.mm", "net.mm", "org.mm",\r
237 "edu.mm", "gov.mm", "com.mn", "org.mn", "edu.mn", "gov.mn",\r
238 "museum.mn", "com.mo", "net.mo", "org.mo", "edu.mo",\r
239 "gov.mo", "com.mt", "net.mt", "org.mt", "edu.mt", "tm.mt",\r
240 "uu.mt", "com.mx", "net.mx", "org.mx", "gob.mx", "edu.mx",\r
241 "com.my", "org.my", "gov.my", "edu.my", "net.my", "com.na",\r
242 "org.na", "net.na", "alt.na", "edu.na", "cul.na", "unam.na",\r
243 "telecom.na", "com.nc", "net.nc", "org.nc", "ac.ng",\r
244 "edu.ng", "sch.ng", "com.ng", "gov.ng", "org.ng", "net.ng",\r
245 "gob.ni", "com.ni", "net.ni", "edu.ni", "nom.ni", "org.ni",\r
246 "com.np", "net.np", "org.np", "gov.np", "edu.np", "ac.nz",\r
247 "co.nz", "cri.nz", "gen.nz", "geek.nz", "govt.nz", "iwi.nz",\r
248 "maori.nz", "mil.nz", "net.nz", "org.nz", "school.nz",\r
249 "com.om", "co.om", "edu.om", "ac.om", "gov.om", "net.om",\r
250 "org.om", "mod.om", "museum.om", "biz.om", "pro.om",\r
251 "med.om", "com.pa", "net.pa", "org.pa", "edu.pa", "ac.pa",\r
252 "gob.pa", "sld.pa", "edu.pe", "gob.pe", "nom.pe", "mil.pe",\r
253 "org.pe", "com.pe", "net.pe", "com.pg", "net.pg", "ac.pg",\r
254 "com.ph", "net.ph", "org.ph", "mil.ph", "ngo.ph", "aid.pl",\r
255 "agro.pl", "atm.pl", "auto.pl", "biz.pl", "com.pl",\r
256 "edu.pl", "gmina.pl", "gsm.pl", "info.pl", "mail.pl",\r
257 "miasta.pl", "media.pl", "mil.pl", "net.pl",\r
258 "nieruchomosci.pl", "nom.pl", "org.pl", "pc.pl",\r
259 "powiat.pl", "priv.pl", "realestate.pl", "rel.pl", "sex.pl",\r
260 "shop.pl", "sklep.pl", "sos.pl", "szkola.pl", "targi.pl",\r
261 "tm.pl", "tourism.pl", "travel.pl", "turystyka.pl",\r
262 "com.pk", "net.pk", "edu.pk", "org.pk", "fam.pk", "biz.pk",\r
263 "web.pk", "gov.pk", "gob.pk", "gok.pk", "gon.pk", "gop.pk",\r
264 "gos.pk", "edu.ps", "gov.ps", "plo.ps", "sec.ps", "com.pt",\r
265 "edu.pt", "gov.pt", "int.pt", "net.pt", "nome.pt", "org.pt",\r
266 "publ.pt", "com.py", "net.py", "org.py", "edu.py", "com.qa",\r
267 "net.qa", "org.qa", "edu.qa", "gov.qa", "asso.re", "com.re",\r
268 "nom.re", "com.ro", "org.ro", "tm.ro", "nt.ro", "nom.ro",\r
269 "info.ro", "rec.ro", "arts.ro", "firm.ro", "store.ro",\r
270 "www.ro", "ac.ru", "adygeya.ru", "altai.ru", "amur.ru",\r
271 "amursk.ru", "arkhangelsk.ru", "astrakhan.ru", "baikal.ru",\r
272 "bashkiria.ru", "belgorod.ru", "bir.ru", "bryansk.ru",\r
273 "buryatia.ru", "cbg.ru", "chel.ru", "chelyabinsk.ru",\r
274 "chita.ru", "chukotka.ru", "chuvashia.ru", "cmw.ru",\r
275 "com.ru", "dagestan.ru", "dudinka.ru", "e-burg.ru",\r
276 "edu.ru", "fareast.ru", "gov.ru", "grozny.ru", "int.ru",\r
277 "irkutsk.ru", "ivanovo.ru", "izhevsk.ru", "jamal.ru",\r
278 "jar.ru", "joshkar-ola.ru", "k-uralsk.ru", "kalmykia.ru",\r
279 "kaluga.ru", "kamchatka.ru", "karelia.ru", "kazan.ru",\r
280 "kchr.ru", "kemerovo.ru", "khabarovsk.ru", "khakassia.ru",\r
281 "khv.ru", "kirov.ru", "kms.ru", "koenig.ru", "komi.ru",\r
282 "kostroma.ru", "krasnoyarsk.ru", "kuban.ru", "kurgan.ru",\r
283 "kursk.ru", "kustanai.ru", "kuzbass.ru", "lipetsk.ru",\r
284 "magadan.ru", "magnitka.ru", "mari-el.ru", "mari.ru",\r
285 "marine.ru", "mil.ru", "mordovia.ru", "mosreg.ru", "msk.ru",\r
286 "murmansk.ru", "mytis.ru", "nakhodka.ru", "nalchik.ru",\r
287 "net.ru", "nkz.ru", "nnov.ru", "norilsk.ru", "nov.ru",\r
288 "novosibirsk.ru", "nsk.ru", "omsk.ru", "orenburg.ru",\r
289 "org.ru", "oryol.ru", "oskol.ru", "palana.ru", "penza.ru",\r
290 "perm.ru", "pp.ru", "pskov.ru", "ptz.ru", "pyatigorsk.ru",\r
291 "rnd.ru", "rubtsovsk.ru", "ryazan.ru", "sakhalin.ru",\r
292 "samara.ru", "saratov.ru", "simbirsk.ru", "smolensk.ru",\r
293 "snz.ru", "spb.ru", "stavropol.ru", "stv.ru", "surgut.ru",\r
294 "syzran.ru", "tambov.ru", "tatarstan.ru", "test.ru",\r
295 "tom.ru", "tomsk.ru", "tsaritsyn.ru", "tsk.ru", "tula.ru",\r
296 "tuva.ru", "tver.ru", "tyumen.ru", "udm.ru", "udmurtia.ru",\r
297 "ulan-ude.ru", "vdonsk.ru", "vladikavkaz.ru", "vladimir.ru",\r
298 "vladivostok.ru", "volgograd.ru", "vologda.ru",\r
299 "voronezh.ru", "vrn.ru", "vyatka.ru", "yakutia.ru",\r
300 "yamal.ru", "yaroslavl.ru", "yekaterinburg.ru",\r
301 "yuzhno-sakhalinsk.ru", "zgrad.ru", "com.sa", "edu.sa", "sch.sa",\r
302 "med.sa", "gov.sa", "net.sa", "org.sa", "pub.sa", "com.sb",\r
303 "net.sb", "org.sb", "edu.sb", "gov.sb", "com.sd", "net.sd",\r
304 "org.sd", "edu.sd", "sch.sd", "med.sd", "gov.sd", "tm.se",\r
305 "press.se", "parti.se", "brand.se", "fh.se", "fhsk.se",\r
306 "fhv.se", "komforb.se", "kommunalforbund.se", "komvux.se",\r
307 "lanarb.se", "lanbib.se", "naturbruksgymn.se", "sshn.se",\r
308 "org.se", "pp.se", "com.sg", "net.sg", "org.sg", "edu.sg",\r
309 "gov.sg", "per.sg", "com.sh", "net.sh", "org.sh", "edu.sh",\r
310 "gov.sh", "mil.sh", "gov.st", "saotome.st", "principe.st",\r
311 "consulado.st", "embaixada.st", "org.st", "edu.st",\r
312 "net.st", "com.st", "store.st", "mil.st", "co.st", "com.sv",\r
313 "org.sv", "edu.sv", "gob.sv", "red.sv", "com.sy", "net.sy",\r
314 "org.sy", "gov.sy", "ac.th", "co.th", "go.th", "net.th",\r
315 "or.th", "com.tn", "net.tn", "org.tn", "edunet.tn",\r
316 "gov.tn", "ens.tn", "fin.tn", "nat.tn", "ind.tn", "info.tn",\r
317 "intl.tn", "rnrt.tn", "rnu.tn", "rns.tn", "tourism.tn",\r
318 "com.tr", "net.tr", "org.tr", "edu.tr", "gov.tr", "mil.tr",\r
319 "bbs.tr", "k12.tr", "gen.tr", "co.tt", "com.tt", "org.tt",\r
320 "net.tt", "biz.tt", "info.tt", "pro.tt", "int.tt",\r
321 "coop.tt", "jobs.tt", "mobi.tt", "travel.tt", "museum.tt",\r
322 "aero.tt", "name.tt", "gov.tt", "edu.tt", "nic.tt", "us.tt",\r
323 "uk.tt", "ca.tt", "eu.tt", "es.tt", "fr.tt", "it.tt",\r
324 "se.tt", "dk.tt", "be.tt", "de.tt", "at.tt", "au.tt",\r
325 "co.tv", "com.tw", "net.tw", "org.tw", "edu.tw", "idv.tw",\r
326 "gov.tw", "com.ua", "gov.ua", "net.ua", "edu.ua", "org.ua",\r
327 "in.ua", "cherkassy.ua", "ck.ua", "chernigov.ua", "cn.ua",\r
328 "chernovtsy.ua", "cv.ua", "crimea.ua", "dnepropetrovsk.ua",\r
329 "dp.ua", "donetsk.ua", "dn.ua", "ivano-frankivsk.ua",\r
330 "if.ua", "kharkov.ua", "kh.ua", "kherson.ua", "ks.ua",\r
331 "khmelnitskiy.ua", "km.ua", "kiev.ua", "kv.ua",\r
332 "kirovograd.ua", "kr.ua", "lugansk.ua", "lg.ua", "lutsk.ua",\r
333 "lviv.ua", "nikolaev.ua", "mk.ua", "odessa.ua", "od.ua",\r
334 "poltava.ua", "pl.ua", "rovno.ua", "rv.ua", "sebastopol.ua",\r
335 "sumy.ua", "ternopil.ua", "te.ua", "uzhgorod.ua",\r
336 "vinnica.ua", "vn.ua", "zaporizhzhe.ua", "zp.ua",\r
337 "zhitomir.ua", "zt.ua", "ac.ug", "co.ug", "or.ug", "go.ug",\r
338 "co.uk", "me.uk", "org.uk", "edu.uk", "ltd.uk", "plc.uk",\r
339 "net.uk", "sch.uk", "nic.uk", "ac.uk", "gov.uk", "nhs.uk",\r
340 "police.uk", "mod.uk", "dni.us", "fed.us", "com.uy",\r
341 "edu.uy", "net.uy", "org.uy", "gub.uy", "mil.uy", "com.ve",\r
342 "net.ve", "org.ve", "co.ve", "edu.ve", "gov.ve", "mil.ve",\r
343 "arts.ve", "bib.ve", "firm.ve", "info.ve", "int.ve",\r
344 "nom.ve", "rec.ve", "store.ve", "tec.ve", "web.ve", "co.vi",\r
345 "net.vi", "org.vi", "com.vn", "biz.vn", "edu.vn", "gov.vn",\r
346 "net.vn", "org.vn", "int.vn", "ac.vn", "pro.vn", "info.vn",\r
347 "health.vn", "name.vn", "com.vu", "edu.vu", "net.vu",\r
348 "org.vu", "de.vu", "ch.vu", "fr.vu", "com.ws", "net.ws",\r
349 "org.ws", "gov.ws", "edu.ws", "ac.yu", "co.yu", "edu.yu",\r
350 "org.yu", "com.ye", "net.ye", "org.ye", "gov.ye", "edu.ye",\r
351 "mil.ye", "ac.za", "alt.za", "bourse.za", "city.za",\r
352 "co.za", "edu.za", "gov.za", "law.za", "mil.za", "net.za",\r
353 "ngo.za", "nom.za", "org.za", "school.za", "tm.za",\r
354 "web.za", "co.zw", "ac.zw", "org.zw", "gov.zw", "eu.org",\r
355 "au.com", "br.com", "cn.com", "de.com", "de.net", "eu.com",\r
356 "gb.com", "gb.net", "hu.com", "no.com", "qc.com", "ru.com",\r
357 "sa.com", "se.com", "uk.com", "uk.net", "us.com", "uy.com",\r
358 "za.com", "dk.org", "tel.no", "fax.nr", "mob.nr",\r
359 "mobil.nr", "mobile.nr", "tel.nr", "tlf.nr", "e164.arpa"\r
360       })\r
361   );\r
362 }\r
363 \r