Verzeichnisstruktur phpBB-3.1.0


Veröffentlicht
27.10.2014

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: 09.10.2024, 12:52 - Dateigröße: 27.48 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 mcp_reports(&$p_master)
 032      {
 033          $this->p_master = &$p_master;
 034      }
 035   
 036      function main($id, $mode)
 037      {
 038          global $auth, $db, $user, $template, $cache;
 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_var('f', 0);
 044          $start = request_var('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_var('report_id_list', array(0));
 055   
 056                  if (!sizeof($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_var('p', 0);
 073   
 074                  // closed reports are accessed by report id
 075                  $report_id = request_var('r', 0);
 076   
 077                  $sql = '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
 078                      FROM ' . REPORTS_TABLE . ' r, ' . REPORTS_REASONS_TABLE . ' rr, ' . USERS_TABLE . ' u
 079                      WHERE ' . (($report_id) ? 'r.report_id = ' . $report_id : "r.post_id = $post_id") . '
 080                          AND rr.reason_id = r.reason_id
 081                          AND r.user_id = u.user_id
 082                          AND r.pm_id = 0
 083                      ORDER BY report_closed ASC';
 084                  $result = $db->sql_query_limit($sql, 1);
 085                  $report = $db->sql_fetchrow($result);
 086                  $db->sql_freeresult($result);
 087   
 088                  if (!$report)
 089                  {
 090                      trigger_error('NO_REPORT');
 091                  }
 092   
 093                  $phpbb_notifications = $phpbb_container->get('notification_manager');
 094   
 095                  $phpbb_notifications->mark_notifications_read('notification.type.report_post', $post_id, $user->data['user_id']);
 096   
 097                  if (!$report_id && $report['report_closed'])
 098                  {
 099                      trigger_error('REPORT_CLOSED');
 100                  }
 101   
 102                  $post_id = $report['post_id'];
 103                  $report_id = $report['report_id'];
 104   
 105                  $parse_post_flags = $report['reported_post_enable_bbcode'] ? OPTION_FLAG_BBCODE : 0;
 106                  $parse_post_flags += $report['reported_post_enable_smilies'] ? OPTION_FLAG_SMILIES : 0;
 107                  $parse_post_flags += $report['reported_post_enable_magic_url'] ? OPTION_FLAG_LINKS : 0;
 108   
 109                  $post_info = phpbb_get_post_data(array($post_id), 'm_report', true);
 110   
 111                  if (!sizeof($post_info))
 112                  {
 113                      trigger_error('NO_REPORT_SELECTED');
 114                  }
 115   
 116                  $post_info = $post_info[$post_id];
 117   
 118                  $reason = array('title' => $report['reason_title'], 'description' => $report['reason_description']);
 119                  if (isset($user->lang['report_reasons']['TITLE'][strtoupper($reason['title'])]) && isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($reason['title'])]))
 120                  {
 121                      $reason['description'] = $user->lang['report_reasons']['DESCRIPTION'][strtoupper($reason['title'])];
 122                      $reason['title'] = $user->lang['report_reasons']['TITLE'][strtoupper($reason['title'])];
 123                  }
 124   
 125                  if (topic_review($post_info['topic_id'], $post_info['forum_id'], 'topic_review', 0, false))
 126                  {
 127                      $template->assign_vars(array(
 128                          'S_TOPIC_REVIEW'    => true,
 129                          'S_BBCODE_ALLOWED'    => $post_info['enable_bbcode'],
 130                          'TOPIC_TITLE'        => $post_info['topic_title'],
 131                          'REPORTED_POST_ID'    => $post_id,
 132                      ));
 133                  }
 134   
 135                  $topic_tracking_info = $extensions = $attachments = array();
 136                  // Get topic tracking info
 137                  if ($config['load_db_lastread'])
 138                  {
 139                      $tmp_topic_data = array($post_info['topic_id'] => $post_info);
 140                      $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']));
 141                      unset($tmp_topic_data);
 142                  }
 143                  else
 144                  {
 145                      $topic_tracking_info = get_complete_topic_tracking($post_info['forum_id'], $post_info['topic_id']);
 146                  }
 147   
 148                  $post_unread = (isset($topic_tracking_info[$post_info['topic_id']]) && $post_info['post_time'] > $topic_tracking_info[$post_info['topic_id']]) ? true : false;
 149                  $message = generate_text_for_display(
 150                      $report['reported_post_text'],
 151                      $report['reported_post_uid'],
 152                      $report['reported_post_bitfield'],
 153                      $parse_post_flags,
 154                      false
 155                  );
 156   
 157                  $report['report_text'] = make_clickable(bbcode_nl2br($report['report_text']));
 158   
 159                  if ($post_info['post_attachment'] && $auth->acl_get('u_download') && $auth->acl_get('f_download', $post_info['forum_id']))
 160                  {
 161                      $sql = 'SELECT *
 162                          FROM ' . ATTACHMENTS_TABLE . '
 163                          WHERE post_msg_id = ' . $post_id . '
 164                              AND in_message = 0
 165                              AND filetime <= ' . (int) $report['report_time'] . '
 166                          ORDER BY filetime DESC';
 167                      $result = $db->sql_query($sql);
 168   
 169                      while ($row = $db->sql_fetchrow($result))
 170                      {
 171                          $attachments[] = $row;
 172                      }
 173                      $db->sql_freeresult($result);
 174   
 175                      if (sizeof($attachments))
 176                      {
 177                          $update_count = array();
 178                          parse_attachments($post_info['forum_id'], $message, $attachments, $update_count);
 179                      }
 180   
 181                      // Display not already displayed Attachments for this post, we already parsed them. ;)
 182                      if (!empty($attachments))
 183                      {
 184                          $template->assign_var('S_HAS_ATTACHMENTS', true);
 185   
 186                          foreach ($attachments as $attachment)
 187                          {
 188                              $template->assign_block_vars('attachment', array(
 189                                  'DISPLAY_ATTACHMENT'    => $attachment)
 190                              );
 191                          }
 192                      }
 193                  }
 194   
 195                  $template->assign_vars(array(
 196                      'S_MCP_REPORT'            => true,
 197                      'S_CLOSE_ACTION'        => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=report_details&amp;f=' . $post_info['forum_id'] . '&amp;p=' . $post_id),
 198                      'S_CAN_VIEWIP'            => $auth->acl_get('m_info', $post_info['forum_id']),
 199                      'S_POST_REPORTED'        => $post_info['post_reported'],
 200                      'S_POST_UNAPPROVED'        => $post_info['post_visibility'] == ITEM_UNAPPROVED || $post_info['post_visibility'] == ITEM_REAPPROVE,
 201                      'S_POST_LOCKED'            => $post_info['post_edit_locked'],
 202                      'S_REPORT_CLOSED'        => $report['report_closed'],
 203                      'S_USER_NOTES'            => true,
 204   
 205                      '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']}") : '',
 206                      '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),
 207                      '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),
 208                      'U_MCP_REPORTER_NOTES'        => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=notes&amp;mode=user_notes&amp;u=' . $report['user_id']),
 209                      'U_MCP_USER_NOTES'            => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=notes&amp;mode=user_notes&amp;u=' . $post_info['user_id']),
 210                      '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']) : '',
 211                      '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']) : '',
 212                      'U_VIEW_FORUM'                => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $post_info['forum_id']),
 213                      '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']),
 214                      'U_VIEW_TOPIC'                => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $post_info['forum_id'] . '&amp;t=' . $post_info['topic_id']),
 215   
 216                      'EDIT_IMG'                => $user->img('icon_post_edit', $user->lang['EDIT_POST']),
 217                      'MINI_POST_IMG'            => ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'),
 218                      'UNAPPROVED_IMG'        => $user->img('icon_topic_unapproved', $user->lang['POST_UNAPPROVED']),
 219   
 220                      '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>'),
 221                      'REPORTED_IMG'                => $user->img('icon_topic_reported', $user->lang['POST_REPORTED']),
 222                      'REPORT_DATE'                => $user->format_date($report['report_time']),
 223                      'REPORT_ID'                    => $report_id,
 224                      'REPORT_REASON_TITLE'        => $reason['title'],
 225                      'REPORT_REASON_DESCRIPTION'    => $reason['description'],
 226                      'REPORT_TEXT'                => $report['report_text'],
 227   
 228                      'POST_AUTHOR_FULL'        => get_username_string('full', $post_info['user_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']),
 229                      'POST_AUTHOR_COLOUR'    => get_username_string('colour', $post_info['user_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']),
 230                      'POST_AUTHOR'            => get_username_string('username', $post_info['user_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']),
 231                      'U_POST_AUTHOR'            => get_username_string('profile', $post_info['user_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']),
 232   
 233                      'REPORTER_FULL'                => get_username_string('full', $report['user_id'], $report['username'], $report['user_colour']),
 234                      'REPORTER_COLOUR'            => get_username_string('colour', $report['user_id'], $report['username'], $report['user_colour']),
 235                      'REPORTER_NAME'                => get_username_string('username', $report['user_id'], $report['username'], $report['user_colour']),
 236                      'U_VIEW_REPORTER_PROFILE'    => get_username_string('profile', $report['user_id'], $report['username'], $report['user_colour']),
 237   
 238                      'POST_PREVIEW'            => $message,
 239                      'POST_SUBJECT'            => ($post_info['post_subject']) ? $post_info['post_subject'] : $user->lang['NO_SUBJECT'],
 240                      'POST_DATE'                => $user->format_date($post_info['post_time']),
 241                      'POST_IP'                => $post_info['poster_ip'],
 242                      'POST_IPADDR'            => ($auth->acl_get('m_info', $post_info['forum_id']) && request_var('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '',
 243                      'POST_ID'                => $post_info['post_id'],
 244   
 245                      'U_LOOKUP_IP'            => ($auth->acl_get('m_info', $post_info['forum_id'])) ? $this->u_action . '&amp;r=' . $report_id . '&amp;p=' . $post_id . '&amp;f=' . $forum_id . '&amp;lookup=' . $post_info['poster_ip'] . '#ip' : '',
 246                  ));
 247   
 248                  $this->tpl_name = 'mcp_post';
 249   
 250              break;
 251   
 252              case 'reports':
 253              case 'reports_closed':
 254                  $topic_id = request_var('t', 0);
 255   
 256                  $forum_info = array();
 257                  $forum_list_reports = get_forum_list('m_report', false, true);
 258                  $forum_list_read = array_flip(get_forum_list('f_read', true, true)); // Flipped so we can isset() the forum IDs
 259   
 260                  // Remove forums we cannot read
 261                  foreach ($forum_list_reports as $k => $forum_data)
 262                  {
 263                      if (!isset($forum_list_read[$forum_data['forum_id']]))
 264                      {
 265                          unset($forum_list_reports[$k]);
 266                      }
 267                  }
 268                  unset($forum_list_read);
 269   
 270                  if ($topic_id)
 271                  {
 272                      $topic_info = phpbb_get_topic_data(array($topic_id));
 273   
 274                      if (!sizeof($topic_info))
 275                      {
 276                          trigger_error('TOPIC_NOT_EXIST');
 277                      }
 278   
 279                      if ($forum_id != $topic_info[$topic_id]['forum_id'])
 280                      {
 281                          $topic_id = 0;
 282                      }
 283                      else
 284                      {
 285                          $topic_info = $topic_info[$topic_id];
 286                          $forum_id = (int) $topic_info['forum_id'];
 287                      }
 288                  }
 289   
 290                  $forum_list = array();
 291   
 292                  if (!$forum_id)
 293                  {
 294                      foreach ($forum_list_reports as $row)
 295                      {
 296                          $forum_list[] = $row['forum_id'];
 297                      }
 298   
 299                      if (!sizeof($forum_list))
 300                      {
 301                          trigger_error('NOT_MODERATOR');
 302                      }
 303   
 304                      $global_id = $forum_list[0];
 305   
 306                      $sql = 'SELECT SUM(forum_topics_approved) as sum_forum_topics
 307                          FROM ' . FORUMS_TABLE . '
 308                          WHERE ' . $db->sql_in_set('forum_id', $forum_list);
 309                      $result = $db->sql_query($sql);
 310                      $forum_info['forum_topics_approved'] = (int) $db->sql_fetchfield('sum_forum_topics');
 311                      $db->sql_freeresult($result);
 312                  }
 313                  else
 314                  {
 315                      $forum_info = phpbb_get_forum_data(array($forum_id), 'm_report');
 316   
 317                      if (!sizeof($forum_info))
 318                      {
 319                          trigger_error('NOT_MODERATOR');
 320                      }
 321   
 322                      $forum_info = $forum_info[$forum_id];
 323                      $forum_list = array($forum_id);
 324                  }
 325   
 326                  $forum_list[] = 0;
 327                  $forum_data = array();
 328                  $pagination = $phpbb_container->get('pagination');
 329   
 330                  $forum_options = '<option value="0"' . (($forum_id == 0) ? ' selected="selected"' : '') . '>' . $user->lang['ALL_FORUMS'] . '</option>';
 331                  foreach ($forum_list_reports as $row)
 332                  {
 333                      $forum_options .= '<option value="' . $row['forum_id'] . '"' . (($forum_id == $row['forum_id']) ? ' selected="selected"' : '') . '>' . str_repeat('&nbsp; &nbsp;', $row['padding']) . $row['forum_name'] . '</option>';
 334                      $forum_data[$row['forum_id']] = $row;
 335                  }
 336                  unset($forum_list_reports);
 337   
 338                  $sort_days = $total = 0;
 339                  $sort_key = $sort_dir = '';
 340                  $sort_by_sql = $sort_order_sql = array();
 341                  phpbb_mcp_sorting($mode, $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id, $topic_id);
 342   
 343                  $forum_topics = ($total == -1) ? $forum_info['forum_topics_approved'] : $total;
 344                  $limit_time_sql = ($sort_days) ? 'AND r.report_time >= ' . (time() - ($sort_days * 86400)) : '';
 345   
 346                  if ($mode == 'reports')
 347                  {
 348                      $report_state = 'AND p.post_reported = 1 AND r.report_closed = 0';
 349                  }
 350                  else
 351                  {
 352                      $report_state = 'AND r.report_closed = 1';
 353                  }
 354   
 355                  $sql = 'SELECT r.report_id
 356                      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' : '') . '
 357                      WHERE ' . $db->sql_in_set('p.forum_id', $forum_list) . "
 358                          $report_state
 359                          AND r.post_id = p.post_id
 360                          " . (($sort_order_sql[0] == 'u') ? 'AND u.user_id = p.poster_id' : '') . '
 361                          ' . (($sort_order_sql[0] == 'r') ? 'AND ru.user_id = r.user_id' : '') . '
 362                          ' . (($topic_id) ? 'AND p.topic_id = ' . $topic_id : '') . "
 363                          AND t.topic_id = p.topic_id
 364                          AND r.pm_id = 0
 365                          $limit_time_sql
 366                      ORDER BY $sort_order_sql";
 367   
 368                  /**
 369                  * Alter sql query to get report id of all reports for requested forum and topic or just forum
 370                  *
 371                  * @event core.mcp_reports_get_reports_query_before
 372                  * @var    string    sql                        String with the query to be executed
 373                  * @var    array    forum_list                List of forums that contain the posts
 374                  * @var    int        topic_id                topic_id in the page request
 375                  * @var    string    limit_time_sql            String with the SQL code to limit the time interval of the post (Note: May be empty string)
 376                  * @var    string    sort_order_sql            String with the ORDER BY SQL code used in this query
 377                  * @since 3.1.0-RC4
 378                  */
 379                  $vars = array(
 380                      'sql',
 381                      'forum_list',
 382                      'topic_id',
 383                      'limit_time_sql',
 384                      'sort_order_sql',
 385                  );
 386                  extract($phpbb_dispatcher->trigger_event('core.mcp_reports_get_reports_query_before', compact($vars)));
 387   
 388                  $result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);
 389   
 390                  $i = 0;
 391                  $report_ids = array();
 392                  while ($row = $db->sql_fetchrow($result))
 393                  {
 394                      $report_ids[] = $row['report_id'];
 395                      $row_num[$row['report_id']] = $i++;
 396                  }
 397                  $db->sql_freeresult($result);
 398   
 399                  if (sizeof($report_ids))
 400                  {
 401                      $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
 402                          FROM ' . REPORTS_TABLE . ' r, ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t, ' . USERS_TABLE . ' u, ' . USERS_TABLE . ' ru
 403                          WHERE ' . $db->sql_in_set('r.report_id', $report_ids) . '
 404                              AND t.topic_id = p.topic_id
 405                              AND r.post_id = p.post_id
 406                              AND u.user_id = p.poster_id
 407                              AND ru.user_id = r.user_id
 408                              AND r.pm_id = 0
 409                          ORDER BY ' . $sort_order_sql;
 410                      $result = $db->sql_query($sql);
 411   
 412                      $report_data = $rowset = array();
 413                      while ($row = $db->sql_fetchrow($result))
 414                      {
 415                          $template->assign_block_vars('postrow', array(
 416                              'U_VIEWFORUM'                => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']),
 417                              'U_VIEWPOST'                => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id'] . '&amp;p=' . $row['post_id']) . '#p' . $row['post_id'],
 418                              'U_VIEW_DETAILS'            => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=reports&amp;start=$start&amp;mode=report_details&amp;f={$row['forum_id']}&amp;r={$row['report_id']}"),
 419   
 420                              'POST_AUTHOR_FULL'        => get_username_string('full', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
 421                              'POST_AUTHOR_COLOUR'    => get_username_string('colour', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
 422                              'POST_AUTHOR'            => get_username_string('username', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
 423                              'U_POST_AUTHOR'            => get_username_string('profile', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
 424   
 425                              'REPORTER_FULL'            => get_username_string('full', $row['reporter_id'], $row['reporter_name'], $row['reporter_colour']),
 426                              'REPORTER_COLOUR'        => get_username_string('colour', $row['reporter_id'], $row['reporter_name'], $row['reporter_colour']),
 427                              'REPORTER'                => get_username_string('username', $row['reporter_id'], $row['reporter_name'], $row['reporter_colour']),
 428                              'U_REPORTER'            => get_username_string('profile', $row['reporter_id'], $row['reporter_name'], $row['reporter_colour']),
 429   
 430                              'FORUM_NAME'    => $forum_data[$row['forum_id']]['forum_name'],
 431                              'POST_ID'        => $row['post_id'],
 432                              'POST_SUBJECT'    => ($row['post_subject']) ? $row['post_subject'] : $user->lang['NO_SUBJECT'],
 433                              'POST_TIME'        => $user->format_date($row['post_time']),
 434                              'REPORT_ID'        => $row['report_id'],
 435                              'REPORT_TIME'    => $user->format_date($row['report_time']),
 436                              'TOPIC_TITLE'    => $row['topic_title'],
 437                              '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']) : '',
 438                          ));
 439                      }
 440                      $db->sql_freeresult($result);
 441                      unset($report_ids, $row);
 442                  }
 443   
 444                  $base_url = $this->u_action . "&amp;f=$forum_id&amp;t=$topic_id&amp;st=$sort_days&amp;sk=$sort_key&amp;sd=$sort_dir";
 445                  $pagination->generate_template_pagination($base_url, 'pagination', 'start', $total, $config['topics_per_page'], $start);
 446   
 447                  // Now display the page
 448                  $template->assign_vars(array(
 449                      'L_EXPLAIN'                => ($mode == 'reports') ? $user->lang['MCP_REPORTS_OPEN_EXPLAIN'] : $user->lang['MCP_REPORTS_CLOSED_EXPLAIN'],
 450                      'L_TITLE'                => ($mode == 'reports') ? $user->lang['MCP_REPORTS_OPEN'] : $user->lang['MCP_REPORTS_CLOSED'],
 451                      'L_ONLY_TOPIC'            => ($topic_id) ? sprintf($user->lang['ONLY_TOPIC'], $topic_info['topic_title']) : '',
 452   
 453                      'S_MCP_ACTION'            => $this->u_action,
 454                      'S_FORUM_OPTIONS'        => $forum_options,
 455                      'S_CLOSED'                => ($mode == 'reports_closed') ? true : false,
 456   
 457                      'TOPIC_ID'                => $topic_id,
 458                      'TOTAL'                    => $total,
 459                      'TOTAL_REPORTS'            => $user->lang('LIST_REPORTS', (int) $total),
 460                      )
 461                  );
 462   
 463                  $this->tpl_name = 'mcp_reports';
 464              break;
 465          }
 466      }
 467  }
 468   
 469  /**
 470  * Closes a report
 471  */
 472  function close_report($report_id_list, $mode, $action, $pm = false)
 473  {
 474      global $db, $template, $user, $config, $auth;
 475      global $phpEx, $phpbb_root_path, $phpbb_container;
 476   
 477      $pm_where = ($pm) ? ' AND r.post_id = 0 ' : ' AND r.pm_id = 0 ';
 478      $id_column = ($pm) ? 'pm_id' : 'post_id';
 479      $module = ($pm) ? 'pm_reports' : 'reports';
 480      $pm_prefix = ($pm) ? 'PM_' : '';
 481   
 482      $sql = "SELECT r.$id_column
 483          FROM " . REPORTS_TABLE . ' r
 484          WHERE ' . $db->sql_in_set('r.report_id', $report_id_list) . $pm_where;
 485      $result = $db->sql_query($sql);
 486   
 487      $post_id_list = array();
 488      while ($row = $db->sql_fetchrow($result))
 489      {
 490          $post_id_list[] = $row[$id_column];
 491      }
 492      $post_id_list = array_unique($post_id_list);
 493   
 494      if ($pm)
 495      {
 496          if (!$auth->acl_getf_global('m_report'))
 497          {
 498              trigger_error('NOT_AUTHORISED');
 499          }
 500      }
 501      else
 502      {
 503          if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_report')))
 504          {
 505              trigger_error('NOT_AUTHORISED');
 506          }
 507      }
 508   
 509      if ($action == 'delete' && strpos($user->data['session_page'], 'mode=report_details') !== false)
 510      {
 511          $redirect = request_var('redirect', build_url(array('mode', 'r', 'quickmod')) . '&amp;mode=reports');
 512      }
 513      else if ($action == 'delete' && strpos($user->data['session_page'], 'mode=pm_report_details') !== false)
 514      {
 515          $redirect = request_var('redirect', build_url(array('mode', 'r', 'quickmod')) . '&amp;mode=pm_reports');
 516      }
 517      else if ($action == 'close' && !request_var('r', 0))
 518      {
 519          $redirect = request_var('redirect', build_url(array('mode', 'p', 'quickmod')) . '&amp;mode=' . $module);
 520      }
 521      else
 522      {
 523          $redirect = request_var('redirect', build_url(array('quickmod')));
 524      }
 525      $success_msg = '';
 526      $forum_ids = array();
 527      $topic_ids = array();
 528   
 529      $s_hidden_fields = build_hidden_fields(array(
 530          'i'                    => $module,
 531          'mode'                => $mode,
 532          'report_id_list'    => $report_id_list,
 533          'action'            => $action,
 534          'redirect'            => $redirect)
 535      );
 536   
 537      if (confirm_box(true))
 538      {
 539          $post_info = ($pm) ? phpbb_get_pm_data($post_id_list) : phpbb_get_post_data($post_id_list, 'm_report');
 540   
 541          $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
 542              FROM " . REPORTS_TABLE . ' r, ' . USERS_TABLE . ' u
 543              WHERE ' . $db->sql_in_set('r.report_id', $report_id_list) . '
 544                  ' . (($action == 'close') ? 'AND r.report_closed = 0' : '') . '
 545                  AND r.user_id = u.user_id' . $pm_where;
 546          $result = $db->sql_query($sql);
 547   
 548          $reports = $close_report_posts = $close_report_topics = $notify_reporters = $report_id_list = array();
 549          while ($report = $db->sql_fetchrow($result))
 550          {
 551              $reports[$report['report_id']] = $report;
 552              $report_id_list[] = $report['report_id'];
 553   
 554              if (!$report['report_closed'])
 555              {
 556                  $close_report_posts[] = $report[$id_column];
 557   
 558                  if (!$pm)
 559                  {
 560                      $close_report_topics[] = $post_info[$report['post_id']]['topic_id'];
 561                  }
 562              }
 563   
 564              if ($report['user_notify'] && !$report['report_closed'])
 565              {
 566                  $notify_reporters[$report['report_id']] = &$reports[$report['report_id']];
 567              }
 568          }
 569          $db->sql_freeresult($result);
 570   
 571          if (sizeof($reports))
 572          {
 573              $close_report_posts = array_unique($close_report_posts);
 574              $close_report_topics = array_unique($close_report_topics);
 575   
 576              if (!$pm && sizeof($close_report_posts))
 577              {
 578                  // Get a list of topics that still contain reported posts
 579                  $sql = 'SELECT DISTINCT topic_id
 580                      FROM ' . POSTS_TABLE . '
 581                      WHERE ' . $db->sql_in_set('topic_id', $close_report_topics) . '
 582                          AND post_reported = 1
 583                          AND ' . $db->sql_in_set('post_id', $close_report_posts, true);
 584                  $result = $db->sql_query($sql);
 585   
 586                  $keep_report_topics = array();
 587                  while ($row = $db->sql_fetchrow($result))
 588                  {
 589                      $keep_report_topics[] = $row['topic_id'];
 590                  }
 591                  $db->sql_freeresult($result);
 592   
 593                  $close_report_topics = array_diff($close_report_topics, $keep_report_topics);
 594                  unset($keep_report_topics);
 595              }
 596   
 597              $db->sql_transaction('begin');
 598   
 599              if ($action == 'close')
 600              {
 601                  $sql = 'UPDATE ' . REPORTS_TABLE . '
 602                      SET report_closed = 1
 603                      WHERE ' . $db->sql_in_set('report_id', $report_id_list);
 604              }
 605              else
 606              {
 607                  $sql = 'DELETE FROM ' . REPORTS_TABLE . '
 608                      WHERE ' . $db->sql_in_set('report_id', $report_id_list);
 609              }
 610              $db->sql_query($sql);
 611   
 612              if (sizeof($close_report_posts))
 613              {
 614                  if ($pm)
 615                  {
 616                      $sql = 'UPDATE ' . PRIVMSGS_TABLE . '
 617                          SET message_reported = 0
 618                          WHERE ' . $db->sql_in_set('msg_id', $close_report_posts);
 619                      $db->sql_query($sql);
 620   
 621                      if ($action == 'delete')
 622                      {
 623                          delete_pm(ANONYMOUS, $close_report_posts, PRIVMSGS_INBOX);
 624                      }
 625                  }
 626                  else
 627                  {
 628                      $sql = 'UPDATE ' . POSTS_TABLE . '
 629                          SET post_reported = 0
 630                          WHERE ' . $db->sql_in_set('post_id', $close_report_posts);
 631                      $db->sql_query($sql);
 632   
 633                      if (sizeof($close_report_topics))
 634                      {
 635                          $sql = 'UPDATE ' . TOPICS_TABLE . '
 636                              SET topic_reported = 0
 637                              WHERE ' . $db->sql_in_set('topic_id', $close_report_topics) . '
 638                                  OR ' . $db->sql_in_set('topic_moved_id', $close_report_topics);
 639                          $db->sql_query($sql);
 640                      }
 641                  }
 642              }
 643   
 644              $db->sql_transaction('commit');
 645          }
 646          unset($close_report_posts, $close_report_topics);
 647   
 648          $phpbb_notifications = $phpbb_container->get('notification_manager');
 649   
 650          foreach ($reports as $report)
 651          {
 652              if ($pm)
 653              {
 654                  add_log('mod', 0, 0, 'LOG_PM_REPORT_' .  strtoupper($action) . 'D', $post_info[$report['pm_id']]['message_subject']);
 655                  $phpbb_notifications->delete_notifications('notification.type.report_pm', $report['pm_id']);
 656              }
 657              else
 658              {
 659                  add_log('mod', $post_info[$report['post_id']]['forum_id'], $post_info[$report['post_id']]['topic_id'], 'LOG_REPORT_' .  strtoupper($action) . 'D', $post_info[$report['post_id']]['post_subject']);
 660                  $phpbb_notifications->delete_notifications('notification.type.report_post', $report['post_id']);
 661              }
 662          }
 663   
 664          // Notify reporters
 665          if (sizeof($notify_reporters))
 666          {
 667              foreach ($notify_reporters as $report_id => $reporter)
 668              {
 669                  if ($reporter['user_id'] == ANONYMOUS)
 670                  {
 671                      continue;
 672                  }
 673   
 674                  $post_id = $reporter[$id_column];
 675   
 676                  if ($pm)
 677                  {
 678                      $phpbb_notifications->add_notifications('notification.type.report_pm_closed', array_merge($post_info[$post_id], array(
 679                          'reporter'            => $reporter['user_id'],
 680                          'closer_id'            => $user->data['user_id'],
 681                          'from_user_id'        => $post_info[$post_id]['author_id'],
 682                      )));
 683                  }
 684                  else
 685                  {
 686                      $phpbb_notifications->add_notifications('notification.type.report_post_closed', array_merge($post_info[$post_id], array(
 687                          'reporter'            => $reporter['user_id'],
 688                          'closer_id'            => $user->data['user_id'],
 689                      )));
 690                  }
 691              }
 692          }
 693   
 694          if (!$pm)
 695          {
 696              foreach ($post_info as $post)
 697              {
 698                  $forum_ids[$post['forum_id']] = $post['forum_id'];
 699                  $topic_ids[$post['topic_id']] = $post['topic_id'];
 700              }
 701          }
 702   
 703          unset($notify_reporters, $post_info, $reports);
 704   
 705          $success_msg = (sizeof($report_id_list) == 1) ? "{$pm_prefix}REPORT_" . strtoupper($action) . 'D_SUCCESS' : "{$pm_prefix}REPORTS_" . strtoupper($action) . 'D_SUCCESS';
 706      }
 707      else
 708      {
 709          confirm_box(false, $user->lang[strtoupper($action) . "_{$pm_prefix}REPORT" . ((sizeof($report_id_list) == 1) ? '' : 'S') . '_CONFIRM'], $s_hidden_fields);
 710      }
 711   
 712      $redirect = request_var('redirect', "index.$phpEx");
 713      $redirect = reapply_sid($redirect);
 714   
 715      if (!$success_msg)
 716      {
 717          redirect($redirect);
 718      }
 719      else
 720      {
 721          meta_refresh(3, $redirect);
 722   
 723          $return_forum = '';
 724          $return_topic = '';
 725   
 726          if (!$pm)
 727          {
 728              if (sizeof($forum_ids) === 1)
 729              {
 730                  $return_forum = sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . current($forum_ids)) . '">', '</a>') . '<br /><br />';
 731              }
 732   
 733              if (sizeof($topic_ids) === 1)
 734              {
 735                  $return_topic = sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . current($topic_ids) . '&amp;f=' . current($forum_ids)) . '">', '</a>') . '<br /><br />';
 736              }
 737          }
 738   
 739          trigger_error($user->lang[$success_msg] . '<br /><br />' . $return_forum . $return_topic . sprintf($user->lang['RETURN_PAGE'], "<a href=\"$redirect\">", '</a>'));
 740      }
 741  }
 742