Verzeichnisstruktur phpBB-3.3.15


Veröffentlicht
28.08.2024

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_reports.php

Zuletzt modifiziert: 02.04.2025, 15:02 - Dateigröße: 32.20 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  * mcp_reports
024  * Handling the reports queue
025  */
026  class mcp_reports
027  {
028      var $p_master;
029      var $u_action;
030   
031      function __construct($p_master)
032      {
033          $this->p_master = $p_master;
034      }
035   
036      function main($id, $mode)
037      {
038          global $auth, $db, $user, $template, $request;
039          global $config, $phpbb_root_path, $phpEx, $action, $phpbb_container, $phpbb_dispatcher;
040   
041          include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
042   
043          $forum_id = $request->variable('f', 0);
044          $start = $request->variable('start', 0);
045   
046          $this->page_title = 'MCP_REPORTS';
047   
048          switch ($action)
049          {
050              case 'close':
051              case 'delete':
052                  include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
053   
054                  $report_id_list = $request->variable('report_id_list', array(0));
055   
056                  if (!count($report_id_list))
057                  {
058                      trigger_error('NO_REPORT_SELECTED');
059                  }
060   
061                  close_report($report_id_list, $mode, $action);
062   
063              break;
064          }
065   
066          switch ($mode)
067          {
068              case 'report_details':
069   
070                  $user->add_lang(array('posting', 'viewforum', 'viewtopic'));
071   
072                  $post_id = $request->variable('p', 0);
073   
074                  // closed reports are accessed by report id
075                  $report_id = $request->variable('r', 0);
076   
077                  $sql_ary = array(
078                      'SELECT'    => 'r.post_id, r.user_id, r.report_id, r.report_closed, report_time, r.report_text, r.reported_post_text, r.reported_post_uid, r.reported_post_bitfield, r.reported_post_enable_magic_url, r.reported_post_enable_smilies, r.reported_post_enable_bbcode, rr.reason_title, rr.reason_description, u.username, u.username_clean, u.user_colour',
079   
080                      'FROM'        => array(
081                          REPORTS_TABLE            => 'r',
082                          REPORTS_REASONS_TABLE    => 'rr',
083                          USERS_TABLE                => 'u',
084                      ),
085   
086                      'WHERE'        => (($report_id) ? 'r.report_id = ' . $report_id : "r.post_id = $post_id") . '
087                          AND rr.reason_id = r.reason_id
088                          AND r.user_id = u.user_id
089                          AND r.pm_id = 0',
090   
091                      'ORDER_BY'    => 'report_closed ASC',
092                  );
093   
094                  /**
095                  * Allow changing the query to obtain the user-submitted report.
096                  *
097                  * @event core.mcp_reports_report_details_query_before
098                  * @var    array    sql_ary            The array in the format of the query builder with the query
099                  * @var    int        forum_id        The forum_id, the number in the f GET parameter
100                  * @var    int        post_id            The post_id of the report being viewed (if 0, it is meaningless)
101                  * @var    int        report_id        The report_id of the report being viewed
102                  * @since 3.1.5-RC1
103                  */
104                  $vars = array(
105                      'sql_ary',
106                      'forum_id',
107                      'post_id',
108                      'report_id',
109                  );
110                  extract($phpbb_dispatcher->trigger_event('core.mcp_reports_report_details_query_before', compact($vars)));
111   
112                  $sql = $db->sql_build_query('SELECT', $sql_ary);
113                  $result = $db->sql_query_limit($sql, 1);
114                  $report = $db->sql_fetchrow($result);
115                  $db->sql_freeresult($result);
116   
117                  /**
118                  * Allow changing the data obtained from the user-submitted report.
119                  *
120                  * @event core.mcp_reports_report_details_query_after
121                  * @var    array    sql_ary        The array in the format of the query builder with the query that had been executted
122                  * @var    int        forum_id    The forum_id, the number in the f GET parameter
123                  * @var    int        post_id        The post_id of the report being viewed (if 0, it is meaningless)
124                  * @var    int        report_id    The report_id of the report being viewed
125                  * @var    array    report        The query's resulting row.
126                  * @since 3.1.5-RC1
127                  */
128                  $vars = array(
129                      'sql_ary',
130                      'forum_id',
131                      'post_id',
132                      'report_id',
133                      'report',
134                  );
135                  extract($phpbb_dispatcher->trigger_event('core.mcp_reports_report_details_query_after', compact($vars)));
136   
137                  if (!$report)
138                  {
139                      trigger_error('NO_REPORT');
140                  }
141   
142                  /* @var $phpbb_notifications \phpbb\notification\manager */
143                  $phpbb_notifications = $phpbb_container->get('notification_manager');
144   
145                  $phpbb_notifications->mark_notifications('report_post', $post_id, $user->data['user_id']);
146   
147                  if (!$report_id && $report['report_closed'])
148                  {
149                      trigger_error('REPORT_CLOSED');
150                  }
151   
152                  $post_id = $report['post_id'];
153                  $report_id = $report['report_id'];
154   
155                  $parse_post_flags = $report['reported_post_enable_bbcode'] ? OPTION_FLAG_BBCODE : 0;
156                  $parse_post_flags += $report['reported_post_enable_smilies'] ? OPTION_FLAG_SMILIES : 0;
157                  $parse_post_flags += $report['reported_post_enable_magic_url'] ? OPTION_FLAG_LINKS : 0;
158   
159                  $post_info = phpbb_get_post_data(array($post_id), 'm_report', true);
160   
161                  if (!count($post_info))
162                  {
163                      trigger_error('NO_REPORT_SELECTED');
164                  }
165   
166                  $post_info = $post_info[$post_id];
167   
168                  $reason = array('title' => $report['reason_title'], 'description' => $report['reason_description']);
169                  if (isset($user->lang['report_reasons']['TITLE'][strtoupper($reason['title'])]) && isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($reason['title'])]))
170                  {
171                      $reason['description'] = $user->lang['report_reasons']['DESCRIPTION'][strtoupper($reason['title'])];
172                      $reason['title'] = $user->lang['report_reasons']['TITLE'][strtoupper($reason['title'])];
173                  }
174   
175                  if (topic_review($post_info['topic_id'], $post_info['forum_id'], 'topic_review', 0, false))
176                  {
177                      $template->assign_vars(array(
178                          'S_TOPIC_REVIEW'    => true,
179                          'S_BBCODE_ALLOWED'    => $post_info['enable_bbcode'],
180                          'TOPIC_TITLE'        => $post_info['topic_title'],
181                          'REPORTED_POST_ID'    => $post_id,
182                      ));
183                  }
184   
185                  $attachments = array();
186                  // Get topic tracking info
187                  if ($config['load_db_lastread'])
188                  {
189                      $tmp_topic_data = array($post_info['topic_id'] => $post_info);
190                      $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']));
191                      unset($tmp_topic_data);
192                  }
193                  else
194                  {
195                      $topic_tracking_info = get_complete_topic_tracking($post_info['forum_id'], $post_info['topic_id']);
196                  }
197   
198                  $post_unread = (isset($topic_tracking_info[$post_info['topic_id']]) && $post_info['post_time'] > $topic_tracking_info[$post_info['topic_id']]) ? true : false;
199                  $message = generate_text_for_display(
200                      $report['reported_post_text'],
201                      $report['reported_post_uid'],
202                      $report['reported_post_bitfield'],
203                      $parse_post_flags,
204                      false
205                  );
206   
207                  $report['report_text'] = make_clickable(bbcode_nl2br($report['report_text']));
208   
209                  if ($post_info['post_attachment'] && $auth->acl_get('u_download') && $auth->acl_get('f_download', $post_info['forum_id']))
210                  {
211                      $sql = 'SELECT *
212                          FROM ' . ATTACHMENTS_TABLE . '
213                          WHERE post_msg_id = ' . $post_id . '
214                              AND in_message = 0
215                              AND filetime <= ' . (int) $report['report_time'] . '
216                          ORDER BY filetime DESC';
217                      $result = $db->sql_query($sql);
218   
219                      while ($row = $db->sql_fetchrow($result))
220                      {
221                          $attachments[] = $row;
222                      }
223                      $db->sql_freeresult($result);
224   
225                      if (count($attachments))
226                      {
227                          $update_count = array();
228                          parse_attachments($post_info['forum_id'], $message, $attachments, $update_count);
229                      }
230   
231                      // Display not already displayed Attachments for this post, we already parsed them. ;)
232                      if (!empty($attachments))
233                      {
234                          $template->assign_var('S_HAS_ATTACHMENTS', true);
235   
236                          foreach ($attachments as $attachment)
237                          {
238                              $template->assign_block_vars('attachment', array(
239                                  'DISPLAY_ATTACHMENT'    => $attachment)
240                              );
241                          }
242                      }
243                  }
244   
245                  // parse signature
246                  $parse_flags = ($post_info['user_sig_bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES;
247                  $post_info['user_sig'] = generate_text_for_display($post_info['user_sig'], $post_info['user_sig_bbcode_uid'], $post_info['user_sig_bbcode_bitfield'], $parse_flags, true);
248   
249                  $topic_id = (int) $post_info['topic_id'];
250   
251                  // So it can be sent through the event below.
252                  $report_template = array(
253                      'S_MCP_REPORT'            => true,
254                      'S_CLOSE_ACTION'        => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=report_details&amp;p=' . $post_id),
255                      'S_CAN_APPROVE'            => $auth->acl_get('m_approve', $post_info['forum_id']),
256                      'S_CAN_VIEWIP'            => $auth->acl_get('m_info', $post_info['forum_id']),
257                      'S_POST_REPORTED'        => $post_info['post_reported'],
258                      'S_POST_UNAPPROVED'        => $post_info['post_visibility'] == ITEM_UNAPPROVED || $post_info['post_visibility'] == ITEM_REAPPROVE,
259                      'S_POST_LOCKED'            => $post_info['post_edit_locked'],
260                      'S_REPORT_CLOSED'        => $report['report_closed'],
261                      'S_USER_NOTES'            => true,
262   
263                      'U_EDIT'                    => ($auth->acl_get('m_edit', $post_info['forum_id'])) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=edit&amp;p={$post_info['post_id']}") : '',
264                      'U_APPROVE_ACTION'            => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;p=' . $post_id),
265                      'U_MCP_APPROVE'                => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=approve_details&amp;p=' . $post_id),
266                      'U_MCP_REPORT'                => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=report_details&amp;p=' . $post_id),
267                      'U_MCP_REPORTER_NOTES'        => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=notes&amp;mode=user_notes&amp;u=' . $report['user_id']),
268                      'U_MCP_USER_NOTES'            => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=notes&amp;mode=user_notes&amp;u=' . $post_info['user_id']),
269                      'U_MCP_WARN_REPORTER'        => ($auth->acl_get('m_warn')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=warn&amp;mode=warn_user&amp;u=' . $report['user_id']) : '',
270                      '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']) : '',
271                      'U_VIEW_FORUM'                => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $post_info['forum_id']),
272                      'U_VIEW_POST'                => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'p=' . $post_info['post_id'] . '#p' . $post_info['post_id']),
273                      'U_VIEW_TOPIC'                => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $post_info['topic_id']),
274   
275                      'EDIT_IMG'                => $user->img('icon_post_edit', $user->lang['EDIT_POST']),
276                      'MINI_POST_IMG'            => ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'),
277                      'UNAPPROVED_IMG'        => $user->img('icon_topic_unapproved', $user->lang['POST_UNAPPROVED']),
278   
279                      'RETURN_REPORTS'            => sprintf($user->lang['RETURN_REPORTS'], '<a href="' . append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports' . (($post_info['post_reported']) ? '&amp;mode=reports' : '&amp;mode=reports_closed') . '&amp;start=' . $start . '&amp;f=' . $post_info['forum_id']) . '">', '</a>'),
280                      'REPORTED_IMG'                => $user->img('icon_topic_reported', $user->lang['POST_REPORTED']),
281                      'REPORT_DATE'                => $user->format_date($report['report_time']),
282                      'REPORT_ID'                    => $report_id,
283                      'REPORT_REASON_TITLE'        => $reason['title'],
284                      'REPORT_REASON_DESCRIPTION'    => $reason['description'],
285                      'REPORT_TEXT'                => $report['report_text'],
286   
287                      'POST_AUTHOR_FULL'        => get_username_string('full', $post_info['user_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']),
288                      'POST_AUTHOR_COLOUR'    => get_username_string('colour', $post_info['user_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']),
289                      'POST_AUTHOR'            => get_username_string('username', $post_info['user_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']),
290                      'U_POST_AUTHOR'            => get_username_string('profile', $post_info['user_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']),
291   
292                      'REPORTER_FULL'                => get_username_string('full', $report['user_id'], $report['username'], $report['user_colour']),
293                      'REPORTER_COLOUR'            => get_username_string('colour', $report['user_id'], $report['username'], $report['user_colour']),
294                      'REPORTER_NAME'                => get_username_string('username', $report['user_id'], $report['username'], $report['user_colour']),
295                      'U_VIEW_REPORTER_PROFILE'    => get_username_string('profile', $report['user_id'], $report['username'], $report['user_colour']),
296   
297                      'POST_PREVIEW'            => $message,
298                      'POST_SUBJECT'            => ($post_info['post_subject']) ? $post_info['post_subject'] : $user->lang['NO_SUBJECT'],
299                      'POST_DATE'                => $user->format_date($post_info['post_time']),
300                      'POST_IP'                => $post_info['poster_ip'],
301                      'POST_IPADDR'            => ($auth->acl_get('m_info', $post_info['forum_id']) && $request->variable('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '',
302                      'POST_ID'                => $post_info['post_id'],
303                      'SIGNATURE'                => $post_info['user_sig'],
304   
305                      'U_LOOKUP_IP'            => ($auth->acl_get('m_info', $post_info['forum_id'])) ? $this->u_action . '&amp;r=' . $report_id . '&amp;p=' . $post_id . '&amp;lookup=' . $post_info['poster_ip'] . '#ip' : '',
306                  );
307   
308                  /**
309                   * Event to add/modify MCP report details template data.
310                   *
311                   * @event core.mcp_report_template_data
312                   * @var int        forum_id                    The forum_id, the number in the f GET parameter
313                   * @var int        topic_id                    The topic_id of the report being viewed
314                   * @var int        post_id                        The post_id of the report being viewed (if 0, it is meaningless)
315                   * @var int        report_id                    The report_id of the report being viewed
316                   * @var array    report                        Array with the report data
317                   * @var    array    report_template                Array with the report template data
318                   * @var array    post_info                    Array with the reported post data
319                   * @since 3.2.5-RC1
320                   */
321                  $vars = array(
322                      'forum_id',
323                      'topic_id',
324                      'post_id',
325                      'report_id',
326                      'report',
327                      'report_template',
328                      'post_info',
329                  );
330                  extract($phpbb_dispatcher->trigger_event('core.mcp_report_template_data', compact($vars)));
331   
332                  $template->assign_vars($report_template);
333   
334                  $this->tpl_name = 'mcp_post';
335   
336              break;
337   
338              case 'reports':
339              case 'reports_closed':
340                  $topic_id = $request->variable('t', 0);
341   
342                  if ($request->is_set_post('t'))
343                  {
344                      $topic_id = $request->variable('t', 0, false, \phpbb\request\request_interface::POST);
345                  }
346   
347                  $forum_info = array();
348                  $forum_list_reports = get_forum_list('m_report', false, true);
349                  $forum_list_read = array_flip(get_forum_list('f_read', true, true)); // Flipped so we can isset() the forum IDs
350   
351                  // Remove forums we cannot read
352                  foreach ($forum_list_reports as $k => $forum_data)
353                  {
354                      if (!isset($forum_list_read[$forum_data['forum_id']]))
355                      {
356                          unset($forum_list_reports[$k]);
357                      }
358                  }
359                  unset($forum_list_read);
360   
361                  if ($topic_id)
362                  {
363                      $topic_info = phpbb_get_topic_data(array($topic_id));
364   
365                      if (!count($topic_info))
366                      {
367                          trigger_error('TOPIC_NOT_EXIST');
368                      }
369   
370                      if ($forum_id != $topic_info[$topic_id]['forum_id'])
371                      {
372                          $topic_id = 0;
373                      }
374                      else
375                      {
376                          $topic_info = $topic_info[$topic_id];
377                          $forum_id = (int) $topic_info['forum_id'];
378                      }
379                  }
380   
381                  $forum_list = array();
382   
383                  if (!$forum_id)
384                  {
385                      foreach ($forum_list_reports as $row)
386                      {
387                          $forum_list[] = $row['forum_id'];
388                      }
389   
390                      if (!count($forum_list))
391                      {
392                          trigger_error('NOT_MODERATOR');
393                      }
394   
395                      $sql = 'SELECT SUM(forum_topics_approved) as sum_forum_topics
396                          FROM ' . FORUMS_TABLE . '
397                          WHERE ' . $db->sql_in_set('forum_id', $forum_list);
398                      $result = $db->sql_query($sql);
399                      $forum_info['forum_topics_approved'] = (int) $db->sql_fetchfield('sum_forum_topics');
400                      $db->sql_freeresult($result);
401                  }
402                  else
403                  {
404                      $forum_info = phpbb_get_forum_data(array($forum_id), 'm_report');
405   
406                      if (!count($forum_info))
407                      {
408                          trigger_error('NOT_MODERATOR');
409                      }
410   
411                      $forum_list = array($forum_id);
412                  }
413   
414                  /* @var $pagination \phpbb\pagination */
415                  $pagination = $phpbb_container->get('pagination');
416                  $forum_list[] = 0;
417                  $forum_data = array();
418   
419                  $forum_options = '<option value="0"' . (($forum_id == 0) ? ' selected="selected"' : '') . '>' . $user->lang['ALL_FORUMS'] . '</option>';
420                  foreach ($forum_list_reports as $row)
421                  {
422                      $forum_options .= '<option value="' . $row['forum_id'] . '"' . (($forum_id == $row['forum_id']) ? ' selected="selected"' : '') . '>' . str_repeat('&nbsp; &nbsp;', $row['padding']) . truncate_string($row['forum_name'], 30, 255, false, $user->lang('ELLIPSIS')) . '</option>';
423                      $forum_data[$row['forum_id']] = $row;
424                  }
425                  unset($forum_list_reports);
426   
427                  $sort_days = $total = 0;
428                  $sort_key = $sort_dir = '';
429                  $sort_by_sql = $sort_order_sql = array();
430                  phpbb_mcp_sorting($mode, $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id, $topic_id);
431   
432                  $limit_time_sql = ($sort_days) ? 'AND r.report_time >= ' . (time() - ($sort_days * 86400)) : '';
433   
434                  if ($mode == 'reports')
435                  {
436                      $report_state = 'AND p.post_reported = 1 AND r.report_closed = 0';
437                  }
438                  else
439                  {
440                      $report_state = 'AND r.report_closed = 1';
441                  }
442   
443                  $sql = 'SELECT r.report_id
444                      FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t, ' . REPORTS_TABLE . ' r ' . (($sort_order_sql[0] == 'u') ? ', ' . USERS_TABLE . ' u' : '') . (($sort_order_sql[0] == 'r') ? ', ' . USERS_TABLE . ' ru' : '') . '
445                      WHERE ' . $db->sql_in_set('p.forum_id', $forum_list) . "
446                          $report_state
447                          AND r.post_id = p.post_id
448                          " . (($sort_order_sql[0] == 'u') ? 'AND u.user_id = p.poster_id' : '') . '
449                          ' . (($sort_order_sql[0] == 'r') ? 'AND ru.user_id = r.user_id' : '') . '
450                          ' . (($topic_id) ? 'AND p.topic_id = ' . $topic_id : '') . "
451                          AND t.topic_id = p.topic_id
452                          AND r.pm_id = 0
453                          $limit_time_sql
454                      ORDER BY $sort_order_sql";
455   
456                  /**
457                  * Alter sql query to get report id of all reports for requested forum and topic or just forum
458                  *
459                  * @event core.mcp_reports_get_reports_query_before
460                  * @var    string    sql                        String with the query to be executed
461                  * @var    array    forum_list                List of forums that contain the posts
462                  * @var    int        topic_id                topic_id in the page request
463                  * @var    string    limit_time_sql            String with the SQL code to limit the time interval of the post (Note: May be empty string)
464                  * @var    string    sort_order_sql            String with the ORDER BY SQL code used in this query
465                  * @since 3.1.0-RC4
466                  */
467                  $vars = array(
468                      'sql',
469                      'forum_list',
470                      'topic_id',
471                      'limit_time_sql',
472                      'sort_order_sql',
473                  );
474                  extract($phpbb_dispatcher->trigger_event('core.mcp_reports_get_reports_query_before', compact($vars)));
475   
476                  $result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);
477   
478                  $i = 0;
479                  $report_ids = array();
480                  while ($row = $db->sql_fetchrow($result))
481                  {
482                      $report_ids[] = $row['report_id'];
483                      $row_num[$row['report_id']] = $i++;
484                  }
485                  $db->sql_freeresult($result);
486   
487                  if (count($report_ids))
488                  {
489                      $sql = 'SELECT t.forum_id, t.topic_id, t.topic_title, p.post_id, p.post_subject, p.post_username, p.poster_id, p.post_time, p.post_attachment, u.username, u.username_clean, u.user_colour, r.user_id as reporter_id, ru.username as reporter_name, ru.user_colour as reporter_colour, r.report_time, r.report_id
490                          FROM ' . REPORTS_TABLE . ' r, ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t, ' . USERS_TABLE . ' u, ' . USERS_TABLE . ' ru
491                          WHERE ' . $db->sql_in_set('r.report_id', $report_ids) . '
492                              AND t.topic_id = p.topic_id
493                              AND r.post_id = p.post_id
494                              AND u.user_id = p.poster_id
495                              AND ru.user_id = r.user_id
496                              AND r.pm_id = 0
497                          ORDER BY ' . $sort_order_sql;
498   
499                      /**
500                       * Alter sql query to get reports data for requested forum and topic or just forum
501                       *
502                       * @event core.mcp_reports_modify_reports_data_sql
503                       * @var    string    sql                        String with the query to be executed
504                       * @var    array    forum_list                List of forums that contain the posts
505                       * @var    int        topic_id                topic_id in the page request
506                       * @var    string    sort_order_sql            String with the ORDER BY SQL code used in this query
507                       * @since 3.3.5-RC1
508                       */
509                      $vars = [
510                          'sql',
511                          'forum_list',
512                          'topic_id',
513                          'sort_order_sql',
514                      ];
515                      extract($phpbb_dispatcher->trigger_event('core.mcp_reports_modify_reports_data_sql', compact($vars)));
516   
517                      $result = $db->sql_query($sql);
518   
519                      while ($row = $db->sql_fetchrow($result))
520                      {
521                          $post_row = [
522                              'U_VIEWFORUM'                => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']),
523                              'U_VIEWPOST'                => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'p=' . $row['post_id']) . '#p' . $row['post_id'],
524                              'U_VIEW_DETAILS'            => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=reports&amp;start=$start&amp;mode=report_details&amp;r={$row['report_id']}"),
525   
526                              'POST_AUTHOR_FULL'        => get_username_string('full', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
527                              'POST_AUTHOR_COLOUR'    => get_username_string('colour', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
528                              'POST_AUTHOR'            => get_username_string('username', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
529                              'U_POST_AUTHOR'            => get_username_string('profile', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
530   
531                              'REPORTER_FULL'            => get_username_string('full', $row['reporter_id'], $row['reporter_name'], $row['reporter_colour']),
532                              'REPORTER_COLOUR'        => get_username_string('colour', $row['reporter_id'], $row['reporter_name'], $row['reporter_colour']),
533                              'REPORTER'                => get_username_string('username', $row['reporter_id'], $row['reporter_name'], $row['reporter_colour']),
534                              'U_REPORTER'            => get_username_string('profile', $row['reporter_id'], $row['reporter_name'], $row['reporter_colour']),
535   
536                              'FORUM_NAME'    => $forum_data[$row['forum_id']]['forum_name'],
537                              'POST_ID'        => $row['post_id'],
538                              'POST_SUBJECT'    => ($row['post_subject']) ? $row['post_subject'] : $user->lang['NO_SUBJECT'],
539                              'POST_TIME'        => $user->format_date($row['post_time']),
540                              'REPORT_ID'        => $row['report_id'],
541                              'REPORT_TIME'    => $user->format_date($row['report_time']),
542                              'TOPIC_TITLE'    => $row['topic_title'],
543                              'ATTACH_ICON_IMG'    => ($auth->acl_get('u_download') && $auth->acl_get('f_download', $row['forum_id']) && $row['post_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
544                          ];
545   
546                          /**
547                           * Alter posts template block for MCP reports
548                           *
549                           * @event core.mcp_reports_modify_post_row
550                           * @var    string    mode        Post report mode
551                           * @var    array    forum_data    Array containing forum data
552                           * @var    array    post_row    Template block array of the post
553                           * @var    array    row            Array with original post and report data
554                           * @var    int        start        Start item of this page
555                           * @var    int        topic_id    topic_id in the page request
556                           * @since 3.3.5-RC1
557                           */
558                          $vars = [
559                              'mode',
560                              'forum_data',
561                              'post_row',
562                              'row',
563                              'start',
564                              'topic_id',
565                          ];
566                          extract($phpbb_dispatcher->trigger_event('core.mcp_reports_modify_post_row', compact($vars)));
567   
568                          $template->assign_block_vars('postrow', $post_row);
569                      }
570                      $db->sql_freeresult($result);
571                      unset($report_ids, $row);
572                  }
573   
574                  $base_url = $this->u_action . "&amp;t=$topic_id&amp;st=$sort_days&amp;sk=$sort_key&amp;sd=$sort_dir";
575                  $pagination->generate_template_pagination($base_url, 'pagination', 'start', $total, $config['topics_per_page'], $start);
576   
577                  // Now display the page
578                  $template->assign_vars(array(
579                      'L_EXPLAIN'                => ($mode == 'reports') ? $user->lang['MCP_REPORTS_OPEN_EXPLAIN'] : $user->lang['MCP_REPORTS_CLOSED_EXPLAIN'],
580                      'L_TITLE'                => ($mode == 'reports') ? $user->lang['MCP_REPORTS_OPEN'] : $user->lang['MCP_REPORTS_CLOSED'],
581                      'L_ONLY_TOPIC'            => ($topic_id) ? sprintf($user->lang['ONLY_TOPIC'], $topic_info['topic_title']) : '',
582   
583                      'S_MCP_ACTION'            => $this->u_action,
584                      'S_FORUM_OPTIONS'        => $forum_options,
585                      'S_CLOSED'                => ($mode == 'reports_closed') ? true : false,
586   
587                      'TOPIC_ID'                => $topic_id,
588                      'TOTAL'                    => $total,
589                      'TOTAL_REPORTS'            => $user->lang('LIST_REPORTS', (int) $total),
590                      )
591                  );
592   
593                  $this->tpl_name = 'mcp_reports';
594              break;
595          }
596      }
597  }
598   
599  /**
600  * Closes a report
601  */
602  function close_report($report_id_list, $mode, $action, $pm = false)
603  {
604      global $db, $user, $auth, $phpbb_log, $request;
605      global $phpEx, $phpbb_root_path, $phpbb_container;
606   
607      $pm_where = ($pm) ? ' AND r.post_id = 0 ' : ' AND r.pm_id = 0 ';
608      $id_column = ($pm) ? 'pm_id' : 'post_id';
609      $module = ($pm) ? 'pm_reports' : 'reports';
610      $pm_prefix = ($pm) ? 'PM_' : '';
611   
612      $sql = "SELECT r.$id_column
613          FROM " . REPORTS_TABLE . ' r
614          WHERE ' . $db->sql_in_set('r.report_id', $report_id_list) . $pm_where;
615      $result = $db->sql_query($sql);
616   
617      $post_id_list = array();
618      while ($row = $db->sql_fetchrow($result))
619      {
620          $post_id_list[] = $row[$id_column];
621      }
622      $db->sql_freeresult($result);
623      $post_id_list = array_unique($post_id_list);
624   
625      if ($pm)
626      {
627          if (!$auth->acl_getf_global('m_report'))
628          {
629              send_status_line(403, 'Forbidden');
630              trigger_error('NOT_AUTHORISED');
631          }
632      }
633      else
634      {
635          if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_report')))
636          {
637              send_status_line(403, 'Forbidden');
638              trigger_error('NOT_AUTHORISED');
639          }
640      }
641   
642      if ($action == 'delete' && strpos($user->data['session_page'], 'mode=report_details') !== false)
643      {
644          $redirect = $request->variable('redirect', build_url(array('mode', 'r', 'quickmod')) . '&amp;mode=reports');
645      }
646      else if ($action == 'delete' && strpos($user->data['session_page'], 'mode=pm_report_details') !== false)
647      {
648          $redirect = $request->variable('redirect', build_url(array('mode', 'r', 'quickmod')) . '&amp;mode=pm_reports');
649      }
650      else if ($action == 'close' && !$request->variable('r', 0))
651      {
652          $redirect = $request->variable('redirect', build_url(array('mode', 'p', 'quickmod')) . '&amp;mode=' . $module);
653      }
654      else
655      {
656          $redirect = $request->variable('redirect', build_url(array('quickmod')));
657      }
658      $success_msg = '';
659      $forum_ids = array();
660      $topic_ids = array();
661   
662      $s_hidden_fields = build_hidden_fields(array(
663          'i'                    => $module,
664          'mode'                => $mode,
665          'report_id_list'    => $report_id_list,
666          'action'            => $action,
667          'redirect'            => $redirect)
668      );
669   
670      if (confirm_box(true))
671      {
672          $post_info = ($pm) ? phpbb_get_pm_data($post_id_list) : phpbb_get_post_data($post_id_list, 'm_report');
673   
674          $sql = "SELECT r.report_id, r.$id_column, r.report_closed, r.user_id, r.user_notify, u.username, u.username_clean, u.user_email, u.user_jabber, u.user_lang, u.user_notify_type
675              FROM " . REPORTS_TABLE . ' r, ' . USERS_TABLE . ' u
676              WHERE ' . $db->sql_in_set('r.report_id', $report_id_list) . '
677                  ' . (($action == 'close') ? 'AND r.report_closed = 0' : '') . '
678                  AND r.user_id = u.user_id' . $pm_where;
679          $result = $db->sql_query($sql);
680   
681          $reports = $close_report_posts = $close_report_topics = $notify_reporters = $report_id_list = array();
682          while ($report = $db->sql_fetchrow($result))
683          {
684              $reports[$report['report_id']] = $report;
685              $report_id_list[] = $report['report_id'];
686   
687              if (!$report['report_closed'])
688              {
689                  $close_report_posts[] = $report[$id_column];
690   
691                  if (!$pm)
692                  {
693                      $close_report_topics[] = $post_info[$report['post_id']]['topic_id'];
694                  }
695              }
696   
697              if ($report['user_notify'] && !$report['report_closed'])
698              {
699                  $notify_reporters[$report['report_id']] = &$reports[$report['report_id']];
700              }
701          }
702          $db->sql_freeresult($result);
703   
704          if (count($reports))
705          {
706              $close_report_posts = array_unique($close_report_posts);
707              $close_report_topics = array_unique($close_report_topics);
708   
709              if (!$pm && count($close_report_posts))
710              {
711                  // Get a list of topics that still contain reported posts
712                  $sql = 'SELECT DISTINCT topic_id
713                      FROM ' . POSTS_TABLE . '
714                      WHERE ' . $db->sql_in_set('topic_id', $close_report_topics) . '
715                          AND post_reported = 1
716                          AND ' . $db->sql_in_set('post_id', $close_report_posts, true);
717                  $result = $db->sql_query($sql);
718   
719                  $keep_report_topics = array();
720                  while ($row = $db->sql_fetchrow($result))
721                  {
722                      $keep_report_topics[] = $row['topic_id'];
723                  }
724                  $db->sql_freeresult($result);
725   
726                  $close_report_topics = array_diff($close_report_topics, $keep_report_topics);
727                  unset($keep_report_topics);
728              }
729   
730              $db->sql_transaction('begin');
731   
732              if ($action == 'close')
733              {
734                  $sql = 'UPDATE ' . REPORTS_TABLE . '
735                      SET report_closed = 1
736                      WHERE ' . $db->sql_in_set('report_id', $report_id_list);
737              }
738              else
739              {
740                  $sql = 'DELETE FROM ' . REPORTS_TABLE . '
741                      WHERE ' . $db->sql_in_set('report_id', $report_id_list);
742              }
743              $db->sql_query($sql);
744   
745              if (count($close_report_posts))
746              {
747                  if ($pm)
748                  {
749                      $sql = 'UPDATE ' . PRIVMSGS_TABLE . '
750                          SET message_reported = 0
751                          WHERE ' . $db->sql_in_set('msg_id', $close_report_posts);
752                      $db->sql_query($sql);
753   
754                      if ($action == 'delete')
755                      {
756                          delete_pm(ANONYMOUS, $close_report_posts, PRIVMSGS_INBOX);
757                      }
758                  }
759                  else
760                  {
761                      $sql = 'UPDATE ' . POSTS_TABLE . '
762                          SET post_reported = 0
763                          WHERE ' . $db->sql_in_set('post_id', $close_report_posts);
764                      $db->sql_query($sql);
765   
766                      if (count($close_report_topics))
767                      {
768                          $sql = 'UPDATE ' . TOPICS_TABLE . '
769                              SET topic_reported = 0
770                              WHERE ' . $db->sql_in_set('topic_id', $close_report_topics) . '
771                                  OR ' . $db->sql_in_set('topic_moved_id', $close_report_topics);
772                          $db->sql_query($sql);
773                      }
774                  }
775              }
776   
777              $db->sql_transaction('commit');
778          }
779          unset($close_report_posts, $close_report_topics);
780   
781          /* @var $phpbb_notifications \phpbb\notification\manager */
782          $phpbb_notifications = $phpbb_container->get('notification_manager');
783   
784          foreach ($reports as $report)
785          {
786              if ($pm)
787              {
788                  $phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_PM_REPORT_' .  strtoupper($action) . 'D', false, array(
789                      'forum_id' => 0,
790                      'topic_id' => 0,
791                      $post_info[$report['pm_id']]['message_subject']
792                  ));
793                  $phpbb_notifications->delete_notifications('notification.type.report_pm', $report['pm_id']);
794              }
795              else
796              {
797                  $phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_REPORT_' .  strtoupper($action) . 'D', false, array(
798                      'forum_id' => $post_info[$report['post_id']]['forum_id'],
799                      'topic_id' => $post_info[$report['post_id']]['topic_id'],
800                      'post_id'  => $report['post_id'],
801                      $post_info[$report['post_id']]['post_subject']
802                  ));
803                  $phpbb_notifications->delete_notifications('notification.type.report_post', $report['post_id']);
804              }
805          }
806   
807          // Notify reporters
808          if (count($notify_reporters))
809          {
810              foreach ($notify_reporters as $report_id => $reporter)
811              {
812                  if ($reporter['user_id'] == ANONYMOUS)
813                  {
814                      continue;
815                  }
816   
817                  $post_id = $reporter[$id_column];
818   
819                  if ($pm)
820                  {
821                      $phpbb_notifications->add_notifications('notification.type.report_pm_closed', array_merge($post_info[$post_id], array(
822                          'reporter'            => $reporter['user_id'],
823                          'closer_id'            => $user->data['user_id'],
824                          'from_user_id'        => $post_info[$post_id]['author_id'],
825                      )));
826                  }
827                  else
828                  {
829                      $phpbb_notifications->add_notifications('notification.type.report_post_closed', array_merge($post_info[$post_id], array(
830                          'reporter'            => $reporter['user_id'],
831                          'closer_id'            => $user->data['user_id'],
832                      )));
833                  }
834              }
835          }
836   
837          if (!$pm)
838          {
839              foreach ($post_info as $post)
840              {
841                  $forum_ids[$post['forum_id']] = $post['forum_id'];
842                  $topic_ids[$post['topic_id']] = $post['topic_id'];
843              }
844          }
845   
846          unset($notify_reporters, $post_info, $reports);
847   
848          $success_msg = (count($report_id_list) == 1) ? "{$pm_prefix}REPORT_" . strtoupper($action) . 'D_SUCCESS' : "{$pm_prefix}REPORTS_" . strtoupper($action) . 'D_SUCCESS';
849      }
850      else
851      {
852          confirm_box(false, $user->lang[strtoupper($action) . "_{$pm_prefix}REPORT" . ((count($report_id_list) == 1) ? '' : 'S') . '_CONFIRM'], $s_hidden_fields);
853      }
854   
855      $redirect = $request->variable('redirect', "index.$phpEx");
856      $redirect = reapply_sid($redirect);
857   
858      if (!$success_msg)
859      {
860          redirect($redirect);
861      }
862      else
863      {
864          meta_refresh(3, $redirect);
865   
866          $return_forum = '';
867          $return_topic = '';
868   
869          if (!$pm)
870          {
871              if (count($forum_ids) === 1)
872              {
873                  $return_forum = sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . current($forum_ids)) . '">', '</a>') . '<br /><br />';
874              }
875   
876              if (count($topic_ids) === 1)
877              {
878                  $return_topic = sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . current($topic_ids)) . '">', '</a>') . '<br /><br />';
879              }
880          }
881   
882          trigger_error($user->lang[$success_msg] . '<br /><br />' . $return_forum . $return_topic . sprintf($user->lang['RETURN_PAGE'], "<a href=\"$redirect\">", '</a>'));
883      }
884  }
885