PageRenderTime 29ms CodeModel.GetById 7ms RepoModel.GetById 0ms app.codeStats 0ms

/textpattern/include/txp_log.php

http://textpattern.googlecode.com/
PHP | 368 lines | 262 code | 52 blank | 54 comment | 36 complexity | 6ddb68baaa1bbee889dcb733dfde4545 MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.1, GPL-2.0
  1. <?php
  2. /*
  3. * Textpattern Content Management System
  4. * http://textpattern.com
  5. *
  6. * Copyright (C) 2005 Dean Allen
  7. * Copyright (C) 2014 The Textpattern Development Team
  8. *
  9. * This file is part of Textpattern.
  10. *
  11. * Textpattern is free software; you can redistribute it and/or
  12. * modify it under the terms of the GNU General Public License
  13. * as published by the Free Software Foundation, version 2.
  14. *
  15. * Textpattern is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with Textpattern. If not, see <http://www.gnu.org/licenses/>.
  22. */
  23. /**
  24. * Visitor logs panel.
  25. *
  26. * @package Admin\Log
  27. */
  28. if (!defined('txpinterface')) {
  29. die('txpinterface is undefined.');
  30. }
  31. if ($event == 'log') {
  32. if (get_pref('logging') === 'none' || !intval(get_pref('expire_logs_after'))) {
  33. require_privs();
  34. }
  35. require_privs('log');
  36. $available_steps = array(
  37. 'log_list' => false,
  38. 'log_change_pageby' => true,
  39. 'log_multi_edit' => true,
  40. );
  41. if ($step && bouncer($step, $available_steps)) {
  42. $step();
  43. } else {
  44. log_list();
  45. }
  46. }
  47. /**
  48. * The main panel listing all log hits.
  49. *
  50. * @param string|array $message The activity message
  51. */
  52. function log_list($message = '')
  53. {
  54. global $event, $log_list_pageby, $expire_logs_after;
  55. pagetop(gTxt('tab_logs'), $message);
  56. extract(gpsa(array(
  57. 'page',
  58. 'sort',
  59. 'dir',
  60. 'crit',
  61. 'search_method'
  62. )));
  63. if ($sort === '') {
  64. $sort = get_pref('log_sort_column', 'time');
  65. }
  66. if ($dir === '') {
  67. $dir = get_pref('log_sort_dir', 'desc');
  68. }
  69. $dir = ($dir == 'asc') ? 'asc' : 'desc';
  70. $expire_logs_after = assert_int($expire_logs_after);
  71. safe_delete('txp_log', "time < date_sub(now(), interval $expire_logs_after day)");
  72. switch ($sort) {
  73. case 'ip' :
  74. $sort_sql = 'ip '.$dir;
  75. break;
  76. case 'host' :
  77. $sort_sql = 'host '.$dir;
  78. break;
  79. case 'page' :
  80. $sort_sql = 'page '.$dir;
  81. break;
  82. case 'refer' :
  83. $sort_sql = 'refer '.$dir;
  84. break;
  85. case 'method' :
  86. $sort_sql = 'method '.$dir;
  87. break;
  88. case 'status' :
  89. $sort_sql = 'status '.$dir;
  90. break;
  91. default :
  92. $sort = 'time';
  93. $sort_sql = 'time '.$dir;
  94. break;
  95. }
  96. set_pref('log_sort_column', $sort, 'log', 2, '', 0, PREF_PRIVATE);
  97. set_pref('log_sort_dir', $dir, 'log', 2, '', 0, PREF_PRIVATE);
  98. $switch_dir = ($dir == 'desc') ? 'asc' : 'desc';
  99. $criteria = 1;
  100. if ($search_method and $crit != '') {
  101. $verbatim = preg_match('/^"(.*)"$/', $crit, $m);
  102. $crit_escaped = $verbatim ? doSlash($m[1]) : doLike($crit);
  103. $critsql = $verbatim ?
  104. array(
  105. 'ip' => "ip = '$crit_escaped'",
  106. 'host' => "host = '$crit_escaped'",
  107. 'page' => "page = '$crit_escaped'",
  108. 'refer' => "refer = '$crit_escaped'",
  109. 'method' => "method = '$crit_escaped'",
  110. 'status' => "status = '$crit_escaped'",
  111. ) : array(
  112. 'ip' => "ip like '%$crit_escaped%'",
  113. 'host' => "host like '%$crit_escaped%'",
  114. 'page' => "page like '%$crit_escaped%'",
  115. 'refer' => "refer like '%$crit_escaped%'",
  116. 'method' => "method like '%$crit_escaped%'",
  117. 'status' => "status like '%$crit_escaped%'",
  118. );
  119. if (array_key_exists($search_method, $critsql)) {
  120. $criteria = $critsql[$search_method];
  121. $limit = 500;
  122. } else {
  123. $search_method = '';
  124. $crit = '';
  125. }
  126. } else {
  127. $search_method = '';
  128. $crit = '';
  129. }
  130. $criteria .= callback_event('admin_criteria', 'log_list', 0, $criteria);
  131. $total = safe_count('txp_log', "$criteria");
  132. echo hed(gTxt('tab_logs'), 1, array('class' => 'txp-heading'));
  133. echo n.'<div id="'.$event.'_control" class="txp-control-panel">';
  134. if ($total < 1) {
  135. if ($criteria != 1) {
  136. echo log_search_form($crit, $search_method).
  137. graf(gTxt('no_results_found'), ' class="indicator"').'</div>';
  138. } else {
  139. echo graf(gTxt('no_refers_recorded'), ' class="indicator"').'</div>';
  140. }
  141. return;
  142. }
  143. $limit = max($log_list_pageby, 15);
  144. list($page, $offset, $numPages) = pager($total, $limit, $page);
  145. echo log_search_form($crit, $search_method).'</div>';
  146. $rs = safe_rows_start(
  147. '*, unix_timestamp(time) as uTime',
  148. 'txp_log',
  149. "$criteria order by $sort_sql limit $offset, $limit"
  150. );
  151. if ($rs) {
  152. echo
  153. n.tag_start('div', array(
  154. 'id' => $event.'_container',
  155. 'class' => 'txp-container',
  156. )).
  157. n.tag_start('form', array(
  158. 'action' => 'index.php',
  159. 'id' => 'log_form',
  160. 'class' => 'multi_edit_form',
  161. 'method' => 'post',
  162. 'name' => 'longform',
  163. )).
  164. n.tag_start('div', array('class' => 'txp-listtables')).
  165. n.tag_start('table', array('class' => 'txp-list')).
  166. n.tag_start('thead').
  167. tr(
  168. hCell(
  169. fInput('checkbox', 'select_all', 0, '', '', '', '', '', 'select_all'),
  170. '', ' scope="col" title="'.gTxt('toggle_all_selected').'" class="txp-list-col-multi-edit"'
  171. ).
  172. column_head(
  173. 'time', 'time', 'log', true, $switch_dir, $crit, $search_method,
  174. (('time' == $sort) ? "$dir " : '').'txp-list-col-time'
  175. ).
  176. column_head(
  177. 'IP', 'ip', 'log', true, $switch_dir, $crit, $search_method,
  178. (('ip' == $sort) ? "$dir " : '').'txp-list-col-ip log_detail'
  179. ).
  180. column_head(
  181. 'host', 'host', 'log', true, $switch_dir, $crit, $search_method,
  182. (('host' == $sort) ? "$dir " : '').'txp-list-col-host'
  183. ).
  184. column_head(
  185. 'page', 'page', 'log', true, $switch_dir, $crit, $search_method,
  186. (('page' == $sort) ? "$dir " : '').'txp-list-col-page'
  187. ).
  188. column_head(
  189. 'referrer', 'refer', 'log', true, $switch_dir, $crit, $search_method,
  190. (('refer' == $sort) ? "$dir " : '').'txp-list-col-refer'
  191. ).
  192. column_head(
  193. 'method', 'method', 'log', true, $switch_dir, $crit, $search_method,
  194. (('method' == $sort) ? "$dir " : '').'txp-list-col-method log_detail'
  195. ).
  196. column_head(
  197. 'status', 'status', 'log', true, $switch_dir, $crit, $search_method,
  198. (('status' == $sort) ? "$dir " : '').'txp-list-col-status log_detail'
  199. )
  200. ).
  201. n.tag_end('thead').
  202. n.tag_start('tbody');
  203. while ($a = nextRow($rs)) {
  204. extract($a, EXTR_PREFIX_ALL, 'log');
  205. if ($log_refer) {
  206. $log_refer = href(txpspecialchars(soft_wrap(preg_replace('#^http://#', '', $log_refer), 30)), txpspecialchars($log_refer), ' target="_blank"');
  207. }
  208. if ($log_page) {
  209. $log_anchor = preg_replace('/\/$/', '', $log_page);
  210. $log_anchor = soft_wrap(substr($log_anchor, 1), 30);
  211. $log_page = href(txpspecialchars($log_anchor), txpspecialchars($log_page), ' target="_blank"');
  212. if ($log_method == 'POST') {
  213. $log_page = strong($log_page);
  214. }
  215. }
  216. echo tr(
  217. td(
  218. fInput('checkbox', 'selected[]', $log_id), '', 'txp-list-col-multi-edit'
  219. ).
  220. hCell(
  221. gTime($log_uTime), '', ' scope="row" class="txp-list-col-time"'
  222. ).
  223. td(
  224. txpspecialchars($log_ip), '', 'txp-list-col-ip log_detail'
  225. ).
  226. td(
  227. txpspecialchars($log_host), '', 'txp-list-col-host'
  228. ).
  229. td(
  230. $log_page, '', 'txp-list-col-page'
  231. ).
  232. td(
  233. $log_refer, '', 'txp-list-col-refer'
  234. ).
  235. td(
  236. txpspecialchars($log_method), '', 'txp-list-col-method log_detail'
  237. ).
  238. td(
  239. $log_status, '', 'txp-list-col-status log_detail'
  240. )
  241. );
  242. }
  243. echo
  244. n.tag_end('tbody').
  245. n.tag_end('table').
  246. n.tag_end('div').
  247. log_multiedit_form($page, $sort, $dir, $crit, $search_method).
  248. tInput().
  249. n.tag_end('form').
  250. graf(toggle_box('log_detail'), array('class' => 'detail-toggle')).
  251. n.tag_start('div', array(
  252. 'id' => $event.'_navigation',
  253. 'class' => 'txp-navigation',
  254. )).
  255. pageby_form('log', $log_list_pageby).
  256. nav_form('log', $page, $numPages, $sort, $dir, $crit, $search_method, $total, $limit).
  257. n.tag_end('div').
  258. n.tag_end('div');
  259. }
  260. }
  261. /**
  262. * Renders a search form for logs.
  263. *
  264. * @param string $crit The current search criteria
  265. * @param string $method The selected search method
  266. * @retrun string HTML
  267. */
  268. function log_search_form($crit, $method)
  269. {
  270. $methods = array(
  271. 'ip' => gTxt('IP'),
  272. 'host' => gTxt('host'),
  273. 'page' => gTxt('page'),
  274. 'refer' => gTxt('referrer'),
  275. 'method' => gTxt('method'),
  276. 'status' => gTxt('status')
  277. );
  278. return search_form('log', 'log_list', $crit, $methods, $method, 'page');
  279. }
  280. /**
  281. * Saves a new pageby value to the server.
  282. */
  283. function log_change_pageby()
  284. {
  285. event_change_pageby('log');
  286. log_list();
  287. }
  288. /**
  289. * Renders a multi-edit widget.
  290. *
  291. * @param int $page The page number
  292. * @param string $sort The current sorting value
  293. * @param string $dir The current sorting direction
  294. * @param string $crit The current search criteria
  295. * @param string $search_method The current search method
  296. * @return string HTML
  297. */
  298. function log_multiedit_form($page, $sort, $dir, $crit, $search_method)
  299. {
  300. $methods = array(
  301. 'delete' => gTxt('delete')
  302. );
  303. return multi_edit($methods, 'log', 'log_multi_edit', $page, $sort, $dir, $crit, $search_method);
  304. }
  305. /**
  306. * Processes multi-edit actions.
  307. */
  308. function log_multi_edit()
  309. {
  310. $deleted = event_multi_edit('txp_log', 'id');
  311. if ($deleted) {
  312. $message = gTxt('logs_deleted', array('{list}' => $deleted));
  313. return log_list($message);
  314. }
  315. return log_list();
  316. }