azett eba24702df First commit in 2021 \o/
Fixed more template errors in order to get everything running with PHP 8.0.
2021-01-01 00:24:24 +01:00

814 lines
19 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');
/**
* 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->register_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->get_template_vars('success'));
$action_url=$smarty->get_template_vars('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);