[ Index ]

PHP Cross Reference of phpBB-3.3.14-deutsch

title

Body

[close]

/includes/mcp/ -> mcp_reports.php (source)

   1  <?php
   2  /**
   3  *
   4  * This file is part of the phpBB Forum Software package.
   5  *
   6  * @copyright (c) phpBB Limited <https://www.phpbb.com>
   7  * @license GNU General Public License, version 2 (GPL-2.0)
   8  *
   9  * For full copyright and license information, please see
  10  * the docs/CREDITS.txt file.
  11  *
  12  */
  13  
  14  /**
  15  * @ignore
  16  */
  17  if (!defined('IN_PHPBB'))
  18  {
  19      exit;
  20  }
  21  
  22  /**
  23  * mcp_reports
  24  * Handling the reports queue
  25  */
  26  class mcp_reports
  27  {
  28      var $p_master;
  29      var $u_action;
  30  
  31  	function __construct($p_master)
  32      {
  33          $this->p_master = $p_master;
  34      }
  35  
  36  	function main($id, $mode)
  37      {
  38          global $auth, $db, $user, $template, $request;
  39          global $config, $phpbb_root_path, $phpEx, $action, $phpbb_container, $phpbb_dispatcher;
  40  
  41          include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
  42  
  43          $forum_id = $request->variable('f', 0);
  44          $start = $request->variable('start', 0);
  45  
  46          $this->page_title = 'MCP_REPORTS';
  47  
  48          switch ($action)
  49          {
  50              case 'close':
  51              case 'delete':
  52                  include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
  53  
  54                  $report_id_list = $request->variable('report_id_list', array(0));
  55  
  56                  if (!count($report_id_list))
  57                  {
  58                      trigger_error('NO_REPORT_SELECTED');
  59                  }
  60  
  61                  close_report($report_id_list, $mode, $action);
  62  
  63              break;
  64          }
  65  
  66          switch ($mode)
  67          {
  68              case 'report_details':
  69  
  70                  $user->add_lang(array('posting', 'viewforum', 'viewtopic'));
  71  
  72                  $post_id = $request->variable('p', 0);
  73  
  74                  // closed reports are accessed by report id
  75                  $report_id = $request->variable('r', 0);
  76  
  77                  $sql_ary = array(
  78                      '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',
  79  
  80                      'FROM'        => array(
  81                          REPORTS_TABLE            => 'r',
  82                          REPORTS_REASONS_TABLE    => 'rr',
  83                          USERS_TABLE                => 'u',
  84                      ),
  85  
  86                      'WHERE'        => (($report_id) ? 'r.report_id = ' . $report_id : "r.post_id = $post_id") . '
  87                          AND rr.reason_id = r.reason_id
  88                          AND r.user_id = u.user_id
  89                          AND r.pm_id = 0',
  90  
  91                      'ORDER_BY'    => 'report_closed ASC',
  92                  );
  93  
  94                  /**
  95                  * Allow changing the query to obtain the user-submitted report.
  96                  *
  97                  * @event core.mcp_reports_report_details_query_before
  98                  * @var    array    sql_ary            The array in the format of the query builder with the query
  99                  * @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  }


Generated: Mon Nov 25 19:05:08 2024 Cross-referenced by PHPXref 0.7.1