<?php /** * Zend Framework * * LICENSE * * This source file is subject to the new BSD license that is bundled * with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://framework.zend.com/license/new-bsd * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. * * @category Zend * @package Zend_Service * @subpackage Akismet * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License * @version $Id$ */ /** * @see Zend_Version */ require_once 'Zend/Version.php'; /** * @see Zend_Service_Abstract */ require_once 'Zend/Service/Abstract.php'; /** * Akismet REST service implementation * * @uses Zend_Service_Abstract * @category Zend * @package Zend_Service * @subpackage Akismet * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Service_Akismet extends Zend_Service_Abstract { /** * Akismet API key * @var string */ protected $_apiKey; /** * Blog URL * @var string */ protected $_blogUrl; /** * Charset used for encoding * @var string */ protected $_charset = 'UTF-8'; /** * TCP/IP port to use in requests * @var int */ protected $_port = 80; /** * User Agent string to send in requests * @var string */ protected $_userAgent; /** * Constructor * * @param string $apiKey Akismet API key * @param string $blog Blog URL * @return void */ public function __construct($apiKey, $blog) { $this->setBlogUrl($blog) ->setApiKey($apiKey) ->setUserAgent('Zend Framework/' . Zend_Version::VERSION . ' | Akismet/1.11'); } /** * Retrieve blog URL * * @return string */ public function getBlogUrl() { return $this->_blogUrl; } /** * Set blog URL * * @param string $blogUrl * @return Zend_Service_Akismet * @throws Zend_Service_Exception if invalid URL provided */ public function setBlogUrl($blogUrl) { require_once 'Zend/Uri.php'; if (!Zend_Uri::check($blogUrl)) { require_once 'Zend/Service/Exception.php'; throw new Zend_Service_Exception('Invalid url provided for blog'); } $this->_blogUrl = $blogUrl; return $this; } /** * Retrieve API key * * @return string */ public function getApiKey() { return $this->_apiKey; } /** * Set API key * * @param string $apiKey * @return Zend_Service_Akismet */ public function setApiKey($apiKey) { $this->_apiKey = $apiKey; return $this; } /** * Retrieve charset * * @return string */ public function getCharset() { return $this->_charset; } /** * Set charset * * @param string $charset * @return Zend_Service_Akismet */ public function setCharset($charset) { $this->_charset = $charset; return $this; } /** * Retrieve TCP/IP port * * @return int */ public function getPort() { return $this->_port; } /** * Set TCP/IP port * * @param int $port * @return Zend_Service_Akismet * @throws Zend_Service_Exception if non-integer value provided */ public function setPort($port) { if (!is_int($port)) { require_once 'Zend/Service/Exception.php'; throw new Zend_Service_Exception('Invalid port'); } $this->_port = $port; return $this; } /** * Retrieve User Agent string * * @return string */ public function getUserAgent() { return $this->_userAgent; } /** * Set User Agent * * Should be of form "Some user agent/version | Akismet/version" * * @param string $userAgent * @return Zend_Service_Akismet * @throws Zend_Service_Exception with invalid user agent string */ public function setUserAgent($userAgent) { if (!is_string($userAgent) || !preg_match(":^[^\n/]*/[^ ]* \| Akismet/[0-9\.]*$:i", $userAgent)) { require_once 'Zend/Service/Exception.php'; throw new Zend_Service_Exception('Invalid User Agent string; must be of format "Application name/version | Akismet/version"'); } $this->_userAgent = $userAgent; return $this; } /** * Post a request * * @param string $host * @param string $path * @param array $params * @return mixed */ protected function _post($host, $path, array $params) { $uri = 'http://' . $host . ':' . $this->getPort() . $path; $client = self::getHttpClient(); $client->setUri($uri); $client->setConfig(array( 'useragent' => $this->getUserAgent(), )); $client->setHeaders(array( 'Host' => $host, 'Content-Type' => 'application/x-www-form-urlencoded; charset=' . $this->getCharset() )); $client->setParameterPost($params); $client->setMethod(Zend_Http_Client::POST); return $client->request(); } /** * Verify an API key * * @param string $key Optional; API key to verify * @param string $blog Optional; blog URL against which to verify key * @return boolean */ public function verifyKey($key = null, $blog = null) { if (null === $key) { $key = $this->getApiKey(); } if (null === $blog) { $blog = $this->getBlogUrl(); } $response = $this->_post('rest.akismet.com', '/1.1/verify-key', array( 'key' => $key, 'blog' => $blog )); return ('valid' == $response->getBody()); } /** * Perform an API call * * @param string $path * @param array $params * @return Zend_Http_Response * @throws Zend_Service_Exception if missing user_ip or user_agent fields */ protected function _makeApiCall($path, $params) { if (empty($params['user_ip']) || empty($params['user_agent'])) { require_once 'Zend/Service/Exception.php'; throw new Zend_Service_Exception('Missing required Akismet fields (user_ip and user_agent are required)'); } if (!isset($params['blog'])) { $params['blog'] = $this->getBlogUrl(); } return $this->_post($this->getApiKey() . '.rest.akismet.com', $path, $params); } /** * Check a comment for spam * * Checks a comment to see if it is spam. $params should be an associative * array with one or more of the following keys (unless noted, all keys are * optional): * - blog: URL of the blog. If not provided, uses value returned by {@link getBlogUrl()} * - user_ip (required): IP address of comment submitter * - user_agent (required): User Agent used by comment submitter * - referrer: contents of HTTP_REFERER header * - permalink: location of the entry to which the comment was submitted * - comment_type: typically, one of 'blank', 'comment', 'trackback', or 'pingback', but may be any value * - comment_author: name submitted with the content * - comment_author_email: email submitted with the content * - comment_author_url: URL submitted with the content * - comment_content: actual content * * Additionally, Akismet suggests returning the key/value pairs in the * $_SERVER array, and these may be included in the $params. * * This method implements the Akismet comment-check REST method. * * @param array $params * @return boolean * @throws Zend_Service_Exception with invalid API key */ public function isSpam($params) { $response = $this->_makeApiCall('/1.1/comment-check', $params); $return = trim($response->getBody()); if ('invalid' == $return) { require_once 'Zend/Service/Exception.php'; throw new Zend_Service_Exception('Invalid API key'); } if ('true' == $return) { return true; } return false; } /** * Submit spam * * Takes the same arguments as {@link isSpam()}. * * Submits known spam content to Akismet to help train it. * * This method implements Akismet's submit-spam REST method. * * @param array $params * @return void * @throws Zend_Service_Exception with invalid API key */ public function submitSpam($params) { $response = $this->_makeApiCall('/1.1/submit-spam', $params); $value = trim($response->getBody()); if ('invalid' == $value) { require_once 'Zend/Service/Exception.php'; throw new Zend_Service_Exception('Invalid API key'); } } /** * Submit ham * * Takes the same arguments as {@link isSpam()}. * * Submits a comment that has been falsely categorized as spam by Akismet * as a false positive, telling Akismet's filters not to filter such * comments as spam in the future. * * Unlike {@link submitSpam()} and {@link isSpam()}, a valid API key is * never necessary; as a result, this method never throws an exception * (unless an exception happens with the HTTP client layer). * * this method implements Akismet's submit-ham REST method. * * @param array $params * @return void */ public function submitHam($params) { $response = $this->_makeApiCall('/1.1/submit-ham', $params); } }