PEAR2_Services_LinkbackPEAR2_Services_Linkback-0.2.1/src/PEAR2/Services/Linkback/Server/Callback/Akismet.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?php
/**
 * This file is part of the PEAR2\Services\Linkback package.
 *
 * PHP version 5
 *
 * @category Services
 * @package  PEAR2\Services\Linkback
 * @author   Christian Weiske <cweiske@php.net>
 * @license  http://www.opensource.org/licenses/lgpl-license.php LGPL
 * @link     http://pear2.php.net/package/Services_Linkback
 */
namespace PEAR2\Services\Linkback\Server\Callback;
use PEAR2\Services\Linkback as SPb;

/**
 * Akismet anti spam callback for the linkback server.
 * Submits linkbacks to Akismet to determine if it is spam or not.
 *
 * @category Services
 * @package  PEAR2\Services\Linkback
 * @author   Christian Weiske <cweiske@php.net>
 * @license  http://www.opensource.org/licenses/lgpl-license.php LGPL
 * @link     http://pear2.php.net/package/Services_Linkback
 */
class Akismet implements ILink
{
    /**
     *  URI of the blog that the linkback server is running on.
     *
     * @var string
     */
    protected $blogUri;

    /**
     * Akismet API key.
     *
     * @var string
     */
    protected $apiKey;

    /**
     * Set variables.
     *
     * @param string $blogUri URI of the blog that the linkback server is running on
     * @param string $apiKey  Akismet API key
     */
    public function __construct($blogUri, $apiKey)
    {
        $this->blogUri = $blogUri;
        $this->apiKey  = $apiKey;
    }

    /**
     * Do a spam check against Akismet.
     *
     * The Akismet support said:
     *
     *   The target URI does indeed go into "permalink".
     *   The source should go in "comment_author_URL".
     *   You should also have the remote IP address for user_ip, and the
     *   remote user agent, for comment_agent.
     *   WordPress also populates the comment_author and comment_content
     *   parameters with the source page title and excerpt, which it
     *   fetches when a pingback is received.
     *
     * @param string $target     Target URI that should be linked in $source
     * @param string $source     Linkback source URI that should link to target
     * @param string $sourceBody Content of $source URI
     * @param object $res        HTTP response from fetching $source
     *
     * @return boolean True if the linkback is no spam.
     *
     * @throws SPb\Exception When the linkback is spam.
     *                       An exception is thrown so that other link callbacks
     *                       are overriden.
     */
    public function verifyLinkExists(
        $target, $source, $sourceBody, \HTTP_Request2_Response $res
    ) {
        $comment = new Services_Akismet2_Comment(
            array(
                'type'               => 'pingback',
                'permalink'          => $target,
                'comment_author_url' => $source
                //FIXME: fill comment_content and comment_author
                // by fetching remote content
            )
        );

        $akismet = new Services_Akismet2($this->blogUrl, $this->apiKey);
        if (!$akismet->isSpam($comment)) {
            return true;
        }

        throw new SPb\Exception('The pingback is probably spam', States::SPAM);
    }
}

?>
EOF