PageRenderTime 51ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/admin/reports.php

https://bitbucket.org/gencer/punbb
PHP | 277 lines | 207 code | 52 blank | 18 comment | 21 complexity | afab4a401053cec6d9d2a00c8699e4ef MD5 | raw file
Possible License(s): GPL-2.0
  1. <?php
  2. /**
  3. * Report management page.
  4. *
  5. * Allows administrators and moderators to handle reported posts.
  6. *
  7. * @copyright (C) 2008-2012 PunBB, partially based on code (C) 2008-2009 FluxBB.org
  8. * @license http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
  9. * @package PunBB
  10. */
  11. if (!defined('FORUM_ROOT'))
  12. define('FORUM_ROOT', '../');
  13. require FORUM_ROOT.'include/common.php';
  14. require FORUM_ROOT.'include/common_admin.php';
  15. ($hook = get_hook('arp_start')) ? eval($hook) : null;
  16. if (!$forum_user['is_admmod'])
  17. message($lang_common['No permission']);
  18. // Load the admin.php language file
  19. require FORUM_ROOT.'lang/'.$forum_user['language'].'/admin_common.php';
  20. require FORUM_ROOT.'lang/'.$forum_user['language'].'/admin_reports.php';
  21. // Mark reports as read
  22. if (isset($_POST['mark_as_read']))
  23. {
  24. if (empty($_POST['reports']))
  25. message($lang_admin_reports['No reports selected']);
  26. ($hook = get_hook('arp_mark_as_read_form_submitted')) ? eval($hook) : null;
  27. $reports_to_mark = array_map('intval', array_keys($_POST['reports']));
  28. $query = array(
  29. 'UPDATE' => 'reports',
  30. 'SET' => 'zapped='.time().', zapped_by='.$forum_user['id'],
  31. 'WHERE' => 'id IN('.implode(',', $reports_to_mark).') AND zapped IS NULL'
  32. );
  33. ($hook = get_hook('arp_mark_as_read_qr_mark_reports_as_read')) ? eval($hook) : null;
  34. $forum_db->query_build($query) or error(__FILE__, __LINE__);
  35. // Add flash message
  36. $forum_flash->add_info($lang_admin_reports['Reports marked read']);
  37. ($hook = get_hook('arp_mark_as_read_pre_redirect')) ? eval($hook) : null;
  38. redirect(forum_link($forum_url['admin_reports']), $lang_admin_reports['Reports marked read']);
  39. }
  40. $forum_page['group_count'] = $forum_page['item_count'] = $forum_page['fld_count'] = 0;
  41. // Setup breadcrumbs
  42. $forum_page['crumbs'] = array(
  43. array($forum_config['o_board_title'], forum_link($forum_url['index'])),
  44. array($lang_admin_common['Forum administration'], forum_link($forum_url['admin_index']))
  45. );
  46. if ($forum_user['g_id'] == FORUM_ADMIN)
  47. $forum_page['crumbs'][] = array($lang_admin_common['Management'], forum_link($forum_url['admin_reports']));
  48. $forum_page['crumbs'][] = array($lang_admin_common['Reports'], forum_link($forum_url['admin_reports']));
  49. ($hook = get_hook('arp_pre_header_load')) ? eval($hook) : null;
  50. define('FORUM_PAGE_SECTION', 'management');
  51. define('FORUM_PAGE', 'admin-reports');
  52. require FORUM_ROOT.'header.php';
  53. // START SUBST - <!-- forum_main -->
  54. ob_start();
  55. ($hook = get_hook('arp_main_output_start')) ? eval($hook) : null;
  56. // Fetch any unread reports
  57. $query = array(
  58. 'SELECT' => 'r.id, r.topic_id, r.forum_id, r.reported_by, r.created, r.message, p.id AS pid, t.subject, f.forum_name, u.username AS reporter',
  59. 'FROM' => 'reports AS r',
  60. 'JOINS' => array(
  61. array(
  62. 'LEFT JOIN' => 'posts AS p',
  63. 'ON' => 'r.post_id=p.id'
  64. ),
  65. array(
  66. 'LEFT JOIN' => 'topics AS t',
  67. 'ON' => 'r.topic_id=t.id'
  68. ),
  69. array(
  70. 'LEFT JOIN' => 'forums AS f',
  71. 'ON' => 'r.forum_id=f.id'
  72. ),
  73. array(
  74. 'LEFT JOIN' => 'users AS u',
  75. 'ON' => 'r.reported_by=u.id'
  76. )
  77. ),
  78. 'WHERE' => 'r.zapped IS NULL',
  79. 'ORDER BY' => 'r.created DESC'
  80. );
  81. ($hook = get_hook('arp_qr_get_new_reports')) ? eval($hook) : null;
  82. $forum_page['new_reports'] = false;
  83. $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
  84. $unread_reports = array();
  85. while ($cur_report = $forum_db->fetch_assoc($result))
  86. {
  87. $unread_reports[] = $cur_report;
  88. }
  89. if (!empty($unread_reports))
  90. {
  91. $forum_page['new_reports'] = true;
  92. ?>
  93. <div class="main-subhead">
  94. <h2 class="hn"><span><?php echo $lang_admin_reports['New reports heading'] ?></span></h2>
  95. </div>
  96. <div class="main-content main-frm">
  97. <form id="arp-new-report-form" class="frm-form" method="post" accept-charset="utf-8" action="<?php echo forum_link($forum_url['admin_reports']) ?>?action=zap">
  98. <div class="hidden">
  99. <input type="hidden" name="csrf_token" value="<?php echo generate_form_token(forum_link($forum_url['admin_reports']).'?action=zap') ?>" />
  100. </div>
  101. <?php
  102. $forum_page['item_num'] = 0;
  103. foreach ($unread_reports as $cur_report)
  104. {
  105. $reporter = ($cur_report['reporter'] != '') ? '<a href="'.forum_link($forum_url['user'], $cur_report['reported_by']).'">'.forum_htmlencode($cur_report['reporter']).'</a>' : $lang_admin_reports['Deleted user'];
  106. $forum = ($cur_report['forum_name'] != '') ? '<a href="'.forum_link($forum_url['forum'], array($cur_report['forum_id'], sef_friendly($cur_report['forum_name']))).'">'.forum_htmlencode($cur_report['forum_name']).'</a>' : $lang_admin_reports['Deleted forum'];
  107. $topic = ($cur_report['subject'] != '') ? '<a href="'.forum_link($forum_url['topic'], array($cur_report['topic_id'], sef_friendly($cur_report['subject']))).'">'.forum_htmlencode($cur_report['subject']).'</a>' : $lang_admin_reports['Deleted topic'];
  108. $message = str_replace("\n", '<br />', forum_htmlencode($cur_report['message']));
  109. $post_id = ($cur_report['pid'] != '') ? '<a href="'.forum_link($forum_url['post'], $cur_report['pid']).'">'.sprintf($lang_admin_reports['Post'], $cur_report['pid']).'</a>' : $lang_admin_reports['Deleted post'];
  110. ($hook = get_hook('arp_new_report_pre_display')) ? eval($hook) : null;
  111. ?>
  112. <div class="ct-set warn-set report set<?php echo ++$forum_page['item_count'] ?>">
  113. <div class="ct-box warn-box">
  114. <h3 class="ct-legend hn"><strong><?php echo ++$forum_page['item_num'] ?></strong> <cite class="username"><?php printf($lang_admin_reports['Reported by'], $reporter) ?></cite> <span><?php echo format_time($cur_report['created']) ?></span></h3>
  115. <h4 class="hn"><?php echo $forum ?> &rarr; <?php echo $topic ?> &rarr; <?php echo $post_id ?></h4>
  116. <p><?php echo $message ?></p>
  117. <p class="item-select"><input type="checkbox" id="fld<?php echo ++$forum_page['fld_count'] ?>" name="reports[<?php echo $cur_report['id'] ?>]" value="1" /> <label for="fld<?php echo $forum_page['fld_count'] ?>"><?php echo $lang_admin_reports['Select report'] ?></label></p>
  118. <?php ($hook = get_hook('arp_new_report_new_block')) ? eval($hook) : null; ?>
  119. </div>
  120. </div>
  121. <?php
  122. }
  123. ?>
  124. <div class="frm-buttons">
  125. <span class="select-all js_link" data-check-form="arp-new-report-form"><?php echo $lang_admin_common['Select all'] ?></span>
  126. <span class="submit primary"><input type="submit" name="mark_as_read" value="<?php echo $lang_admin_reports['Mark read'] ?>" /></span>
  127. </div>
  128. </form>
  129. </div>
  130. <?php
  131. }
  132. // Fetch the last 10 reports marked as read
  133. $query = array(
  134. 'SELECT' => 'r.id, r.topic_id, r.forum_id, r.reported_by, r.created, r.message, r.zapped, r.zapped_by AS zapped_by_id, p.id AS pid, t.subject, f.forum_name, u.username AS reporter, u2.username AS zapped_by',
  135. 'FROM' => 'reports AS r',
  136. 'JOINS' => array(
  137. array(
  138. 'LEFT JOIN' => 'posts AS p',
  139. 'ON' => 'r.post_id=p.id'
  140. ),
  141. array(
  142. 'LEFT JOIN' => 'topics AS t',
  143. 'ON' => 'r.topic_id=t.id'
  144. ),
  145. array(
  146. 'LEFT JOIN' => 'forums AS f',
  147. 'ON' => 'r.forum_id=f.id'
  148. ),
  149. array(
  150. 'LEFT JOIN' => 'users AS u',
  151. 'ON' => 'r.reported_by=u.id'
  152. ),
  153. array(
  154. 'LEFT JOIN' => 'users AS u2',
  155. 'ON' => 'r.zapped_by=u2.id'
  156. )
  157. ),
  158. 'WHERE' => 'r.zapped IS NOT NULL',
  159. 'ORDER BY' => 'r.zapped DESC',
  160. 'LIMIT' => '10'
  161. );
  162. ($hook = get_hook('arp_qr_get_last_zapped_reports')) ? eval($hook) : null;
  163. $forum_page['old_reports'] = false;
  164. $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
  165. $zapped_reports = array();
  166. while ($cur_report = $forum_db->fetch_assoc($result))
  167. {
  168. $zapped_reports[] = $cur_report;
  169. }
  170. if (!empty($zapped_reports))
  171. {
  172. $i = 1;
  173. $forum_page['group_count'] = $forum_page['item_count'] = $forum_page['item_num'] = 0;
  174. $forum_page['old_reports'] = true;
  175. ?>
  176. <div class="main-subhead">
  177. <h2 class="hn"><span><?php echo $lang_admin_reports['Read reports heading'] ?><?php echo (count($zapped_reports)) ? '' : ' '.$lang_admin_reports['No new reports'] ?></span></h2>
  178. </div>
  179. <div class="main-content main-frm">
  180. <?php
  181. foreach ($zapped_reports as $cur_report)
  182. {
  183. $reporter = ($cur_report['reporter'] != '') ? '<a href="'.forum_link($forum_url['user'], $cur_report['reported_by']).'">'.forum_htmlencode($cur_report['reporter']).'</a>' : $lang_admin_reports['Deleted user'];
  184. $forum = ($cur_report['forum_name'] != '') ? '<a href="'.forum_link($forum_url['forum'], array($cur_report['forum_id'], sef_friendly($cur_report['forum_name']))).'">'.forum_htmlencode($cur_report['forum_name']).'</a>' : $lang_admin_reports['Deleted forum'];
  185. $topic = ($cur_report['subject'] != '') ? '<a href="'.forum_link($forum_url['topic'], array($cur_report['topic_id'], sef_friendly($cur_report['subject']))).'">'.forum_htmlencode($cur_report['subject']).'</a>' : $lang_admin_reports['Deleted topic'];
  186. $message = str_replace("\n", '<br />', forum_htmlencode($cur_report['message']));
  187. $post_id = ($cur_report['pid'] != '') ? '<a href="'.forum_link($forum_url['post'], $cur_report['pid']).'">'.sprintf($lang_admin_reports['Post'], $cur_report['pid']).'</a>' : $lang_admin_reports['Deleted post'];
  188. $zapped_by = ($cur_report['zapped_by'] != '') ? '<a href="'.forum_link($forum_url['user'], $cur_report['zapped_by_id']).'">'.forum_htmlencode($cur_report['zapped_by']).'</a>' : $lang_admin_reports['Deleted user'];
  189. ($hook = get_hook('arp_report_pre_display')) ? eval($hook) : null;
  190. ?>
  191. <div class="ct-set report data-set set<?php echo ++$forum_page['item_count'] ?>">
  192. <div class="ct-box data-box">
  193. <h3 class="ct-legend hn"><strong><?php echo ++$forum_page['item_num'] ?></strong> <cite class="username"><?php printf($lang_admin_reports['Reported by'], $reporter) ?></cite> <span><?php echo format_time($cur_report['created']) ?></span></h3>
  194. <h4 class="hn"><?php echo $forum ?> &rarr; <?php echo $topic ?> &rarr; <?php echo $post_id ?></h4>
  195. <p><?php echo $message ?> <strong><?php printf($lang_admin_reports['Marked read by'], format_time($cur_report['zapped']), $zapped_by) ?></strong></p>
  196. <?php ($hook = get_hook('arp_report_new_block')) ? eval($hook) : null; ?>
  197. </div>
  198. </div>
  199. <?php
  200. }
  201. ?>
  202. </div>
  203. <?php
  204. }
  205. if (!$forum_page['new_reports'] && !$forum_page['old_reports'])
  206. {
  207. ?>
  208. <div class="main-subhead">
  209. <h2 class="hn"><span><?php echo $lang_admin_reports['Empty reports heading'] ?></span></h2>
  210. </div>
  211. <div class="main-content main-frm">
  212. <div class="ct-box">
  213. <p><?php echo $lang_admin_reports['No reports'] ?></p>
  214. </div>
  215. </div>
  216. <?php
  217. }
  218. // Init JS helper for select-all
  219. $forum_loader->add_js('PUNBB.common.addDOMReadyEvent(PUNBB.common.initToggleCheckboxes);', array('type' => 'inline'));
  220. ($hook = get_hook('arp_end')) ? eval($hook) : null;
  221. $tpl_temp = forum_trim(ob_get_contents());
  222. $tpl_main = str_replace('<!-- forum_main -->', $tpl_temp, $tpl_main);
  223. ob_end_clean();
  224. // END SUBST - <!-- forum_main -->
  225. require FORUM_ROOT.'footer.php';