Seditio Source
Root |
./othercms/dotclear-2.22/plugins/fairTrackbacks/class.dc.filter.fairtrackbacks.php
<?php
/**
 * @brief fairTrackbacks, an antispam filter 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
dcFilterFairTrackbacks extends dcSpamFilter
{
    public
$name    = 'Fair Trackbacks';
    public
$has_gui = false;
    public
$active  = true;
    public
$order   = -10;

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

    protected function
setInfo()
    {
       
$this->description = __('Checks trackback source for a link to the post');
    }

    public function
isSpam($type, $author, $email, $site, $ip, $content, $post_id, &$status)
    {
        if (
$type != 'trackback') {
            return;
        }

        try {
           
$default_parse = ['scheme' => '', 'host' => '', 'path' => '', 'query' => ''];
           
$S             = array_merge($default_parse, parse_url($site));

            if ((
$S['scheme'] != 'http' && $S['scheme'] != 'https') || !$S['host'] || !$S['path']) {
                throw new
Exception('Invalid URL');
            }

           
# Check incomink link page
           
$post     = $this->core->blog->getPosts(['post_id' => $post_id]);
           
$post_url = $post->getURL();
           
$P        = array_merge($default_parse, parse_url($post_url));

            if (
$post_url == $site) {
                throw new
Exception('Same source and destination');
            }

           
$o = netHttp::initClient($site, $path);
           
$o->setTimeout(DC_QUERY_TIMEOUT);
           
$o->get($path);

           
# Trackback source does not return 200 status code
           
if ($o->getStatus() != 200) {
                throw new
Exception('Invalid Status Code');
            }

           
$tb_page = $o->getContent();

           
# Do we find a link to post in trackback source?
           
if ($S['host'] == $P['host']) {
               
$pattern = $P['path'] . ($P['query'] ? '?' . $P['query'] : '');
            } else {
               
$pattern = $post_url;
            }
           
$pattern = preg_quote($pattern, '/');

            if (!
preg_match('/' . $pattern . '/', $tb_page)) {
                throw new
Exception('Unfair');
            }
        } catch (
Exception $e) {
            throw new
Exception('Trackback not allowed for this URL.');
        }
    }
}