Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

mcp_post.php

Zuletzt modifiziert: 09.10.2024, 12:52 - Dateigröße: 20.82 KiB


001  <?php
002  /**
003  *
004  * This file is part of the phpBB Forum Software package.
005  *
006  * @copyright (c) phpBB Limited <https://www.phpbb.com>
007  * @license GNU General Public License, version 2 (GPL-2.0)
008  *
009  * For full copyright and license information, please see
010  * the docs/CREDITS.txt file.
011  *
012  */
013   
014  /**
015  * @ignore
016  */
017  if (!defined('IN_PHPBB'))
018  {
019      exit;
020  }
021   
022  /**
023  * Handling actions in post details screen
024  */
025  function mcp_post_details($id, $mode, $action)
026  {
027      global $phpEx, $phpbb_root_path, $config, $request;
028      global $template, $db, $user, $auth;
029      global $phpbb_dispatcher;
030   
031      $user->add_lang('posting');
032   
033      $post_id = $request->variable('p', 0);
034      $start    = $request->variable('start', 0);
035   
036      // Get post data
037      $post_info = phpbb_get_post_data(array($post_id), false, true);
038   
039      add_form_key('mcp_post_details');
040   
041      if (!sizeof($post_info))
042      {
043          trigger_error('POST_NOT_EXIST');
044      }
045   
046      $post_info = $post_info[$post_id];
047      $url = append_sid("{$phpbb_root_path}mcp.$phpEx?" . phpbb_extra_url());
048   
049      switch ($action)
050      {
051          case 'whois':
052   
053              if ($auth->acl_get('m_info', $post_info['forum_id']))
054              {
055                  $ip = $request->variable('ip', '');
056                  include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
057   
058                  $template->assign_vars(array(
059                      'RETURN_POST'    => sprintf($user->lang['RETURN_POST'], '<a href="' . append_sid("{$phpbb_root_path}mcp.$phpEx", "i=$id&amp;mode=$mode&amp;p=$post_id") . '">', '</a>'),
060                      'U_RETURN_POST'    => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=$id&amp;mode=$mode&amp;p=$post_id"),
061                      'L_RETURN_POST'    => sprintf($user->lang['RETURN_POST'], '', ''),
062                      'WHOIS'            => user_ipwhois($ip),
063                  ));
064              }
065   
066              // We're done with the whois page so return
067              return;
068   
069          break;
070   
071          case 'chgposter':
072          case 'chgposter_ip':
073   
074              if ($action == 'chgposter')
075              {
076                  $username = $request->variable('username', '', true);
077                  $sql_where = "username_clean = '" . $db->sql_escape(utf8_clean_string($username)) . "'";
078              }
079              else
080              {
081                  $new_user_id = $request->variable('u', 0);
082                  $sql_where = 'user_id = ' . $new_user_id;
083              }
084   
085              $sql = 'SELECT *
086                  FROM ' . USERS_TABLE . '
087                  WHERE ' . $sql_where;
088              $result = $db->sql_query($sql);
089              $row = $db->sql_fetchrow($result);
090              $db->sql_freeresult($result);
091   
092              if (!$row)
093              {
094                  trigger_error('NO_USER');
095              }
096   
097              if ($auth->acl_get('m_chgposter', $post_info['forum_id']))
098              {
099                  if (check_form_key('mcp_post_details'))
100                  {
101                      change_poster($post_info, $row);
102                  }
103                  else
104                  {
105                      trigger_error('FORM_INVALID');
106                  }
107              }
108   
109          break;
110   
111          default:
112   
113              /**
114              * This event allows you to handle custom post moderation options
115              *
116              * @event core.mcp_post_additional_options
117              * @var    string    action        Post moderation action name
118              * @var    array    post_info    Information on the affected post
119              * @since 3.1.5-RC1
120              */
121              $vars = array('action', 'post_info');
122              extract($phpbb_dispatcher->trigger_event('core.mcp_post_additional_options', compact($vars)));
123   
124          break;
125      }
126   
127      // Set some vars
128      $users_ary = $usernames_ary = array();
129      $attachments = $extensions = array();
130      $post_id = $post_info['post_id'];
131   
132      // Get topic tracking info
133      if ($config['load_db_lastread'])
134      {
135          $tmp_topic_data = array($post_info['topic_id'] => $post_info);
136          $topic_tracking_info = get_topic_tracking($post_info['forum_id'], $post_info['topic_id'], $tmp_topic_data, array($post_info['forum_id'] => $post_info['forum_mark_time']));
137          unset($tmp_topic_data);
138      }
139      else
140      {
141          $topic_tracking_info = get_complete_topic_tracking($post_info['forum_id'], $post_info['topic_id']);
142      }
143   
144      $post_unread = (isset($topic_tracking_info[$post_info['topic_id']]) && $post_info['post_time'] > $topic_tracking_info[$post_info['topic_id']]) ? true : false;
145   
146      // Process message, leave it uncensored
147      $parse_flags = ($post_info['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES;
148      $message = generate_text_for_display($post_info['post_text'], $post_info['bbcode_uid'], $post_info['bbcode_bitfield'], $parse_flags, false);
149   
150      if ($post_info['post_attachment'] && $auth->acl_get('u_download') && $auth->acl_get('f_download', $post_info['forum_id']))
151      {
152          $sql = 'SELECT *
153              FROM ' . ATTACHMENTS_TABLE . '
154              WHERE post_msg_id = ' . $post_id . '
155                  AND in_message = 0
156              ORDER BY filetime DESC, post_msg_id ASC';
157          $result = $db->sql_query($sql);
158   
159          while ($row = $db->sql_fetchrow($result))
160          {
161              $attachments[] = $row;
162          }
163          $db->sql_freeresult($result);
164   
165          if (sizeof($attachments))
166          {
167              $user->add_lang('viewtopic');
168              $update_count = array();
169              parse_attachments($post_info['forum_id'], $message, $attachments, $update_count);
170          }
171   
172          // Display not already displayed Attachments for this post, we already parsed them. ;)
173          if (!empty($attachments))
174          {
175              $template->assign_var('S_HAS_ATTACHMENTS', true);
176   
177              foreach ($attachments as $attachment)
178              {
179                  $template->assign_block_vars('attachment', array(
180                      'DISPLAY_ATTACHMENT'    => $attachment)
181                  );
182              }
183          }
184      }
185   
186      // Deleting information
187      if ($post_info['post_visibility'] == ITEM_DELETED && $post_info['post_delete_user'])
188      {
189          // User having deleted the post also being the post author?
190          if (!$post_info['post_delete_user'] || $post_info['post_delete_user'] == $post_info['poster_id'])
191          {
192              $display_username = get_username_string('full', $post_info['poster_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']);
193          }
194          else
195          {
196              $sql = 'SELECT user_id, username, user_colour
197                  FROM ' . USERS_TABLE . '
198                  WHERE user_id = ' . (int) $post_info['post_delete_user'];
199              $result = $db->sql_query($sql);
200              $user_delete_row = $db->sql_fetchrow($result);
201              $db->sql_freeresult($result);
202              $display_username = get_username_string('full', $post_info['post_delete_user'], $user_delete_row['username'], $user_delete_row['user_colour']);
203          }
204   
205          $user->add_lang('viewtopic');
206          $l_deleted_by = $user->lang('DELETED_INFORMATION', $display_username, $user->format_date($post_info['post_delete_time'], false, true));
207      }
208      else
209      {
210          $l_deleted_by = '';
211      }
212   
213      $mcp_post_template_data = array(
214          'U_MCP_ACTION'            => "$url&amp;i=main&amp;quickmod=1&amp;mode=post_details", // Use this for mode paramaters
215          'U_POST_ACTION'            => "$url&amp;i=$id&amp;mode=post_details", // Use this for action parameters
216          'U_APPROVE_ACTION'        => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&amp;p=$post_id&amp;f={$post_info['forum_id']}"),
217   
218          'S_CAN_VIEWIP'            => $auth->acl_get('m_info', $post_info['forum_id']),
219          'S_CAN_CHGPOSTER'        => $auth->acl_get('m_chgposter', $post_info['forum_id']),
220          'S_CAN_LOCK_POST'        => $auth->acl_get('m_lock', $post_info['forum_id']),
221          'S_CAN_DELETE_POST'        => $auth->acl_get('m_delete', $post_info['forum_id']),
222   
223          'S_POST_REPORTED'        => ($post_info['post_reported']) ? true : false,
224          'S_POST_UNAPPROVED'        => ($post_info['post_visibility'] == ITEM_UNAPPROVED || $post_info['post_visibility'] == ITEM_REAPPROVE) ? true : false,
225          'S_POST_DELETED'        => ($post_info['post_visibility'] == ITEM_DELETED) ? true : false,
226          'S_POST_LOCKED'            => ($post_info['post_edit_locked']) ? true : false,
227          'S_USER_NOTES'            => true,
228          'S_CLEAR_ALLOWED'        => ($auth->acl_get('a_clearlogs')) ? true : false,
229          'DELETED_MESSAGE'        => $l_deleted_by,
230          'DELETE_REASON'            => $post_info['post_delete_reason'],
231   
232          'U_EDIT'                => ($auth->acl_get('m_edit', $post_info['forum_id'])) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=edit&amp;f={$post_info['forum_id']}&amp;p={$post_info['post_id']}") : '',
233          'U_FIND_USERNAME'        => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&amp;form=mcp_chgposter&amp;field=username&amp;select_single=true'),
234          'U_MCP_APPROVE'            => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=approve_details&amp;f=' . $post_info['forum_id'] . '&amp;p=' . $post_id),
235          'U_MCP_REPORT'            => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=report_details&amp;f=' . $post_info['forum_id'] . '&amp;p=' . $post_id),
236          'U_MCP_USER_NOTES'        => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=notes&amp;mode=user_notes&amp;u=' . $post_info['user_id']),
237          'U_MCP_WARN_USER'        => ($auth->acl_get('m_warn')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=warn&amp;mode=warn_user&amp;u=' . $post_info['user_id']) : '',
238          'U_VIEW_POST'            => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $post_info['forum_id'] . '&amp;p=' . $post_info['post_id'] . '#p' . $post_info['post_id']),
239          'U_VIEW_TOPIC'            => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $post_info['forum_id'] . '&amp;t=' . $post_info['topic_id']),
240   
241          'MINI_POST_IMG'            => ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'),
242   
243          'RETURN_TOPIC'            => sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f={$post_info['forum_id']}&amp;p=$post_id") . "#p$post_id\">", '</a>'),
244          'RETURN_FORUM'            => sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", "f={$post_info['forum_id']}&amp;start={$start}") . '">', '</a>'),
245          'REPORTED_IMG'            => $user->img('icon_topic_reported', $user->lang['POST_REPORTED']),
246          'UNAPPROVED_IMG'        => $user->img('icon_topic_unapproved', $user->lang['POST_UNAPPROVED']),
247          'DELETED_IMG'            => $user->img('icon_topic_deleted', $user->lang['POST_DELETED']),
248          'EDIT_IMG'                => $user->img('icon_post_edit', $user->lang['EDIT_POST']),
249          'SEARCH_IMG'            => $user->img('icon_user_search', $user->lang['SEARCH']),
250   
251          'POST_AUTHOR_FULL'        => get_username_string('full', $post_info['user_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']),
252          'POST_AUTHOR_COLOUR'    => get_username_string('colour', $post_info['user_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']),
253          'POST_AUTHOR'            => get_username_string('username', $post_info['user_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']),
254          'U_POST_AUTHOR'            => get_username_string('profile', $post_info['user_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']),
255   
256          'POST_PREVIEW'            => $message,
257          'POST_SUBJECT'            => $post_info['post_subject'],
258          'POST_DATE'                => $user->format_date($post_info['post_time']),
259          'POST_IP'                => $post_info['poster_ip'],
260          'POST_IPADDR'            => ($auth->acl_get('m_info', $post_info['forum_id']) && $request->variable('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '',
261          'POST_ID'                => $post_info['post_id'],
262   
263          'U_LOOKUP_IP'            => ($auth->acl_get('m_info', $post_info['forum_id'])) ? "$url&amp;i=$id&amp;mode=$mode&amp;lookup={$post_info['poster_ip']}#ip" : '',
264          'U_WHOIS'                => ($auth->acl_get('m_info', $post_info['forum_id'])) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=$id&amp;mode=$mode&amp;action=whois&amp;p=$post_id&amp;ip={$post_info['poster_ip']}") : '',
265      );
266   
267      $s_additional_opts = false;
268   
269      /**
270      * Event to add/modify MCP post template data
271      *
272      * @event core.mcp_post_template_data
273      * @var    array    post_info                    Array with the post information
274      * @var    array    mcp_post_template_data        Array with the MCP post template data
275      * @var    array    attachments                    Array with the post attachments, if any
276      * @var    bool    s_additional_opts            Must be set to true in extension if additional options are presented in MCP post panel
277      * @since 3.1.5-RC1
278      */
279      $vars = array(
280          'post_info',
281          'mcp_post_template_data',
282          'attachments',
283          's_additional_opts',
284      );
285      extract($phpbb_dispatcher->trigger_event('core.mcp_post_template_data', compact($vars)));
286   
287      $template->assign_vars($mcp_post_template_data);
288      $template->assign_var('S_MCP_POST_ADDITIONAL_OPTS', $s_additional_opts);
289   
290      unset($mcp_post_template_data);
291   
292      // Get User Notes
293      $log_data = array();
294      $log_count = false;
295      view_log('user', $log_data, $log_count, $config['posts_per_page'], 0, 0, 0, $post_info['user_id']);
296   
297      if (!empty($log_data))
298      {
299          $template->assign_var('S_USER_NOTES', true);
300   
301          foreach ($log_data as $row)
302          {
303              $template->assign_block_vars('usernotes', array(
304                  'REPORT_BY'        => $row['username_full'],
305                  'REPORT_AT'        => $user->format_date($row['time']),
306                  'ACTION'        => $row['action'],
307                  'ID'            => $row['id'])
308              );
309          }
310      }
311   
312      // Get Reports
313      if ($auth->acl_get('m_report', $post_info['forum_id']))
314      {
315          $sql = 'SELECT r.*, re.*, u.user_id, u.username
316              FROM ' . REPORTS_TABLE . ' r, ' . USERS_TABLE . ' u, ' . REPORTS_REASONS_TABLE . " re
317              WHERE r.post_id = $post_id
318                  AND r.reason_id = re.reason_id
319                  AND u.user_id = r.user_id
320              ORDER BY r.report_time DESC";
321          $result = $db->sql_query($sql);
322   
323          if ($row = $db->sql_fetchrow($result))
324          {
325              $template->assign_var('S_SHOW_REPORTS', true);
326   
327              do
328              {
329                  // If the reason is defined within the language file, we will use the localized version, else just use the database entry...
330                  if (isset($user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])]) && isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])]))
331                  {
332                      $row['reson_description'] = $user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])];
333                      $row['reason_title'] = $user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])];
334                  }
335   
336                  $template->assign_block_vars('reports', array(
337                      'REPORT_ID'        => $row['report_id'],
338                      'REASON_TITLE'    => $row['reason_title'],
339                      'REASON_DESC'    => $row['reason_description'],
340                      'REPORTER'        => get_username_string('username', $row['user_id'], $row['username']),
341                      'U_REPORTER'    => get_username_string('profile', $row['user_id'], $row['username']),
342                      'USER_NOTIFY'    => ($row['user_notify']) ? true : false,
343                      'REPORT_TIME'    => $user->format_date($row['report_time']),
344                      'REPORT_TEXT'    => bbcode_nl2br(trim($row['report_text'])),
345                  ));
346              }
347              while ($row = $db->sql_fetchrow($result));
348          }
349          $db->sql_freeresult($result);
350      }
351   
352      // Get IP
353      if ($auth->acl_get('m_info', $post_info['forum_id']))
354      {
355          $rdns_ip_num = $request->variable('rdns', '');
356   
357          if ($rdns_ip_num != 'all')
358          {
359              $template->assign_vars(array(
360                  'U_LOOKUP_ALL'    => "$url&amp;i=main&amp;mode=post_details&amp;rdns=all")
361              );
362          }
363   
364          // Get other users who've posted under this IP
365          $sql = 'SELECT poster_id, COUNT(poster_id) as postings
366              FROM ' . POSTS_TABLE . "
367              WHERE poster_ip = '" . $db->sql_escape($post_info['poster_ip']) . "'
368              GROUP BY poster_id
369              ORDER BY postings DESC";
370          $result = $db->sql_query($sql);
371   
372          while ($row = $db->sql_fetchrow($result))
373          {
374              // Fill the user select list with users who have posted under this IP
375              if ($row['poster_id'] != $post_info['poster_id'])
376              {
377                  $users_ary[$row['poster_id']] = $row;
378              }
379          }
380          $db->sql_freeresult($result);
381   
382          if (sizeof($users_ary))
383          {
384              // Get the usernames
385              $sql = 'SELECT user_id, username
386                  FROM ' . USERS_TABLE . '
387                  WHERE ' . $db->sql_in_set('user_id', array_keys($users_ary));
388              $result = $db->sql_query($sql);
389   
390              while ($row = $db->sql_fetchrow($result))
391              {
392                  $users_ary[$row['user_id']]['username'] = $row['username'];
393                  $usernames_ary[utf8_clean_string($row['username'])] = $users_ary[$row['user_id']];
394              }
395              $db->sql_freeresult($result);
396   
397              foreach ($users_ary as $user_id => $user_row)
398              {
399                  $template->assign_block_vars('userrow', array(
400                      'USERNAME'        => get_username_string('username', $user_id, $user_row['username']),
401                      'NUM_POSTS'        => $user_row['postings'],
402                      'L_POST_S'        => ($user_row['postings'] == 1) ? $user->lang['POST'] : $user->lang['POSTS'],
403   
404                      'U_PROFILE'        => get_username_string('profile', $user_id, $user_row['username']),
405                      'U_SEARCHPOSTS' => append_sid("{$phpbb_root_path}search.$phpEx", 'author_id=' . $user_id . '&amp;sr=topics'))
406                  );
407              }
408          }
409   
410          // Get other IP's this user has posted under
411   
412          // A compound index on poster_id, poster_ip (posts table) would help speed up this query a lot,
413          // but the extra size is only valuable if there are persons having more than a thousands posts.
414          // This is better left to the really really big forums.
415   
416          $sql = 'SELECT poster_ip, COUNT(poster_ip) AS postings
417              FROM ' . POSTS_TABLE . '
418              WHERE poster_id = ' . $post_info['poster_id'] . "
419              GROUP BY poster_ip
420              ORDER BY postings DESC";
421          $result = $db->sql_query($sql);
422   
423          while ($row = $db->sql_fetchrow($result))
424          {
425              $hostname = (($rdns_ip_num == $row['poster_ip'] || $rdns_ip_num == 'all') && $row['poster_ip']) ? @gethostbyaddr($row['poster_ip']) : '';
426   
427              $template->assign_block_vars('iprow', array(
428                  'IP'            => $row['poster_ip'],
429                  'HOSTNAME'        => $hostname,
430                  'NUM_POSTS'        => $row['postings'],
431                  'L_POST_S'        => ($row['postings'] == 1) ? $user->lang['POST'] : $user->lang['POSTS'],
432   
433                  'U_LOOKUP_IP'    => ($rdns_ip_num == $row['poster_ip'] || $rdns_ip_num == 'all') ? '' : "$url&amp;i=$id&amp;mode=post_details&amp;rdns={$row['poster_ip']}#ip",
434                  'U_WHOIS'        => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=$id&amp;mode=$mode&amp;action=whois&amp;p=$post_id&amp;ip={$row['poster_ip']}"))
435              );
436          }
437          $db->sql_freeresult($result);
438   
439          $user_select = '';
440   
441          if (sizeof($usernames_ary))
442          {
443              ksort($usernames_ary);
444   
445              foreach ($usernames_ary as $row)
446              {
447                  $user_select .= '<option value="' . $row['poster_id'] . '">' . $row['username'] . "</option>\n";
448              }
449          }
450   
451          $template->assign_var('S_USER_SELECT', $user_select);
452      }
453   
454  }
455   
456  /**
457  * Change a post's poster
458  */
459  function change_poster(&$post_info, $userdata)
460  {
461      global $auth, $db, $config, $phpbb_root_path, $phpEx, $user, $phpbb_log, $phpbb_dispatcher;
462   
463      if (empty($userdata) || $userdata['user_id'] == $post_info['user_id'])
464      {
465          return;
466      }
467   
468      $post_id = $post_info['post_id'];
469   
470      $sql = 'UPDATE ' . POSTS_TABLE . "
471          SET poster_id = {$userdata['user_id']}
472          WHERE post_id = $post_id";
473      $db->sql_query($sql);
474   
475      // Resync topic/forum if needed
476      if ($post_info['topic_last_post_id'] == $post_id || $post_info['forum_last_post_id'] == $post_id || $post_info['topic_first_post_id'] == $post_id)
477      {
478          sync('topic', 'topic_id', $post_info['topic_id'], false, false);
479          sync('forum', 'forum_id', $post_info['forum_id'], false, false);
480      }
481   
482      // Adjust post counts... only if the post is approved (else, it was not added the users post count anyway)
483      if ($post_info['post_postcount'] && $post_info['post_visibility'] == ITEM_APPROVED)
484      {
485          $sql = 'UPDATE ' . USERS_TABLE . '
486              SET user_posts = user_posts - 1
487              WHERE user_id = ' . $post_info['user_id'] .'
488              AND user_posts > 0';
489          $db->sql_query($sql);
490   
491          $sql = 'UPDATE ' . USERS_TABLE . '
492              SET user_posts = user_posts + 1
493              WHERE user_id = ' . $userdata['user_id'];
494          $db->sql_query($sql);
495      }
496   
497      // Add posted to information for this topic for the new user
498      markread('post', $post_info['forum_id'], $post_info['topic_id'], time(), $userdata['user_id']);
499   
500      // Remove the dotted topic option if the old user has no more posts within this topic
501      if ($config['load_db_track'] && $post_info['user_id'] != ANONYMOUS)
502      {
503          $sql = 'SELECT topic_id
504              FROM ' . POSTS_TABLE . '
505              WHERE topic_id = ' . $post_info['topic_id'] . '
506                  AND poster_id = ' . $post_info['user_id'];
507          $result = $db->sql_query_limit($sql, 1);
508          $topic_id = (int) $db->sql_fetchfield('topic_id');
509          $db->sql_freeresult($result);
510   
511          if (!$topic_id)
512          {
513              $sql = 'DELETE FROM ' . TOPICS_POSTED_TABLE . '
514                  WHERE user_id = ' . $post_info['user_id'] . '
515                      AND topic_id = ' . $post_info['topic_id'];
516              $db->sql_query($sql);
517          }
518      }
519   
520      // change the poster_id within the attachments table, else the data becomes out of sync and errors displayed because of wrong ownership
521      if ($post_info['post_attachment'])
522      {
523          $sql = 'UPDATE ' . ATTACHMENTS_TABLE . '
524              SET poster_id = ' . $userdata['user_id'] . '
525              WHERE poster_id = ' . $post_info['user_id'] . '
526                  AND post_msg_id = ' . $post_info['post_id'] . '
527                  AND topic_id = ' . $post_info['topic_id'];
528          $db->sql_query($sql);
529      }
530   
531      // refresh search cache of this post
532      $search_type = $config['search_type'];
533   
534      if (class_exists($search_type))
535      {
536          // We do some additional checks in the module to ensure it can actually be utilised
537          $error = false;
538          $search = new $search_type($error, $phpbb_root_path, $phpEx, $auth, $config, $db, $user, $phpbb_dispatcher);
539   
540          if (!$error && method_exists($search, 'destroy_cache'))
541          {
542              $search->destroy_cache(array(), array($post_info['user_id'], $userdata['user_id']));
543          }
544      }
545   
546      $from_username = $post_info['username'];
547      $to_username = $userdata['username'];
548   
549      /**
550      * This event allows you to perform additional tasks after changing a post's poster
551      *
552      * @event core.mcp_change_poster_after
553      * @var    array    userdata    Information on a post's new poster
554      * @var    array    post_info    Information on the affected post
555      * @since 3.1.6-RC1
556      * @changed 3.1.7-RC1        Change location to prevent post_info from being set to the new post information
557      */
558      $vars = array('userdata', 'post_info');
559      extract($phpbb_dispatcher->trigger_event('core.mcp_change_poster_after', compact($vars)));
560   
561      // Renew post info
562      $post_info = phpbb_get_post_data(array($post_id), false, true);
563   
564      if (!sizeof($post_info))
565      {
566          trigger_error('POST_NOT_EXIST');
567      }
568   
569      $post_info = $post_info[$post_id];
570   
571      // Now add log entry
572      $phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_MCP_CHANGE_POSTER', false, array(
573          'forum_id' => $post_info['forum_id'],
574          'topic_id' => $post_info['topic_id'],
575          'post_id'  => $post_info['post_id'],
576          $post_info['topic_title'],
577          $from_username,
578          $to_username
579      ));
580  }
581