3 /* Copyright (C) 2005 Reini Urban
5 * This file is part of PhpWiki.
7 * PhpWiki is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * PhpWiki is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with PhpWiki; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 * See http://www.surbl.org/
26 * Perform a name lookup (A) for any link tld against multi.surbl.org and bl.spamcop.net,
27 * like: domainundertest.com.multi.surbl.org
28 * or 40.30.20.10.multi.surbl.org (for http://10.20.30.40/)
29 * This is the same, but a bit lighter than PEAR::Net_DNSBL_SURBL
33 * Strip domain prefixes so that either the last two name parts are returned,
34 * or if it's a known tld (like "co.uk") the last three.
36 function stripDomainPrefixes($host) {
37 static $twoleveltlds = array();
38 $host_elements = explode('.', $host);
39 while (count($host_elements) > 3) {
40 array_shift($host_elements);
42 $host_3_elements = implode('.', $host_elements);
43 if (count($host_elements) > 2) {
44 array_shift($host_elements);
46 $host_2_elements = implode('.', $host_elements);
47 if (empty($twoleveltlds)) {
48 $data = @file(dirname(__FILE__)."/../config/two-level-tlds");
49 $twoleveltlds = $data ? array_flip($data) : array();
51 if (array_key_exists($host_2_elements, $twoleveltlds))
52 //IS_IN_2LEVEL: we want the last three names
53 $host = $host_3_elements;
55 // IS_NOT_2LEVEL: we want the last two names
56 $host = $host_2_elements;
60 function IsBlackListed($uri) {
61 static $blacklists = array("multi.surbl.org", "bl.spamcop.net");
62 /* "sbl-xbl.spamhaus.net" */
63 static $whitelist = array();
64 if (empty($whitelist)) { // list of domains
65 $data = @file(dirname(__FILE__)."/../config/whitelist");
66 $whitelist = $data ? array_flip($data) : array();
69 $parsed_uri = parse_url($uri);
70 if (!empty($parsed_uri['host']))
71 $host = $parsed_uri['host'];
73 $host = $parsed_uri['path'];
74 if (array_key_exists($host, $whitelist))
76 if (preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $host)) {
77 $host = implode('.', array_reverse(explode('.', $host)));
82 foreach ($blacklists as $bl) {
83 if (!$revip and $bl == "multi.surbl.org") {
84 $host = stripDomainPrefixes($host); // strip domain prefixes
85 if (array_key_exists($host, $whitelist))
88 // convert to IP addr and revert it.
89 $host = implode('.', array_reverse(explode('.', gethostbyname($host))));
92 $res = gethostbyname($host . "." . $bl);
93 if (preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $res))
94 return array($bl, $res, $host);
101 if (defined('SPAMBLOCKLIST_TEST') and SPAMBLOCKLIST_TEST) {
102 BlackListDebug("10.20.30.40");
103 BlackListDebug("spammer.org");
104 BlackListDebug("www.ricoruca.com");
105 BlackListDebug("ricoruca.com");
106 BlackListDebug("soft-sky.org");
107 BlackListDebug("lovers.lv");
108 BlackListDebug("wumort.net");
109 BlackListDebug("bibleinayear.org");
110 BlackListDebug("p50927464.dip.t-dialin.net");
112 function BlackListDebug($host) {
113 $res = IsBlackListed($host);
114 echo sprintf("%12s", $host), "\tis";
116 echo " listed at $res[0] - $res[1]\n";
118 echo " not blacklisted.\n";
126 // c-hanging-comment-ender-p: nil
127 // indent-tabs-mode: nil