.
*/
/**
* Visitor logs panel.
*
* @package Admin\Log
*/
use Textpattern\Search\Filter;
if (!defined('txpinterface')) {
die('txpinterface is undefined.');
}
if ($event == 'log') {
if (get_pref('logging') === 'none' || !intval(get_pref('expire_logs_after'))) {
require_privs();
}
require_privs('log');
$available_steps = array(
'log_list' => false,
'log_change_pageby' => true,
'log_multi_edit' => true,
);
if ($step && bouncer($step, $available_steps)) {
$step();
} else {
log_list();
}
}
/**
* The main panel listing all log hits.
*
* @param string|array $message The activity message
*/
function log_list($message = '')
{
global $event, $log_list_pageby, $expire_logs_after;
pagetop(gTxt('tab_logs'), $message);
extract(gpsa(array(
'page',
'sort',
'dir',
'crit',
'search_method',
)));
if ($sort === '') {
$sort = get_pref('log_sort_column', 'time');
} else {
if (!in_array($sort, array('ip', 'host', 'page', 'refer', 'method', 'status'))) {
$sort = 'time';
}
set_pref('log_sort_column', $sort, 'log', 2, '', 0, PREF_PRIVATE);
}
if ($dir === '') {
$dir = get_pref('log_sort_dir', 'desc');
} else {
$dir = ($dir == 'asc') ? "asc" : "desc";
set_pref('log_sort_dir', $dir, 'log', 2, '', 0, PREF_PRIVATE);
}
$expire_logs_after = assert_int($expire_logs_after);
safe_delete('txp_log', "time < DATE_SUB(NOW(), INTERVAL $expire_logs_after DAY)");
switch ($sort) {
case 'ip':
$sort_sql = "ip $dir";
break;
case 'host':
$sort_sql = "host $dir";
break;
case 'page':
$sort_sql = "page $dir";
break;
case 'refer':
$sort_sql = "refer $dir";
break;
case 'method':
$sort_sql = "method $dir";
break;
case 'status':
$sort_sql = "status $dir";
break;
default:
$sort = 'time';
$sort_sql = "time $dir";
break;
}
$switch_dir = ($dir == 'desc') ? 'asc' : 'desc';
$search = new Filter($event,
array(
'ip' => array(
'column' => 'txp_log.ip',
'label' => gTxt('IP'),
),
'host' => array(
'column' => 'txp_log.host',
'label' => gTxt('host'),
),
'page' => array(
'column' => 'txp_log.page',
'label' => gTxt('page'),
),
'refer' => array(
'column' => 'txp_log.refer',
'label' => gTxt('referrer'),
),
'method' => array(
'column' => 'txp_log.method',
'label' => gTxt('method'),
),
'status' => array(
'column' => 'txp_log.status',
'label' => gTxt('status'),
'type' => 'integer',
),
)
);
list($criteria, $crit, $search_method) = $search->getFilter(array(
'status' => array('can_list' => true),
));
$search_render_options = array(
'placeholder' => 'search_logs',
);
$total = safe_count('txp_log', "$criteria");
echo n.'
'.
n.tag(
hed(gTxt('tab_logs'), 1, array('class' => 'txp-heading')),
'div', array('class' => 'txp-layout-4col-alt')
);
$searchBlock =
n.tag(
$search->renderForm('log_list', $search_render_options),
'div', array(
'class' => 'txp-layout-4col-3span',
'id' => $event.'_control',
)
);
$contentBlockStart = n.tag_start('div', array(
'class' => 'txp-layout-1col',
'id' => $event.'_container',
));
if ($total < 1) {
if ($criteria != 1) {
echo $searchBlock.
$contentBlockStart.
graf(
span(null, array('class' => 'ui-icon ui-icon-info')).' '.
gTxt('no_results_found'),
array('class' => 'alert-block information')
);
} else {
echo $contentBlockStart.
graf(
span(null, array('class' => 'ui-icon ui-icon-info')).' '.
gTxt('no_refers_recorded'),
array('class' => 'alert-block information')
);
}
echo n.tag_end('div'). // End of .txp-layout-1col.
n.'
'; // End of .txp-layout.
return;
}
$limit = max($log_list_pageby, 15);
list($page, $offset, $numPages) = pager($total, $limit, $page);
echo $searchBlock.$contentBlockStart;
$rs = safe_rows_start(
"*, UNIX_TIMESTAMP(time) AS uTime",
'txp_log',
"$criteria ORDER BY $sort_sql LIMIT $offset, $limit"
);
if ($rs) {
echo n.tag(
toggle_box('log_detail'), 'div', array('class' => 'txp-list-options')).
n.tag_start('form', array(
'class' => 'multi_edit_form',
'id' => 'log_form',
'name' => 'longform',
'method' => 'post',
'action' => 'index.php',
)).
n.tag_start('div', array('class' => 'txp-listtables')).
n.tag_start('table', array('class' => 'txp-list')).
n.tag_start('thead').
tr(
hCell(
fInput('checkbox', 'select_all', 0, '', '', '', '', '', 'select_all'),
'', ' class="txp-list-col-multi-edit" scope="col" title="'.gTxt('toggle_all_selected').'"'
).
column_head(
'time', 'time', 'log', true, $switch_dir, $crit, $search_method,
(('time' == $sort) ? "$dir " : '').'txp-list-col-time'
).
column_head(
'IP', 'ip', 'log', true, $switch_dir, $crit, $search_method,
(('ip' == $sort) ? "$dir " : '').'txp-list-col-ip'
).
column_head(
'host', 'host', 'log', true, $switch_dir, $crit, $search_method,
(('host' == $sort) ? "$dir " : '').'txp-list-col-host log_detail'
).
column_head(
'page', 'page', 'log', true, $switch_dir, $crit, $search_method,
(('page' == $sort) ? "$dir " : '').'txp-list-col-page'
).
column_head(
'referrer', 'refer', 'log', true, $switch_dir, $crit, $search_method,
(('refer' == $sort) ? "$dir " : '').'txp-list-col-refer'
).
column_head(
'method', 'method', 'log', true, $switch_dir, $crit, $search_method,
(('method' == $sort) ? "$dir " : '').'txp-list-col-method log_detail'
).
column_head(
'status', 'status', 'log', true, $switch_dir, $crit, $search_method,
(('status' == $sort) ? "$dir " : '').'txp-list-col-status log_detail'
)
).
n.tag_end('thead').
n.tag_start('tbody');
while ($a = nextRow($rs)) {
extract($a, EXTR_PREFIX_ALL, 'log');
if ($log_refer) {
$log_refer = href(txpspecialchars(soft_wrap(preg_replace('#^http://#', '', $log_refer), 30)), txpspecialchars($log_refer), ' target="_blank"');
}
if ($log_page) {
$log_anchor = preg_replace('/\/$/', '', $log_page);
$log_anchor = soft_wrap(substr($log_anchor, 1), 30);
$log_page = href(txpspecialchars($log_anchor), txpspecialchars($log_page), ' target="_blank"');
if ($log_method == 'POST') {
$log_page = strong($log_page);
}
}
echo tr(
td(
fInput('checkbox', 'selected[]', $log_id), '', 'txp-list-col-multi-edit'
).
hCell(
gTime($log_uTime), '', ' class="txp-list-col-time" scope="row"'
).
td(
href(txpspecialchars($log_ip), 'https://whois.domaintools.com/'.rawurlencode($log_ip), array(
'rel' => 'external',
'target' => '_blank',
)), '', 'txp-list-col-ip'
).
td(
txpspecialchars($log_host), '', 'txp-list-col-host log_detail'
).
td(
$log_page, '', 'txp-list-col-page'
).
td(
$log_refer, '', 'txp-list-col-refer'
).
td(
txpspecialchars($log_method), '', 'txp-list-col-method log_detail'
).
td(
$log_status, '', 'txp-list-col-status log_detail'
)
);
}
echo
n.tag_end('tbody').
n.tag_end('table').
n.tag_end('div'). // End of .txp-listtables.
log_multiedit_form($page, $sort, $dir, $crit, $search_method).
tInput().
n.tag_end('form').
n.tag_start('div', array(
'class' => 'txp-navigation',
'id' => $event.'_navigation',
)).
pageby_form('log', $log_list_pageby).
nav_form('log', $page, $numPages, $sort, $dir, $crit, $search_method, $total, $limit).
n.tag_end('div');
}
echo n.tag_end('div'). // End of .txp-layout-1col.
n.''; // End of .txp-layout.
}
/**
* Saves a new pageby value to the server.
*/
function log_change_pageby()
{
event_change_pageby('log');
log_list();
}
/**
* Renders a multi-edit widget.
*
* @param int $page The page number
* @param string $sort The current sorting value
* @param string $dir The current sorting direction
* @param string $crit The current search criteria
* @param string $search_method The current search method
* @return string HTML
*/
function log_multiedit_form($page, $sort, $dir, $crit, $search_method)
{
$methods = array(
'delete' => gTxt('delete'),
);
return multi_edit($methods, 'log', 'log_multi_edit', $page, $sort, $dir, $crit, $search_method);
}
/**
* Processes multi-edit actions.
*/
function log_multi_edit()
{
$deleted = event_multi_edit('txp_log', 'id');
if ($deleted) {
$message = gTxt('logs_deleted', array('{list}' => $deleted));
return log_list($message);
}
return log_list();
}