2023-10-28 13:56:05 +02:00

883 lines
20 KiB
PHP

<?php
/**
* This is the administration panel for the plugin Flatpress Comment Center.
*/
if (!class_exists('plugin_commentcenter')) {
die('Don\'t try to hack us.');
}
class admin_entry_commentcenter extends AdminPanelAction {
// The language files
var $langres = 'plugin:commentcenter';
// The commands
var $commands = array(
'configure',
'polup',
'poldown',
'poledit',
'poldelete',
'approve_list',
'publishcomm',
'pubnoham',
'deletecomm',
'manage',
'deletecomm2',
'commspam'
);
// The submits
var $events = array(
'configure',
'edit_policy',
'delok',
'cancel',
'multidel',
'mpubcomm',
'mdelcomm',
'commdelok',
'ccancel',
'entry_search',
'mdelcomm_2',
'commdelok_2',
'ccancel_2'
);
var $plugin;
/**
* This function is used as a callback when the panel is loaded.
* It indicates the Smarty template and it saves by reference the
* main class of the plugin Comment Center.
*/
function setup() {
global $lang;
$this->plugin = &$GLOBALS ['plugin_commentcenter'];
$smarty = &$this->smarty;
// The default TPL
$smarty->assign('admin_resource', 'plugin:commentcenter/policies');
$smarty->assign('plugin_url', plugin_geturl('commentcenter'));
$smarty->registerPlugin('modifier', 'idToSubject', array(
&$this,
'_idToTitle'
));
add_filter('wp_title', array(
&$this,
'_title'
), 15, 2);
add_action('wp_head', array(
&$this,
'_head'
), 10);
}
/**
* This function is the callback for the hook system.
* It sets the title.
*
* @param string $val:
* The current title
* @param string $sep:
* The separator
* @return string: The title
*/
function _title($val, $sep) {
return "{$val} {$sep} Comment Center";
}
/**
* This function is the callback for the hook system.
* It adds the javascript of the plugin.
*/
function _head() {
if (!function_exists('plugin_jquery_head')) {
return;
}
$src1 = plugin_geturl('commentcenter') . 'res/ajax.js';
$src2 = BLOG_BASEURL . 'admin.php?jslang=commentcenter';
echo '<script type="text/javascript" src="' . $src1 . "\"></script>\n";
echo '<script type="text/javascript" src="' . $src2 . "\"></script>\n";
}
/**
* This function return the entry title from the id.
* It's made to be called from Smarty.
*
* @param string $id:
* The entry id
* @return string: The output
*/
function _idToTitle($id) {
$o = new FPDB_Query(array(
'start' => 0,
'count' => 1,
'fullparse' => false,
'id' => $id
), null);
if (!$o->hasMore()) {
return false;
}
$arr = $o->getEntry();
return wp_specialchars($arr [1] ['subject']);
}
/**
* This function is an advanced redirect option.
*
* @param string $cmd:
* The command
* @param mixed $cmdval:
* The value for the command
* @param boolean $nosuccess:
* Don't save the success?
*/
function _redirect($cmd, $cmdval = 1, $nosuccess = false) {
global $panel;
$smarty = &$this->smarty;
sess_add("success_{$panel}", $smarty->getTemplateVars('success'));
$action_url = $smarty->getTemplateVars('action_url');
$url = admin_filter_command($action_url, $cmd, $cmdval);
$url = html_entity_decode($url);
$url = substr($url, strlen(BLOG_BASEURL));
utils_redirect($url);
die();
}
/**
* This is the main function of the panel.
*/
function main() {
$smarty = &$this->smarty;
$plugin = &$this->plugin;
$plugin->loadPolicies();
$smarty->assign('policies', $plugin->policies);
}
/**
* This is the callback for the configure command.
*/
function doconfigure() {
global $lang;
$plugin = &$this->plugin;
$conf = $plugin->getConf();
$smarty = &$this->smarty;
$smarty->assign('admin_resource', 'plugin:commentcenter/configure');
$smarty->assign('pl_conf', $conf);
$conf = $plugin->getConf();
if (isset($conf) && array_key_exists('akismet_check', $conf) && $conf ['akismet_check']) {
$akismet = $plugin->akismetLoad();
if (is_numeric($akismet)) {
$error = $lang ['admin'] ['entry'] ['commentcenter'] ['akismet_errors'] [$akismet];
$smarty->assign('warnings', $error);
}
}
}
/**
* This callback is used when the configuration is saved.
*/
function onconfigure() {
if (!empty($_POST ['akismet_url'])) {
$pos = strpos($_POST ['akismet_url'], '//');
if ($pos === FALSE || $pos > 8) {
$_POST ['akismet_url'] = 'http://' . $_POST ['akismet_url'];
}
}
$save = array(
'log_all' => isset($_POST ['log_all']),
'email_alert' => isset($_POST ['email_alert']),
'akismet_check' => isset($_POST ['akismet_check']),
'akismet_key' => $_POST ['akismet_key'],
'akismet_url' => $_POST ['akismet_url']
);
// It doesn't make very sense: I could just use array_merge but...
foreach ($save as $key => $value) {
plugin_addoption('commentcenter', $key, $value);
}
$success = plugin_saveoptions() ? 1 : -1;
$this->smarty->assign('success', $success);
$this->_redirect('configure');
}
/**
* The edit policy/new policy action callback.
*
* @param integer $id:
* The policy id. -1 means a new one
* @return integer: The redirect option
*/
function dopoledit($id) {
global $lang;
$plugin = &$this->plugin;
$smarty = &$this->smarty;
$plang = &$lang ['admin'] ['entry'] ['commentcenter'];
$plugin->loadPolicies();
$smarty->assign('policy', array());
$smarty->assign('admin_resource', 'plugin:commentcenter/editpol');
$smarty->assign('pol_id', $id);
if ($id != -1 && isset($plugin->policies [$id])) {
$smarty->assign('policy', $plugin->policies [$id]);
} elseif ($id != -1) {
// Inexistent policy
$smarty->assign('errors', $plang ['errors'] ['pol_nonex']);
} else {
$smarty->assign('polnew', true);
}
return 0;
}
/**
* The edit policy/new policy save callback.
*
* @return integer: The redirect option
*/
function onedit_policy() {
$plugin = &$this->plugin;
$success = 2;
$policy = array();
@$id = $_POST ['policy_id'];
$plugin->loadPolicies();
if ($id != -1 && !isset($plugin->policies [$id])) {
$success = -2;
}
while (true && $success == 2) {
if (empty($_POST ['apply_to'])) {
$success = -2;
break;
}
if (!isset($_POST ['behavoir'])) {
$success = -2;
break;
}
$behavoir = $_POST ['behavoir'];
if ($behavoir != 1 && $behavoir != 0 && $behavoir != -1) {
$success = -2;
break;
}
$policy ['do'] = $behavoir;
switch ($_POST ['apply_to']) {
case 'all_entries':
$policy ['is_all'] = true;
break 2;
case 'some_entries':
if (empty($_POST ['entries'])) {
$success = -2;
} else {
$entries = array();
foreach ($_POST ['entries'] as $entry) {
if (entry_exists($entry)) {
$entries [] = $entry;
}
}
if (count($entries) == 0) {
$success = -2;
} else {
$entries = array_unique($entries);
$policy ['entry'] = $entries;
}
}
break 2;
case 'properties':
$policy ['is_all'] = true;
if (isset($_POST ['cats'])) {
$policy ['categories'] = array_keys($_POST ['cats']);
$policy ['is_all'] = false;
}
if (is_numeric($_POST ['older'])) {
// Save in seconds
$policy ['older'] = $_POST ['older'] * 86400;
$policy ['is_all'] = false;
}
if (isset($policy ['is_all']) && @!$policy ['is_all']) {
unset($policy ['is_all']);
}
break 2;
default:
$success = -2;
break 2;
}
break;
}
if ($success == 2) {
if ($id == -1) {
$plugin->policies [] = $policy;
} else {
$plugin->policies [$id] = $policy;
}
$success = $plugin->savePolicies() ? 2 : -2;
}
$this->smarty->assign('success', $success);
return 2;
}
/**
* This function is the callback for the poldelete action.
*
* @param integer $id:
* The id of policy you wish to delete
* @return integer: Redirect option
*/
function dopoldelete($id) {
$plugin = &$this->plugin;
$smarty = &$this->smarty;
$smarty->assign('admin_resource', 'plugin:commentcenter/deletepol');
$plugin->loadPolicies();
if (isset($plugin->policies [$id])) {
$smarty->assign('policies', array(
$id => $plugin->policies [$id]
));
}
$smarty->assign('single', true);
return 0;
}
/**
* This function is like dopoldelete but it's for multiple policies.
*
* @return integer: Redirect option
*/
function onmultidel() {
$plugin = &$this->plugin;
$smarty = &$this->smarty;
if (@!count($_POST ['select'])) {
$smarty->assign('success', -4);
return 2;
}
$smarty->assign('admin_resource', 'plugin:commentcenter/deletepol');
$plugin->loadPolicies();
$policies = array();
foreach ($_POST ['select'] as $polid => $checkvalue) {
if (isset($plugin->policies [$polid])) {
$policies [$polid] = $plugin->policies [$polid];
}
}
if (count($policies) > 0) {
$smarty->assign('policies', $policies);
} else {
$smarty->assign('success', -4);
return 2;
}
if (count($policies) == 1) {
$smarty->assign('single', true);
}
return 0;
}
/**
* This is the delete ok command.
*
* @return integer: The redirect option
*/
function ondelok() {
if (empty($_POST ['del_policy'])) {
$s = -4;
} else {
$plugin = $this->plugin;
$plugin->loadPolicies();
foreach ($_POST ['del_policy'] as $polid) {
if (isset($plugin->policies [$polid])) {
unset($plugin->policies [$polid]);
}
}
$s = $plugin->savePolicies() ? 4 : -4;
}
$this->smarty->assign('success', $s);
return 2;
}
/**
* This is the cancel callback.
* It just makes the redirect.
*
* @return integer: The redirect option
*/
function oncancel() {
return 2;
}
/**
* This function is the callback for the polup action.
*
* @param integer $id:
* The id of policy you wish to delete
* @return integer: Redirect option
*/
function dopolup($id) {
$s = -3;
if ($id > 0) {
$plugin = &$this->plugin;
$plugin->loadPolicies();
$plugin->policyMove($id, $id - 1);
$s = $plugin->savePolicies() ? 3 : -3;
}
$this->smarty->assign('success', $s);
return 2;
}
/**
* This function is the callback for the poldown action.
*
* @param integer $id:
* The id of policy you wish to delete
* @return integer: Redirect option
*/
function dopoldown($id) {
$s = -3;
$plugin = &$this->plugin;
$plugin->loadPolicies();
if ($id < count($plugin->policies) - 1) {
$plugin->policyMove($id, $id + 1);
$s = $plugin->savePolicies() ? 3 : -3;
}
$this->smarty->assign('success', $s);
return 2;
}
/**
* This function is the callback for the approve_list command
*
* @return integer: The redirect option
*/
function doapprove_list() {
$plugin = &$this->plugin;
$smarty = &$this->smarty;
$conf = $plugin->getConf();
$smarty->assign('use_akismet', @$conf ['akismet_check']);
$smarty->assign('other', @$conf ['log_all']);
$smarty->assign('admin_resource', 'plugin:commentcenter/approvelist');
$lister = new commentcenter_list($plugin->pl_dir);
$smarty->assign('entries', $lister->toDetails());
return 0;
}
/**
* This function is the callback for the publishcomm command
*
* @param string $id:
* The comment id
* @param boolean $noredirect:
* If true, don't redirect
* @param boolean $noham:
* If it was blocked from Akismet, don't submit as ham
* @return integer: The redirect option
*/
function dopublishcomm($id, $noredirect = false, $noham = false) {
$plugin = &$this->plugin;
$smarty = &$this->smarty;
$f = $plugin->pl_dir . $id . '.txt';
if (!file_exists($f)) {
$smarty->assign('success', -5);
$succ = -5;
} else {
include $f;
$entry = substr($id, 1, 18);
$ham = false;
if (isset($comment ['log_reason'])) {
$ham = $comment ['log_reason'] == 'akismet' && !$noham;
unset($comment ['log_reason']);
}
if (isset($comment ['id'])) {
unset($comment ['id']);
}
if ($ham) {
$clean = $plugin->akismetClean($comment, $entry);
$akismet = &$plugin->akismetLoad();
if (is_object($akismet)) {
$akismet->setComment($clean);
$akismet->submitHam();
}
}
$id = comment_save($entry, $comment);
do_action('comment_post', $entry, array(
$id,
$comment
));
$succ = $id ? 5 : -5;
$smarty->assign('success', $succ);
if ($succ == 5) {
@unlink($f);
}
}
if ($noredirect) {
return $succ == 5;
}
$this->_redirect('approve_list');
return 0;
}
/**
* This is the callback for the action pubnoham.
*
* @param string $id:
* The comment id
* @return integer: The redirect option.
*/
function dopubnoham($id) {
return $this->dopublishcomm($id, false, true);
}
/**
* This is the callback to publish multiple comments.
*
* @return integer: The redirect option
*/
function onmpubcomm() {
if (!isset($_POST ['select'])) {
$this->dopublishcomm('fake');
}
$target = count($_POST ['select']);
$noham = !isset($_POST ['submitham']);
$i = 0;
foreach ((array) $_POST ['select'] as $comm => $check) {
$i++;
$this->dopublishcomm($comm, $i != $target, $noham);
}
// If it's correct, we should exited the script before
$this->smarty->assign('success', -5);
$this->_redirect('approve_list');
return 0;
}
/**
* This function is the callback for the deletecomm action.
*
* @param integer $id:
* The id of the comment you wish to delete
* @return integer: Redirect option
*/
function dodeletecomm($id) {
$plugin = &$this->plugin;
$smarty = &$this->smarty;
$smarty->assign('admin_resource', 'plugin:commentcenter/deletecomm');
$entry = substr($id, 1, 18);
$commid = substr($id, 21, 20);
$f = $plugin->pl_dir . $id . '.txt';
if (file_exists($f)) {
include $f;
$delete [$entry] ['del'] [$commid] = $comment;
$smarty->assign('entries', $delete);
} else {
$smarty->assign('success', -6);
$this->_redirect('approve_list');
}
$smarty->assign('single', true);
return 0;
}
/**
* This function is like dopoldelete but it's for multiple policies.
*
* @return integer: Redirect option
*/
function onmdelcomm() {
$plugin = &$this->plugin;
$smarty = &$this->smarty;
if (@!count($_POST ['select'])) {
$smarty->assign('success', -6);
$this->_redirect('approve_list');
return 0;
}
$smarty->assign('admin_resource', 'plugin:commentcenter/deletecomm');
$remove = array();
foreach ($_POST ['select'] as $commbig => $check) {
$entry = substr($commbig, 1, 18);
$commid = substr($commbig, 21, 20);
$f = $plugin->pl_dir . $commbig . '.txt';
if (file_exists($f)) {
include $f;
$remove [$entry] ['del'] [$commid] = $comment;
}
}
if (count($remove) > 0) {
$smarty->assign('entries', $remove);
} else {
$smarty->assign('success', -6);
$this->_redirect('approve_list');
return 0;
}
if (count($remove) == 1) {
$smarty->assign('single', true);
}
return 0;
}
/**
* This is the delete ok command.
*
* @return integer: The redirect option
*/
function oncommdelok() {
if (empty($_POST ['select'])) {
$s = -6;
} else {
foreach ($_POST ['select'] as $commid => $check) {
$f = $this->plugin->pl_dir . $commid . '.txt';
@unlink($f);
}
$s = 6;
}
$this->smarty->assign('success', $s);
$this->_redirect('approve_list');
return 2;
}
/**
* This is the cancel callback.
* It just makes the redirect.
*
* @return integer: The redirect option
*/
function onccancel() {
$this->_redirect('approve_list');
return 2;
}
/**
* This function is the callback for the action "manage".
*
* @param string $entry:
* The entry id
* @return integer: The redirect option
*/
function domanage($entry) {
global $lang, $fpdb;
$smarty = &$this->smarty;
$smarty->assign('admin_resource', 'plugin:commentcenter/manage');
$smarty->assign('is_managing', true);
$conf = $this->plugin->getConf();
if (@$conf ['akismet_check']) {
$smarty->assign('use_akismet', true);
}
if ($entry != 'search' && !entry_exists($entry)) {
$smarty->assign('error', $lang ['admin'] ['entry'] ['commentcenter'] ['errors'] ['entry_nf']);
} elseif ($entry != 'search') {
$smarty->assign('entry_id', $entry);
$smarty->assign('fetch', 'list');
$fpdb->query("id:{$entry},fullparse:true,comments:true");
$q = &$fpdb->getQuery();
$q->getEntry();
$list = array();
while ($q->comments->hasMore()) {
list ($id, $comment) = $q->comments->getComment();
$list [$entry] ['list'] [$id] = $comment;
}
$smarty->assign('entries', $list);
}
return 0;
}
/**
* Since it's impossible to use a GET form in Flatpress, to search entries
* we have to use a POST form, and here's its callback.
*
* @return integer: The redirect option
*/
function onentry_search() {
if (!isset($_POST ['entry'])) {
$_POST ['entry'] = '';
}
// In the function we call 'search' isn't an error, but here yes, so delete it
if ($_POST ['entry'] == 'search') {
$_POST ['entry'] = '';
}
return @$this->domanage($_POST ['entry']);
}
/**
* This function is the callback for the deletecomm2 action.
*
* @param integer $id:
* The id of the comment you wish to delete
* @return integer: Redirect option
*/
function dodeletecomm2($id) {
$smarty = &$this->smarty;
$smarty->assign('admin_resource', 'plugin:commentcenter/deletecomm');
$smarty->assign('is_managing', true);
$entry = substr($id, 1, 18);
$commid = substr($id, 21, 20);
$smarty->assign('entry', $entry);
if (comment_exists($entry, $commid)) {
$delete [$entry] ['del'] [$commid] = comment_parse($entry, $commid);
$smarty->assign('entries', $delete);
} else {
$smarty->assign('success', -6);
$this->_redirect('manage', $entry);
}
$smarty->assign('single', true);
return 0;
}
/**
* This function is like dopoldelete but it's for multiple policies.
*
* @return integer: Redirect option
*/
function onmdelcomm_2() {
$smarty = &$this->smarty;
if (@!count($_POST ['select'])) {
$smarty->assign('success', -6);
$this->_redirect('manage', @$_POST ['entry_hid']);
return 0;
}
$smarty->assign('admin_resource', 'plugin:commentcenter/deletecomm');
$smarty->assign('is_managing', true);
$smarty->assign('entry', @$_POST ['entry_hid']);
$remove = array();
foreach ($_POST ['select'] as $commbig => $check) {
$entry = substr($commbig, 1, 18);
$commid = substr($commbig, 21, 20);
$comment = comment_parse($entry, $commid);
if ($comment !== false) {
$remove [$entry] ['del'] [$commid] = $comment;
}
}
if (count($remove) > 0) {
$smarty->assign('entries', $remove);
} else {
$smarty->assign('success', -6);
$this->_redirect('manage', @$_POST ['entry_hid']);
return 0;
}
if (count($remove) == 1) {
$smarty->assign('single', true);
}
return 0;
}
/**
* This is the delete ok command.
*
* @return integer: The redirect option
*/
function oncommdelok_2() {
if (empty($_POST ['select'])) {
$s = -6;
} else {
$i = 0;
foreach ($_POST ['select'] as $commid => $check) {
$entry = substr($commid, 1, 18);
$commid = substr($commid, 21, 20);
$i += comment_delete($entry, $commid) ? 1 : 0;
}
$s = $i > 0 ? 6 : -6;
}
$this->smarty->assign('success', $s);
$this->_redirect('manage', @$_POST ['entry']);
return 2;
}
/**
* This is the cancel callback.
* It just makes the redirect.
*
* @return integer: The redirect option
*/
function onccancel_2() {
$this->_redirect('manage', @$_POST ['entry']);
return 2;
}
/**
* This function is the callback for the action commspam.
*
* @param string $id:
* The comment id
* @return integer: The redirect option
*/
function docommspam($id) {
$smarty = &$this->smarty;
$plugin = &$this->plugin;
$entry = substr($id, 1, 18);
$commid = substr($id, 21, 20);
if (!comment_exists($entry, $commid)) {
$smarty->assign('success', -7);
} else {
$comment = comment_parse($entry, $commid);
$clean = $plugin->akismetClean($comment, $entry);
$akismet = &$plugin->akismetLoad();
if (is_object($akismet)) {
$akismet->setComment($clean);
$akismet->submitSpam();
$smarty->assign('success', $akismet->errorsExist() ? -7 : 7);
} else {
$smarty->assign('success', -7);
}
}
$this->_redirect('manage', $entry);
return 0;
}
}
admin_addpanelaction('entry', 'commentcenter', true);