Please make sure IN_MYBB is defined.");
}
// Neat trick for caching our custom template(s)
// Basically, when we include this from class_plugins.php we can do stuff in init.php, which is before we cache our templates
// So we won't need an extra call to cache it.
if(my_strpos($_SERVER['PHP_SELF'], 'showthread.php'))
{
global $templatelist;
if(isset($templatelist))
{
$templatelist .= ',';
}
$templatelist .= 'akismet_postbit_spam';
}
$plugins->add_hook("datahandler_post_insert_thread", "akismet_verify");
$plugins->add_hook("datahandler_post_insert_thread_post", "akismet_verify");
$plugins->add_hook("datahandler_post_insert_post", "akismet_verify");
$plugins->add_hook("datahandler_post_validate_post", "akismet_fake_draft");
$plugins->add_hook("datahandler_post_validate_thread", "akismet_fake_draft");
$plugins->add_hook("newreply_do_newreply_end", "akismet_redirect_thread");
$plugins->add_hook("newthread_do_newthread_end", "akismet_redirect_forum");
$plugins->add_hook("moderation_start", "akismet_moderation_start");
$plugins->add_hook("postbit", "akismet_postbit");
$plugins->add_hook("admin_forum_menu", "akismet_admin_nav");
$plugins->add_hook("admin_forum_permissions", "akismet_admin_permissions");
$plugins->add_hook("admin_load", "akismet_admin");
$plugins->add_hook("admin_forum_action_handler", "akismet_action_handler");
$plugins->add_hook("admin_config_plugins_activate_commit", "akismet_key");
function akismet_info()
{
global $lang;
$lang->load("forum_akismet", false, true);
return array(
"name" => $lang->akismet,
"description" => $lang->akismet_desc,
"website" => "http://mybb.com",
"author" => "MyBB Group",
"authorsite" => "http://mybb.com",
"version" => "1.2.2",
"guid" => "e57a80dbe7ff85083596a1a3b7da3ce7",
"compatibility" => "16*",
);
}
/**
* ADDITIONAL PLUGIN INSTALL/UNINSTALL ROUTINES
*
* _install():
* Called whenever a plugin is installed by clicking the "Install" button in the plugin manager.
* If no install routine exists, the install button is not shown and it assumed any work will be
* performed in the _activate() routine.
*
* function hello_install()
* {
* }
*
* _is_installed():
* Called on the plugin management page to establish if a plugin is already installed or not.
* This should return TRUE if the plugin is installed (by checking tables, fields etc) or FALSE
* if the plugin is not installed.
*
* function hello_is_installed()
* {
* global $db;
* if($db->table_exists("hello_world"))
* {
* return true;
* }
* return false;
* }
*
* _uninstall():
* Called whenever a plugin is to be uninstalled. This should remove ALL traces of the plugin
* from the installation (tables etc). If it does not exist, uninstall button is not shown.
*
* function hello_uninstall()
* {
* }
*
* _activate():
* Called whenever a plugin is activated via the Admin CP. This should essentially make a plugin
* "visible" by adding templates/template changes, language changes etc.
*
* function hello_activate()
* {
* }
*
* _deactivate():
* Called whenever a plugin is deactivated. This should essentially "hide" the plugin from view
* by removing templates/template changes etc. It should not, however, remove any information
* such as tables, fields etc - that should be handled by an _uninstall routine. When a plugin is
* uninstalled, this routine will also be called before _uninstall() if the plugin is active.
*
* function hello_deactivate()
* {
* }
*/
function akismet_install()
{
global $db, $mybb, $lang;
if($db->field_exists('akismetstopped', "users"))
{
$db->write_query("ALTER TABLE ".TABLE_PREFIX."users DROP akismetstopped");
}
// DELETE ALL SETTINGS TO AVOID DUPLICATES
$db->write_query("DELETE FROM ".TABLE_PREFIX."settings WHERE name IN(
'akismetswitch',
'akismetnumtillban',
'akismetfidsignore',
'akismetuidsignore',
'akismetuserstoignore'
)");
$db->delete_query("settinggroups", "name = 'akismet'");
$db->delete_query("datacache", "title = 'akismet_update_check'");
$query = $db->simple_select("settinggroups", "COUNT(*) as rows");
$rows = $db->fetch_field($query, "rows");
$insertarray = array(
'name' => 'akismet',
'title' => 'Akismet',
'description' => 'Options on how to configure and personalize Akismet',
'disporder' => $rows+1,
'isdefault' => 0
);
$group['gid'] = $db->insert_query("settinggroups", $insertarray);
$mybb->akismet_insert_gid = $group['gid'];
$insertarray = array(
'name' => 'akismetswitch',
'title' => 'Akismet Main Switch',
'description' => 'Turns on or off Akismet.',
'optionscode' => 'onoff',
'value' => 1,
'disporder' => 0,
'gid' => $group['gid']
);
$db->insert_query("settings", $insertarray);
$insertarray = array(
'name' => 'akismetapikey',
'title' => 'API Key to use for Akismet',
'description' => $db->escape_string('The API Key used to connect to Akismet. Please check here for more details: http://wordpress.com/api-keys/'),
'optionscode' => 'text',
'value' => '',
'disporder' => 1,
'gid' => $group['gid']
);
$db->insert_query("settings", $insertarray);
$insertarray = array(
'name' => 'akismetnumtillban',
'title' => 'Spam messages until ban',
'description' => 'The number of spam messages detected by Akismet until the user gets banned (set to 0 to disable).',
'optionscode' => 'text',
'value' => '3',
'disporder' => 2,
'gid' => $group['gid']
);
$db->insert_query("settings", $insertarray);
$insertarray = array(
'name' => 'akismetfidsignore',
'title' => 'Forums to Ignore',
'description' => 'Forums, separated by a comma, to ignore. Use the forum id, not the name.',
'optionscode' => 'text',
'value' => '',
'disporder' => 3,
'gid' => $group['gid']
);
$db->insert_query("settings", $insertarray);
$insertarray = array(
'name' => 'akismetuidsignore',
'title' => 'Usergroups to Ignore',
'description' => 'Usergroups, separated by a comma, to ignore. Use the usergroup id, not the name.',
'optionscode' => 'text',
'value' => '6,4,3',
'disporder' => 4,
'gid' => $group['gid']
);
$db->insert_query("settings", $insertarray);
$insertarray = array(
'name' => 'akismetuserstoignore',
'title' => 'Users to Ignore',
'description' => 'Users, separated by a comma, to ignore. Use the user id, not the name.',
'optionscode' => 'text',
'value' => '',
'disporder' => 6,
'gid' => $group['gid']
);
$db->insert_query("settings", $insertarray);
$db->write_query("ALTER TABLE ".TABLE_PREFIX."users ADD akismetstopped int NOT NULL default 0");
rebuild_settings();
}
function akismet_is_installed()
{
global $db;
if($db->field_exists('akismetstopped', "users"))
{
return true;
}
return false;
}
function akismet_activate()
{
global $db, $mybb;
include MYBB_ROOT."/inc/adminfunctions_templates.php";
find_replace_templatesets("postbit", "#".preg_quote('{$post[\'button_spam\']}')."#i", '', 0);
find_replace_templatesets("postbit_classic", "#".preg_quote('{$post[\'button_spam\']}')."#i", '', 0);
$db->delete_query("templates", "title = 'akismet_postbit_spam'");
find_replace_templatesets("postbit", "#".preg_quote('{$post[\'button_edit\']}')."#i", '{$post[\'button_spam\']}{$post[\'button_edit\']}');
find_replace_templatesets("postbit_classic", "#".preg_quote('{$post[\'button_edit\']}')."#i", '{$post[\'button_spam\']}{$post[\'button_edit\']}');
$insert_array = array(
'title' => 'akismet_postbit_spam',
'template' => $db->escape_string(''),
'sid' => '-1',
'version' => '',
'dateline' => TIME_NOW
);
$db->insert_query("templates", $insert_array);
change_admin_permission('forum', 'akismet');
}
function akismet_deactivate()
{
global $db, $mybb;
include MYBB_ROOT."/inc/adminfunctions_templates.php";
find_replace_templatesets("postbit", "#".preg_quote('{$post[\'button_spam\']}')."#i", '', 0);
find_replace_templatesets("postbit_classic", "#".preg_quote('{$post[\'button_spam\']}')."#i", '', 0);
$db->delete_query("templates", "title = 'akismet_postbit_spam'");
change_admin_permission('forum', 'akismet', -1);
}
function akismet_uninstall()
{
global $db;
if($db->field_exists('akismetstopped', "users"))
{
$db->write_query("ALTER TABLE ".TABLE_PREFIX."users DROP akismetstopped");
}
// DELETE ALL SETTINGS TO AVOID DUPLICATES
$db->write_query("DELETE FROM ".TABLE_PREFIX."settings WHERE name IN(
'akismetswitch',
'akismetapikey',
'akismetnumtillban',
'akismetfidsignore',
'akismetuidsignore',
'akismetuserstoignore'
)");
$db->delete_query("settinggroups", "name = 'akismet'");
$db->delete_query("datacache", "title = 'akismet_update_check'");
rebuild_settings();
}
function akismet_key()
{
global $installed, $mybb;
if($installed == false && $mybb->input['plugin'] == "akismet")
{
global $message;
flash_message($message, 'success');
admin_redirect("index.php?module=config-settings&action=change&gid=".intval($mybb->akismet_insert_gid)."#row_setting_akismetapikey");
}
}
function akismet_show_confirm_page()
{
global $mybb, $lang, $theme, $pid, $fid, $db, $headerinclude, $header, $footer;
$pid = intval($pid);
$fid = intval($fid);
$query = $db->simple_select("posts", "subject", "pid='{$pid}'", 1);
$post = $db->fetch_array($query);
$post['subject'] = htmlspecialchars_uni($post['subject']);
if(!$post)
{
error("Invalid Post ID.");
}
output_page("
{$mybb->settings['bbname']} - {$lang->mark_as_spam}
{$headerinclude}
{$header}
{$footer}
");
exit;
}
function akismet_moderation_start()
{
global $mybb, $db, $akismet, $lang, $cache, $fid, $pid;
if(!$mybb->settings['akismetswitch'] || $mybb->input['action'] != 'mark_as_spam')
{
return;
}
$lang->load("akismet", false, true);
if(!$mybb->input['pid'])
{
error("No Post ID specified.");
}
$pid = intval($mybb->input['pid']);
if(!$mybb->input['fid'])
{
error("No Forum ID specified.");
}
$fid = intval($mybb->input['fid']);
if(!is_moderator($fid))
{
error("No Permissions to do this action.");
}
$query = $db->query("
SELECT p.uid, p.username, u.email, u.website, u.akismetstopped, p.message, p.ipaddress, p.tid, p.replyto, p.fid, f.usepostcounts
FROM ".TABLE_PREFIX."posts p
LEFT JOIN ".TABLE_PREFIX."users u ON (u.uid=p.uid)
LEFT JOIN ".TABLE_PREFIX."forums f ON (f.fid=p.fid)
WHERE p.pid = '{$pid}'
");
$post = $db->fetch_array($query);
if(!$post)
{
error("Invalid Post ID.");
}
if(!$mybb->input['my_post_key'] || $mybb->request_method != "post")
{
akismet_show_confirm_page();
}
verify_post_check($mybb->input['my_post_key']);
$akismet_array = array(
'type' => 'post',
'username' => $post['username'],
'email' => $post['email'],
'website' => $post['website'],
'message' => $post['message'],
'user_ip' => $post['ipaddress']
);
if($post['replyto'] == 0)
{
$db->update_query("threads", array('visible' => '-4'), "tid = '{$post['tid']}'");
$db->update_query("posts", array('visible' => '-4'), "tid = '{$post['tid']}'");
$snippit = "thread";
}
else
{
$db->update_query("posts", array('visible' => '-4'), "pid = '{$pid}'");
$snippit = "post";
}
if(!$akismet)
{
$akismet = new Akismet($mybb->settings['bburl'], $mybb->settings['akismetapikey'], $akismet_array);
}
$akismet->submit_spam();
$numakismetthread = $numakismetpost = 0;
if($snippit == "thread")
{
$query = $db->query("
SELECT p.uid, u.usergroup
FROM ".TABLE_PREFIX."posts p
LEFT JOIN ".TABLE_PREFIX."users u ON (u.uid=p.uid)
WHERE p.tid = '{$post['tid']}'
");
while($post2 = $db->fetch_array($query))
{
++$numakismetpost;
if($post['usepostcounts'] != 0)
{
$db->write_query("UPDATE ".TABLE_PREFIX."users SET postnum=postnum-1 WHERE uid = '{$post2['uid']}'");
}
if($mybb->settings['akismetuidsignore'])
{
$akismet_uids_ignore = explode(',', $mybb->settings['akismetuidsignore']);
if(in_array($post2['usergroup'], $akismet_uids_ignore) || is_super_admin($post2['uid']))
{
continue;
}
}
if(is_super_admin($post2['uid']))
{
continue;
}
$db->write_query("UPDATE ".TABLE_PREFIX."users SET akismetstopped=akismetstopped+1 WHERE uid = '{$post2['uid']}'");
$query1 = $db->simple_select("users", "akismetstopped", "uid = '{$post2['uid']}'");
$akismetstopped = $db->fetch_field($query1, 'akismetstopped');
// Check if the person should be banned
if($mybb->settings['akismetnumtillban'] > 0 && $akismetstopped >= $mybb->settings['akismetnumtillban'])
{
$banned_user = array(
"uid" => $post2['uid'],
"admin" => 0,
"gid" => 7,
"oldgroup" => $post2['usergroup'],
"dateline" => TIME_NOW,
"bantime" => 'perm',
"lifted" => 'perm',
"reason" => "Automatically banned by the Akismet system for spamming.",
"oldadditionalgroups" => ''
);
$db->insert_query("banned", $banned_user);
$db->update_query("users", array('usergroup' => 7), "uid = '{$post2['uid']}'");
$cache->update_moderators();
}
}
++$numakismetthread;
}
else
{
$db->write_query("UPDATE ".TABLE_PREFIX."users SET akismetstopped=akismetstopped+1 WHERE uid = '{$post['uid']}'");
$query = $db->simple_select("users", "akismetstopped, usergroup", "uid = '{$post['uid']}'");
$akismetstopped = $db->fetch_field($query, 'akismetstopped');
$usergroup = $db->fetch_field($query, 'usergroup');
if($mybb->settings['akismetuidsignore'])
{
$akismet_uids_ignore = explode(',', $mybb->settings['akismetuidsignore']);
if(in_array($usergroup, $akismet_uids_ignore))
{
continue;
}
}
if(is_super_admin($post['uid']))
{
continue;
}
// Check if the person should be banned
if($mybb->settings['akismetnumtillban'] > 0 && $akismetstopped >= $mybb->settings['akismetnumtillban'])
{
$banned_user = array(
"uid" => $post['uid'],
"admin" => 0,
"gid" => 7,
"oldgroup" => $usergroup,
"dateline" => TIME_NOW,
"bantime" => 'perm',
"lifted" => 'perm',
"reason" => "Automatically banned by the Akismet system for spamming.",
"oldadditionalgroups" => ''
);
$db->insert_query("banned", $banned_user);
$db->update_query("users", array('usergroup' => 7), "uid = '{$post['uid']}'");
$cache->update_moderators();
}
++$numakismetpost;
if($post['usepostcounts'] != 0)
{
$db->write_query("UPDATE ".TABLE_PREFIX."users SET postnum=postnum-1 WHERE uid = '{$post['uid']}'");
}
}
update_thread_counters($post['tid'], array('replies' => '-'.$numakismetpost));
update_forum_counters($post['fid'], array('threads' => '-'.$numakismetthread, 'posts' => '-'.$numakismetpost));
if($snippit == "thread")
{
redirect(get_forum_link($post['fid']), $lang->thread_spam_success);
}
else
{
redirect(get_thread_link($post['tid']), $lang->post_spam_success);
}
}
function akismet_postbit(&$post)
{
global $templates, $mybb, $theme, $lang;
if(!$mybb->settings['akismetswitch'] || !is_moderator($post['fid']))
{
return;
}
if($mybb->settings['akismetuidsignore'])
{
$akismet_uids_ignore = explode(',', $mybb->settings['akismetuidsignore']);
if(in_array($usergroup, $akismet_uids_ignore))
{
return;
}
}
if(is_super_admin($post['uid']))
{
return;
}
$lang->load("akismet", false, true);
eval("\$post['button_spam'] = \"".$templates->get("akismet_postbit_spam")."\";");
}
function akismet_verify(&$post)
{
global $mybb, $isspam, $akismet;
if($isspam == true && $mybb->settings['akismetswitch'] == 1)
{
if(isset($post->thread_insert_data))
{
$post->thread_insert_data['visible'] = '-4';
}
$post->post_insert_data['visible'] = '-4';
}
}
function akismet_fake_draft(&$post)
{
global $mybb, $isspam, $akismet, $cache;
$exclude_array = explode(',', $mybb->settings['akismetuserstoignore']);
if(!$mybb->settings['akismetswitch'] || in_array($mybb->user['uid'], $exclude_array) || is_super_admin($mybb->user['uid']))
{
return;
}
if($mybb->settings['akismetfidsignore'])
{
$akismet_fids_ignore = explode(',', $mybb->settings['akismetfidsignore']);
if(in_array($post->data['fid'], $akismet_fids_ignore))
{
return;
}
}
if($mybb->settings['akismetuidsignore'])
{
$akismet_uids_ignore = explode(',', $mybb->settings['akismetuidsignore']);
if(in_array($mybb->user['usergroup'], $akismet_uids_ignore))
{
return;
}
}
$akismet_array = array(
'type' => 'post',
'username' => $post->data['username'],
'email' => $mybb->user['email'],
'website' => $mybb->user['website'],
'message' => $post->data['message'],
'user_ip' => $mybb->user['ipaddress']
);
if(!$akismet)
{
$akismet = new Akismet($mybb->settings['bburl'], $mybb->settings['akismetapikey'], $akismet_array);
}
if($akismet->check())
{
global $db;
$isspam = true;
// Update our spam count attempts
++$mybb->user['akismetstopped'];
$db->update_query("users", array('akismetstopped' => $mybb->user['akismetstopped']), "uid = '{$mybb->user['uid']}'");
// Check if the person should be banned
if($mybb->settings['akismetnumtillban'] > 0 && $mybb->user['akismetstopped'] >= $mybb->settings['akismetnumtillban'])
{
$banned_user = array(
"uid" => $mybb->user['uid'],
"admin" => 0,
"gid" => 7,
"oldgroup" => $mybb->user['usergroup'],
"dateline" => TIME_NOW,
"bantime" => 'perm',
"lifted" => 'perm',
"reason" => "Automatically banned by the Akismet system for spamming.",
"oldadditionalgroups" => ''
);
$db->insert_query("banned", $banned_user);
$db->update_query("users", array('usergroup' => 7), "uid = '{$mybb->user['uid']}'");
$cache->update_moderators();
// We better do this..otherwise they have dodgy permissions
$mybb->user['banoldgroup'] = $mybb->user['usergroup'];
$mybb->user['usergroup'] = 7;
global $mybbgroups;
$mybbgroups = $mybb->user['usergroup'];
if($mybb->user['additionalgroups'])
{
$mybbgroups .= ','.$mybb->user['additionalgroups'];
}
}
// Fake visibility
// Essentially because you can't modify the $visible variable we need to trick it
// into thinking its saving a draft so it won't modify the users lastpost and postcount
// In akismet_verify, its set back to -4 so we can still uniquely verify that this is a spam message
// before it's inserted into the database.
$post->data['savedraft'] = 1;
}
}
function akismet_redirect_thread()
{
global $isspam, $url, $lang, $thread, $mybb;
if($isspam && $mybb->settings['akismetswitch'] == 1)
{
$lang->load("akismet", false, true);
$url = get_thread_link($thread['tid']);
$url2 = get_forum_link($thread['fid']);
error("".$lang->redirect_newreply."
".$lang->sprintf($lang->redirect_return_forum, $url, $url2)."
", $lang->akismet_error);
}
}
function akismet_redirect_forum()
{
global $isspam, $url, $lang, $fid, $mybb;
if($isspam && $mybb->settings['akismetswitch'] == 1)
{
$lang->load("akismet", false, true);
$url = get_forum_link($fid);
error("".$lang->redirect_newthread."
".$lang->sprintf($lang->redirect_return_forum, $url)."
", $lang->akismet_error);
}
}
function akismet_action_handler(&$action)
{
$action['akismet'] = array('active' => 'akismet', 'file' => '');
}
function akismet_admin_nav(&$sub_menu)
{
global $mybb, $lang;
if($mybb->settings['akismetswitch'] == 1)
{
$lang->load("forum_akismet", false, true);
end($sub_menu);
$key = (key($sub_menu))+10;
if(!$key)
{
$key = '50';
}
$sub_menu[$key] = array('id' => 'akismet', 'title' => $lang->akismet, 'link' => "index.php?module=forum-akismet");
}
}
function akismet_admin_permissions(&$admin_permissions)
{
global $db, $mybb;
if($mybb->settings['akismetswitch'] == 1)
{
global $lang;
$lang->load("forum_akismet", false, true);
$admin_permissions['akismet'] = $lang->can_manage_akismet;
}
}
function akismet_admin()
{
global $mybb, $db, $page, $lang;
if($page->active_action != "akismet")
{
return;
}
$page->add_breadcrumb_item($lang->akismet);
if($mybb->input['delete_all'] && $mybb->request_method == "post")
{
// User clicked no
if($mybb->input['no'])
{
admin_redirect("index.php?module=forum-akismet");
}
if($mybb->request_method == "post")
{
// Delete the template
$db->delete_query("posts", "visible = '-4'");
// Log admin action
log_admin_action();
flash_message($lang->success_deleted_spam, 'success');
admin_redirect("index.php?module=forum-akismet");
}
else
{
$page->output_confirm_action("index.php?module=forum-akismet&delete_all=1", $lang->confirm_spam_deletion);
}
}
if($mybb->input['unmark'] && $mybb->request_method == "post")
{
$unmark = $mybb->input['akismet'];
if(empty($unmark))
{
flash_message($lang->error_unmark, 'error');
admin_redirect("index.php?module=forum-akismet");
}
$posts_in = '';
$comma = '';
foreach($unmark as $key => $val)
{
$posts_in .= $comma.intval($key);
$comma = ',';
}
$query = $db->simple_select("posts", "pid, tid", "pid IN ({$posts_in}) AND replyto = '0'");
while($post = $db->fetch_array($query))
{
$threadp[] = $post['tid'];
}
if(!is_array($threadp))
{
$threadp = array();
}
$thread_list = implode(',', $threadp);
$query = $db->query("
SELECT p.tid, f.usepostcounts, p.uid, p.fid, p.dateline, p.replyto, t.lastpost, t.lastposter, t.lastposteruid, t.subject
FROM ".TABLE_PREFIX."posts p
LEFT JOIN ".TABLE_PREFIX."threads t ON (t.tid=p.tid)
LEFT JOIN ".TABLE_PREFIX."forums f ON (f.fid=p.fid)
WHERE p.pid IN ({$posts_in}) AND p.visible = '-4'
");
while($post = $db->fetch_array($query))
{
// Fetch the last post for this forum
$query2 = $db->query("
SELECT tid, lastpost, lastposter, lastposteruid, subject
FROM ".TABLE_PREFIX."threads
WHERE fid='{$post['fid']}' AND visible='1' AND closed NOT LIKE 'moved|%'
ORDER BY lastpost DESC
LIMIT 0, 1
");
$lastpost = $db->fetch_array($query2);
if($post['lastpost'] > $lastpost['lastpost'])
{
$lastpost['lastpost'] = $post['lastpost'];
$lastpost['lastposter'] = $post['lastposter'];
$lastpost['lastposteruid'] = $post['lastposteruid'];
$lastpost['subject'] = $post['subject'];
$lastpost['tid'] = $post['tid'];
}
$update_count = array(
"lastpost" => intval($lastpost['lastpost']),
"lastposter" => $db->escape_string($lastpost['lastposter']),
"lastposteruid" => intval($lastpost['lastposteruid']),
"lastposttid" => intval($lastpost['tid']),
"lastpostsubject" => $db->escape_string($lastpost['subject'])
);
$db->update_query("forums", $update_count, "fid='{$post['fid']}'");
$query2 = $db->query("
SELECT u.uid, u.username, p.username AS postusername, p.dateline
FROM ".TABLE_PREFIX."posts p
LEFT JOIN ".TABLE_PREFIX."users u ON (u.uid=p.uid)
WHERE p.tid='{$post['tid']}' AND p.visible='1' OR p.pid = '{$post['pid']}'
ORDER BY p.dateline DESC
LIMIT 1"
);
$lastpost = $db->fetch_array($query2);
$query2 = $db->query("
SELECT u.uid, u.username, p.username AS postusername, p.dateline
FROM ".TABLE_PREFIX."posts p
LEFT JOIN ".TABLE_PREFIX."users u ON (u.uid=p.uid)
WHERE p.tid='{$post['tid']}'
ORDER BY p.dateline ASC
LIMIT 0,1
");
$firstpost = $db->fetch_array($query2);
if(!$firstpost['username'])
{
$firstpost['username'] = $firstpost['postusername'];
}
if(!$lastpost['username'])
{
$lastpost['username'] = $lastpost['postusername'];
}
if(!$lastpost['dateline'])
{
$lastpost['username'] = $firstpost['username'];
$lastpost['uid'] = $firstpost['uid'];
$lastpost['dateline'] = $firstpost['dateline'];
}
$lastpost['username'] = $db->escape_string($lastpost['username']);
$firstpost['username'] = $db->escape_string($firstpost['username']);
$query2 = $db->simple_select("users", "akismetstopped", "uid='{$post['uid']}'");
$akismetstopped = $db->fetch_field($query2, "akismetstopped")-1;
if($akismetstopped < 0)
{
$akismetstopped = 0;
}
$db->update_query("users", array('akismetstopped' => $akismetstopped), "uid='{$post['uid']}'");
$update_array = array(
'username' => $firstpost['username'],
'uid' => intval($firstpost['uid']),
'lastpost' => intval($lastpost['dateline']),
'lastposter' => $lastpost['username'],
'lastposteruid' => intval($lastpost['uid']),
);
$db->update_query("threads", $update_array, "tid='{$post['tid']}'");
if($post['usepostcounts'] != 0)
{
$db->write_query("UPDATE ".TABLE_PREFIX."users SET postnum=postnum+1 WHERE uid = '{$post['uid']}'");
}
$newthreads = $newreplies = 0;
if($post['replyto'] == 0)
{
++$newthreads;
}
else
{
++$newreplies;
}
update_thread_counters($post['tid'], array('replies' => '+'.$newreplies));
update_forum_counters($post['fid'], array('threads' => '+'.$newthreads, 'posts' => '+1'));
}
$approve = array(
"visible" => 1,
);
if($thread_list)
{
$db->update_query("threads", $approve, "tid IN ({$thread_list})");
}
$db->update_query("posts", $approve, "pid IN ({$posts_in})");
// Log admin action
log_admin_action();
flash_message($lang->success_unmarked, 'success');
admin_redirect("index.php?module=forum-akismet");
}
if($mybb->input['delete'] && $mybb->request_method == "post")
{
$deletepost = $mybb->input['akismet'];
if(empty($deletepost))
{
flash_message($lang->error_deletepost, 'error');
admin_redirect("index.php?module=forum-akismet");
}
$posts_in = '';
$comma = '';
foreach($deletepost as $key => $val)
{
$posts_in .= $comma.intval($key);
$comma = ',';
}
$query = $db->simple_select("posts", "pid, tid", "pid IN ({$posts_in}) AND replyto = '0'");
while($post = $db->fetch_array($query))
{
$threadp[$post['pid']] = $post['tid'];
}
if(!is_array($threadp))
{
$threadp = array();
}
require_once MYBB_ROOT."inc/functions_upload.php";
foreach($deletepost as $pid => $val)
{
if(array_key_exists($pid, $threadp))
{
$db->delete_query("posts", "pid IN ({$posts_in})");
$db->delete_query("attachments", "pid IN ({$posts_in})");
// Get thread info
$query = $db->simple_select("threads", "poll", "tid='".$threadp[$pid]."'");
$poll = $db->fetch_field($query, 'poll');
// Delete threads, redirects, favorites, polls, and poll votes
$db->delete_query("threads", "tid='".$threadp[$pid]."'");
$db->delete_query("threads", "closed='moved|".$threadp[$pid]."'");
$db->delete_query("threadsubscriptions", "tid='".$threadp[$pid]."'");
$db->delete_query("polls", "tid='".$threadp[$pid]."'");
$db->delete_query("pollvotes", "pid='{$poll}'");
}
// Remove attachments
remove_attachments($pid);
// Delete the post
$db->delete_query("posts", "pid='{$pid}'");
}
// Log admin action
log_admin_action();
flash_message($lang->success_spam_deleted, 'success');
admin_redirect("index.php?module=forum-akismet");
}
if(!$mybb->input['action'])
{
require MYBB_ROOT."inc/class_parser.php";
$parser = new postParser;
$page->output_header($lang->akismet);
$form = new Form("index.php?module=forum-akismet", "post");
$table = new Table;
$table->construct_header($form->generate_check_box("checkall", 1, '', array('class' => 'checkall')), array('width' => '5%'));
$table->construct_header("Title / Username / Post", array('class' => 'align_center'));
$mybb->input['page'] = intval($mybb->input['page']);
if($mybb->input['page'] > 0)
{
$start = $mybb->input['page'] * 20;
}
else
{
$start = 0;
}
$query = $db->simple_select("posts", "COUNT(pid) as spam", "visible = '-4'");
$total_rows = $db->fetch_field($query, 'spam');
if($start > $total_rows)
{
$start = $total_rows - 20;
}
if($start < 0)
{
$start = 0;
}
$query = $db->simple_select("posts", "*", "visible = '-4'", array('limit_start' => $start, 'limit' => '20', 'order_by' => 'dateline', 'order_dir' => 'desc'));
while($post = $db->fetch_array($query))
{
if($post['uid'] != 0)
{
$username = "".format_name($post['username'], $post['usergroup'], $post['displaygroup'])."";
}
else
{
$username = $post['username'];
}
$table->construct_cell($form->generate_check_box("akismet[{$post['pid']}]", 1, ''));
$table->construct_cell("{$lang->username} {$username} {$lang->title}: ".htmlspecialchars_uni($post['subject'])." (".my_date($mybb->settings['dateformat'], $post['dateline']).", ".my_date($mybb->settings['timeformat'], $post['dateline']).")");
$table->construct_row();
$parser_options = array(
"allow_html" => 0,
"allow_mycode" => 0,
"allow_smilies" => 0,
"allow_imgcode" => 0,
"me_username" => $post['username'],
"filter_badwords" => 1
);
$post['message'] = $parser->parse_message($post['message'], $parser_options);
$table->construct_cell($post['message'], array("colspan" => 2));
$table->construct_row();
}
$num_rows = $table->num_rows();
if($num_rows == 0)
{
$table->construct_cell($lang->no_spam_found, array("class" => "align_center", "colspan" => 2));
$table->construct_row();
}
$table->output($lang->detected_spam_messages);
echo "
".draw_admin_pagination($mybb->input['page'], 20, $total_rows, "index.php?module=forum-akismet&page={page}");
$buttons[] = $form->generate_submit_button($lang->unmark_selected, array('name' => 'unmark'));
$buttons[] = $form->generate_submit_button($lang->deleted_selected, array('name' => 'delete'));
if($num_rows > 0)
{
$buttons[] = $form->generate_submit_button($lang->delete_all, array('name' => 'delete_all', 'onclick' => "return confirm('{$lang->confirm_spam_deletion}');"));
}
$form->output_submit_wrapper($buttons);
$form->end();
$page->output_footer();
}
exit;
}
/**
* This class is Copyright 2009 Ryan Gordon (Tikitiki)
* Built to communicate with the akismet server
*/
class Akismet {
/**
* The array of required server keys when building a query string
*
* @var array
*/
var $required = array(
'HTTP_REFERRER',
'HTTP_ACCEPT_CHARSET',
'SERVERNAME',
'SERVER_ADDR',
'REMOTE_ADDR',
'HTTP_USER_AGENT'
);
/**
* The array of a post to validate against Akismet.
*
* @var array
*/
var $post = array();
/**
* The port to use to connect to the Akismet servers
*
* @var integer
*/
var $port = 80;
/**
* The address to use to connect to the Akismet servers
*
* @var string
*/
var $host = "rest.akismet.com";
/**
* The version of Akismet being used
*
* @var integer
*/
var $version = "1.1";
/**
* The API key used to validate your use of Akismet
*
* @var string
*/
var $key = false;
/**
* The main page of your forum
*
* @var string
*/
var $site = false;
/**
* The object of the Akismet connection
*
* @var object
*/
var $connection;
/**
* Errors (uh oh)
*
* @var array
*/
var $errors = array();
/**
* Initilize the Akismet class
*
* @param string The board url.
* @param int The API Key used to validate your use of Akismet.
* @param array Array of the post that is going to be validated by Akismet.
*/
function Akismet($url, $api_key, $post)
{
// Set option stuff
$this->url = $url;
$this->api_key = $api_key;
$this->post = $post;
$this->format_post();
if(!isset($this->post['user_ip']))
{
if($_SERVER['REMOTE_ADDR'] != getenv('SERVER_ADDR'))
{
$this->post['user_ip'] = $_SERVER['REMOTE_ADDR'];
}
else
{
$this->post['user_ip'] = getenv('HTTP_X_FORWARDED_FOR');
}
}
if(!isset($this->post['permalink']))
{
$this->post['permalink'] = $_SERVER['HTTP_REFERER'];
}
if(!isset($this->post['user_agent']))
{
$this->post['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
}
if(!isset($this->post['referrer']))
{
$this->post['referrer'] = $_SERVER['HTTP_REFERER'];
}
$this->post['blog'] = $url;
// Check if the API key is valid
if(!$this->validate_api_key())
{
$this->set_error("invalid_key");
}
}
/**
* Checks a post against the Akismet server
*
* @return boolean True if the comment passed spam validation.
*/
function check()
{
if($this->fetch_response($this->build_query_string(), 'comment-check') == "true")
{
// We have spam!
return true;
}
// Good! The check failed; We're all good to go!
return false;
}
/**
* Submits a spam post to the Akismet server
*
*/
function submit_spam()
{
$this->fetch_response($this->build_query_string(), 'submit-spam');
}
/**
* Submits a ham post to the Akismet server
*
*/
function submit_ham()
{
$this->fetch_response($this->build_query_string(), 'submit-ham');
}
/**
* Validate a API Key against the Akismet server
*
* @return boolean True if the API Key passed.
*/
function validate_api_key()
{
if($this->fetch_response("key=".$this->api_key."&blog=".urlencode($this->url), 'verify-key') == "valid")
{
return true;
}
return false;
}
/**
* Formats the comment array to the Akismet API Standards
*
*/
function format_post()
{
$format = array(
'type' => 'comment_type',
'username' => 'comment_author',
'email' => 'comment_author_email',
'website' => 'comment_author_url',
'message' => 'comment_content',
);
// Basically we're assigning $long to the comment array if $short in the comment array, is not null
foreach($format as $short => $long)
{
if(isset($this->post[$short]))
{
$this->post[$long] = $this->post[$short];
unset($this->post[$short]);
}
}
}
/**
* Builds a query string to work with Akismet
*
* @return string The built query string
*/
function build_query_string()
{
foreach($_SERVER as $key => $value)
{
if(in_array($key, $this->required))
{
if($key == 'REMOTE_ADDR')
{
$this->post[$key] = $this->post['user_ip'];
}
else
{
$this->post[$key] = $value;
}
}
}
$query_string = '';
foreach($this->post as $key => $data)
{
$query_string .= $key.'='.urlencode(stripslashes($data)).'&';
}
return $query_string;
}
/**
* Connects to the Akismet server
*
* @return boolean True on success.
*/
function connect()
{
$this->connection = @fsockopen($this->host, 80);
if(!$this->connection)
{
$this->set_error("server_not_found");
return false;
}
return true;
}
/**
* Sends a request to the Akismet server
*
* @param string The request uri.
* @param string The path to what is being checked (e.x. 'comment-spam').
* @return mixed The response on success, false otherwise.
*/
function fetch_response($request, $path)
{
$this->connect();
if($this->connection == true && !$this->errors['server_not_found'])
{
if(!empty($this->api_key))
{
$api_key = $this->api_key.".";
}
else
{
$api_key = "";
}
$http_request = "POST /{$this->version}/{$path} HTTP/1.1\r\n";
$http_request .= "Host: {$api_key}{$this->host}\r\n";
$http_request .= "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n";
$http_request .= "Content-Length: ".strlen($request)."\r\n";
$http_request .= "User-Agent: MyBB/1.6 | Akismet/1.1\r\n";
$http_request .= "Connection: close\r\n";
$http_request .= "\r\n";
$http_request .= $request;
@fwrite($this->connection, $http_request);
$http_response = "";
while(feof($this->connection) === false)
{
$http_response .= @fgets($this->connection, 1160);
}
$http_response = explode("\r\n\r\n", $http_response, 2);
return $http_response[1];
}
else
{
$this->set_error("response_failed");
return false;
}
$this->disconnect();
}
/**
* Disconnects from the Akismet server
*
*/
function disconnect()
{
@fclose($this->connection);
}
/**
* Append an error onto the error array
*
* @param string The error message.
* @param int The error code of the error.
* @return boolean Always true.
*/
function set_error($error_code)
{
switch($error_code)
{
case "server_not_found":
$message = "Could not connect to Akismet server.";
break;
case "response_failed":
$message = "There was a problem retrieving the response.";
break;
case "invalid_key":
$message = "Your Akismet API key does not appear to be valid.";
break;
default:
$message = "Unkown error.";
break;
}
$this->errors[$error_code] = $message;
return true;
}
/**
* Check if a specified error exists with the error array
*
* @param int The error code
* @return boolean True if error exists.
*/
function error_exists($error_code)
{
if(isset($this->errors[$error_code]))
{
return true;
}
return false;
}
/**
* Checks if there are any errors stored in the error array
*
* @return boolean True if there errors.
*/
function errors_exist()
{
if(count($this->errors) > 0)
{
return true;
}
return false;
}
}
?>