Simplify ignore logic + disallow ignoring chatters with higher status

This commit is contained in:
Daniel Winzen
2016-07-21 09:06:29 +02:00
parent 5c4586c04e
commit 643189d5ee
2 changed files with 50 additions and 72 deletions

View File

@ -1,3 +1,5 @@
Simplify ignore logic + disallow ignoring chatters with higher status
Version 1.20.5 - Jul. 19, 2016 Version 1.20.5 - Jul. 19, 2016
Check permission before selectively deleting a message. Check permission before selectively deleting a message.

120
chat.php
View File

@ -1612,15 +1612,6 @@ function send_post(){
} }
$disablepm=(bool) get_setting('disablepm'); $disablepm=(bool) get_setting('disablepm');
if(!$disablepm){ if(!$disablepm){
$ignored=array();
$ignore=get_ignored($U['nickname']);
foreach($ignore as $ign){
if($ign['ignored']===$U['nickname']){
$ignored[]=$ign['by'];
}else{
$ignored[]=$ign['ignored'];
}
}
$stmt=$db->prepare('SELECT nickname, style, status FROM ' . PREFIX . 'members WHERE eninbox!=0 AND eninbox<=? AND nickname NOT IN (SELECT nickname FROM ' . PREFIX . 'sessions WHERE incognito=0) AND nickname NOT IN (SELECT ign FROM ' . PREFIX . 'ignored WHERE ignby=?) AND nickname NOT IN (SELECT ignby FROM ' . PREFIX . 'ignored WHERE ign=?);'); $stmt=$db->prepare('SELECT nickname, style, status FROM ' . PREFIX . 'members WHERE eninbox!=0 AND eninbox<=? AND nickname NOT IN (SELECT nickname FROM ' . PREFIX . 'sessions WHERE incognito=0) AND nickname NOT IN (SELECT ign FROM ' . PREFIX . 'ignored WHERE ignby=?) AND nickname NOT IN (SELECT ignby FROM ' . PREFIX . 'ignored WHERE ign=?);');
$stmt->execute(array($U['status'], $U['nickname'], $U['nickname'])); $stmt->execute(array($U['status'], $U['nickname'], $U['nickname']));
while($tmp=$stmt->fetch(PDO::FETCH_ASSOC)){ while($tmp=$stmt->fetch(PDO::FETCH_ASSOC)){
@ -1628,7 +1619,7 @@ function send_post(){
} }
sort_names($P); sort_names($P);
foreach($P as $user){ foreach($P as $user){
if($U['nickname']!==$user[3] && !in_array($user[3], $ignored)){ if($U['nickname']!==$user[3]){
echo '<option '; echo '<option ';
if($_REQUEST['sendto']==$user[3]){ if($_REQUEST['sendto']==$user[3]){
echo 'selected '; echo 'selected ';
@ -1698,44 +1689,34 @@ function send_profile($arg=''){
echo "<$H[form]>$H[commonform]".hidden('action', 'profile').hidden('do', 'save')."<h2>$I[profile]</h2><i>$arg</i><table class=\"center-table\">"; echo "<$H[form]>$H[commonform]".hidden('action', 'profile').hidden('do', 'save')."<h2>$I[profile]</h2><i>$arg</i><table class=\"center-table\">";
thr(); thr();
sort_names($P); sort_names($P);
$ignored=array(); $ignored=[];
$ignore=get_ignored($U['nickname']); $stmt=$db->prepare('SELECT ign FROM ' . PREFIX . 'ignored WHERE ignby=?;');
foreach($ignore as $ign){ $stmt->execute([$U['nickname']]);
if($ign['by']===$U['nickname']){ while($tmp=$stmt->fetch(PDO::FETCH_ASSOC)){
$ignored[]=$ign['ignored']; $ignored[]=$tmp['ign'];
}
} }
if(count($ignored)>0){ if(count($ignored)>0){
echo "<tr><td><table class=\"left-table\"><tr><th>$I[unignore]</th><td class=\"right\">"; echo "<tr><td><table class=\"left-table\"><tr><th>$I[unignore]</th><td class=\"right\">";
echo "<select name=\"unignore\" size=\"1\"><option value=\"\">$I[choose]</option>"; echo "<select name=\"unignore\" size=\"1\"><option value=\"\">$I[choose]</option>";
foreach($ignored as $ign){ foreach($ignored as $ign){
$style=''; echo "<option value=\"$ign\">$ign</option>";
foreach($P as $user){
if($ign===$user[0]){
$style=" style=\"$user[1]\"";
break;
}
}
echo "<option value=\"$ign\"$style>$ign</option>";
} }
echo '</select></td></tr></table></td></tr>'; echo '</select></td></tr></table></td></tr>';
thr(); thr();
} }
if(count($P)-count($ignored)>1){ echo "<tr><td><table class=\"left-table\"><tr><th>$I[ignore]</th><td class=\"right\">";
echo "<tr><td><table class=\"left-table\"><tr><th>$I[ignore]</th><td class=\"right\">"; echo "<select name=\"ignore\" size=\"1\"><option value=\"\">$I[choose]</option>";
echo "<select name=\"ignore\" size=\"1\"><option value=\"\">$I[choose]</option>"; $stmt=$db->query('SELECT poster FROM ' . PREFIX . 'messages GROUP BY poster;');
$stmt=$db->query('SELECT poster FROM ' . PREFIX . 'messages GROUP BY poster;'); while($nick=$stmt->fetch(PDO::FETCH_NUM)){
while($nick=$stmt->fetch(PDO::FETCH_NUM)){ $nicks[]=$nick[0];
$nicks[]=$nick[0];
}
foreach($P as $user){
if($U['nickname']!==$user[0] && !in_array($user[0], $ignored) && in_array($user[0], $nicks)){
echo "<option value=\"$user[0]\" style=\"$user[1]\">$user[0]</option>";
}
}
echo '</select></td></tr></table></td></tr>';
thr();
} }
foreach($P as $user){
if($U['nickname']!==$user[0] && in_array($user[0], $nicks) && $user[2]<=$U['status']){
echo "<option value=\"$user[0]\" style=\"$user[1]\">$user[0]</option>";
}
}
echo '</select></td></tr></table></td></tr>';
thr();
echo "<tr><td><table class=\"left-table\"><tr><th>$I[refreshrate]</th><td class=\"right\">"; echo "<tr><td><table class=\"left-table\"><tr><th>$I[refreshrate]</th><td class=\"right\">";
echo "<input type=\"number\" name=\"refresh\" size=\"3\" maxlength=\"3\" min=\"5\" max=\"150\" value=\"$U[refresh]\"></td></tr></table></td></tr>"; echo "<input type=\"number\" name=\"refresh\" size=\"3\" maxlength=\"3\" min=\"5\" max=\"150\" value=\"$U[refresh]\"></td></tr></table></td></tr>";
thr(); thr();
@ -2346,7 +2327,12 @@ function parse_sessions(){
// load other sessions // load other sessions
$countmods=0; $countmods=0;
$P=array(); $P=array();
$stmt=$db->query('SELECT nickname, style, status, incognito FROM ' . PREFIX . 'sessions WHERE entry!=0 AND status>0 ORDER BY status DESC, lastpost DESC;'); if(isSet($U['nickname'])){
$stmt=$db->prepare('SELECT nickname, style, status, incognito FROM ' . PREFIX . 'sessions WHERE entry!=0 AND status>0 AND nickname NOT IN (SELECT ign FROM '. PREFIX . 'ignored WHERE ignby=?) AND nickname NOT IN (SELECT ignby FROM '. PREFIX . 'ignored WHERE ign=?) ORDER BY status DESC, lastpost DESC;');
$stmt->execute([$U['nickname'], $U['nickname']]);
}else{
$stmt=$db->query('SELECT nickname, style, status, incognito FROM ' . PREFIX . 'sessions WHERE entry!=0 AND status>0 ORDER BY status DESC, lastpost DESC;');
}
while($temp=$stmt->fetch(PDO::FETCH_ASSOC)){ while($temp=$stmt->fetch(PDO::FETCH_ASSOC)){
if(!$temp['incognito']){ if(!$temp['incognito']){
$P[$temp['nickname']]=[$temp['nickname'], $temp['style'], $temp['status'], $temp['nickname']]; $P[$temp['nickname']]=[$temp['nickname'], $temp['style'], $temp['status'], $temp['nickname']];
@ -2594,7 +2580,7 @@ function amend_profile(){
} }
function save_profile(){ function save_profile(){
global $I, $U, $db; global $I, $P, $U, $db;
amend_profile(); amend_profile();
$stmt=$db->prepare('UPDATE ' . PREFIX . 'sessions SET refresh=?, style=?, boxwidth=?, boxheight=?, bgcolour=?, notesboxwidth=?, notesboxheight=?, timestamps=?, embed=?, incognito=?, nocache=?, tz=?, eninbox=? WHERE session=?;'); $stmt=$db->prepare('UPDATE ' . PREFIX . 'sessions SET refresh=?, style=?, boxwidth=?, boxheight=?, bgcolour=?, notesboxwidth=?, notesboxheight=?, timestamps=?, embed=?, incognito=?, nocache=?, tz=?, eninbox=? WHERE session=?;');
$stmt->execute(array($U['refresh'], $U['style'], $U['boxwidth'], $U['boxheight'], $U['bgcolour'], $U['notesboxwidth'], $U['notesboxheight'], $U['timestamps'], $U['embed'], $U['incognito'], $U['nocache'], $U['tz'], $U['eninbox'], $U['session'])); $stmt->execute(array($U['refresh'], $U['style'], $U['boxwidth'], $U['boxheight'], $U['bgcolour'], $U['notesboxwidth'], $U['notesboxheight'], $U['timestamps'], $U['embed'], $U['incognito'], $U['nocache'], $U['tz'], $U['eninbox'], $U['session']));
@ -2607,8 +2593,10 @@ function save_profile(){
$stmt->execute(array($_REQUEST['unignore'], $U['nickname'])); $stmt->execute(array($_REQUEST['unignore'], $U['nickname']));
} }
if(!empty($_REQUEST['ignore'])){ if(!empty($_REQUEST['ignore'])){
$stmt=$db->prepare('INSERT INTO ' . PREFIX . 'ignored (ign, ignby) VALUES (?, ?);'); if($_REQUEST['ignore']!==$U['nickname'] && $P[$_REQUEST['ignore']][2]<=$U['status']){
$stmt->execute(array($_REQUEST['ignore'], $U['nickname'])); $stmt=$db->prepare('INSERT INTO ' . PREFIX . 'ignored (ign, ignby) VALUES (?, ?);');
$stmt->execute(array($_REQUEST['ignore'], $U['nickname']));
}
} }
if($U['status']>1 && !empty($_REQUEST['newpass'])){ if($U['status']>1 && !empty($_REQUEST['newpass'])){
if(!valid_pass($_REQUEST['newpass'])){ if(!valid_pass($_REQUEST['newpass'])){
@ -2701,7 +2689,7 @@ function add_user_defaults(){
function validate_input(){ function validate_input(){
global $P, $U, $db; global $P, $U, $db;
$inboxes=[]; $inbox=false;
$maxmessage=get_setting('maxmessage'); $maxmessage=get_setting('maxmessage');
$U['message']=substr($_REQUEST['message'], 0, $maxmessage); $U['message']=substr($_REQUEST['message'], 0, $maxmessage);
$U['rejected']=substr($_REQUEST['message'], $maxmessage); $U['rejected']=substr($_REQUEST['message'], $maxmessage);
@ -2749,22 +2737,18 @@ function validate_input(){
if(get_setting('disablepm')){ if(get_setting('disablepm')){
return; return;
} }
$stmt=$db->prepare('SELECT * FROM ' . PREFIX . 'ignored WHERE (ignby=? AND ign=?) OR (ignby=? AND ign=?);'); $stmt=$db->prepare('SELECT nickname, style, status FROM ' . PREFIX . 'members WHERE nickname=? AND eninbox!=0 AND eninbox<=? AND nickname NOT IN (SELECT nickname FROM ' . PREFIX . 'sessions WHERE incognito=0) AND nickname NOT IN (SELECT ign FROM ' . PREFIX . 'ignored WHERE ignby=?) AND nickname NOT IN (SELECT ignby FROM ' . PREFIX . 'ignored WHERE ign=?);');
$stmt->execute(array($U['nickname'], $_REQUEST['sendto'], $_REQUEST['sendto'], $U['nickname'])); $stmt->execute(array($_REQUEST['sendto'], $U['status'], $U['nickname'], $U['nickname']));
if(!$stmt->fetch(PDO::FETCH_NUM)){ if($tmp=$stmt->fetch(PDO::FETCH_ASSOC)){
$stmt=$db->prepare('SELECT nickname, style, status FROM ' . PREFIX . 'members WHERE eninbox!=0 AND eninbox<=? AND nickname NOT IN (SELECT nickname FROM ' . PREFIX . 'sessions WHERE incognito=0) AND nickname NOT IN (SELECT ign FROM ' . PREFIX . 'ignored WHERE ignby=?) AND nickname NOT IN (SELECT ignby FROM ' . PREFIX . 'ignored WHERE ign=?);'); $P[$tmp['nickname']]=[$tmp['nickname'], $tmp['style'], $tmp['status'], $tmp['nickname']];
$stmt->execute(array($U['status'], $U['nickname'], $U['nickname'])); $inbox=true;
while($tmp=$stmt->fetch(PDO::FETCH_ASSOC)){ }
$P[$tmp['nickname']]=[$tmp['nickname'], $tmp['style'], $tmp['status'], $tmp['nickname']]; if(isSet($P[$_REQUEST['sendto']])){
$inboxes[$tmp['nickname']]=true; $U['recipient']=$P[$_REQUEST['sendto']][0];
} $U['displayrecp']=style_this($U['recipient'], $P[$_REQUEST['sendto']][1]);
if(isSet($P[$_REQUEST['sendto']])){ $U['poststatus']='9';
$U['recipient']=$P[$_REQUEST['sendto']][0]; $U['delstatus']='9';
$U['displayrecp']=style_this($U['recipient'], $P[$_REQUEST['sendto']][1]); $U['displaysend']=sprintf(get_setting('msgsendprv'), style_this($U['nickname'], $U['style']), $U['displayrecp']);
$U['poststatus']='9';
$U['delstatus']='9';
$U['displaysend']=sprintf(get_setting('msgsendprv'), style_this($U['nickname'], $U['style']), $U['displayrecp']);
}
} }
if(empty($U['recipient'])){// nick left already or ignores us if(empty($U['recipient'])){// nick left already or ignores us
$U['message']=''; $U['message']='';
@ -2779,7 +2763,7 @@ function validate_input(){
$U['lastpost']=time(); $U['lastpost']=time();
$stmt=$db->prepare('UPDATE ' . PREFIX . 'sessions SET lastpost=?, postid=? WHERE session=?;'); $stmt=$db->prepare('UPDATE ' . PREFIX . 'sessions SET lastpost=?, postid=? WHERE session=?;');
$stmt->execute(array($U['lastpost'], $_REQUEST['postid'], $U['session'])); $stmt->execute(array($U['lastpost'], $_REQUEST['postid'], $U['session']));
if(isSet($inboxes[$_REQUEST['sendto']])){ if($inbox){
$message=array( $message=array(
'postdate' =>time(), 'postdate' =>time(),
'poster' =>$U['nickname'], 'poster' =>$U['nickname'],
@ -3192,17 +3176,6 @@ function save_setup(){
} }
} }
function get_ignored($name){
global $db;
$ignored=array();
$stmt=$db->prepare('SELECT ign, ignby FROM ' . PREFIX . 'ignored WHERE ign=? OR ignby=?;');
$stmt->execute([$name, $name]);
while($tmp=$stmt->fetch(PDO::FETCH_ASSOC)){
$ignored[]=['ignored'=>$tmp['ign'], 'by'=>$tmp['ignby']];
}
return $ignored;
}
function valid_admin(){ function valid_admin(){
global $U; global $U;
if(isSet($_REQUEST['session'])){ if(isSet($_REQUEST['session'])){
@ -3560,6 +3533,9 @@ function update_db(){
$memcached->delete(DBNAME . '-' . PREFIX . "settings-enablejs"); $memcached->delete(DBNAME . '-' . PREFIX . "settings-enablejs");
} }
} }
if($dbversion<24){
$db->exec('DELETE FROM ' . PREFIX . 'ignored WHERE id IN (SELECT id FROM (SELECT ' . PREFIX . 'ignored.id, ign, ignby FROM ' . PREFIX . 'ignored, ' . PREFIX . 'members WHERE nickname=ignby AND status < (SELECT status FROM ' . PREFIX . 'members WHERE nickname=ign) ) AS t);');
}
update_setting('dbversion', DBVERSION); update_setting('dbversion', DBVERSION);
if(get_setting('msgencrypted')!=MSGENCRYPTED){ if(get_setting('msgencrypted')!=MSGENCRYPTED){
if(!extension_loaded('openssl')){ if(!extension_loaded('openssl')){
@ -3749,7 +3725,7 @@ function load_lang(){
function load_config(){ function load_config(){
date_default_timezone_set('UTC'); date_default_timezone_set('UTC');
define('VERSION', '1.20.5'); // Script version define('VERSION', '1.20.5'); // Script version
define('DBVERSION', 23); // Database version define('DBVERSION', 24); // Database version
define('MSGENCRYPTED', false); // Store messages encrypted in the database to prevent other database users from reading them - true/false - visit the setup page after editing! define('MSGENCRYPTED', false); // Store messages encrypted in the database to prevent other database users from reading them - true/false - visit the setup page after editing!
define('ENCRYPTKEY', 'MY_KEY'); // Encryption key for messages define('ENCRYPTKEY', 'MY_KEY'); // Encryption key for messages
define('DBHOST', 'localhost'); // Database host define('DBHOST', 'localhost'); // Database host