Seditio Source
Root |
./othercms/dotclear-2.22/plugins/antispam/filters/class.dc.filter.iplookup.php
<?php
/**
 * @brief antispam, a plugin for Dotclear 2
 *
 * @package Dotclear
 * @subpackage Plugins
 *
 * @copyright Olivier Meunier & Association Dotclear
 * @copyright GPL-2.0-only
 */
if (!defined('DC_RC_PATH')) {
    return;
}

class
dcFilterIpLookup extends dcSpamFilter
{
    public
$name    = 'IP Lookup';
    public
$has_gui = true;
    public
$help    = 'iplookup-filter';

    private
$default_bls = 'sbl-xbl.spamhaus.org , bsb.spamlookup.net';

    public function
__construct($core)
    {
       
parent::__construct($core);

        if (
defined('DC_DNSBL_SUPER') && DC_DNSBL_SUPER && !$core->auth->isSuperAdmin()) {
           
$this->has_gui = false;
        }
    }

    protected function
setInfo()
    {
       
$this->description = __('Checks sender IP address against DNSBL servers');
    }

    public function
getStatusMessage($status, $comment_id)
    {
        return
sprintf(__('Filtered by %1$s with server %2$s.'), $this->guiLink(), $status);
    }

    public function
isSpam($type, $author, $email, $site, $ip, $content, $post_id, &$status)
    {
        if (!
$ip) {
           
// No IP given
           
return;
        }

        if (!
filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE) && !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE)) {
           
// Not an IPv4 IP (excludind private range) not an IPv6 IP (excludind private range)
           
return;
        }

       
$bls = $this->getServers();
       
$bls = preg_split('/\s*,\s*/', $bls);

        foreach (
$bls as $bl) {
            if (
$this->dnsblLookup($ip, $bl)) {
               
// Pass by reference $status to contain matching DNSBL
               
$status = $bl;

                return
true;
            }
        }
    }

    public function
gui($url)
    {
        global
$core;

       
$bls = $this->getServers();

        if (isset(
$_POST['bls'])) {
            try {
               
$this->core->blog->settings->addNamespace('antispam');
               
$this->core->blog->settings->antispam->put('antispam_dnsbls', $_POST['bls'], 'string', 'Antispam DNSBL servers', true, false);
               
dcPage::addSuccessNotice(__('The list of DNSBL servers has been succesfully updated.'));
               
http::redirect($url);
            } catch (
Exception $e) {
               
$core->error->add($e->getMessage());
            }
        }

       
/* DISPLAY
        ---------------------------------------------- */
       
$res = '<form action="' . html::escapeURL($url) . '" method="post" class="fieldset">' .
       
'<h3>' . __('IP Lookup servers') . '</h3>' .
       
'<p><label for="bls">' . __('Add here a coma separated list of servers.') . '</label>' .
       
form::textarea('bls', 40, 3, html::escapeHTML($bls), 'maximal') .
       
'</p>' .
       
'<p><input type="submit" value="' . __('Save') . '" />' .
       
$this->core->formNonce() . '</p>' .
           
'</form>';

        return
$res;
    }

    private function
getServers()
    {
       
$bls = $this->core->blog->settings->antispam->antispam_dnsbls;
        if (
$bls === null) {
           
$this->core->blog->settings->addNamespace('antispam');
           
$this->core->blog->settings->antispam->put('antispam_dnsbls', $this->default_bls, 'string', 'Antispam DNSBL servers', true, false);

            return
$this->default_bls;
        }

        return
$bls;
    }

    private function
dnsblLookup($ip, $bl)
    {
       
$revIp = implode('.', array_reverse(explode('.', $ip)));

       
$host = $revIp . '.' . $bl . '.';
        if (
gethostbyname($host) != $host) {
            return
true;
        }

        return
false;
    }
}