HTML tag
//'uri_bbcode' => $t_area, // URI inside [url] or [link] BBCode
);
if ($rule) {
$bool = array(
// Rules
//'asap' => TRUE, // Quit or return As Soon As Possible
'uniqhost' => TRUE, // Show uniq host (at block notification mail)
'badhost' => TRUE, // Check badhost
);
} else {
$bool = array();
}
// Remove non-$positive values
foreach (array_keys($positive) as $key) {
if ($positive[$key] < 0) unset($positive[$key]);
}
return $positive + $bool;
}
// Simple/fast spam check
function check_uri_spam($target = '', $method = array())
{
// Return value
$progress = array(
'method' => array(
// Theme to do => Dummy, optional value, or optional array()
//'quantity' => 8,
//'uniqhost' => TRUE,
//'non_uniqhost'=> 3,
//'non_uniquri' => 3,
//'badhost' => TRUE,
//'area_anchor' => 0,
//'area_bbcode' => 0,
//'uri_anchor' => 0,
//'uri_bbcode' => 0,
),
'sum' => array(
// Theme => Volume found (int)
),
'is_spam' => array(
// Flag. If someting defined here,
// one or more spam will be included
// in this report
),
'blocked' => array(
// Hosts blocked
//'category' => array(
// 'host',
//)
),
'hosts' => array(
// Hosts not blocked
),
);
// Aliases
$sum = & $progress['sum'];
$is_spam = & $progress['is_spam'];
$progress['method'] = & $method; // Argument
$blocked = & $progress['blocked'];
$hosts = & $progress['hosts'];
$asap = isset($method['asap']);
// Init
if (! is_array($method) || empty($method)) {
$method = check_uri_spam_method();
}
foreach(array_keys($method) as $key) {
if (! isset($sum[$key])) $sum[$key] = 0;
}
if (! isset($sum['quantity'])) $sum['quantity'] = 0;
if (is_array($target)) {
foreach($target as $str) {
if (! is_string($str)) continue;
$_progress = check_uri_spam($str, $method); // Recurse
// Merge $sum
$_sum = & $_progress['sum'];
foreach (array_keys($_sum) as $key) {
if (! isset($sum[$key])) {
$sum[$key] = & $_sum[$key];
} else {
$sum[$key] += $_sum[$key];
}
}
// Merge $is_spam
$_is_spam = & $_progress['is_spam'];
foreach (array_keys($_is_spam) as $key) {
$is_spam[$key] = TRUE;
if ($asap) break;
}
if ($asap && $is_spam) break;
// Merge only
$blocked = array_merge_recursive($blocked, $_progress['blocked']);
$hosts = array_merge_recursive($hosts, $_progress['hosts']);
}
// Unique values
$blocked = array_unique_recursive($blocked);
$hosts = array_unique_recursive($hosts);
// Recount $sum['badhost']
$sum['badhost'] = array_count_leaves($blocked);
return $progress;
}
// Area: There's HTML anchor tag
if ((! $asap || ! $is_spam) && isset($method['area_anchor'])) {
$key = 'area_anchor';
$_asap = isset($method['asap']) ? array('asap' => TRUE) : array();
$result = area_pickup($target, array($key => TRUE) + $_asap);
if ($result) {
$sum[$key] = $result[$key];
if (isset($method[$key]) && $sum[$key] > $method[$key]) {
$is_spam[$key] = TRUE;
}
}
}
// Area: There's 'BBCode' linking tag
if ((! $asap || ! $is_spam) && isset($method['area_bbcode'])) {
$key = 'area_bbcode';
$_asap = isset($method['asap']) ? array('asap' => TRUE) : array();
$result = area_pickup($target, array($key => TRUE) + $_asap);
if ($result) {
$sum[$key] = $result[$key];
if (isset($method[$key]) && $sum[$key] > $method[$key]) {
$is_spam[$key] = TRUE;
}
}
}
// Return if ...
if ($asap && $is_spam) return $progress;
// URI: Pickup
$pickups = uri_pickup_normalize(spam_uri_pickup($target, $method));
// Return if ...
if (empty($pickups)) return $progress;
// URI: Check quantity
$sum['quantity'] += count($pickups);
// URI quantity
if ((! $asap || ! $is_spam) && isset($method['quantity']) &&
$sum['quantity'] > $method['quantity']) {
$is_spam['quantity'] = TRUE;
}
// URI: used inside HTML anchor tag pair
if ((! $asap || ! $is_spam) && isset($method['uri_anchor'])) {
$key = 'uri_anchor';
foreach($pickups as $pickup) {
if (isset($pickup['area'][$key])) {
$sum[$key] += $pickup['area'][$key];
if(isset($method[$key]) &&
$sum[$key] > $method[$key]) {
$is_spam[$key] = TRUE;
if ($asap && $is_spam) break;
}
if ($asap && $is_spam) break;
}
}
}
// URI: used inside 'BBCode' pair
if ((! $asap || ! $is_spam) && isset($method['uri_bbcode'])) {
$key = 'uri_bbcode';
foreach($pickups as $pickup) {
if (isset($pickup['area'][$key])) {
$sum[$key] += $pickup['area'][$key];
if(isset($method[$key]) &&
$sum[$key] > $method[$key]) {
$is_spam[$key] = TRUE;
if ($asap && $is_spam) break;
}
if ($asap && $is_spam) break;
}
}
}
// URI: Uniqueness (and removing non-uniques)
if ((! $asap || ! $is_spam) && isset($method['non_uniquri'])) {
$uris = array();
foreach (array_keys($pickups) as $key) {
$uris[$key] = uri_pickup_implode($pickups[$key]);
}
$count = count($uris);
$uris = array_unique($uris);
$sum['non_uniquri'] += $count - count($uris);
if ($sum['non_uniquri'] > $method['non_uniquri']) {
$is_spam['non_uniquri'] = TRUE;
}
if (! $asap || ! $is_spam) {
foreach (array_diff(array_keys($pickups),
array_keys($uris)) as $remove) {
unset($pickups[$remove]);
}
}
unset($uris);
}
// Return if ...
if ($asap && $is_spam) return $progress;
// Host: Uniqueness (uniq / non-uniq)
foreach ($pickups as $pickup) $hosts[] = & $pickup['host'];
$hosts = array_unique($hosts);
$sum['uniqhost'] += count($hosts);
if ((! $asap || ! $is_spam) && isset($method['non_uniqhost'])) {
$sum['non_uniqhost'] = $sum['quantity'] - $sum['uniqhost'];
if ($sum['non_uniqhost'] > $method['non_uniqhost']) {
$is_spam['non_uniqhost'] = TRUE;
}
}
// Return if ...
if ($asap && $is_spam) return $progress;
// URI: Bad host (Separate good/bad hosts from $hosts)
if ((! $asap || ! $is_spam) && isset($method['badhost'])) {
// is_badhost()
$list = get_blocklist('list');
$blocked = blocklist_distiller($hosts, array_keys($list), $asap);
foreach($list as $key=>$type){
if (! $type) unset($blocked[$key]); // Ignore goodhost etc
}
unset($list);
if (! empty($blocked)) $is_spam['badhost'] = TRUE;
}
return $progress;
}
// Count leaves (A leaf = value that is not an array, or an empty array)
function array_count_leaves($array = array(), $count_empty = FALSE)
{
if (! is_array($array) || (empty($array) && $count_empty)) return 1;
// Recurse
$count = 0;
foreach ($array as $part) {
$count += array_count_leaves($part, $count_empty);
}
return $count;
}
// An array-leaves to a flat array
function array_flat_leaves($array, $unique = TRUE)
{
if (! is_array($array)) return $array;
$tmp = array();
foreach(array_keys($array) as $key) {
if (is_array($array[$key])) {
// Recurse
foreach(array_flat_leaves($array[$key]) as $_value) {
$tmp[] = $_value;
}
} else {
$tmp[] = & $array[$key];
}
}
return $unique ? array_values(array_unique($tmp)) : $tmp;
}
// An array() to an array leaf
function array_leaf($array = array('A', 'B', 'C.D'), $stem = FALSE, $edge = TRUE)
{
if (! is_array($array)) return $array;
$leaf = array();
$tmp = & $leaf;
foreach($array as $arg) {
if (! is_string($arg) && ! is_int($arg)) continue;
$tmp[$arg] = array();
$parent = & $tmp;
$tmp = & $tmp[$arg];
}
if ($stem) {
$parent[key($parent)] = & $edge;
} else {
$parent = key($parent);
}
return $leaf; // array('A' => array('B' => 'C.D'))
}
// ---------------------
// Reporting
// Summarize $progress (blocked only)
function summarize_spam_progress($progress = array(), $blockedonly = FALSE)
{
if ($blockedonly) {
$tmp = array_keys($progress['is_spam']);
} else {
$tmp = array();
$method = & $progress['method'];
if (isset($progress['sum'])) {
foreach ($progress['sum'] as $key => $value) {
if (isset($method[$key]) && $value) {
$tmp[] = $key . '(' . $value . ')';
}
}
}
}
return implode(', ', $tmp);
}
function summarize_detail_badhost($progress = array())
{
if (! isset($progress['blocked']) || empty($progress['blocked'])) return '';
// Flat per group
$blocked = array();
foreach($progress['blocked'] as $list => $lvalue) {
foreach($lvalue as $group => $gvalue) {
$flat = implode(', ', array_flat_leaves($gvalue));
if ($flat === $group) {
$blocked[$list][] = $flat;
} else {
$blocked[$list][$group] = $flat;
}
}
}
// Shrink per list
// From: 'A-1' => array('ie.to')
// To: 'A-1' => 'ie.to'
foreach($blocked as $list => $lvalue) {
if (is_array($lvalue) &&
count($lvalue) == 1 &&
is_numeric(key($lvalue))) {
$blocked[$list] = current($lvalue);
}
}
return var_export_shrink($blocked, TRUE, TRUE);
}
function summarize_detail_newtral($progress = array())
{
if (! isset($progress['hosts']) ||
! is_array($progress['hosts']) ||
empty($progress['hosts'])) return '';
// Generate a responsible $trie
$trie = array();
foreach($progress['hosts'] as $value) {
// 'A.foo.bar.example.com'
$resp = whois_responsibility($value); // 'example.com'
$rest = rtrim(substr($value, 0, - strlen($resp)), '.') . '.'; // 'A.foo.bar.'
$trie = array_merge_recursive(
$trie,
array($resp => array($rest => NULL))
);
}
ksort_by_domain($trie);
$result = array();
foreach(array_keys($trie) as $key) {
// Sort and flatten -- 'A.foo.bar., B.foo.bar.'
ksort_by_domain($trie[$key]);
$trie[$key] = implode(', ', array_keys($trie[$key]));
// Format: var_export_shrink() -like output
if ($trie[$key] == '.') {
// Just one 'responsibility.example.com'
$result[] = ' \'' . $key . '\',';
} else {
// One subdomain-or-host, or several ones
$result[] = ' \'' . $key . '\' => \'' . $trie[$key] . '\',';
}
unset($trie[$key]);
}
return
'array (' . "\n" .
implode("\n", $result) . "\n" .
')';
}
// ksort() by domain
function ksort_by_domain(& $array)
{
$sort = array();
foreach(array_keys($array) as $key) {
$sort[delimiter_reverse($key)] = $key;
}
ksort($sort, SORT_STRING);
$result = array();
foreach($sort as $key) {
$result[$key] = & $array[$key];
}
$array = $result;
}
// Check responsibility-root of the FQDN
// 'foo.bar.example.com' => 'example.com' (.com has the last whois for it)
// 'foo.bar.example.au' => 'example.au' (.au has the last whois for it)
// 'foo.bar.example.edu.au' => 'example.edu.au' (.edu.au has the last whois for it)
// 'foo.bar.example.act.edu.au' => 'example.act.edu.au' (.act.edu.au has the last whois for it)
function whois_responsibility($fqdn = 'foo.bar.example.com', $parent = FALSE, $implicit = TRUE)
{
// Domains who have 2nd and/or 3rd level domains
static $domain = array(
// ccTLD: Australia
// http://www.auda.org.au/
// NIC : http://www.aunic.net/
// Whois: http://www.ausregistry.com.au/
'au' => array(
// .au Second Level Domains
// http://www.auda.org.au/domains/
'asn' => TRUE,
'com' => TRUE,
'conf' => TRUE,
'csiro' => TRUE,
'edu' => array( // http://www.domainname.edu.au/
// Geographic
'act' => TRUE,
'nt' => TRUE,
'nsw' => TRUE,
'qld' => TRUE,
'sa' => TRUE,
'tas' => TRUE,
'vic' => TRUE,
'wa' => TRUE,
),
'gov' => array(
// Geographic
'act' => TRUE, // Australian Capital Territory
'nt' => TRUE, // Northern Territory
'nsw' => TRUE, // New South Wales
'qld' => TRUE, // Queensland
'sa' => TRUE, // South Australia
'tas' => TRUE, // Tasmania
'vic' => TRUE, // Victoria
'wa' => TRUE, // Western Australia
),
'id' => TRUE,
'net' => TRUE,
'org' => TRUE,
'info' => TRUE,
),
// ccTLD: China
// NIC : http://www.cnnic.net.cn/en/index/
// Whois: http://ewhois.cnnic.cn/
'cn' => array(
// Provisional Administrative Rules for Registration of Domain Names in China
// http://www.cnnic.net.cn/html/Dir/2003/11/27/1520.htm
// Organizational
'ac' => TRUE,
'com' => TRUE,
'edu' => TRUE,
'gov' => TRUE,
'net' => TRUE,
'org' => TRUE,
// Geographic
'ah' => TRUE,
'bj' => TRUE,
'cq' => TRUE,
'fj' => TRUE,
'gd' => TRUE,
'gs' => TRUE,
'gx' => TRUE,
'gz' => TRUE,
'ha' => TRUE,
'hb' => TRUE,
'he' => TRUE,
'hi' => TRUE,
'hk' => TRUE,
'hl' => TRUE,
'hn' => TRUE,
'jl' => TRUE,
'js' => TRUE,
'jx' => TRUE,
'ln' => TRUE,
'mo' => TRUE,
'nm' => TRUE,
'nx' => TRUE,
'qh' => TRUE,
'sc' => TRUE,
'sd' => TRUE,
'sh' => TRUE,
'sn' => TRUE,
'sx' => TRUE,
'tj' => TRUE,
'tw' => TRUE,
'xj' => TRUE,
'xz' => TRUE,
'yn' => TRUE,
'zj' => TRUE,
),
// ccTLD: India
// NIC : http://www.inregistry.in/
// Whois: http://www.inregistry.in/whois_search/
'in' => array(
// Policies http://www.inregistry.in/policies/
'ac' => TRUE,
'co' => TRUE,
'firm' => TRUE,
'gen' => TRUE,
'gov' => TRUE,
'ind' => TRUE,
'mil' => TRUE,
'net' => TRUE,
'org' => TRUE,
'res' => TRUE,
// Reserved Names by the government (for the 2nd level)
// http://www.inregistry.in/policies/reserved_names
),
// ccTLD: South Korea
// NIC : http://www.nic.or.kr/english/
// Whois: http://whois.nida.or.kr/english/
'kr' => array(
// .kr domain policy [appendix 1] : Qualifications for Second Level Domains
// http://domain.nida.or.kr/eng/policy.jsp
// Organizational
'co' => TRUE,
'ne ' => TRUE,
'or ' => TRUE,
're ' => TRUE,
'pe' => TRUE,
'go ' => TRUE,
'mil' => TRUE,
'ac' => TRUE,
'hs' => TRUE,
'ms' => TRUE,
'es' => TRUE,
'sc' => TRUE,
'kg' => TRUE,
// Geographic
'seoul' => TRUE,
'busan' => TRUE,
'daegu' => TRUE,
'incheon' => TRUE,
'gwangju' => TRUE,
'daejeon' => TRUE,
'ulsan' => TRUE,
'gyeonggi' => TRUE,
'gangwon' => TRUE,
'chungbuk' => TRUE,
'chungnam' => TRUE,
'jeonbuk' => TRUE,
'jeonnam' => TRUE,
'gyeongbuk' => TRUE,
'gyeongnam' => TRUE,
'jeju' => TRUE,
),
// ccTLD: Japan
// NIC : http://jprs.co.jp/en/
// Whois: http://whois.jprs.jp/en/
'jp' => array(
// Guide to JP Domain Name
// http://jprs.co.jp/en/jpdomain.html
// Organizational
'ac' => TRUE,
'ad' => TRUE,
'co' => TRUE,
'go' => TRUE,
'gr' => TRUE,
'lg' => TRUE,
'ne' => TRUE,
'or' => TRUE,
// Geographic
//
// Examples for 3rd level domains
//'kumamoto' => array(
// // http://www.pref.kumamoto.jp/link/list.asp#4
// 'amakusa' => TRUE,
// 'hitoyoshi' => TRUE,
// 'jonan' => TRUE,
// 'kumamoto' => TRUE,
// ...
//),
'aichi' => TRUE,
'akita' => TRUE,
'aomori' => TRUE,
'chiba' => TRUE,
'ehime' => TRUE,
'fukui' => TRUE,
'fukuoka' => TRUE,
'fukushima' => TRUE,
'gifu' => TRUE,
'gunma' => TRUE,
'hiroshima' => TRUE,
'hokkaido' => TRUE,
'hyogo' => TRUE,
'ibaraki' => TRUE,
'ishikawa' => TRUE,
'iwate' => TRUE,
'kagawa' => TRUE,
'kagoshima' => TRUE,
'kanagawa' => TRUE,
'kawasaki' => TRUE,
'kitakyushu'=> TRUE,
'kobe' => TRUE,
'kochi' => TRUE,
'kumamoto' => TRUE,
'kyoto' => TRUE,
'mie' => TRUE,
'miyagi' => TRUE,
'miyazaki' => TRUE,
'nagano' => TRUE,
'nagasaki' => TRUE,
'nagoya' => TRUE,
'nara' => TRUE,
'niigata' => TRUE,
'oita' => TRUE,
'okayama' => TRUE,
'okinawa' => TRUE,
'osaka' => TRUE,
'saga' => TRUE,
'saitama' => TRUE,
'sapporo' => TRUE,
'sendai' => TRUE,
'shiga' => TRUE,
'shimane' => TRUE,
'shizuoka' => TRUE,
'tochigi' => TRUE,
'tokushima' => TRUE,
'tokyo' => TRUE,
'tottori' => TRUE,
'toyama' => TRUE,
'wakayama' => TRUE,
'yamagata' => TRUE,
'yamaguchi' => TRUE,
'yamanashi' => TRUE,
'yokohama' => TRUE,
),
// ccTLD: Mexico
// NIC : http://www.nic.mx/
// Whois: http://www.nic.mx/es/Busqueda.Who_Is
'mx' => array(
// Politicas Generales de Nombres de Dominio
// http://www.nic.mx/es/Politicas?CATEGORY=INDICE
'com' => TRUE,
'edu' => TRUE,
'gob' => TRUE,
'net' => TRUE,
'org' => TRUE,
),
// ccTLD: Taiwan
// NIC : http://www.twnic.net.tw/
// Whois: http://www.twnic.net.tw/
'tw' => array(
// Guidelines for Administration of Domain Name Registration
// http://www.twnic.net.tw/english/dn/dn_02.htm
// II. Types of TWNIC Domain Names and Application Requirements
// http://www.twnic.net.tw/english/dn/dn_02_b.htm
'club' => TRUE,
'com' => TRUE,
'ebiz' => TRUE,
'edu' => TRUE,
'game' => TRUE,
'gov' => TRUE,
'idv' => TRUE,
'mil' => TRUE,
'net' => TRUE,
'org' => TRUE,
// Reserved words for the 2nd level
// http://mydn.twnic.net.tw/en/dn02/INDEX.htm
),
// ccTLD: Ukraine
// NIC : http://www.nic.net.ua/
// Whois: http://whois.com.ua/
'ua' => array(
// policy for alternative 2nd level domain names (a2ld)
// http://www.nic.net.ua/doc/a2ld
// http://whois.com.ua/
'cherkassy' => TRUE,
'chernigov' => TRUE,
'chernovtsy' => TRUE,
'ck' => TRUE,
'cn' => TRUE,
'com' => TRUE,
'crimea' => TRUE,
'cv' => TRUE,
'dn' => TRUE,
'dnepropetrovsk' => TRUE,
'donetsk' => TRUE,
'dp' => TRUE,
'edu' => TRUE,
'gov' => TRUE,
'if' => TRUE,
'ivano-frankivsk' => TRUE,
'kh' => TRUE,
'kharkov' => TRUE,
'kherson' => TRUE,
'kiev' => TRUE,
'kirovograd' => TRUE,
'km' => TRUE,
'kr' => TRUE,
'ks' => TRUE,
'lg' => TRUE,
'lugansk' => TRUE,
'lutsk' => TRUE,
'lviv' => TRUE,
'mk' => TRUE,
'net' => TRUE,
'nikolaev' => TRUE,
'od' => TRUE,
'odessa' => TRUE,
'org' => TRUE,
'pl' => TRUE,
'poltava' => TRUE,
'rovno' => TRUE,
'rv' => TRUE,
'sebastopol' => TRUE,
'sumy' => TRUE,
'te' => TRUE,
'ternopil' => TRUE,
'uz' => TRUE,
'uzhgorod' => TRUE,
'vinnica' => TRUE,
'vn' => TRUE,
'zaporizhzhe' => TRUE,
'zhitomir' => TRUE,
'zp' => TRUE,
'zt' => TRUE,
),
// ccTLD: United Kingdom
// NIC : http://www.nic.uk/
'uk' => array(
// Second Level Domains
// http://www.nic.uk/registrants/aboutdomainnames/sld/
'co' => TRUE,
'ltd' => TRUE,
'me' => TRUE,
'net' => TRUE,
'nic' => TRUE,
'org' => TRUE,
'plc' => TRUE,
'sch' => TRUE,
// Delegated Second Level Domains
// http://www.nic.uk/registrants/aboutdomainnames/sld/delegated/
'ac' => TRUE,
'gov' => TRUE,
'mil' => TRUE,
'mod' => TRUE,
'nhs' => TRUE,
'police' => TRUE,
),
// ccTLD: United States of America
// NIC : http://nic.us/
// Whois: http://whois.us/
'us' => array(
// See RFC1480
// Organizational
'dni',
'fed',
'isa',
'kids',
'nsn',
// Geographical
// United States Postal Service: State abbreviations (for postal codes)
// http://www.usps.com/ncsc/lookups/abbreviations.html
'ak' => TRUE, // Alaska
'al' => TRUE, // Alabama
'ar' => TRUE, // Arkansas
'as' => TRUE, // American samoa
'az' => TRUE, // Arizona
'ca' => TRUE, // California
'co' => TRUE, // Colorado
'ct' => TRUE, // Connecticut
'dc' => TRUE, // District of Columbia
'de' => TRUE, // Delaware
'fl' => TRUE, // Florida
'fm' => TRUE, // Federated states of Micronesia
'ga' => TRUE, // Georgia
'gu' => TRUE, // Guam
'hi' => TRUE, // Hawaii
'ia' => TRUE, // Iowa
'id' => TRUE, // Idaho
'il' => TRUE, // Illinois
'in' => TRUE, // Indiana
'ks' => TRUE, // Kansas
'ky' => TRUE, // Kentucky
'la' => TRUE, // Louisiana
'ma' => TRUE, // Massachusetts
'md' => TRUE, // Maryland
'me' => TRUE, // Maine
'mh' => TRUE, // Marshall Islands
'mi' => TRUE, // Michigan
'mn' => TRUE, // Minnesota
'mo' => TRUE, // Missouri
'mp' => TRUE, // Northern mariana islands
'ms' => TRUE, // Mississippi
'mt' => TRUE, // Montana
'nc' => TRUE, // North Carolina
'nd' => TRUE, // North Dakota
'ne' => TRUE, // Nebraska
'nh' => TRUE, // New Hampshire
'nj' => TRUE, // New Jersey
'nm' => TRUE, // New Mexico
'nv' => TRUE, // Nevada
'ny' => TRUE, // New York
'oh' => TRUE, // Ohio
'ok' => TRUE, // Oklahoma
'or' => TRUE, // Oregon
'pa' => TRUE, // Pennsylvania
'pr' => TRUE, // Puerto Rico
'pw' => TRUE, // Palau
'ri' => TRUE, // Rhode Island
'sc' => TRUE, // South Carolina
'sd' => TRUE, // South Dakota
'tn' => TRUE, // Tennessee
'tx' => TRUE, // Texas
'ut' => TRUE, // Utah
'va' => TRUE, // Virginia
'vi' => TRUE, // Virgin Islands
'vt' => TRUE, // Vermont
'wa' => TRUE, // Washington
'wi' => TRUE, // Wisconsin
'wv' => TRUE, // West Virginia
'wy' => TRUE, // Wyoming
),
);
if (! is_string($fqdn)) return '';
$result = array();
$dcursor = & $domain;
$array = array_reverse(explode('.', $fqdn));
$i = 0;
while(TRUE) {
$acursor = $array[$i];
if (is_array($dcursor) && isset($dcursor[$acursor])) {
$result[] = & $array[$i];
$dcursor = & $dcursor[$acursor];
} else {
if (! $parent && isset($acursor)) {
$result[] = & $array[$i]; // Whois servers must know this subdomain
}
break;
}
++$i;
}
// Implicit responsibility: Top-Level-Domains must not be yours
// 'bar.foo.something' => 'foo.something'
if ($implicit && count($result) == 1 && count($array) > 1) {
$result[] = & $array[1];
}
return $result ? implode('.', array_reverse($result)) : '';
}
// ---------------------
// Exit
// Freeing memories
function spam_dispose()
{
get_blocklist(NULL);
}
// Common bahavior for blocking
// NOTE: Call this function from various blocking feature, to disgueise the reason 'why blocked'
function spam_exit($mode = '', $data = array())
{
$exit = TRUE;
switch ($mode) {
case '':
echo("\n");
break;
case 'dump':
echo('' . "\n");
echo htmlspecialchars(var_export($data, TRUE));
echo('
' . "\n");
break;
};
if ($exit) exit; // Force exit
}
// ---------------------
// Simple filtering
// TODO: Record them
// Simple/fast spam filter ($target: 'a string' or an array())
function pkwk_spamfilter($action, $page, $target = array('title' => ''), $method = array(), $exitmode = '')
{
$progress = check_uri_spam($target, $method);
if (empty($progress['is_spam'])) {
spam_dispose();
} else {
// TODO: detect encoding from $target for mbstring functions
// $tmp = array();
// foreach(array_keys($target) as $key) {
// $tmp[strings($key, 0, FALSE, TRUE)] = strings($target[$key], 0, FALSE, TRUE); // Removing "\0" etc
// }
// $target = & $tmp;
pkwk_spamnotify($action, $page, $target, $progress, $method);
spam_exit($exitmode, $progress);
}
}
// ---------------------
// PukiWiki original
// Mail to administrator(s)
function pkwk_spamnotify($action, $page, $target = array('title' => ''), $progress = array(), $method = array())
{
global $notify, $notify_subject;
if (! $notify) return;
$asap = isset($method['asap']);
$summary['ACTION'] = 'Blocked by: ' . summarize_spam_progress($progress, TRUE);
if (! $asap) {
$summary['METRICS'] = summarize_spam_progress($progress);
}
$tmp = summarize_detail_badhost($progress);
if ($tmp != '') $summary['DETAIL_BADHOST'] = $tmp;
$tmp = summarize_detail_newtral($progress);
if (! $asap && $tmp != '') $summary['DETAIL_NEUTRAL_HOST'] = $tmp;
$summary['COMMENT'] = $action;
$summary['PAGE'] = '[blocked] ' . (is_pagename($page) ? $page : '');
$summary['URI'] = get_script_uri() . '?' . rawurlencode($page);
$summary['USER_AGENT'] = TRUE;
$summary['REMOTE_ADDR'] = TRUE;
pkwk_mail_notify($notify_subject, var_export($target, TRUE), $summary, TRUE);
}
?>