| Current Path : /home/magalijoj/www/blog/plugins/akismet/ |
| Current File : /home/magalijoj/www/blog/plugins/akismet/class.dc.filter.akismet.php |
<?php
# ***** BEGIN LICENSE BLOCK *****
# This is Antispam, a plugin for DotClear.
# Copyright (c) 2007 Olivier Meunier and contributors. All rights
# reserved.
#
# DotClear is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# DotClear is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with DotClear; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# ***** END LICENSE BLOCK *****
class dcFilterAkismet extends dcSpamFilter
{
public $name = 'Akismet';
public $has_gui = true;
public $active = false;
public function __construct(&$core)
{
parent::__construct($core);
if (defined('DC_AKISMET_SUPER') && DC_AKISMET_SUPER && !$core->auth->isSuperAdmin()) {
$this->has_gui = false;
}
}
protected function setInfo()
{
$this->description = __('Akismet spam filter');
}
public function getStatusMessage($status,$comment_id)
{
return sprintf(__('Filtered by %s.'),$this->guiLink());
}
private function akInit()
{
$blog =& $this->core->blog;
if (!$blog->settings->ak_key) {
return false;
}
return new akismet($blog->url,$blog->settings->ak_key);
}
public function isSpam($type,$author,$email,$site,$ip,$content,$post_id,&$status)
{
if (($ak = $this->akInit()) === false) {
return;
}
$blog =& $this->core->blog;
try
{
if ($ak->verify())
{
$post = $blog->getPosts(array('post_id' => $post_id));
$c = $ak->comment_check(
$post->getURL(),
$type,
$author,
$email,
$site,
$content
);
if ($c) {
$status = 'Filtered by Akismet';
return true;
}
}
} catch (Exception $e) {} # If http or akismet is dead, we don't need to know it
}
public function trainFilter($status,$filter,$type,$author,$email,$site,$ip,$content,$rs)
{
# We handle only false positive from akismet
if ($status == 'spam' && $filter != 'dcFilterAkismet')
{
return;
}
$f = $status == 'spam' ? 'submit_spam' : 'submit_ham';
if (($ak = $this->akInit()) === false) {
return;
}
try
{
if ($ak->verify()) {
$ak->{$f}($rs->getPostURL(),$type,$author,$email,$site,$content);
}
} catch (Exception $e) {} # If http or akismet is dead, we don't need to know it
}
public function gui($url)
{
$blog =& $this->core->blog;
$ak_key = $blog->settings->ak_key;
$ak_verified = null;
if (isset($_POST['ak_key']))
{
try
{
$ak_key = $_POST['ak_key'];
$blog->settings->setNameSpace('akismet');
$blog->settings->put('ak_key',$ak_key,'string');
http::redirect($url.'&up=1');
}
catch (Exception $e)
{
$this->core->error->add($e->getMessage());
}
}
if ($blog->settings->ak_key)
{
try {
$ak = new akismet($blog->url,$blog->settings->ak_key);
$ak_verified = $ak->verify();
} catch (Exception $e) {
$this->core->error->add($e->getMessage());
}
}
$res =
'<form action="'.html::escapeURL($url).'" method="post">'.
'<p><label class="classic">'.__('Akismet API key:').' '.
form::field('ak_key',12,128,$ak_key).'</label>';
if ($ak_verified !== null) {
if ($ak_verified) {
$res .= ' <img src="images/check-on.png" alt="" /> '.__('API key verified');
} else {
$res .= ' <img src="images/check-off.png" alt="" /> '.__('API key not verified');
}
}
$res .= '</p>';
$res .=
'<p><a href="http://wordpress.com/api-keys/">'.__('Get your own API key').'</a></p>'.
'<p><input type="submit" value="'.__('save').'" />'.
$this->core->formNonce().'</p>'.
'</form>';
return $res;
}
}
class akismet extends netHttp
{
protected $base_host = 'rest.akismet.com';
protected $ak_host = '';
protected $ak_version = '1.1';
protected $ak_path = '/%s/%s';
protected $ak_key = null;
protected $blog_url;
protected $timeout = 3;
public function __construct($blog_url,$api_key)
{
$this->blog_url = $blog_url;
$this->ak_key = $api_key;
$this->ak_path = sprintf($this->ak_path,$this->ak_version,'%s');
$this->ak_host = $this->ak_key.'.'.$this->base_host;
parent::__construct($this->ak_host,80);
}
public function verify()
{
$this->host = $this->base_host;
$path = sprintf($this->ak_path,'verify-key');
$data = array(
'key' => $this->ak_key,
'blog' => $this->blog_url
);
if ($this->post($path,$data,'UTF-8'))
{
return $this->getContent() == 'valid';
}
return false;
}
public function comment_check($permalink,$type,$author,$email,$url,$content)
{
$info_ignore = array('HTTP_COOKIE');
$info = array();
foreach ($_SERVER as $k => $v) {
if (strpos($k,'HTTP_') === 0 && !in_array($k,$info_ignore)) {
$info[$k] = $v;
}
}
return $this->callFunc('comment-check',$permalink,$type,$author,$email,$url,$content,$info);
}
public function submit_spam($permalink,$type,$author,$email,$url,$content)
{
$this->callFunc('submit-spam',$permalink,$type,$author,$email,$url,$content);
return true;
}
public function submit_ham($permalink,$type,$author,$email,$url,$content)
{
$this->callFunc('submit-ham',$permalink,$type,$author,$email,$url,$content);
return true;
}
protected function callFunc($function,$permalink,$type,$author,$email,$url,$content,$info=array())
{
$ua = isset($info['HTTP_USER_AGENT']) ? $info['HTTP_USER_AGENT'] : '';
$referer = isset($info['HTTP_REFERER']) ? $info['HTTP_REFERER'] : '';
# Prepare comment data
$data = array(
'blog' => $this->blog_url,
'user_ip' => http::realIP(),
'user_agent' => $ua,
'referrer' => $referer,
'permalink' => $permalink,
'comment_type' => $type,
'comment_author' => $author,
'comment_author_email' => $email,
'comment_author_url' => $url,
'comment_content' => $content
);
$data = array_merge($data,$info);
$this->host = $this->ak_host;
$path = sprintf($this->ak_path,$function);
if (!$this->post($path,$data,'UTF-8')) {
throw new Exception('HTTP error: '.$this->getError());
}
return $this->getContent() == 'true';
}
}
?>