Ejemplo n.º 1
0
function check_uri_spam($target = '', $method = array())
{
    // Return value
    $progress = array('method' => array(), 'sum' => array(), 'is_spam' => array(), 'blocked' => array(), 'hosts' => array());
    // 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 (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_leaves($blocked, $_progress['blocked'], FALSE, FALSE);
            $hosts = array_merge_leaves($hosts, $_progress['hosts'], FALSE, FALSE);
        }
        // Unique values
        $blocked = array_unique_recursive($blocked);
        $hosts = array_unique_recursive($hosts);
        // Renumber numeric keys
        array_renumber_numeric_keys($blocked);
        array_renumber_numeric_keys($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;
}
Ejemplo n.º 2
0
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'
        if (empty($resp)) {
            // One or more test, or do nothing here
            $resp = strval($value);
            $rest = '';
        } else {
            $rest = rtrim(substr($value, 0, -strlen($resp)), '.');
            // 'A.foo.bar'
        }
        $trie = array_merge_leaves($trie, array($resp => array($rest => NULL)), FALSE);
    }
    // Format: var_export_shrink() -like output
    $result = array();
    ksort_by_domain($trie);
    foreach (array_keys($trie) as $key) {
        ksort_by_domain($trie[$key]);
        if (count($trie[$key]) == 1 && key($trie[$key]) == '') {
            // Just one 'responsibility.example.com'
            $result[] = '  \'' . $key . '\',';
        } else {
            // One subdomain-or-host, or several ones
            $subs = array();
            foreach (array_keys($trie[$key]) as $sub) {
                if ($sub == '') {
                    $subs[] = $key;
                } else {
                    $subs[] = $sub . '.' . $key;
                }
            }
            $result[] = '  \'' . $key . '\' => \'' . implode(', ', $subs) . '\',';
        }
        unset($trie[$key]);
    }
    return 'array (' . "\n" . implode("\n", $result) . "\n" . ')';
}