/upload/admin/admin_log.php

http://torrentpier2.googlecode.com/ · PHP · 416 lines · 310 code · 75 blank · 31 comment · 42 complexity · 275c20878a09051cd4c8ae92becee73d MD5 · raw file

  1. <?php
  2. // ACP Header - START
  3. if (!empty($setmodules))
  4. {
  5. $module['Users']['Actions_log'] = basename(__FILE__);
  6. return;
  7. }
  8. require('./pagestart.php');
  9. // ACP Header - END
  10. $datastore->enqueue(array(
  11. 'moderators',
  12. ));
  13. $log_action->init();
  14. $per_page = 50;
  15. $row_class_1 = 'row1';
  16. $row_class_2 = 'row2';
  17. $def_days = 3;
  18. $def_datetime = TIMENOW;
  19. $max_forum_name_len = 40;
  20. $title_match_max_len = 60;
  21. $poster_name_max_len = 25;
  22. $select_max_height = 16;
  23. $dt_format = 'Y-m-d'; // used in one-day filter
  24. $url = basename(__FILE__);
  25. // Key names
  26. $type_key = 'type';
  27. $forum_key = 'f';
  28. $topic_key = 't';
  29. $user_key = 'u';
  30. $datetime_key = 'dt'; // value should be strtotime() time ("2006-06-25" etc.)
  31. $daysback_key = 'db';
  32. $sort_key = 'sort';
  33. $title_match_key = 'tm';
  34. // Key values
  35. $all_types = 0; // =|
  36. $all_users = 0; // |> only "0" is a valid value
  37. $all_forums = 0; // =|
  38. $sort_asc = 'ASC';
  39. $sort_desc = 'DESC';
  40. // Defaults
  41. $def_types = $all_types;
  42. $def_users = $all_users;
  43. $def_forums = $all_forums;
  44. $def_sort = $sort_desc;
  45. // Moderators data
  46. if (!$mod = $datastore->get('moderators'))
  47. {
  48. $datastore->update('moderators');
  49. $mod = $datastore->get('moderators');
  50. }
  51. array_deep($mod['moderators'], 'html_entity_decode');
  52. array_deep($mod['admins'], 'html_entity_decode');
  53. $users = array($lang['ACTS_LOG_ALL_ACTIONS'] => $all_users) + array_flip($mod['moderators']) + array_flip($mod['admins']);
  54. unset($mod);
  55. // Forums data
  56. if (!$forums = $datastore->get('cat_forums'))
  57. {
  58. $datastore->update('cat_forums');
  59. $forums = $datastore->get('cat_forums');
  60. }
  61. $f_data = $forums['f'];
  62. unset($forums);
  63. // Start
  64. $start = isset($_REQUEST['start']) ? abs(intval($_REQUEST['start'])) : 0;
  65. // Type
  66. $type_selected = array($def_types);
  67. $type_csv = '';
  68. if ($var =& $_REQUEST[$type_key])
  69. {
  70. $type_selected = get_id_ary($var);
  71. if (in_array($all_types, $type_selected))
  72. {
  73. $type_selected = array($all_types);
  74. }
  75. $type_csv = join(',', $type_selected);
  76. $url = ($type_csv != $def_types) ? url_arg($url, $type_key, $type_csv) : $url;
  77. }
  78. // User
  79. $user_selected = array($def_users);
  80. $user_csv = '';
  81. if ($var =& $_REQUEST[$user_key])
  82. {
  83. $user_selected = get_id_ary($var);
  84. if (in_array($all_users, $user_selected))
  85. {
  86. $user_selected = array($all_users);
  87. }
  88. $user_csv = join(',', $user_selected);
  89. $url = ($user_csv != $def_users) ? url_arg($url, $user_key, $user_csv) : $url;
  90. }
  91. // Forum
  92. $forum_selected = array($def_forums);
  93. $forum_csv = '';
  94. if ($var =& $_REQUEST[$forum_key])
  95. {
  96. $forum_selected = get_id_ary($var);
  97. if (in_array($all_forums, $forum_selected))
  98. {
  99. $forum_selected = array($all_forums);
  100. }
  101. $forum_csv = join(',', $forum_selected);
  102. $url = ($forum_csv != $def_forums) ? url_arg($url, $forum_key, $forum_csv) : $url;
  103. }
  104. // Topic
  105. $topic_selected = null;
  106. $topic_csv = '';
  107. if ($var =& $_REQUEST[$topic_key])
  108. {
  109. $topic_selected = get_id_ary($var);
  110. $topic_csv = join(',', $topic_selected);
  111. $url = ($topic_csv) ? url_arg($url, $topic_key, $topic_csv) : $url;
  112. }
  113. // Order
  114. $order_val = 'log_time';
  115. // Sort
  116. $sort_val = $def_sort;
  117. if ($var =& $_REQUEST[$sort_key] AND $var != $def_sort)
  118. {
  119. $sort_val = ($var == $sort_asc) ? $sort_asc : $sort_desc;
  120. $url = url_arg($url, $sort_key, $sort_val);
  121. }
  122. // Time
  123. $datetime_val = $def_datetime;
  124. $daysback_val = $def_days;
  125. if ($var =& $_REQUEST[$daysback_key] AND $var != $def_days)
  126. {
  127. $daysback_val = max(intval($var), 1);
  128. $url = url_arg($url, $daysback_key, $daysback_val);
  129. }
  130. if ($var =& $_REQUEST[$datetime_key] AND $var != $def_datetime)
  131. {
  132. $tz = TIMENOW + (3600 * $bb_cfg['board_timezone']);
  133. if (($tmp_timestamp = strtotime($var, $tz)) > 0)
  134. {
  135. $datetime_val = $tmp_timestamp;
  136. $url = url_arg($url, $datetime_key, date($dt_format, $datetime_val));
  137. }
  138. }
  139. $time_end_val = 86400 + mktime(0, 0, 0, date('m', $datetime_val), date('d', $datetime_val), date('Y', $datetime_val));
  140. $time_start_val = $time_end_val - 86400*$daysback_val;
  141. // First log time
  142. $row = DB()->fetch_row("SELECT MIN(log_time) AS first_log_time FROM ". BB_LOG);
  143. $first_log_time = (int) $row['first_log_time'];
  144. // Title match
  145. $title_match_val = $title_match_sql = '';
  146. if ($var =& $_REQUEST[$title_match_key])
  147. {
  148. if ($tmp_title_match = substr(urldecode(trim($var)), 0, $title_match_max_len))
  149. {
  150. $title_match_sql = DB()->escape($tmp_title_match);
  151. $url = url_arg($url, $title_match_key, urlencode($tmp_title_match));
  152. }
  153. }
  154. //
  155. // SQL
  156. //
  157. $select = "SELECT *";
  158. $from = "FROM ". BB_LOG;
  159. $where = "
  160. WHERE log_time BETWEEN $time_start_val AND $time_end_val
  161. ";
  162. $where .= ($type_csv) ? "
  163. AND log_type_id IN($type_csv)
  164. " : '';
  165. $where .= ($user_csv) ? "
  166. AND log_user_id IN($user_csv)
  167. " : '';
  168. $where .= ($forum_csv) ? "
  169. AND log_forum_id IN($forum_csv)
  170. " : '';
  171. $where .= ($topic_csv) ? "
  172. AND log_topic_id IN($topic_csv)
  173. " : '';
  174. $where .= ($title_match_sql) ? "
  175. AND MATCH (log_topic_title) AGAINST ('$title_match_sql' IN BOOLEAN MODE)
  176. " : '';
  177. $order = "ORDER BY $order_val";
  178. $sort = $sort_val;
  179. $limit = "LIMIT $start, ". ($per_page + 1);
  180. $sql = "
  181. $select
  182. $from
  183. $where
  184. $order
  185. $sort
  186. $limit
  187. ";
  188. $log_rowset = DB()->fetch_rowset($sql);
  189. $log_count = count($log_rowset);
  190. if ($log_count == $per_page + 1)
  191. {
  192. $items_count = $start + ($per_page * 2);
  193. $pages = '?';
  194. array_pop($log_rowset);
  195. }
  196. else
  197. {
  198. $items_count = $start + $log_count;
  199. $pages = (!$log_count) ? 1 : ceil($items_count / $per_page);
  200. }
  201. generate_pagination($url, $items_count, $per_page, $start);
  202. $filter = array();
  203. if ($log_rowset)
  204. {
  205. $log_type = $log_action->log_type;
  206. $log_type_flip = array_flip($log_type);
  207. foreach ($log_rowset as $row_num => $row)
  208. {
  209. $msg = '';
  210. $forum_name = $forum_name_new = '';
  211. $topic_title = $topic_title_new = '';
  212. $topic_deleted = ($row['log_type_id'] == $log_type['mod_topic_delete']);
  213. switch ($row['log_type_id'])
  214. {
  215. case $log_type['mod_topic_delete']:
  216. case $log_type['mod_topic_move']:
  217. case $log_type['mod_topic_lock']:
  218. case $log_type['mod_topic_unlock']:
  219. case $log_type['mod_post_delete']:
  220. case $log_type['mod_topic_split']:
  221. // topic_title
  222. if (!empty($row['log_topic_title']))
  223. {
  224. $topic_title = $row['log_topic_title'];
  225. }
  226. // topic_title_new
  227. if (!empty($row['log_topic_title_new']))
  228. {
  229. $topic_title_new = $row['log_topic_title_new'];
  230. }
  231. // forum_name
  232. if ($fid =& $row['log_forum_id'])
  233. {
  234. $forum_name = ($fname =& $f_data[$fid]['forum_name']) ? $fname : 'id:'. $row['log_forum_id'];
  235. }
  236. // forum_name_new
  237. if ($fid =& $row['log_forum_id_new'])
  238. {
  239. $forum_name_new = ($fname =& $f_data[$fid]['forum_name']) ? $fname : 'id:'. $row['log_forum_id'];
  240. }
  241. break;
  242. }
  243. $msg .= " $row[log_msg]";
  244. $row_class = !($row_num & 1) ? $row_class_1 : $row_class_2;
  245. $datetime_href_s = url_arg($url, $datetime_key, date($dt_format, $row['log_time']));
  246. $datetime_href_s = url_arg($datetime_href_s, $daysback_key, 1);
  247. $template->assign_block_vars('log', array(
  248. 'ACTION_DESC' => $lang['LOG_ACTION']['LOG_TYPE'][$log_type_flip[$row['log_type_id']]],
  249. 'ACTION_HREF_S' => url_arg($url, $type_key, $row['log_type_id']),
  250. 'USER_ID' => $row['log_user_id'],
  251. 'USERNAME' => $row['log_username'],
  252. 'USER_HREF_S' => url_arg($url, $user_key, $row['log_user_id']),
  253. 'USER_IP' => decode_ip($row['log_user_ip']),
  254. 'FORUM_ID' => $row['log_forum_id'],
  255. 'FORUM_HREF' => BB_ROOT . FORUM_URL . $row['log_forum_id'],
  256. 'FORUM_HREF_S' => url_arg($url, $forum_key, $row['log_forum_id']),
  257. 'FORUM_NAME' => htmlCHR($forum_name),
  258. 'FORUM_ID_NEW' => $row['log_forum_id_new'],
  259. 'FORUM_HREF_NEW' => BB_ROOT . FORUM_URL . $row['log_forum_id_new'],
  260. 'FORUM_HREF_NEW_S' => url_arg($url, $forum_key, $row['log_forum_id_new']),
  261. 'FORUM_NAME_NEW' => htmlCHR($forum_name_new),
  262. 'TOPIC_ID' => $row['log_topic_id'],
  263. 'TOPIC_HREF' => (!$topic_deleted) ? BB_ROOT . TOPIC_URL . $row['log_topic_id'] : '',
  264. 'TOPIC_HREF_S' => url_arg($url, $topic_key, $row['log_topic_id']),
  265. 'TOPIC_TITLE' => $topic_title,
  266. 'TOPIC_ID_NEW' => $row['log_topic_id_new'],
  267. 'TOPIC_HREF_NEW' => BB_ROOT . TOPIC_URL . $row['log_topic_id_new'],
  268. 'TOPIC_HREF_NEW_S' => url_arg($url, $topic_key, $row['log_topic_id_new']),
  269. 'TOPIC_TITLE_NEW' => $topic_title_new,
  270. 'DATE' => bb_date($row['log_time'], 'j-M'),
  271. 'TIME' => bb_date($row['log_time'], 'H:i'),
  272. 'DATETIME_HREF_S' => $datetime_href_s,
  273. 'MSG' => $msg,
  274. 'ROW_CLASS' => $row_class,
  275. ));
  276. // Topics
  277. if ($topic_csv && empty($filter['topics'][$row['log_topic_title']]))
  278. {
  279. $template->assign_block_vars('topics', array(
  280. 'TOPIC_TITLE' => $row['log_topic_title'],
  281. ));
  282. $filter['topics'][$row['log_topic_title']] = true;
  283. }
  284. // Forums
  285. if ($forum_csv && empty($filter['forums'][$forum_name]))
  286. {
  287. $template->assign_block_vars('forums', array(
  288. 'FORUM_NAME' => htmlCHR($forum_name),
  289. ));
  290. $filter['forums'][$forum_name] = true;
  291. }
  292. // Users
  293. if ($user_csv && empty($filter['users'][$row['log_username']]))
  294. {
  295. $template->assign_block_vars('users', array(
  296. 'USERNAME' => $row['log_username'],
  297. ));
  298. $filter['users'][$row['log_username']] = true;
  299. }
  300. }
  301. $template->assign_vars(array(
  302. 'FILTERS' => ($topic_csv || $forum_csv || $user_csv),
  303. 'FILTER_TOPICS' => !empty($filter['topics']),
  304. 'FILTER_FORUMS' => !empty($filter['forums']),
  305. 'FILTER_USERS' => !empty($filter['users']),
  306. ));
  307. }
  308. else
  309. {
  310. $template->assign_block_vars('log_not_found', array());
  311. }
  312. //
  313. // Selects
  314. //
  315. $log_type_select = array($lang['ACTS_LOG_ALL_ACTIONS'] => $all_types) + $log_action->log_type_select;
  316. // Order select
  317. $order_options = '<option value="">&nbsp;'.$lang['ACTS_LOG_TIME'].'&nbsp;</option>';
  318. $template->assign_vars(array(
  319. 'LOG_COLSPAN' => 4,
  320. 'DATETIME_NAME' => $datetime_key,
  321. 'DATETIME_VAL' => date('Y-m-d', $datetime_val),
  322. 'DAYSBACK_NAME' => $daysback_key,
  323. 'DAYSBACK_VAL' => $daysback_val,
  324. 'FIRST_LOG_TIME' => ($first_log_time) ? date('Y-m-d', $first_log_time) : $lang['ACC_NONE'],
  325. 'TITLE_MATCH_MAX' => $title_match_max_len,
  326. 'TITLE_MATCH_NAME' => $title_match_key,
  327. 'TITLE_MATCH_VAL' => $title_match_val,
  328. 'ORDER_NAME' => '',
  329. 'ORDER_OPTIONS' => $order_options,
  330. 'SORT_NAME' => $sort_key,
  331. 'SORT_ASC' => $sort_asc,
  332. 'SORT_DESC' => $sort_desc,
  333. 'SORT_ASC_CHECKED' => ($sort_val == $sort_asc) ? HTML_CHECKED : '',
  334. 'SORT_DESC_CHECKED' => ($sort_val == $sort_desc) ? HTML_CHECKED : '',
  335. 'SEL_FORUM' => get_forum_select('admin', "{$forum_key}[]", $forum_selected, $max_forum_name_len, $select_max_height, '', $all_forums),
  336. 'SEL_LOG_TYPE' => build_select("{$type_key}[]", $log_type_select, $type_selected, 60, $select_max_height),
  337. 'SEL_USERS' => build_select("{$user_key}[]", $users, $user_selected, 16, $select_max_height),
  338. 'S_LOG_ACTION' => "admin_log.php",
  339. 'TOPIC_CSV' => $topic_csv,
  340. ));
  341. print_page('admin_log.tpl', 'admin');