Ok, the modification to editpost.php has a logic error in it.
You test two conditions in a nested double test:
Was post made anon?
- Yes
-- was it anon before?
---Yes set a bunch of vars incl $threadupdate
---No set a bunch of vars incl $threadupdate
- No
-- was it anon before?
---Yes set a bunch of vars incl $threadupdate
---No set a bunch of vars incl $threadupdate
Then you later have logic twice to update the thread
// if (!empty($threadupdate))
$threadupdate will never be empty in either case.
Net effect: When a thread is posted and someone replies to it and then edits their reply, thread.postusername and thread.postuserid are overwridden inappropriately and the 2nd threadupdate . Thread should only be updated with anon/real user names and IDs if the OP is edited.
This is the change I made to the entire code set of editpost.php following
delete_post_index($postid);
PHP Code:
// The post is made anonymously
if ($edit['postanon'])
{
// Check to see if it was made anonymously BEFORE the edit
if ($postinfo['postanon'])
{
$edit['postusername']= $postinfo['username'];
$edit['userid'] = $postinfo['userid'];
$edit['postanon'] = $postinfo['postanon'];
$edit['anonname'] = $postinfo['username'];
if($threadinfo[firstpostid] == $postinfo[postid])
{
$threadupdate[] = "postusername = '" . addslashes(htmlspecialchars_uni($edit['postusername'])) . "',anonname = '" . addslashes(htmlspecialchars_uni($edit['anonname'])) . "', postanon = $edit[postanon]";
}
$forumupdate = "anonname = '" . addslashes(htmlspecialchars_uni($edit['anonname'])) . "', postanon = $edit[postanon]";
}
// If not, we need to set the values.
else
{
// This isn't exactly right. But, most times, it will work.
$edit['postusername']= $usergroupcache["$bbuserinfo[usergroupid]"]['anonname'];
$edit['postusername']= $threadinfo[postusername];
$edit['userid'] = 256;
$edit['postanon'] = $postinfo['userid'];
$edit['anonname'] = $postinfo['username'];
if($threadinfo[firstpostid] == $postinfo[postid])
{
$threadupdate[] = "postusername = '" . addslashes(htmlspecialchars_uni($edit['postusername'])) . "',anonname = '" . addslashes(htmlspecialchars_uni($edit['anonname'])) . "', postanon = $edit[postanon]";
}
$forumupdate = "anonname = '" . addslashes(htmlspecialchars_uni($edit['anonname'])) . "', postanon = $edit[postanon]";
}
}
// The post is no longer made anonymously
else
{
// Check to see if it was made anonymously BEFORE the edit.
if ($postinfo['postanon'])
{
$edit['postusername']= $postinfo['anonname'];
$edit['userid'] = $postinfo['postanon'];
$edit['postanon'] = 0;
$edit['anonname'] = "";
if($threadinfo[firstpostid] == $postinfo[postid])
{
$threadupdate[] = "postusername = '" . addslashes(htmlspecialchars_uni($edit['postusername'])) . "',anonname = '" . addslashes(htmlspecialchars_uni($edit['anonname'])) . "', postanon = $edit[postanon]";
}
$forumupdate = "anonname = '" . addslashes(htmlspecialchars_uni($edit['anonname'])) . "', postanon = $edit[postanon]";
}
else
{
$edit['postanon'] = 0;
$edit['anonname'] = "";
$edit['userid'] = $postinfo['userid'];
$edit['postusername'] = $postinfo['username'];
if($threadinfo[firstpostid] == $postinfo[postid])
{
$threadupdate[] = "postusername = '" . addslashes(htmlspecialchars_uni($edit['postusername'])) . "',anonname = '" . addslashes(htmlspecialchars_uni($edit['anonname'])) . "', postanon = $edit[postanon]";
}
$forumupdate = "anonname = '" . addslashes(htmlspecialchars_uni($edit['anonname'])) . "', postanon = $edit[postanon]";
}
}
if (!empty($threadupdate))
{
// do thread update
$DB_site->query("
UPDATE " . TABLE_PREFIX . "thread
SET " . implode(', ', $threadupdate) . "
WHERE threadid = $threadinfo[threadid]
");
}
if ($foruminfo['lastposter'] == $postinfo['username'])
{
// this thread is the one being displayed as the thread with the last post...
$forumupdate = "lastposter = '" . addslashes(htmlspecialchars_uni($edit['postusername'])) . "', postanon = $edit[postanon]";
}
if ($threadinfo['lastposter'] == $postinfo['username'])
{
// this post is the one being displayed as the thread with the last post...
$threadupdate[] = "lastposter = '" . addslashes(htmlspecialchars_uni($edit['postusername'])) . "',anonname = '" . addslashes(htmlspecialchars_uni($edit['anonname'])) . "', postanon = $edit[postanon]";
}
if (!empty($threadupdate))
{
// do thread update
$DB_site->query("
UPDATE " . TABLE_PREFIX . "thread
SET " . implode(', ', $threadupdate) . "
WHERE threadid = $threadinfo[threadid]
");
}
You will see, I wrapped all updates to $threadupdate in a conditional validating that the post edited is the first post in the thread.
I also removed "postuserid = $edit[userid]" in all spots in that code (it was in every update to $threadupdate).